使用JAX-WS 2.0和@WebService使用一个服务发布多个端口

时间:2010-09-03 14:17:36

标签: java web-services soap jax-ws

我想创建一个暴露多个端口类型的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中有一些嵌套的命名空间支持,所以我可以在不同的命名空间中使用相同的方法。我将获取/设置/删除彼此相邻的不同类型数据的方法,但我宁愿不将它们全部放在与getA / getB相同的大接口中,依此类推,因为我希望能够稍后添加新数据类型而不强制所有客户端从新的WSDL集重新生成。有关实现此目的的任何提示都是受欢迎的,即使它意味着使用另一种从java代码生成WSDL的方式。

3 个答案:

答案 0 :(得分:1)

您可以尝试重命名其中一个方法,并在@WebMethod注释中明确设置action或operationName字段。

答案 1 :(得分:1)

我建议不要将输入参数定义为String,您应该考虑为每个方法定义一个RequestType(xsd中的复杂类型),这样可以提供以下优点:
1.如果您具有已定义的复杂类型,则在复杂类型中添加更多元素时,请求可以独立发展,而wsdl中的Web方法签名不会更改。 2.你可以使用与上面两种方法相同的名称(比如get(...)),而它们都有不同的请求类型。您可以通过使用不同的请求名称定义xsd(具有相同名称空间)中的两个不同元素来实现此目的。如果要为请求元素使用相同的名称,则必须考虑在不同的名称空间中定义它们。在OOP中,它们将在不同的包中生成,因此它们可以具有相同的名称。

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

答案 2 :(得分:0)

Webservices中不接受函数重载。我的意思是不能用同名的多个操作。您需要相同的端口和相同的操作名称来返回不同的类Object,您可以尝试以下操作。

接口

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

web服务

@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;
    }
}

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