2015-06-19 51 views
1

我想創建Webservice的模擬器 WSDL的所有操作,我們可以創建只提供.xsdxml文件SOAP Web服務泛型方法。在提供xml/xsd之後,將會生成wsdl文件,因此,我只想使ServiceEndPoint類方法成爲通用的,以便單個方法爲所有操作提供響應。SOAP:如何使提供針對動態

至此我已樣本代碼來測試皁web服務如何利用彈簧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

您可以嘗試使用generics在你的方法象下面這樣:

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

爲了使這項工作,corespo請求和響應必須進行分類。

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

如果產油雖使用apache cxfjaxb生成代碼,這可以通過提供與JAXB custom binding插件inheritance與實現的接口創建請求/響應的類來完成。

例如。

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

感謝上述方案,我已經添加了jabxb2-maven-插件在Maven和請看下面的依賴性增加。請讓我知道我必須添加'<繼承:器具> mypackage.IRequest'這行 – user3403462

+0

' org.codehaus.mojo \t \t JAXB2-行家-插件 \t \t 1.6 \t \t \t \t \t \t XJC \t \t \t \t XJC \t \t \t \t \t \t \t \t <結構> \t \t $ {project.basedir}/SRC /主/資源/ \t \t <輸出目錄> $ {project.basedir}/SRC /主/ JAVA \t \t \t \t' – user3403462

+0

請參閱http://stackoverflow.com/questions/1271980/generating-a-jaxb-class-that-implements-an-interface和http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBUsing4.html – Sridhar

0

您不能,WSDL不支持通過泛型類型。 wsdl的原因基本上是用來告訴客戶端的方法和類型,客戶端可以使用wsdl生成代理,你的類型將被強制輸入。

如果你仍然想這樣做,它會挫敗wsdl的目的。您可以將序列化並作爲xml或任何字符串傳遞並在客戶端中解析/反序列化。顯然客戶不會知道這種類型,這沒有任何意義。

0

如果你想這樣做: getCountry, getStudent, getX, getY行爲(具有相同的輸入/輸出簽名)應該都指向你實現的,下面黑客可以解決單一的Web服務功能:

如果使用CXF(或類似的lib),你可以使用攔截器來處理你的請求headerscontent。如果將此攔截器註冊到適當位置,如「READ」(請參閱​​phases list),則可以將header: SOAPAction的值從getX()更改爲getCountry()

也看到了這個問題:Stackoverflow: Apache CXF - Set HTTP header