Я борюсь с проектом Spring-WS.
В моем классе Endpoint, если я не укажу, что я получаю/возвращаю JAXBElement, я получаю следующую ошибку: Нет адаптера для конечной точки; Ваша конечная точка аннотирована с помощью @Endpoint или она реализует поддерживаемый интерфейс, такой как MessageHandler или PayloadEndpoint?
Например, этот метод будет работать нормально:
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "pingRequest")
@ResponsePayload
public JAXBElement<PingResponse> pingRequest(@RequestPayload JAXBElement<PingRequest> request) {
PingResponse response = service.ping();
return new JAXBElement<PingResponse>(request.getName(), PingResponse.class, response);
}
Но это вызовет ошибку, упомянутую выше:
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "pingRequest")
@ResponsePayload
public PingResponse pingRequest(@RequestPayload PingRequest request) {
return service.ping();
}
Есть ли способ просто вернуть нужный мне элемент вместо того, чтобы оборачивать его в JAXBElement?
У меня есть несколько методов, объявленных таким образом, и я заметил, что мне нужно обернуть их как JAXBElements только тогда, когда я использую элементы, импортированные из другого XSD.
Например, если у меня есть XSD, определенный следующим образом:
<xs:element name="pingRequest">
<xs:complexType>
<xs:sequence>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="pingResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="return" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
Он будет работать без указания JAXBElement в подписи. Но если я хочу экспортировать это и использовать в другом XSD, например:
сервис.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://example.com/service"
elementFormDefault="qualified"
targetNamespace="http://example.com/service"
xmlns:customlib="http://example.com/customlib">
<xs:import namespace="http://example.com/customlib"
schemaLocation="../customlib.xsd" />
<xs:element name="pingRequest" type="customlib:pingRequest" />
<xs:element name="pingResponse" type="customlib:pingResponse" />
customlib.xsd:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://example.com/customlib"
elementFormDefault="unqualified"
targetNamespace="http://example.com/customlib">
<xs:complexType name="pingRequest">
</xs:complexType>
<xs:complexType name="pingResponse">
<xs:sequence>
<xs:element name="return" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>
Тогда это не сработает. Я не уверен, что нужно гуглить, чтобы получить желаемый эффект.