2009-11-12 125 views
2

在spring-ws中使用Jaxb2Marschaller時,是否可以使用原始或基本Java類型創建Web服務操作?例如,看起來像這樣的一個方法:Jaxb2Marshaller和原始類型

@Override 
@PayloadRoot(localPart = "AddTaskRequest", namespace = "http://example.com/examplews/") 
public long addTask(final Task task) throws AddTaskFault { 
// do something 
return 0; 
} 

我使用maven jaxws插件從我的WSDL生成接口和模型類。當我嘗試調用web服務我得到以下錯誤:

java.lang.IllegalStateException:沒有適配器端點[...]:請問您的端點實現類似的MessageHandler或PayloadEndpoint

支持的接口我發現,如果我改變的方法是:

@Override 
@PayloadRoot(localPart = "AddTaskRequest", namespace = "http://example.com/examplews/") 
public JAXBElement<Long> addTask(final JAXBElement<Task> task) throws AddTaskFault { 
final ObjectFactory objectFactory = new ObjectFactory(); 
return objectFactory.createAddTaskResponse(0L); 
} 

我能叫它 - 但這個簽名是不是與Maven的JAXWS插件生成的接口兼容。

我能做些什麼來配置spring-ws能夠使用第一種實現或告訴maven jaxws插件生成接口的第二種變體?

更新:我的相關彈簧WS配置條目看起來像:

<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
<property name="contextPath" value="com.example.examplews" /> 
</bean> 

<bean class="org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter"> 
<constructor-arg ref="marshaller" /> 
</bean> 

<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping"> 
<property name="order" value="1" /> 
</bean> 
+0

您可以發佈您的Spring XML配置?我有一個類似的問題,我通過配置解決了它......這是一段時間後,但如果你張貼你的我可以檢查我的正確配置是什麼,併發布差異。 – laura 2009-11-12 14:37:50

回答

4

春-WS試圖一個EndpointAdapter匹配的Endpoint,它會檢查所有的端點方法的參數,加上它的返回值,是Jaxb2Marshaller已知的類型,而long不會。從概念上講,這是有道理的,因爲JAXB不知道如何在沒有更多信息(這是JAXBElement進來的地方)的情況下將long轉換爲XML。

你應該認識到Spring-WS是而不是這是一個JAX-WS的實現,並沒有虛僞的地方。您無法真正期待採用JAX-WS生成的構件,並期望它們只能在Spring_WS中工作,儘管在很多情況下Spring-WS足夠靈活來處理它。

+0

好吧,那麼使用自頂向下方法使用spring ws的最佳方式是什麼?我想使用maven生成必要的類,以便我只需實現Web服務接口。 – 2009-11-12 14:53:56

+0

我知道沒有生成工具可以做到這一點,但是Spring-WS非常輕巧,所以你不會真的節省那麼多的輸入。 – skaffman 2009-11-12 14:58:22

+0

所以你會建議使用自下而上,只寫我的代碼我的Web服務接口? – 2009-11-12 15:03:10

0

下面是我的配置中的所有相關信息,因爲我無法確切地告訴你可以改變什麼,它們有很大不同,並且自從我這樣做以來已經過了一年半了。

<bean id="schemaCollection" 
     class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection"> 
     <property name="xsds" value="/my.xsd" /> 
     <property name="inline" value="true" /> 
    </bean> 

    <bean id="marshallingEndpoint" 
     class="....EndpointImpl"> 
    </bean> 

    <oxm:jaxb2-marshaller id="marshaller" contextPath=".....schema" /> 

    <bean id="annotationMapping"  class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping"> 
     <property name="interceptors"> 
      <list> 
       <bean class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor" /> 
       <bean class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor"> 
        <property name="xsdSchemaCollection" 
         ref="schemaCollection" /> 
        <property name="validateRequest" value="true" /> 
        <property name="validateResponse" value="true" /> 
       </bean> 
      </list> 
     </property> 
     <property name="order" value="1" /> 
    </bean> 

    <sws:marshalling-endpoints /> 

希望它在某種程度上有所幫助。 Endpoint類擁有@Endpoint,方法@PayloadRoot。他們並沒有返回太久,但我不必將我的課程包裝在JAXBElement中。

[編輯]命名空間

xmlns:oxm="http://www.springframework.org/schema/oxm" 
    xmlns:sws="http://www.springframework.org/schema/web-services" 

    xsi:schemaLocation=" 
     http://www.springframework.org/schema/oxm 
     http://www.springframework.org/schema/oxm/spring-oxm-1.5.xsd"> 
+0

謝謝,什麼命名空間是oxm和sws? – 2009-11-12 15:31:22