Jaxb2marshaller и примитивные типы
Вопрос
Можно ли создать операцию веб-службы с использованием примитивных или основных типов Java при использовании JAXB2marschaler в Spring-WS? Например, метод выглядит так:
@Override
@PayloadRoot(localPart = "AddTaskRequest", namespace = "http://example.com/examplews/")
public long addTask(final Task task) throws AddTaskFault {
// do something
return 0;
}
Я использую плагин Maven Jaxws для генерации классов интерфейса и моделей из моего WSDL. Когда я пытаюсь позвонить в веб -сервис, я получаю следующую ошибку:
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>
Решение
Когда Spring-WS пытается соответствовать EndpointAdapter
чтобы Endpoint
, он проверяет, что все параметры метода конечной точки, плюс его возвращаемое значение, являются типами, известными Jaxb2Marshaller
, а также long
не буду. Концептуально, это имеет смысл, так как JAXB не знал бы, как перевернуть long
в XML без дополнительной информации (где где JAXBElement
приходит в).
Вы должны понимать, что Spring-WS нет реализация JAX-WS, и не представляет собой притворство. Вы не можете ожидать, что вы возьмете артефакты, сгенерированные JAX-WS, и ожидать, что они будут работать просто в Spring_WS, хотя во многих случаях Spring-WS достаточно гибкая, чтобы справиться с этим.
Другие советы
Вот все, что актуально в моей конфигурации, так как я не могу сказать, что вы могли бы изменить, они довольно разные, и прошло полтора года с тех пор, как я это сделал.
<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, методы @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">