2017-06-21 54 views
1

我正在爲Spring-WS項目苦苦掙扎。沒有端點適配器。您的端點是否使用@Endpoint進行了註釋,還是實現了像MessageHandler或PayloadEndpoint這樣的受支持的接口?

在我的Endpoint類中,如果我沒有指定我正在接收/返回一個JAXBElement,我得到以下錯誤:沒有端點適配器;您的端點是否使用@Endpoint進行了註釋,還是實現了像MessageHandler或PayloadEndpoint這樣的受支持的接口?

舉例來說,此方法將工作確定:

@PayloadRoot(namespace = NAMESPACE_URI, localPart = "pingRequest") 
@ResponsePayload 
public JAXBElement<PingResponse> pingRequest(@RequestPayload JAXBElement<PingRequest> request) { 
    PingResponse response = service.ping(); 
    return new JAXBElement<PingResponse>(request.getName(), PingResponse.class, response); 
} 

但高於此人會導致錯誤提到:

@PayloadRoot(namespace = NAMESPACE_URI, localPart = "pingRequest") 
@ResponsePayload 
public PingResponse pingRequest(@RequestPayload PingRequest request) { 
    return service.ping(); 
} 

有什麼辦法,我簡單地返回我想要的元素而不是將它包裝在JAXBElement中?

我有幾個方法聲明,我注意到當我使用從另一個XSD導入的元素時,我只需要將它們包裝爲JAXBElements。

舉例來說,如果我有像這樣定義我的XSD:

<xs:element name="pingRequest"> 
    <xs:complexType> 
     <xs:sequence> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 
<xs:element name="pingResponse"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="return" type="xs:string" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

它將工作沒有簽名指定的JAXBElement。但是,如果我想導出,並在這樣的另一個XSD使用它:

service.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:tns="http://example.com/service" 
    elementFormDefault="qualified" 
    targetNamespace="http://example.com/service" 
    xmlns:customlib="http://example.com/customlib"> 

    <xs:import namespace="http://example.com/customlib" 
    schemaLocation="../customlib.xsd" /> 

    <xs:element name="pingRequest" type="customlib:pingRequest" /> 

    <xs:element name="pingResponse" type="customlib:pingResponse" /> 

customlib.xsd:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:tns="http://example.com/customlib" 
    elementFormDefault="unqualified" 
    targetNamespace="http://example.com/customlib"> 

    <xs:complexType name="pingRequest"> 
    </xs:complexType> 

    <xs:complexType name="pingResponse"> 
     <xs:sequence> 
      <xs:element name="return" type="xs:string" /> 
     </xs:sequence> 
    </xs:complexType> 

</xs:schema> 

那麼它不會工作。我不知道該如何谷歌才能獲得所需的效果。

回答

1

JAXBElement在這裏,因爲你有自定義類型。如果你指出nillable = true,你會得到相同的結果。正如你已經明白你需要做你的請求和響應簡單的元素,所以不需要JAXBElement包裝器。

將真實數據模型放入一個xsd及其包裝器(如請求和響應元素)是另一個好習慣。在這種情況下,您可以使用不同的包裝器更改數據模型的表示形式,而無需更改數據模型本身。

+0

我有一個自定義類型的唯一原因是因爲否則我不能從另一個XSD導入它們。是否有可能使用常規類型,所以我不必使用JAXBElement包裝?我想避免使用JAXBElements,同時也能夠將XSD導入到其他XSD中。如果有必要,我可以修改元素,但我確實希望避免重複它們(這就是爲什麼我試圖導入它們) – facundop

相關問題