【发布时间】:2018-01-16 21:56:34
【问题描述】:
我正在使用弹簧皂 ws。
我有以下 JAXB 域类对应于复杂类型
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"reference",
"reason"
})
@XmlRootElement(name = "request-message")
public class RequestMessageType {
@XmlElement(name = "reference", required = true)
protected String reference;
@XmlElement(name = "reason")
protected String reason;
// I have getters and setters but removed here.
}
我有以下带有@XmlRegistry 注释的类
@XmlRegistry
public class ObjectFactory {
private final static QName _RequestMessage_QNAME = new QName("http://namespace/url", "request-message");
public ObjectFactory() {
}
@XmlElementDecl(namespace = "http://namespace/url", name = "request-message")
public JAXBElement<RequestMessageType> createDisconnectRequestMessage(RequestMessageType value) {
return new JAXBElement<RequestMessageType>(_RequestMessage_QNAME, RequestMessageType.class, null, value);
}
}
以下是端点
@Endpoint
public class FirstEndPoint {
private static final String NAMESPACE_URI = "http://first/url/version";
private static final Logger LOG = Logger.getLogger(FirstEndPoint.class);
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "request-message")
@ResponsePayload
public JAXBElement<ResponseMessageType> requestMessage(@RequestPayload JAXBElement<RequestMessageType> requestMessage) {
LOG.info("request-message : first version ID : " + requestMessage.getValue().getReference());
//Preparing response and return response
}
}
@Endpoint
public class SecondEndPoint {
private static final String NAMESPACE_URI = "http://second/url/version";
private static final Logger LOG = Logger.getLogger(SecondEndPoint.class);
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "request-message")
@ResponsePayload
public JAXBElement<ResponseMessageType> requestMessage(@RequestPayload JAXBElement<RequestMessageType> requestMessage) {
LOG.info("request-message : second version ID : " + requestMessage.getValue().getReference());
//Preparing response and return response
}
}
当我发出 Soap 请求时,我使用的是在 soap 请求的端点中给出的 NAMESPACE_URI。
在这里,在这种情况下,我得到以下响应
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Server</faultcode>
<faultstring xml:lang="en">unexpected element (uri:"http://first/url/version", local:"request-message"). Expected elements are <{http://namespace/url}request-message></faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
如果我在端点和soap请求中使用“http://namespace/url”作为NAMESPACE_URI,我会得到正确的响应,但我尝试让具有两个不同命名空间的两个端点不同,然后它不起作用并给出上述响应。
如何为具有相同 JAXB 类的两个不同端点使用两个不同的命名空间?我对 Spring 和 Web 服务完全陌生。
附加信息:RequestMessageType 类和 ObjectFactory 类在一个包中,并且在 package-info.java 命名空间中
@javax.xml.bind.annotation.XmlSchema(namespace="http://namespace/url",elementFormDefault=javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.example
我需要更改 package-info.java 文件中的任何内容吗?
【问题讨论】:
-
我很高兴也能看到您生成的 WSDL 在任何情况下,在我的模式中,我都会定义两个请求和响应元素。这些元素将属于同一类型。如果你愿意,我有时间可以在我的 github 帐户上分享一个简单的项目
-
我建议创建一个 RequestMessageType 抽象,并创建 2 个类来扩展它。这些课程单独注册。通过这样做:您的 wsdls 将具有不同的命名空间,但您的服务层可以保持不变。