我正在使用春天肥皂ws。我怎樣纔能有兩個不同的端點具有不同的命名空間和相同的JAXB類?
我有以下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
}
}
當我做肥皂請求,我正在使用肥皂請求中的端點中給出的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>
如果我在端點使用「http://namespace/url」作爲NAMESPACE_URI和SOAP請求,我得到適當的迴應,但我儘量做到針對不同兩個端點有兩個不同的命名空間,那麼它不起作用,並給出上述響應。
如何爲具有相同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 在我的模式我無論如何d定義兩個請求和響應元素。這些元素將是相同的類型。當我有時間時,如果你願意,我可以在我的github賬戶上共享一個簡單的項目 –
我建議創建一個RequestMessageType摘要,並使它從2個類中擴展。這些課程單獨註冊。通過這樣做:您的wsdls將具有不同的名稱空間,但您的服務層可以保持不變。 –