CXF jaxws端点相对发布地址

发布于 2024-11-29 20:42:39 字数 2636 浏览 1 评论 0 原文

我在尝试在 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 文档无法进一步帮助我。

I am having a lot of difficulty trying to use a relative publish address in my CXF web service endpoint configuration.

I have a simple Java-first JAX-WS project with the following configuration files:

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>

According to http://cxf.apache.org/docs/servlet-transport.html, it seems i should be able to specify the publish address of HelloWorldService and the URL of the service will resolve to (e.g.) http://localhost:8080/services/HelloWorldService. But when I try to go to http://localhost:8080/services/HelloWorldService?wsdl I get a 404. If i change the publish address in my jaxws endpoint to the absolute URL http://localhost:8080/services/HelloWorldService I am able to access the wsdl.

I want to specify a relative endpoint address if possible. I am new to using CXF (and writing web services), so any help is much appreciated!

UPDATE 1:

Note that I am deploying my web service to Tomcat 7. I don't know what is logging it, but one of the lines in my start up log states Setting the server's publish address to be HelloWorldService. If anyone needs more info to help me please let me know.

UPDATE 2:

It appears that CXF detects whether a CXFServlet is "being used" and uses an embedded jetty instance if it is not. http://cxf.apache.org/docs/xfire-migration-guide.html#XFireMigrationGuide-HTTPandServletSetup. So, for some reason CXF is using the embedded jetty instance instead of my servlet. However, I don't know what further configuration I need besides the HelloWorldServlet in my web.xml, and the CXF documentation doesn't help me further.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

九公里浅绿 2024-12-06 20:42:39

答案当然很简单(简单来说就是头撞桌子)。在我的 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.

枕头说它不想醒 2024-12-06 20:42:39

难道不应该吗

address="/HelloWorldService"

Shouldn't it be

address="/HelloWorldService"

?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文