CXF jaxws端点相对发布地址
我在尝试在 CXF Web 服务端点配置中使用相对发布地址时遇到很多困难。
我有一个简单的 Java-first JAX-WS 项目,具有以下配置文件:
applicationContent-cxf.xml:
<beans xmlns=...>
...
<jaxws:endpoint
id="helloWorldService"
implementorClass="org.helloworld.ws.HelloWorldServiceImpl"
implementor="#helloWorldServiceImpl" <!-- spring managed -->
endpointName="sayHello"
address="HelloWorldService"/>
</beans>
web.xml:
<web-app>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
WEB-INF/applicationContext.xml
WEB-INF/applicationContext-cxf.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>HelloWorldServlet</servlet-name>
<display-name>Hello World Servlet</display-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
根据 http://cxf.apache.org/docs/servlet-transport.html,看来我应该能够指定 HelloWorldService
的发布地址和服务将解析为(例如)http://localhost:8080/services/HelloWorldService。但是当我尝试访问 http://localhost:8080/services/HelloWorldService?wsdl 时,我得到 404。如果我将 jaxws 端点中的发布地址更改为绝对 URL http://localhost:8080/services/HelloWorldService
我能够访问 wsdl。
如果可能的话,我想指定一个相对端点地址。我是使用 CXF(和编写 Web 服务)的新手,因此非常感谢任何帮助!
更新 1:
请注意,我正在将 Web 服务部署到 Tomcat 7。我不知道是什么记录了它,但我的启动日志中的其中一行指出设置服务器的发布地址为HelloWorldService
。如果有人需要更多信息来帮助我,请告诉我。
更新2:
看来CXF会检测CXFServlet是否“正在使用”,如果没有,则使用嵌入式jetty实例。 http://cxf.apache.org/docs/xfire-migration-guide.html# XFireMigrationGuide-HTTPandServletSetup。因此,出于某种原因,CXF 使用嵌入式 jetty 实例而不是我的 servlet。但是,我不知道除了 web.xml 中的 HelloWorldServlet 之外还需要什么进一步配置,并且 CXF 文档无法进一步帮助我。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
答案当然很简单(简单来说就是头撞桌子)。在我的 cxf bean 定义中,我没有导入“cxf-servlet.xml”文件,如此处所示 http:// cxf.apache.org/docs/servlet-transport.html。如果未导入此文件,cxf 假定它应该使用嵌入式 jetty 实例而不是我的 CXF servlet。我的猜测是 jetty 实例仅适用于指定绝对发布地址的端点。
The answer was, of course, simple (banging-head-on-desk simple, that is). In my cxf bean definitions, i was not importing the "cxf-servlet.xml" file as seen here http://cxf.apache.org/docs/servlet-transport.html. If this file is not imported, cxf assumes it should use the embedded jetty instance instead of my CXF servlet. My guess is the jetty instance only works with endpoints specifying an absolute publish address.
难道不应该吗
?
Shouldn't it be
?