我正在使用自上而下的方法开发 Web 服务,使用 JAX-WS 的 wsimport 从 WSDL 生成服务类型和接口。这提供了一个如下的端口类型接口,我实现了它。
/**
* This class was generated by the JAX-WS RI.
* JAX-WS RI 2.2.4-b01
* Generated source version: 2.2
*/
@WebService(name = "ExamplePortType", targetNamespace = "http://example.com")
public interface ExamplePortType {
/**
* @param example
* @return java.lang.String
* @throws ExampleException
*/
@WebMethod
@WebResult(name = "exampleResponse", targetNamespace = "http://example.com")
@RequestWrapper(localName = "sendExample", targetNamespace = "http://example.com", className = "com.example.SendExample")
@ResponseWrapper(localName = "sendExampleResponse", targetNamespace = "http://example.com", className = "com.example.SendExampleResponse")
public String sendExample(
@WebParam(name = "example", targetNamespace = "http://example.com")
ExampleRequest example)
throws ExampleException
;
}
将此服务添加到应用程序服务器(在我的情况下为 Tomcat)的正常方法似乎是将实现类作为 servlet 添加到 web.xml 并将 WSServletContextListener 添加为侦听器。粗略地说,似乎在初始化上下文时,侦听器构造了 ServletAdapters,它包装了实现 bean 并将它们添加到由瘦 WSServlet 调用的 WSServletDelegate。然后,对您的实现的请求由 WSServlet 处理,并由委托根据您设置的任何 URL 模式传递给您的 bean。
有没有办法以编程方式完成上述操作?我想要一个接受上述接口实例并返回给我一个 Servlet 实例的方法,如果在 ServletContext 中注册,它会将适当的请求路由到包装的实现。就像是:
Servlet exampleServlet = new ServletAdapter().wrap(new ExamplePortTypeImpl());
一项要求是我不能依赖静态配置文件(例如 web.xml 或 sun-jaxws.xml)。JAX-WS 或相关库(即:Axis2 等)是否提供这种功能?
如果有不清楚的地方道歉;这是我第一次来这里:)。任何指针表示赞赏。
目前使用 JAX-WS 2.1、Tomcat 7、Servlet 3.0。