没有sun-jaxws.xml的Tomcat上的JAX-WS Web服务

时间:2013-05-14 07:54:13

标签: java web-services java-ee tomcat jax-ws

我正在尝试在Tomcat上部署基于JAX-WS的Web服务时最小化所需的配置。随着Servlet 3.0的引入(由Tomcat 7+支持),web.xml可以被抛弃,但仍有sun-jaxws.xml。这个blog post很有意思:

  

当然,使用jax-ws注释,甚至配置   sun-jaxws.xml可以是可选的,使其成为完全描述符   免费,但这需要指定一个默认的url模式,如   JAX-WS中的JSR-109或Jersey REST服务中的自定义模式   说明书

是否可以避免Tomcat上的sun-jaxws.xml,以及如何?

4 个答案:

答案 0 :(得分:13)

可悲的是,配置必须存在某处。根据消息来源,这是强制性的。信不信由你,the location of the sun-jaxws.xml file is hard-coded到/WEB-INF/sun-jaxws.xml(谢谢,伙计们@Metro)。

实际上,您需要控制以下类


需要做什么:

    显然不会延长
  1. WSServletContextListener。此侦听器根据sun-jaxws.xml和jaxws-catalog文件执行大多数初始化。就像我之前提到的,位置是硬编码的。所以你在这里阻力最小的路径是

    • 实现您自己的vanilla servlet侦听器(使用@WebListener)并调用new WSServletContextListener()。然后,您将自己的contextInitialized(ServletContext ctxt)contextDestroyed()方法委派给WSServletContextListener实例中的方法。

    • 使用@XmlRootElement类代表sun-jaxws文件,在运行时实例化生成监听器的文件(我将在短时间内提供此示例,现在没有时间:))。

  2. 对于这样一个可有可无的便利,IMO来说,这是一个很大的麻烦,但它应该在理论上起作用。我会写一些样本,看看他们很快就会播放。

答案 1 :(得分:3)

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

  • WEB-INF / sun-jaxws.xml
  • WSServletContextListener
  • WSServlet

不幸的是,很难省略 WEB-INF / sun-jaxws.xml 文件,但由于Servlet 3.0 API,有更简单的方法可以省略 web.xml 配置

您可以这样做:

 LinearLayout singleLayout = (LinearLayout)linearView.findViewWithTag("LinearLayout"+index);
 EditText editText = singleLayout.findViewWithTag("EditText"+index);

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

}

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

@WebListener
public class Listener implements ServletContextAttributeListener, ServletContextListener {

    private final WSServletContextListener listener;

    public Listener() {
        this.listener = new WSServletContextListener();
    }

    @Override
    public void attributeAdded(ServletContextAttributeEvent event) {
        listener.attributeAdded(event);
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent event) {
        listener.attributeRemoved(event);
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent event) {
        listener.attributeReplaced(event);
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        listener.contextInitialized(sce);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        listener.contextDestroyed(sce);
    }
}

答案 2 :(得分:2)

我通过这种方式成功发布了Web服务。我使用apache cfx在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();
    }

答案 3 :(得分:1)

您必须发布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)使它成为可选项。此外,如果将EJB 3.1公开为webservice(使用jaxws),则可以在生成的构建中看不到sun-jaxws.xml文件。