Tomcat 上的 JAX-WS Web service without sun-jaxws.xml

2022-09-04 01:36:03

我试图在 Tomcat 上部署基于 JAX-WS 的 Web 服务时最小化所需的配置。随着Servlet 3.0(由Tomcat 7 +支持)的引入,可以抛弃,但仍然存在.这篇博客文章很有趣:web.xmlsun-jaxws.xml

当然,通过使用 jax-ws 注释,甚至配置 sun-jaxws.xml都可以设置为可选的,使其完全没有描述符,但这需要指定一个默认的 url 模式,如 JSR-109 或自定义模式,如泽西岛 REST 服务,在 JAX-WS 规范中。

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


答案 1

可悲的是,配置必须存在于某个地方。根据来源,这是强制性的。信不信由你,sun-jaxws.xml文件的位置被硬编码为/WEB-INF/sun-jaxws.xml(谢谢,伙计们@Metro)。

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


需要做什么:

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

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

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

IMO,对于这样一个可有可无的便利来说,这是一个很大的麻烦,但它应该在理论上起作用。我会写一些示例,看看它们很快就会如何玩。


答案 2

要在 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 {

}

@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);
    }
}

我已经在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>

推荐