SOAP:如何创建动态地为WSDL的所有操作提供响应的泛型方法

时间:2015-06-19 08:24:26

标签: java spring web-services soap wsdl

我正在尝试创建 Webservice Simulator ,只需提供.xsdxml文件即可创建 SOAP Webservices 。在提供xml/xsd之后,将生成wsdl文件,因此我只是尝试使ServiceEndPoint类方法通用,以便单个方法为所有操作提供响应。

到目前为止,我已经制作了示例代码,以测试如何使用Spring Web服务生成soap Web服务并使用 JAXP API 。 我想使以下方法通用,以便它提供对所有操作的响应:

@PayloadRoot(namespace = NAMESPACE_URI, localPart = "getStudentRequest")
@ResponsePayload
public GetStudentResponse getCountry(@RequestPayload GetStudentRequest request) {
    GetStudentResponse response = new GetStudentResponse();
    response.setStudent(studentUtility.getStudent(request.getStudentId()));
    return response;

截至目前,上述方法已绑定到特定操作getStudentRequest 请帮助我知道如何使上述方法通用,以便它为所有操作提供响应。

请在下面找到我生成xsd文件的WSDL文件:

<xs:element name="getStudentRequest">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="studentId" type="xs:int"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:element name="getStudentResponse">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="student" type="tns:student"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:complexType name="student">
    <xs:sequence>
        <xs:element name="studentId" type="xs:int"/>
        <xs:element name="name" type="xs:string"/>
        <xs:element name="age" type="xs:int"/>
        <xs:element name="class" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

3 个答案:

答案 0 :(得分:0)

您可以尝试在方法中使用generics,如下所示:

public <T extends IRequest, R extends IResponse> R getCountry(@RequestPayload T request) {

为了使这项工作,相应的请求和响应必须是分类。

class GetStudentRequest implements IRequest{}
class GetStudentResponse implements IResponse{}

如果使用apache cxfjaxb生成代码,可以通过提供JAXB custom binding inheritance插件来创建具有接口实现的请求/响应类。

例如。

<inheritance:implements>mypackage.IRequest</inheritance:implements> 

答案 1 :(得分:0)

你不能,WSDL不支持传递通用类型。 wsdl的原因主要用于告知客户端方法和类型,客户端可以使用wsdl生成代理,并且您的类型将被强类型化。

如果你仍然想这样做,那就违背了wsdl的目的。您可以序列化并传递为xml或任何字符串,并在客户端中解析/反序列化。显然客户不会知道这种类型,这没有任何意义。

答案 2 :(得分:0)

如果你想这样做: getCountry, getStudent, getX, getY个动作(具有相同的输入/输出签名)应该都指向您实现的单个Web服务功能,下面的黑客可以是解决方案:

如果您使用CXF(或类似的lib),您可以使用拦截器来操纵您的请求headerscontent。如果您将此拦截器注册到“READ”(请参阅​​phases list)这样的适当位置,则可以将header: SOAPAction值从getX()更改为getCountry()

另请参阅此问题:Stackoverflow: Apache CXF - Set HTTP header