端点没有适配器。您的端点是否使用 @Endpoint 注释,或者它是否实现了受支持的接口,如 MessageHandler 或 PayloadEndpoint?
No adapter for endpoint. Is your endpoint annotated with @Endpoint, or does it implement a supported interface like MessageHandler or PayloadEndpoint?
我正在为一个 Spring-WS 项目而苦苦挣扎。
在我的端点 class 中,如果我没有指定我是 receiving/returning 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();
}
有什么方法可以简单地 return 我想要的元素,而不是将其包装在 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>
那就不行了。我不确定要 google 做什么才能达到预期的效果。
JAXBElement 在这里是因为您有自定义类型。如果你指向 nillable=true ,你会得到相同的结果。正如您已经了解的那样,您需要处理简单的请求和响应元素,因此不需要 JAXBElement 包装器。
并且将真实数据模型放在一个 xsd 中并将其包装器(如请求和响应元素)放在另一个中是一种很好的做法。在这种情况下,您可以使用不同的包装器更改数据模型的表示,而无需更改数据模型本身。
我正在为一个 Spring-WS 项目而苦苦挣扎。
在我的端点 class 中,如果我没有指定我是 receiving/returning 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();
}
有什么方法可以简单地 return 我想要的元素,而不是将其包装在 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>
那就不行了。我不确定要 google 做什么才能达到预期的效果。
JAXBElement 在这里是因为您有自定义类型。如果你指向 nillable=true ,你会得到相同的结果。正如您已经了解的那样,您需要处理简单的请求和响应元素,因此不需要 JAXBElement 包装器。
并且将真实数据模型放在一个 xsd 中并将其包装器(如请求和响应元素)放在另一个中是一种很好的做法。在这种情况下,您可以使用不同的包装器更改数据模型的表示,而无需更改数据模型本身。