我在尝试在CXF Web服务端点配置中使用相对发布地址时遇到很多困难。

我有一个简单的Java优先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的发布地址,并且该服务的URL可以解析为(例如http://localhost:8080/services/HelloWorldService)。但是,当我尝试转到http://localhost:8080/services/HelloWorldService?wsdl时,我得到404。如果我将jaxws端点中的发布地址更改为绝对URL http://localhost:8080/services/HelloWorldService,则可以访问wsdl。

如果可能,我想指定一个相对端点地址。我不熟悉CXF(和编写Web服务),因此非常感谢您的帮助!

更新1:

请注意,我正在将Web服务部署到Tomcat7。我不知道该日志记录了什么,但是启动日志中的其中一行显示Setting the server's publish address to be HelloWorldService。如果有人需要更多信息来帮助我,请告诉我。

更新2:

看来CXF会检测CXFServlet是否正在“被使用”,如果没有,则使用嵌入式码头实例。 http://cxf.apache.org/docs/xfire-migration-guide.html#XFireMigrationGuide-HTTPandServletSetup。因此,出于某种原因,CXF使用嵌入式码头实例代替了我的servlet。但是,除了我的web.xml中的HelloWorldServlet外,我不知道需要什么进一步的配置,并且CXF文档对我没有进一步的帮助。

最佳答案

答案当然很简单(即简单地敲打 table )。在我的cxf bean定义中,我没有导入http://cxf.apache.org/docs/servlet-transport.html所示的“cxf-servlet.xml”文件。如果未导入此文件,则cxf假定它应使用嵌入式的jetty实例而不是我的CXF servlet。我的猜测是,码头实例仅适用于指定绝对发布地址的端点。

关于web-services - CXF jaxws端点相对发布地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7070748/

10-13 08:16