在spring-ws中使用Jaxb2Marschaller时,是否可以使用原始或基本Java类型创建Web服务操作?例如,一个看起来像这样的方法:
@Override
@PayloadRoot(localPart = "AddTaskRequest", namespace = "http://example.com/examplews/")
public long addTask(final Task task) throws AddTaskFault {
// do something
return 0;
}
我正在使用maven jaxws插件从我的WSDL生成接口和模型类。当我尝试调用webservice时,我收到以下错误:
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插件生成接口的第二种变体?
更新:我的相关spring-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 :(得分:4)
当Spring-WS尝试将EndpointAdapter
与Endpoint
匹配时,它会检查端点方法的所有参数及其返回值是{{1}已知的类型}}和Jaxb2Marshaller
不会。从概念上讲,这是有道理的,因为JAXB不知道如何在没有更多信息的情况下将long
转换为XML(这是long
的来源)。
你应该意识到Spring-WS 不是一个JAX-WS实现,并没有任何借口。你真的不能指望使用JAX-WS生成的工件,并期望它们只能在Spring_WS中工作,尽管在很多情况下Spring-WS足够灵活,可以处理它。
答案 1 :(得分: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中。
[edit]名称空间
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">