读书人

关于servlet,web.xmlcxf的有关问题

发布时间: 2012-04-08 14:38:30 作者: rapoo

关于servlet,web.xml,cxf的问题
用cxf发布服务,在web.xml中配置了两个cxf的servlet
<servlet>
<servlet-name>CXFServlet1</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet1</servlet-name>
<url-pattern>/Aplace/*</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>CXFServlet2</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet2</servlet-name>
<url-pattern>/Bplace/*</url-pattern>
</servlet-mapping>


然后在spring的配置中配置了:
<jaxws:endpoint id="mycxf" implementor="#myService" address="/myService" />

这时,启动tomcat,如果我先输入:http://localhost:8080/myApp/Aplace/myService?wsdl,可以显示,然后在输入
http://localhost:8080/myApp/Bplace/myService?wsdl就无法显示。反之亦然,总之就是先启动那个,另一个就无法显示。
这是为什么啊?


ps:无法显示时,tomcat报错:
警告: Interceptor has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: No such operation: (HTTP GET PATH_INFO: /myApp/myService)
at org.apache.cxf.interceptor.URIMappingInterceptor.handleMessage(URIMappingInterceptor.java:83)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:104)
at org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:98)
at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:392)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:170)
at org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:142)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:50)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:101)
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.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
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(Thread.java:662)



[解决办法]
并没有对这个问题进行深入的研究,但是我认为这个CXFServlet类似于Struts在web.xml中的中心分发器,这个中心Servlet只需要一个就够了,不需要多个,否则可能出现冲突,如果有多个访问路径的话,只需要修改每个<jaxws:endpoint id="mycxf" implementor="#myService" address="/myService" />中配置的address属性这个相对地址就行了。就好比我们网站主域名都一样,其他服务都是相对主域名的相对访问路径。

读书人网 >J2EE开发

热点推荐