Java Web服务命名空间共享

Java Web服务命名空间共享,java,xml,web-services,soap,jax-ws,Java,Xml,Web Services,Soap,Jax Ws,我创建了一组3个javajax-wsweb服务,每个服务生成自己的WSDL文件,但它们都包含在同一个项目&web应用程序中 它们共享许多相同的请求/响应对象。例如,所有请求和响应对象都继承自BaseRequest和BaseResponse类 当我使用C#.NET创建客户机时,它会创建多个BaseRequest和BaseResponse类,每个WSDL文件一个,但我真正希望它只创建一组共享的BaseRequest和BaseResponse类 如果我让所有单独的web服务共享同一个目标名称空间,似乎

我创建了一组3个javajax-wsweb服务,每个服务生成自己的WSDL文件,但它们都包含在同一个项目&web应用程序中

它们共享许多相同的请求/响应对象。例如,所有请求和响应对象都继承自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、GetOutagentNumber请求和GetOutageableAccountsByAccountNumbersRequest
全部继承自BaseRequest。响应对象的想法也是一样。

但是,我认为您真正想要的是类型的名称空间相同。服务的名称空间实际上并不重要。只要这些类型有一个公共名称空间,就可以实现某种程度的公共性

我不能代表.NET说话,但在Java世界中,三个单独的wsdl的
wsimport
将生成三组代码。但是,如果这些类型位于wsdl/schema的公共名称空间中,则三次中的两次生成相同的代码。如果将三个wsdl生成到同一个客户机项目(jar、war等)中,将导致代码的公共位被覆盖两次

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

package com.example.services.base;

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