【发布时间】:2015-09-18 07:25:55
【问题描述】:
我想在 WebSphere 7 上支持两个版本的 Web 服务。虽然这两个 Web 服务单独工作都很好,但是当两者都存在时只有一个正在侦听。
我将以下两个类和 web.xml 打包在同一个 war-file 中(在一个 ear-file 中)。
MyWebServiceV1Impl.java
package mywebservice._2015._01;
@WebService(name = "MyWebService", targetNamespace = "http://mywebservice.com/2015/01", portName = "MyWebServicePort", serviceName = "MyWebService")
public class MyWebServiceV1Impl implements MyWebService {
// implementation of webmethods
}
MyWebServiceV2Impl.java
package mywebservice._2015._02;
@WebService(name = "MyWebService", targetNamespace = "http://mywebservice.com/2015/02", portName = "MyWebServicePort", serviceName = "MyWebService")
public class MyWebServiceV2Impl implements MyWebService {
// implementation of webmethods
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<display-name>WebService1</display-name>
<servlet-name>WebService1</servlet-name>
<servlet-class>mywebservice._2015._01.MyWebServiceV1Impl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WebService1</servlet-name>
<url-pattern>v1</url-pattern>
</servlet-mapping>
<servlet>
<display-name>WebService2</display-name>
<servlet-name>WebService2</servlet-name>
<servlet-class>mywebservice._2015._02.MyWebServiceV2Impl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WebService2</servlet-name>
<url-pattern>v2</url-pattern>
</servlet-mapping>
</web-app>
Web 服务是自顶向下设计的:从 wsdl 开始。我认为这与 Web 服务的名称有关,但我不知道要更改什么,因此两个服务在部署时都在侦听,而无需更改 wsdl 中的 Web 服务的名称。
我也尝试在 WebService-annotation 中指定 endpointInterface,但这也无济于事。
我错过了什么?
【问题讨论】:
-
您需要提供不同的serviceName。尝试将您的第二个服务注释更改为:
serviceName = "MyWebServiceV2"。从web.xml中删除这些servlet和servlet-mapping条目。通过 URL 访问您的服务:http://hostname/appName/serviceName -
感谢您的回复!更改
serviceName不起作用,因为实现不再与源 wsdl 匹配,并且不允许我更改 wsdl。 -
对于你不同的servlet映射到工作服务的portName必须至少不同,检查你是否可以在第二个实现中拥有
portName = "MyWebServicePort2"。另一种解决方案是在一个 EAR 中创建 2 场战争。 -
我已经解决了我的问题,使用第一个建议,将服务注释更改为
serviceName = "MyWebServiceV2"。我希望可以在不更改 wsdl 的情况下做到这一点。 -
我已经提供了它作为答案,所以你可以接受它。
标签: java web-services websphere jax-ws websphere-7