如何在 websphere 上部署同一个 web 服务的多个版本

How to deploy multiple versions of the same web service on websphere

我想在 WebSphere 7 上支持一个 Web 服务的两个版本。虽然两个 Web 服务单独工作都很好,但是当两者都存在时只有一个在监听。

我将以下两个 类 和 web.xml 打包在同一个 war 文件中(在 ear 文件中)。

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 注释中指定端点接口,但这也无济于事。

我错过了什么?

您需要提供不同的serviceName。尝试将您的第二个服务注释更改为:serviceName = "MyWebServiceV2"。从 web.xml 中删除这些 servlet 和 servlet 映射条目。通过 URL 访问您的服务:http://hostname/appName/serviceName.

为了使您的不同 servlet 映射工作,服务必须至少在 portName 中有所不同,检查您是否可以在 portName = "MyWebServicePort2" 中有第二个实现。

另一个解决方案是在一个 EAR 中创建 2 个战争。