Веб-служба JAX-WS на Tomcat без sun-jaxws.XML

Я пытаюсь минимизировать требуемую конфигурацию при развертывании веб-службы на основе JAX-WS на Tomcat. С введением сервлета 3.0 (поддерживается Tomcat 7+), web.xml можно выкинуть, но есть еще sun-jaxws.xml. Это блоге Это интересно:

конечно, с использованием аннотаций jax-ws, даже конфигурации солнце-jaxws.xml можно сделать необязательным, сделав его полностью дескриптором бесплатно, но для этого требуется указать значение по умолчанию url-шаблон, как в JSR-109 или пользовательский шаблон, как в службах Jersey REST, в JAX-WS спецификация.

можно ли избежать sun-jaxws.xml на Tomcat, и как?

4 ответов


к сожалению, конфигурация должны exist где-то. Это обязательно, согласно источнику. Веришь или нет,расположение солнца-jaxws.XML-файл-это жестко to/WEB-INF / sun-jaxws.xml (спасибо, ребята @ Metro).

эффективно, вам нужно взять под контроль следующие классы


что нужно сделать:

  1. WSServletContextListener очевидно, не будет продлен. Этот прослушиватель выполняет большинство инициализаций для sun-jaxws.xml и jaxws-файл каталога. Как я упоминал ранее, местоположение жестко закодировано. Так что ваш путь наименьшего сопротивления здесь

    • реализуйте свой собственный прослушиватель сервлетов vanilla (с @WebListener) и назвать new WSServletContextListener(). Затем вы делегируете свой собственный contextInitialized(ServletContext ctxt) и contextDestroyed() методы к тем, в вашем экземпляре WSServletContextListener.

    • создайте файл при создании экземпляра слушателя, на лету, используя @XmlRootElement класс, который будет представлять файл sun-jaxws(я предоставлю образец этого через короткое время, у меня нет времени прямо сейчас :) ).

это много проблем для такого необязательного удобства, ИМО, но это должно работать в теории. Я напишу несколько образцов и посмотрю, как они будут играть в ближайшее время.


чтобы иметь поддержку JAX-WS в Tomcat, вы должны настроить:

  • WEB-INF / sun-jaxws.в XML
  • WSServletContextListener
  • WSServlet

к сожалению, трудно опустить WEB-INF / sun-jaxws.в XML файл, но есть более простой способ опустить web.в XML конфигурация из-за API сервлета 3.0.

вы можете сделать что-то подобное это:

@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>

таким образом, я успешно опубликовал веб-службы. Я использовал 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();
    }

вы должны опубликовать веб-службу. Вы можете реализовать 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 как веб-сервис (с jaxws), вы не видите sun-jaxws.xml-файл в сгенерированной сборке.