2012-08-24 103 views
0

我正在使用自顶向下的方法处理Web服务,使用JAX-WS'wsimport从WSDL生成服务类型和接口。这提供了一个端口类型的接口,如下所示,我执行。以编程方式获取JAX-WS WebService实现的Servlet实例?

/** 
* 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),是实现类添加到web.xml的servlet和添加WSServletContextListener作为一个倾听者。非常粗略的看起来,在初始化上下文时,监听器会构造包装实现bean的ServletAdapter,并将它们添加到由WSServlet调用的WSServletDelegate。然后由WSServlet处理对您的实现的请求,并由代理根据您设置的任何URL模式传递给您的bean。

有没有办法做到以上编程?我想要一个接受上述接口的实例并返回给我一个Servlet的实例的方法,如果在ServletContext中注册的话,会将相应的请求路由到包装的实现。喜欢的东西:

Servlet exampleServlet = new ServletAdapter().wrap(new ExamplePortTypeImpl()); 

的一个要求是,我不能依靠静态配置文件(如web.xml中或阳光jaxws.xml)。 JAX-WS或相关库(即:Axis2等)是否提供这种功能?

道歉,如果有什么不明确;这是我第一次来:)。任何指针赞赏。

当前使用JAX-WS 2.1,Tomcat 7,Servlet 3.0。

回答

1

好的,经过大量的实验,我已经能够将一些有用的东西放在一起。为了文档的缘故,我会在这里发布它。

基本上,我通过模拟或重新实现JAX-WS如何从它的WSServletContextListener创建它的WSServlet来实现此目的。不幸的是,我无法找到一个更容易或更好的支持和直接的方式来做到这一点。

基本上,我的工厂使用它的WSEndpoint.create()方法创建一个WSEndpoint。 create()将我试图包装的WebService实现的Class作为输入。大多数其他输入为空以鼓励WSEndpoint使用默认值或尝试从实现类中的注释中提取一些配置。

然后,我使用新的ServletAdapterList()使用先前创建的WSEndpoint创建ServletAdapter。为此,由于我为每个实现类创建了一个Servlet,因此适配器的名称无关紧要,并且可以将其配置为将所有流量发送到实现,而不管URL如何。

然后,我使用先前的ServletAdapter的单例列表创建一个新的WSServletDelegate()。这里唯一的技巧是,看起来JAX-WS至少对于这一步和下一步都有一个不好的习惯,即在ServletContext的初始参数中存储一些值。它也没有正确地检查空值,尽管如果参数不在上下文中它有默认值使用。所以我最终创建了一个ServletContext的虚拟实现,我将它传递给WSServletDelegate构造函数,使其感觉像是在查找init参数。

最后,我创建了一个HttpServlet的实现,它将请求转发到WSServletDelegate,类似于WSServlet的做法。由于WSServlet再次将委托对象存储在ServletContext初始参数中,我发现重新实现它的功能比混淆现有的WSServlet更容易。这个HttpServlet的实现可以像任何普通的Servlet一样对待,它将接受并处理SOAP web服务调用。

相关问题