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

2022-09-04 23:27:55

我想创建一个公开了多个端口类型的 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。


答案 1

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


答案 2

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

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


推荐