Нет адаптера для конечной точки. Ваша конечная точка аннотирована с помощью @Endpoint или она реализует поддерживаемый интерфейс, такой как MessageHandler или PayloadEndpoint?

Я борюсь с проектом 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>

Тогда это не сработает. Я не уверен, что нужно гуглить, чтобы получить желаемый эффект.


person facundop    schedule 21.06.2017    source источник


Ответы (1)


JAXBElement здесь, потому что у вас есть собственный тип. Если вы укажете nillable=true, вы получите то же самое. Как вы уже поняли, вам нужно сделать ваши запросы и ответы простыми элементами, поэтому оболочка JAXBElement не понадобится.

И рекомендуется помещать реальную модель данных в один xsd, а ее оболочки, такие как элемент запроса и ответа, в другой. В этом случае вы можете изменить представление вашей модели данных с помощью различных оболочек, не меняя саму модель данных.

person Donz    schedule 21.06.2017
comment
Единственная причина, по которой у меня есть собственный тип, заключается в том, что иначе я не могу импортировать их из другого XSD. Можно ли использовать обычный тип, чтобы мне не приходилось использовать оболочки JAXBElement? Я хотел бы избежать использования JAXBElements, а также иметь возможность импортировать XSD в другие XSD. Я могу изменить элементы, если это необходимо, но я хочу избежать их дублирования (поэтому я пытаюсь их импортировать) - person facundop; 21.06.2017