Web服务命名空间共享

时间:2014-04-01 15:14:43

标签: java xml web-services soap jax-ws

我创建了一组3个Java JAX-WS Web服务,每个服务都生成自己的WSDL文件,但它们都包含在同一个项目中。网络应用。

他们共享许多相同的请求/响应对象。例如,所有的请求&响应对象继承自BaseRequest和BaseResponse类。

当我使用C#.NET创建客户端时,它会创建多个BaseRequest和BaseResponse类,每个WSDL文件一个,但我真正希望它只创建一组共享的BaseRequest和BaseResponse类。

如果我让所有单独的Web服务共享相同的目标命名空间,我似乎可以完成此任务。我的问题是,这是否可以接受&适合做(在生成不同WSDL文件的多个Web服务之间共享相同的命名空间)?

这是一些示例Java代码,因此您可以了解我的Web服务的外观:

@WebService(name = "BasicServicePortType", targetNamespace = "http://com.vectren.ws.basic.impl")
public interface BasicService
{
    @ResponseWrapper(localName = "LogInResponseWrapper")
    public LogInResponse logIn(@WebParam(name="request")LogInRequest request);

    @ResponseWrapper(localName = "LogOutResponseWrapper")
    public LogOutResponse logOut(@WebParam(name="request")LogOutRequest request);
}


@WebService(name = "ContentServicePortType", targetNamespace = "http://com.vectren.ws.content.impl")
public interface ContentService
{
    @ResponseWrapper(localName = "GetContentResponseWrapper")
    public GetContentResponse getContentList(@WebParam(name="request")GetContentRequest request);
}

@WebService(name = "OutageServicePortType", targetNamespace = "http://com.vectren.ws.outage.impl")  
public interface OutageService
{
    @ResponseWrapper(localName = "GetOutageNumbersResponseWrapper")
    public GetOutageNumbersResponse getOutageNumbers(@WebParam(name="request")GetOutageNumbersRequest request);

    @ResponseWrapper(localName = "GetOutageableAccountsByAccountNumbersResponseWrapper")
    public GetOutageableAccountsResponse getOutageableAccountsByAccountNumbers(@WebParam(name="request")GetOutageableAccountsByAccountNumbersRequest request);
}

注意:在每种情况下,请求/响应对象都从相同的“BaseRequest”/“BaseResponse”类继承。例如,LogInRequest,LogOutRequest,GetContentRequest,GetOutageNumbersRequest,& GetOutageableAccountsByAccountNumbersRequest 所有都继承自BaseRequest。响应对象的想法相同。

1 个答案:

答案 0 :(得分:1)

我认为你真正想要的是 types 的命名空间是一样的。 服务的名称空间并不重要。只要类型具有共同的命名空间,您就可以达到某种程度的通用性。

我不能代表.NET,但在Java世界中,三个独立的WSDL中的wsimport将生成三组代码。但是,如果类型位于WSDL /模式的公共名称空间中,则三次中的两次生成相同的相同代码。如果从三个WSDL生成到同一个客户端项目(jar,war等)应该导致两次代码的公共位被覆盖。

在公共类中,您可以注释它们以具有特定的xml命名空间。如果我记得,不这样做会导致它们在生成的WSDL关联的XSD中的服务的名称空间中声明。

package com.example.services.base;

@XmlRootElement
@XmlType(namespace="http://services.example.com/base")
public class BaseRequest {
//...
}