У меня есть веб-сервис, который я пытаюсь реализовать, используя Spring и Jaxb.У меня уже есть несколько работающих сервисов, использующих оба из них - но этот конкретный сервис доставляет мне трудности из-за формата ответа.В моем XSD ответ определяется следующим образом (обратите внимание, что это один элемент):
<!-- Response definition -->
<element name="ServiceResponse" type="Q1:Outcome"/>
<!-- Outcome definition -->
<complexType name="Outcome">
<sequence>
<element name="ErrorCode">
<simpleType>
<restriction base="string">
<maxLength value="8"/>
</restriction>
</simpleType>
</element>
<element name="ErrorText">
<simpleType>
<restriction base="string">
<maxLength value="1000"/>
</restriction>
</simpleType>
</element>
<element name="DocumentId">
<simpleType>
<restriction base="string">
<maxLength value="30"/>
</restriction>
</simpleType>
</element>
</sequence>
</complexType>
У меня есть метод обслуживания, который выглядит следующим образом:
@PayloadRoot( localPart = SERVICE_REQUEST, namespace = NAMESPACE )
public Outcome processFileRequest( ServiceRequest requestObject )
I endс исключением, которое выглядит следующим образом:
java.lang.IllegalStateException: нет адаптера для конечной точки [public dortman.xsd.objects.Outcome dortman.annotated.MyTestEndpoint.processFileRequest (dortman.xsd.objects).ServiceRequest)]: Ваша конечная точка реализует поддерживаемый интерфейс, такой как MessageHandler или PayloadEndpoint?
После нахождения некоторых связанных сообщений на форуме Spring и Stackoverflow кажется, что возвращаемые объекты должны иметь аннотацию XmlRootElement.или быть завернутым в элемент JAXBElement.Чтобы попробовать первый, я изменил ответ в XSD на:
<!-- Response definition -->
<element name="ServiceResponse">
<complexType>
<sequence>
<element name="FileSize" type="long"/>
</sequence>
</complexType>
</element>
Это работает, поскольку JAXB затем генерирует класс ServiceResponse, который имеет аннотацию XmlRootElement.К сожалению, у меня не обязательно есть широта, чтобы изменить XSD - что означает, что мне нужно выбрать другой вариант.Я попробовал это.Мой новый метод обслуживания выглядит следующим образом:
@PayloadRoot( localPart = SERVICE_REQUEST, namespace = NAMESPACE )
public JAXBElement<Outcome> processFileRequest( ServiceRequest requestObject )
И затем я обертываю свой возвращаемый объект, используя метод, созданный в ObjectFactory:
/**
* Create an instance of {@link JAXBElement }{@code <}{@link Outcome }{@code >}}
*
*/
@XmlElementDecl(namespace = "http://www.dortman.com/MyTestService", name = "ServiceResponse")
public JAXBElement<Outcome> createServiceResponse(Outcome value) {
return new JAXBElement<Outcome>(_ServiceResponse_QNAME, Outcome.class, null, value);
}
Я подаю на сервер, ожидая, что эторешить проблему.Но вместо этого я получаю:
java.lang.IllegalStateException: нет адаптера для конечной точки [public javax.xml.bind.JAXBElement dortman.annotated.MyTestEndpoint.processFileRequest (dortman.xsd.objects.Servicequ): Ваша конечная точка реализует поддерживаемый интерфейс, такой как MessageHandler или PayloadEndpoint?в org.springframework.ws.server.MessageDispatcher.getEndpointAdapter (MessageDispatcher.java:283) в org.springframework.ws.server.MessageDispatcher.dispatch (MessageDispatcher.java:226) в org.springframework.wes.(MessageDispatcher.java:169) по адресу org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection (WebServiceMessageReceiverObjectSupport.java:89) по адресу org.springframework.erapHerg.Werserverorg.springframework.ws.transport.http.MessageDispatcherServlet.doService (MessageDispatcherServlet.java:231) при weblogic.servlet.internal.WebAppServletContext.execute (WebAppServletContext.java:2174) в weblogic.servlet.internal.ServletRequestImpl.run (ServletRequestImpl.Java: 1446) в weblogic.work.ExecuteThread.execute (ExecuteThread.java:201) в weblogic.work.ExecuteThread.run (ExecuteThread.java:173)
Очевидно, это былоне впечатлен моим использованием JAXBElement.Кто-нибудь еще сталкивался с этой проблемой?
Мой файл конфигурации (который уже работает с ~ 6 веб-службами, просто ни один из них не демонстрирует этот конкретный вариант XSD) содержит следующее:
<!-- JAXB marshaller to be used by the annotated web services -->
<bean class="org.springframework.ws.server.endpoint.adapter.MarshallingMethodEndpointAdapter">
<constructor-arg>
<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="contextPath" value="dortman.xsd.objects" />
<property name="mtomEnabled" value="true"/>
</bean>
</constructor-arg>
</bean>
<bean id="messageFactory" class="org.springframework.ws.soap.axiom.AxiomSoapMessageFactory">
<property name="payloadCaching" value="true"></property>
<property name="attachmentCaching" value="true"></property>
</bean>