2010-03-21 136 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);