我正在尝试在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
,以及如何?
答案 0 :(得分:13)
可悲的是,配置必须存在某处。根据消息来源,这是强制性的。信不信由你,the location of the sun-jaxws.xml file is hard-coded到/WEB-INF/sun-jaxws.xml(谢谢,伙计们@Metro)。
实际上,您需要控制以下类
需要做什么:
WSServletContextListener
。此侦听器根据sun-jaxws.xml和jaxws-catalog文件执行大多数初始化。就像我之前提到的,位置是硬编码的。所以你在这里阻力最小的路径是
实现您自己的vanilla servlet侦听器(使用@WebListener
)并调用new WSServletContextListener()
。然后,您将自己的contextInitialized(ServletContext ctxt)
和contextDestroyed()
方法委派给WSServletContextListener
实例中的方法。
使用@XmlRootElement
类代表sun-jaxws文件,在运行时实例化生成监听器的文件(我将在短时间内提供此示例,现在没有时间:))。
对于这样一个可有可无的便利,IMO来说,这是一个很大的麻烦,但它应该在理论上起作用。我会写一些样本,看看他们很快就会播放。
答案 1 :(得分:3)
要在Tomcat中支持JAX-WS,您必须配置:
不幸的是,很难省略 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文件。