2010-03-21 134 views
1

我想用CXF在JSF中創建動態Web服務調用器。但是當我加載這個簡單的代碼時,我得到錯誤。 代碼:爲什麼我在CXF中遇到這個錯誤

JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); 
Client client = dcf.createClient("http://ws.strikeiron.com/IPLookup2?wsdl"); 

錯誤:

沒有工廠配置此應用。如果臉部初始化完全不起作用,就會發生這種情況 - 確保正確包含基本臉部應用程序所需的所有配置設置,並且包含所有必需的庫。同時檢查您的Web應用程序和您的容器的日誌輸出是否有任何異常!如果你這樣做並且一無所獲,這個錯誤可能是由於你使用了一些特殊的Web容器,它們不支持通過TLD文件註冊上下文偵聽器,並且沒有在你的web.xml中設置上下文偵聽器。一個典型的配置是這樣的; org.apache.myfaces.webapp.StartupServletContextListener

引起︰ java.lang.IllegalStateException - 沒有工廠配置爲此應用程序。如果臉部初始化完全不起作用,就會發生這種情況 - 確保正確包含基本臉部應用程序所需的所有配置設置,並且包含所有必需的庫。同時檢查您的Web應用程序和您的容器的日誌輸出是否有任何異常!如果你這樣做並且一無所獲,這個錯誤可能是由於你使用了一些特殊的Web容器,它們不支持通過TLD文件註冊上下文偵聽器,並且沒有在你的web.xml中設置上下文偵聽器。一個典型的配置是這樣的; org.apache.myfaces.webapp.StartupServletContextListener

任何想法如何解決這個問題?

的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
    <display-name>ServiceInvoker</display-name> 
    <welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    <welcome-file>index.htm</welcome-file> 
    <welcome-file>index.jsp</welcome-file> 
    <welcome-file>default.html</welcome-file> 
    <welcome-file>default.htm</welcome-file> 
    <welcome-file>default.jsp</welcome-file> 
    </welcome-file-list> 
    <servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.jsf</url-pattern> 
    </servlet-mapping> 
    <context-param> 
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> 
    <param-value>resources.application</param-value> 
    </context-param> 
    <context-param> 
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>client</param-value> 
    </context-param> 
    <context-param> 
    <description> 
    This parameter tells MyFaces if javascript code should be allowed in 
    the rendered HTML output. 
    If javascript is allowed, command_link anchors will have javascript code 
    that submits the corresponding form. 
    If javascript is not allowed, the state saving info and nested parameters 
    will be added as url parameters. 
    Default is 'true'</description> 
    <param-name>org.apache.myfaces.ALLOW_JAVASCRIPT</param-name> 
    <param-value>true</param-value> 
    </context-param> 
    <context-param> 
    <description> 
    If true, rendered HTML code will be formatted, so that it is 'human-readable' 
    i.e. additional line separators and whitespace will be written, that do not 
    influence the HTML code. 
    Default is 'true'</description> 
    <param-name>org.apache.myfaces.PRETTY_HTML</param-name> 
    <param-value>true</param-value> 
    </context-param> 
    <context-param> 
    <param-name>org.apache.myfaces.DETECT_JAVASCRIPT</param-name> 
    <param-value>false</param-value> 
    </context-param> 
    <context-param> 
    <description> 
    If true, a javascript function will be rendered that is able to restore the 
    former vertical scroll on every request. Convenient feature if you have pages 
    with long lists and you do not want the browser page to always jump to the top 
    if you trigger a link or button action that stays on the same page. 
    Default is 'false' 
</description> 
    <param-name>org.apache.myfaces.AUTO_SCROLL</param-name> 
    <param-value>true</param-value> 
    </context-param> 
    <listener> 
    <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class> 
    </listener> 
</web-app> 

faces-config.xml中

<?xml version="1.0" encoding="UTF-8"?> 

<faces-config 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" 
    version="1.2"> 
    <managed-bean> 
     <description>Bean used for invoking services</description> 
     <managed-bean-name>invoker</managed-bean-name> 
     <managed-bean-class>org.cot.invoker.Invoker</managed-bean-class> 
     <managed-bean-scope>session</managed-bean-scope> 
    </managed-bean> 

</faces-config> 

這是我在Eclipse的控制檯中看到:

