简体   繁体   English

有没有办法重用WebService? Java的春天

[英]Is there way to reuse WebService ? Spring in Java

I have one WebService class, which I would like to use more times with different facades/services implementing one interface. 我有一个WebService类,我想在实现一个接口的不同外观/服务上使用更多的时间。 I tried to create two beans from one class and map them onto two different addresses as two web services, however on the both addresses there are all requests targeted to second instance of WebService. 我试图从一个类创建两个bean,并将它们映射为两个Web服务,并将它们映射到两个不同的地址,但是在这两个地址上,所有请求均针对WebService的第二个实例。 It is important to implement all these web services by one client just by changing url of WSDL. 仅通过更改WSDL的URL,由一个客户端实现所有这些Web服务就很重要。 That mean all attributes should be same (targetNamespace, name, portName, serviceName) otherwise an Exception is thrown on client. 这意味着所有属性都应该相同(targetNamespace,名称,portName,serviceName),否则将在客户端引发异常。

Class looks like this: 类看起来像这样:

@WebService
public class ServiceX {
    private IFacade facade;

    public ServiceX(IFacade facade) {
         this.facade = facade;
    }
    @WebMethod
    public Result getResult(){
        return facade.getResult();
    }
}

Then I am using Spring with XML configuration like this: 然后我将Spring与XML配置一起使用,如下所示:

<wss:binding url="/serviceonews">
    <wss:service>
        <ref bean="serviceone" />
    </wss:service>
</wss:binding>

<ws:service id="serviceone">
    <ws:bean>
        <bean class="ServiceX">
            <constructor-arg ref="firstFacade" />
        </bean>
    </ws:bean>
</ws:service>

<wss:binding url="/servicetwows">
    <wss:service>
        <ref bean="servicetwo" />
    </wss:service>
</wss:binding>

<ws:service id="servicetwo">
    <ws:bean>
        <bean class="ServiceX">
            <constructor-arg ref="secondFacade" />
        </bean>
    </ws:bean>
</ws:service>

<bean id="firstFacade" class="FirstFacade" />
<bean id="secondFacade" class="SecondFacade" />

Here is web.xml: 这是web.xml:

<servlet>
    <servlet-name>WSSpringServlet</servlet-name>
    <servlet-class>com.sun.xml.ws.transport.http.servlet.WSSpringServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>WSSpringServlet</servlet-name>
    <url-pattern>/serviceonews</url-pattern>
    <url-pattern>/servicetwows</url-pattern>
</servlet-mapping>

I found the solution finally. 我终于找到了解决方案。 Everytime I tried to create 2 beans from one class the newest bean replaced the already existed. 每次我尝试从一个类创建2个bean时,最新的bean替换了已经存在的bean。 The solution of having two same WSDLs is not in creating two beans from one class, but in settings of attributes in annotation. 具有两个相同的WSDL的解决方案不是从一个类创建两个bean,而是在注释中设置属性。 I my case I needed two web services inheriting from base logic with different constructor, which was filling base logic with concrete facade/service. 以我为例,我需要两个Web服务,这些Web服务从具有不同构造函数的基本逻辑继承而来,这些Web服务是用具体的外观/服务填充基本逻辑。

@WebService(targetNamespace="http://package/", name="ServiceX", portName="ServiceXPort", serviceName="ServiceName")
public class ServiceX extends ServiceXBase {

    public ServiceX(IFacade facade) {
         super(facade);
    }

    @WebMethod
    public Result getResult(){
        return super.getResult();
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM