【问题标题】:No adapter for endpoint. Is your endpoint annotated with @Endpoint, or does it implement a supported interface like MessageHandler or PayloadEndpoint?端点没有适配器。您的端点是否使用 @Endpoint 进行了注释,或者它是否实现了受支持的接口,例如 MessageHandler 或 PayloadEndpoint?
【发布时间】:2017-11-24 12:13:04
【问题描述】:

我正在为一个 Spring-WS 项目而苦苦挣扎。

在我的 Endpoint 类中,如果我没有指定我正在接收/返回 JAXBElement,我会收到以下错误:No adapter for endpoint;您的端点是用@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 中?

我有几个这样声明的方法,我注意到当我使用从另一个 XSD 导入的元素时,我只需要将它们包装为 JAXBElements。

例如,如果我这样定义我的 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 中使用,如下所示:

service.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>

那就不行了。我不确定用谷歌搜索什么才能达到预期的效果。

【问题讨论】:

    标签: java soap spring-ws


    【解决方案1】:

    JAXBElement 在这里是因为您有自定义类型。如果你指向 nillable=true 你会得到同样的结果。正如您已经了解的那样,您需要执行请求和响应简单元素,因此不需要 JAXBElement 包装器。

    最好将真实数据模型放在一个 xsd 中,并将其包装器(如请求和响应元素)放在另一个 xsd 中。在这种情况下,您可以使用不同的包装器更改数据模型的表示,而无需更改数据模型本身。

    【讨论】:

    • 我拥有自定义类型的唯一原因是因为否则我无法从另一个 XSD 导入它们。是否可以使用常规类型,所以我不必使用 JAXBElement 包装器?我想避免使用 JAXBElements,同时还能够将 XSD 导入另一个 XSD。如有必要,我可以修改元素,但我确实想避免重复它们(这就是我尝试导入它们的原因)
    猜你喜欢
    • 2013-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 2015-07-20
    • 2016-01-16
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多