【问题标题】:Publishing multiple ports with one service using JAX-WS 2.0 and @WebService使用 JAX-WS 2.0 和 @WebService 通过一项服务发布多个端口
【发布时间】:2011-04-07 21:20:21
【问题描述】:

我想创建一个公开了多种端口类型的 SOAP 服务,其中每种端口类型都有一个单独的接口。我正在尝试使用 JAX-WS 2.0 来做到这一点。

例子:

interface A:
    ObjectA get(String name);

interface B:
    ObjectB get(String name);

Service:
    port A
          get
    port B
          get

我遇到的问题是 @WebService 是使用单个类/接口定义的,所以我能够设置它的唯一方法是拥有两个独立的服务。每个服务都由带有@WebService 注解的单独类实现。

我想使用同一个服务公开两个端口,以明确它们都是同一个 API 的一部分。这可能吗?

真的,我想要的是在 WSDL 中支持某种嵌套的命名空间,这样我就可以在不同的命名空间中使用相同的方法。我将拥有用于彼此相邻的不同类型数据的 get/set/delete 方法,但我宁愿不要将它们全部放在与 getA/getB 等相同的大接口中,因为我希望能够稍后添加新的数据类型,而不强制所有客户端从新的 WSDL 集重新生成。欢迎任何有关实现此目的的提示,即使这意味着使用另一种从 java 代码生成 WSDL 的方式。

【问题讨论】:

    标签: java web-services soap jax-ws


    【解决方案1】:

    Web 服务不接受函数重载。我的意思是不能进行同名的多个操作。你需要相同的端口和相同的操作名称来返回不同的类对象,你可以尝试以下。

    界面

    public interface OB {
    public Object get(String name);
    }
    

    网络服务

    @Override
    @WebMethod
    public Object get(String name) {
        if(name.equals("A")){
            return new ObjectA("A");
        }else if(name.equals("B")){
            return new ObjectB(1);
        }else {
            return null;
        }
    }
    

    在这种情况下,您必须确定需要从请求中返回哪个类对象,然后构造它并返回是其中一种方式。

    【讨论】:

      【解决方案2】:

      我建议不要将输入参数定义为字符串,而应考虑为这些方法中的每一个定义一个 RequestType(xsd 中的复杂类型),这将为您带来以下优势:
      1.如果你有一个定义的复杂类型,那么请求可以独立进化,你在复杂类型中添加更多元素,而web方法签名在wsdl中不会改变。
      2. 您可以为上面的 2 个方法使用相同的名称(比如 get(...)),而它们都有不同的请求类型。您可以通过在 xsd(具有相同命名空间)中定义具有不同请求名称的两个不同元素来实现此目的。如果您希望请求元素具有相同的名称,那么您必须考虑在不同的命名空间中定义它们。这样在 OOP 中,它们将在不同的包中生成,因此它们可以具有相同的名称。

      另一方面,我建议让您的操作名称和消息名称尽可能独特和具体。

      【讨论】:

        【解决方案3】:

        您可以尝试重命名其中一个方法,并在@WebMethod 注释中显式设置操作或操作名称字段。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-21
          • 2011-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多