Tôi đang sử dụng xà phòng mùa xuân.Làm cách nào để có hai điểm cuối khác nhau với không gian tên khác nhau và cùng một lớp JAXB?
Tôi đã sau lớp miền JAXB tương ứng với các loại phức tạp
@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.
}
Tôi có lớp sau đây với các chú thích @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);
}
}
Sau đây là các điểm cuối
@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
}
}
Khi tôi làm xà phòng yêu cầu, tôi đang sử dụng NAMESPACE_URI được cung cấp trong các điểm cuối trong yêu cầu xà phòng.
Ở đây, trong trường hợp này, tôi nhận được sau phản ứng
<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>
Nếu tôi sử dụng "http://namespace/url" như NAMESPACE_URI trong thiết bị đầu cuối và trong yêu cầu xà phòng tôi nhận được câu trả lời đúng đắn nhưng tôi cố gắng để làm cho nó khác nhau cho hai điểm cuối với hai không gian tên khác nhau thì nó không hoạt động và đưa ra phản hồi ở trên.
Làm cách nào để sử dụng hai không gian tên khác nhau cho hai điểm cuối khác nhau với cùng một lớp JAXB? Tôi hoàn toàn mới vào mùa xuân và dịch vụ web.
Thông tin thêm: lớp RequestMessageType và lớp ObjectFactory là trong một gói và trong namespace package-info.java là
@javax.xml.bind.annotation.XmlSchema(namespace="http://namespace/url",elementFormDefault=javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.example
Tôi có cần phải thay đổi bất cứ điều gì trong tập tin package-info.java?
tôi sẽ là tốt để xem cũng WSDL được tạo của bạn Trong bất kỳ trường hợp trong lược đồ của tôi tôi d xác định hai phần tử yêu cầu và đáp ứng. Những yếu tố này sẽ cùng loại. Khi tôi có thời gian nếu bạn muốn tôi có thể chia sẻ một dự án đơn giản trên tài khoản github của tôi –
Tôi khuyên bạn nên tạo một bản tóm tắt RequestMessageType và tạo 2 lớp để mở rộng từ nó. Những lớp học đó đăng ký một cách riêng biệt.Bằng cách đó: các wsdls của bạn sẽ có các không gian tên khác nhau, nhưng lớp dịch vụ của bạn có thể được giữ nguyên chưa sửa đổi. –