我正在尝试创建 Webservice Simulator ,只需提供.xsd
或xml
文件即可创建 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>
答案 0 :(得分:0)
您可以尝试在方法中使用generics
,如下所示:
public <T extends IRequest, R extends IResponse> R getCountry(@RequestPayload T request) {
为了使这项工作,相应的请求和响应必须是分类。
class GetStudentRequest implements IRequest{}
class GetStudentResponse implements IResponse{}
如果使用apache cxf
或jaxb
生成代码,可以通过提供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),您可以使用拦截器来操纵您的请求headers
和content
。如果您将此拦截器注册到“READ”(请参阅phases list)这样的适当位置,则可以将header: SOAPAction
值从getX()
更改为getCountry()
。