有没有办法重用Web服务? Java中的Spring

时间:2013-12-09 16:18:52

标签: java spring web-services web.xml

我有一个WebService类,我希望使用不同的Facade / services实现一个接口。我尝试从一个类创建两个bean并将它们映射到两个不同的地址作为两个Web服务,但是在这两个地址上都有针对WebService的第二个实例的所有请求。仅通过更改WSDL的URL来实现一个客户端的所有这些Web服务是很重要的。这意味着所有属性应该相同(targetNamespace,name,portName,serviceName)否则会在客户端上抛出异常。

类看起来像这样:

@WebService
public class ServiceX {
    private IFacade facade;

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

然后我使用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" />

这是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>

1 个答案:

答案 0 :(得分:1)

我终于找到了解决方案。每次我尝试从一个类创建2个bean时,最新的bean替换已经存在的bean。 具有两个相同WSDL的解决方案不是从一个类创建两个bean,而是在注释中的属性设置中。我的情况我需要两个从基础逻辑继承的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();
    }
}