Веб-служба 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).
эффективно, вам нужно взять под контроль следующие классы
что нужно сделать:
-
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-файл в сгенерированной сборке.