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

3gtaxfhh  于 2023-08-02  发布在  Java
关注(0)|答案(4)|浏览(115)

在Tomcat上部署基于JAX-WS的Web服务时,我试图最小化所需的配置。随着Servlet 3.0的引入(Tomcat 7+支持),web.xml可以被抛出,但仍然存在sun-jaxws.xml。这个blog post很有趣:
当然,通过使用jax-ws注解,甚至配置sun-jaxws.xml也可以是可选的,使其完全不受描述符的限制,但这需要在JAX-WS规范中指定一个默认的url模式(如JSR-109)或自定义模式(如Jersey REST服务)。
在Tomcat上是否可以避免sun-jaxws.xml,以及如何避免?

qgelzfjb

qgelzfjb1#

可悲的是,配置必须存在 * 某处 *。这是强制性的,根据来源。信不信由你,sun-jaxws.xml文件的位置被硬编码到/WEB-INF/sun-jaxws. xml(谢谢,guys @ Metro)。

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

  • public final class WSServletContextListener
  • public class WSServlet
    需要发生的事情:
  • WSServletContextListener显然不会被扩展。这个侦听器执行sun-jaxws.xml和jaxws-catalog文件的大部分初始化。就像我之前提到的,位置是硬编码的。所以你的最小阻力就是
  • 实现您自己vanilla servlet侦听器(使用@WebListener)并调用new WSServletContextListener()。然后将自己的contextInitialized(ServletContext ctxt)contextDestroyed()方法委托给WSServletContextListener示例中的方法。
  • 使用一个@XmlRootElement类在监听器示例化时动态生成文件,该类将表示sun-jaxws文件(我将在稍后提供一个示例,现在没有时间:)。

这是一个很大的麻烦,这样一个可有可无的方便,海事组织,但它应该在理论上工作。我会写一些样本,看看他们如何发挥不久。

oug3syen

oug3syen2#

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

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

不幸的是,很难省略WEB-INF/sun-jaxws.xml文件,但由于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>

s6fujrry

s6fujrry3#

通过这种方式,我已经成功地发布了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();
    }

字符串

e0uiprwp

e0uiprwp4#

您必须发布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公开为Web服务(使用jaxws),则在生成的构建中看不到sun-jaxws.xml文件。

相关问题