我想创建一个暴露多个端口类型的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的方式。
答案 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;
}
}
在这种情况下,您必须确定需要从请求返回哪个类对象,然后构造它并返回是其中一种方式。