Java 不带sun-jaxws.xml的Tomcat上的JAX-WS Web服务
在Tomcat上部署基于JAX-WS的Web服务时,我试图最小化所需的配置。随着Servlet3.0(由Tomcat7+支持)的引入,Java 不带sun-jaxws.xml的Tomcat上的JAX-WS Web服务,java,web-services,jakarta-ee,tomcat,jax-ws,Java,Web Services,Jakarta Ee,Tomcat,Jax Ws,在Tomcat上部署基于JAX-WS的Web服务时,我试图最小化所需的配置。随着Servlet3.0(由Tomcat7+支持)的引入,web.xml可以被抛弃,但是仍然有sunJAXWS.xml。这很有趣: 当然,通过使用jax-ws注释,甚至配置 可以将sun-jaxws.xml设置为可选,使其完全符合描述符 免费,但这需要指定默认的url模式,如 JSR-109或定制模式,如JAX-WS中的Jersey REST服务 规格 在Tomcat上是否可以避免sunjaxws.xml,以及如何避免?
web.xml
可以被抛弃,但是仍然有sunJAXWS.xml
。这很有趣:
当然,通过使用jax-ws注释,甚至配置
可以将sun-jaxws.xml设置为可选,使其完全符合描述符
免费,但这需要指定默认的url模式,如
JSR-109或定制模式,如JAX-WS中的Jersey REST服务
规格
在Tomcat上是否可以避免
sunjaxws.xml
,以及如何避免?您必须发布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)使其成为可选的。此外,如果将EJB3.1公开为webservice(使用jaxws),则在生成的构建中看不到sun-jaxws.xml文件。遗憾的是,配置必须存在于某个地方。根据消息来源,这是强制性的。信不信由你,请转到/WEB-INF/sun-jaxws.xml(谢谢,伙计们@Metro) 有效地,您需要控制以下类别
需要做什么:
WSServletContextListener
显然不会被扩展。此侦听器根据sun-jaxws.xml和jaxws目录文件执行大多数初始化。正如我前面提到的,位置是硬编码的。所以你在这里阻力最小的途径是
- 实现您自己的香草servlet侦听器(使用
)并调用@WebListener
。然后将自己的新的WSServletContextListener()
和contextInitialized(ServletContext ctxt)
方法委托给contextdestromed()
实例中的方法WSServletContextListener
- 使用将表示sun jaxws文件的
类在实例化侦听器时动态生成该文件(我将在稍后提供一个示例,现在没有时间:)@XmlRootElement
在我看来,这样一种可有可无的便利是很麻烦的,但在理论上它应该是可行的。我将很快编写一些示例,看看它们是如何运行的。我已经通过这种方式成功地发布了web服务。我使用ApacheCfx在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();
}
要在Tomcat中获得JAX-WS支持,您必须配置:
- WEB-INF/sun jaxws.xml
- WSServletContextListener
- WSServlet
@WebServlet(name = "ServiceServlet" , urlPatterns = "/service", loadOnStartup = 1)
public class Servlet extends WSServlet {
}
及
我已经在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>
谢谢你的回答。然而,我不想使用Endpoint.publish(..)基础设施,因为它代表一个轻量级HTTP服务器——如果我想这样,我就不会使用Tomcat。接下来,Tomcat是一个servlet容器;换句话说,您不能在Tomcat上部署EJB。我知道这在Glassfish中很有用,但那是因为Glassfish符合JSR-109。默认情况下Tomcat不支持EJB。例如,你应该考虑使用TomEE。我提到EJB只是为了作为一个示例来演示不需要sun-jaxws.xml(这不是强制性的)。就我个人而言,我总是更喜欢完整的应用程序服务器(比如Glassfish)而不是servlet容器(比如Tomcat)。但是,我们的客户机使用Tomcat,我很好奇是否可以简化在Tomcat上部署Web服务所需的配置。因此,我的问题是关于Tomcat的,而不是TomEE或Glassfish。+1,不知道sun jaxws.xml
的位置是硬编码的:)那么默认的url模式如何使sun jaxws.xml
成为可选的(参见我在问题中引用的博客),米尔延米基奇仔细阅读了这篇文章,这一切似乎都是一厢情愿的想法,而不是什么参考:他的博客文章中的链接已经死了。我仍然设法找到了他所指的源代码,但仍然表明需要sun-jaxws.xml。谢谢你的回答。我应该用“JAX-WSRI”或“Metro”标记我的问题,因为sunjaxws.xml
与这些实现相关。ApacheCXF是JAX-WS的不同实现,因此它与sunJAXWS.xml
没有任何关系。我知道我们可以省略web.xml
文件,这在问题的文本中已经提到过。问题是关于省略sunjaxws.xml
file.ah好的,但是我为其他可能不知道如何省略web.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>