没有端点适配器。您的端点是使用@Endpoint注释的,还是实现了MessageHandler或PayloadEndpoint等受支持的接口?

时间:2017-06-21 14:15:47

标签: java soap spring-ws

我正在努力完成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中?

我有一些声明的方法,我注意到当我使用从另一个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>

然后它不会工作。我不知道该怎样才能获得理想的效果。

1 个答案:

答案 0 :(得分:1)

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

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