2010年3月22日15: 00:11 org.apache.cxf.endpoint.dynamic.DynamicClientFactory outputDebug 信息:創建的類: com.strikeiron.ws.GetRemainingHits,com.strikeiron.ws.GetRemainingHitsResponse,com.strikeiron.ws.LicenseInfo,com.strikeiron.ws.ObjectFactory,com.strikeiron.ws.RegisteredUser,com.strikeiron.ws.SubscriptionInfo,com。 strikeiron.ws.UnregisteredUser,com.strikeiron.ArrayOfMethodStatusRecord,com.strikeiron.ArrayOfSIWsStatus,com.strikeiron.ArrayOfServiceInfoRecord,com.strikeiron.ArrayOfString,com.strikeiron.ArrayOfString1,com.strikeiron.DNSInfo,com.strikeiron.DNSLookup,com。 strikeiron.DNSLookupResponse,com.strikeiron.GetServiceInfo,com.strikeiron.GetServiceInfoResponse,com.strikeiron.GetStatusCodes,com.strikeiron.GetStatusCodesForMethod,com.strikeiron.GetStatusCodesForMethodResponse,com.strikeiron.GetStatusCodesResponse,com.strikeiron.MethodStatusRecord,com.strikeiron。 ObjectFactory,com.strikeiron.SIWsOutputOfDNSInfo,com.strikeiron.SIWsOutputOfMethodStatusRecord,com.strikeiron.SIWsOutputOfSIWsResultArrayOfMethodStatusRecord,com.strikeiron.SIWsOutputOfSIWsResultArrayOfSer viceInfoRecord,com.strikeiron.SIWsResultArrayOfMethodStatusRecord,com.strikeiron.SIWsResultArrayOfSIWsStatus,com.strikeiron.SIWsResultArrayOfServiceInfoRecord,com.strikeiron.SIWsStatus,com.strikeiron.ServiceInfoRecord JE SLO 2010年3月22日15時00分13秒javax.faces.webapp._ErrorPageWriter handleThrowable 嚴重:發生異常 java.lang.IllegalStateException:沒有爲此應用程序配置的工廠。如果臉部初始化完全不起作用,就會發生這種情況 - 確保正確包含基本臉部應用程序所需的所有配置設置,並且包含所有必需的庫。同時檢查您的Web應用程序和您的容器的日誌輸出是否有任何異常! 如果你這樣做並沒有發現,這個錯誤可能是由於你使用了一些特殊的Web容器,它們不支持通過TLD文件註冊上下文偵聽器,而上下文偵聽器沒有在你的web.xml中設置。 典型的配置如下所示; org.apache.myfaces.webapp.StartupServletContextListener

at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:106) 
at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:356) 
at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41) 
at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:140) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:155) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
at java.lang.Thread.run(Unknown Source) 

當我點擊:

<h:commandLink value="Invoke me!" actionListener="#{invoker.doInvoke}"></h:commandLink> 
+0

向我們展示了'faces-config.xml中'和'web.xml' – Bozho 2010-03-22 08:41:12

+0

我也添加faces-config.xml和web.xml。嗯......我已經2天試圖解決這個問題 – Milan 2010-03-22 08:51:12

+0

在日誌文件中是否還有其他異常/錯誤?像'NoClassDefFound',例如 – Bozho 2010-03-22 11:26:34

回答

0

你報什麼都沒有做與CXF的錯誤,而是用org.apache.myfaces 。

如果所有從服務器回來的,那麼你有錯誤的URL?wsdl。瀏覽該URL是否在普通瀏覽器中生成WSDL文件?

您可能會在CXF用戶郵件列表中獲得更好的調試幫助。這不是一個問題,而是一個診斷問題,需要花費很多時間。

+0

wsdl?網址是好的。在普通瀏覽器中,我看到了WSDL文檔。 可能問題出在myFaces中。但是,在哪裏......我沒有想法。 – Milan 2010-03-21 23:49:42

1

爲了避免像「沒有配置此應用工廠」的一些錯誤利用CXF動態客戶端和JSF,你必須做一些事情是這樣的:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); 
Client client = dcf.createClient("http://ws.strikeiron.com/IPLookup2?wsdl"); 
Thread.currentThread().setContextClassLoader(classLoader);