Java 不带sun-jaxws.xml的Tomcat上的JAX-WS Web服务

Java 不带sun-jaxws.xml的Tomcat上的JAX-WS Web服务,java,web-services,jakarta-ee,tomcat,jax-ws,Java,Web Services,Jakarta Ee,Tomcat,Jax Ws,在Tomcat上部署基于JAX-WS的Web服务时,我试图最小化所需的配置。随着Servlet3.0(由Tomcat7+支持)的引入,web.xml可以被抛弃,但是仍然有sunJAXWS.xml。这很有趣: 当然,通过使用jax-ws注释,甚至配置 可以将sun-jaxws.xml设置为可选,使其完全符合描述符 免费,但这需要指定默认的url模式,如 JSR-109或定制模式,如JAX-WS中的Jersey REST服务 规格 在Tomcat上是否可以避免sunjaxws.xml,以及如何避免?

在Tomcat上部署基于JAX-WS的Web服务时,我试图最小化所需的配置。随着Servlet3.0(由Tomcat7+支持)的引入,
web.xml
可以被抛弃,但是仍然有
sunJAXWS.xml
。这很有趣:

当然,通过使用jax-ws注释,甚至配置 可以将sun-jaxws.xml设置为可选,使其完全符合描述符 免费,但这需要指定默认的url模式,如 JSR-109或定制模式,如JAX-WS中的Jersey REST服务 规格


在Tomcat上是否可以避免
sunjaxws.xml
,以及如何避免?

您必须发布web服务。您可以实现ServletContextListener并发布端点:

@javax.servlet.annotation.WebListener 
public class AppServletContextListener implements javax.servlet.ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) { 
        Endpoint.publish("{protocol}://{host}:{port}/{context}/{wsName}", new MyHelloWorldWSImpl());
    } 

    public void contextDestroyed(ServletContextEvent sce) { 
        .... 
    }
}

sun-jaxws.xml不是规范所必需的……例如,如果您注意到,glassfish(metro)使其成为可选的。此外,如果将EJB3.1公开为webservice(使用jaxws),则在生成的构建中看不到sun-jaxws.xml文件。

遗憾的是,配置必须存在于某个地方。根据消息来源,这是强制性的。信不信由你,请转到/WEB-INF/sun-jaxws.xml(谢谢,伙计们@Metro)

有效地,您需要控制以下类别


需要做什么:

  • WSServletContextListener
    显然不会被扩展。此侦听器根据sun-jaxws.xml和jaxws目录文件执行大多数初始化。正如我前面提到的,位置是硬编码的。所以你在这里阻力最小的途径是

    • 实现您自己的香草servlet侦听器(使用
      @WebListener
      )并调用
      新的WSServletContextListener()
      。然后将自己的
      contextInitialized(ServletContext ctxt)
      contextdestromed()
      方法委托给
      WSServletContextListener
      实例中的方法

    • 使用将表示sun jaxws文件的
      @XmlRootElement
      类在实例化侦听器时动态生成该文件(我将在稍后提供一个示例,现在没有时间:)


  • 在我看来,这样一种可有可无的便利是很麻烦的,但在理论上它应该是可行的。我将很快编写一些示例,看看它们是如何运行的。

    我已经通过这种方式成功地发布了web服务。我使用ApacheCfx在servletContextListener中发布

    @WebListener
    public class WebServicePublisListener implements ServletContextListener {
    
        /**
         * Default constructor. 
         */
        public WebServicePublisListener() {
            // TODO Auto-generated constructor stub
        }
    
        /**
         * @see ServletContextListener#contextInitialized(ServletContextEvent)
         */
        public void contextInitialized(ServletContextEvent sce)  { 
            JaxWsServerFactoryBean srvFactory = new JaxWsServerFactoryBean();
            srvFactory.setServiceClass(RandService.class);
            srvFactory.setAddress("/RandService");
            srvFactory.setServiceBean(new RandServiceImplement());
            srvFactory.create();
        }
    

    要在Tomcat中获得JAX-WS支持,您必须配置:

    • WEB-INF/sun jaxws.xml
    • WSServletContextListener
    • WSServlet
    不幸的是,很难省略WEB-INF/sun jaxws.xml文件,但由于Servlet 3.0 API,省略WEB.xml配置更容易

    您可以这样做:

    @WebServlet(name = "ServiceServlet" , urlPatterns = "/service", loadOnStartup = 1)
    public class Servlet extends WSServlet {
    
    }
    

    我已经在Tomcat-8.5.23版本上进行了测试,它可以正常工作。但请记住,您仍然必须有WEB-INF/sun jaxws.xml文件

    <endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
           version="2.0">
        <endpoint name="SampleService"
              implementation="com.ws.ServiceImpl"
              url-pattern="/service" />
    </endpoints>
    
    
    
    谢谢你的回答。然而,我不想使用Endpoint.publish(..)基础设施,因为它代表一个轻量级HTTP服务器——如果我想这样,我就不会使用Tomcat。接下来,Tomcat是一个servlet容器;换句话说,您不能在Tomcat上部署EJB。我知道这在Glassfish中很有用,但那是因为Glassfish符合JSR-109。默认情况下Tomcat不支持EJB。例如,你应该考虑使用TomEE。我提到EJB只是为了作为一个示例来演示不需要sun-jaxws.xml(这不是强制性的)。就我个人而言,我总是更喜欢完整的应用程序服务器(比如Glassfish)而不是servlet容器(比如Tomcat)。但是,我们的客户机使用Tomcat,我很好奇是否可以简化在Tomcat上部署Web服务所需的配置。因此,我的问题是关于Tomcat的,而不是TomEE或Glassfish。+1,不知道
    sun jaxws.xml
    的位置是硬编码的:)那么默认的url模式如何使
    sun jaxws.xml
    成为可选的(参见我在问题中引用的博客),米尔延米基奇仔细阅读了这篇文章,这一切似乎都是一厢情愿的想法,而不是什么参考:他的博客文章中的链接已经死了。我仍然设法找到了他所指的源代码,但仍然表明需要sun-jaxws.xml。谢谢你的回答。我应该用“JAX-WSRI”或“Metro”标记我的问题,因为
    sunjaxws.xml
    与这些实现相关。ApacheCXF是JAX-WS的不同实现,因此它与
    sunJAXWS.xml
    没有任何关系。我知道我们可以省略
    web.xml
    文件,这在问题的文本中已经提到过。问题是关于省略
    sunjaxws.xml
    file.ah好的,但是我为其他可能不知道如何省略web.xml文件的人添加了解决方案。例如,几周前我就遇到了这个问题。
    <endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
           version="2.0">
        <endpoint name="SampleService"
              implementation="com.ws.ServiceImpl"
              url-pattern="/service" />
    </endpoints>