2009-11-12 127 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