我有一个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>
答案 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();
}
}