Yay sabunu ws kullanıyorum. JAXB etki alanı sınıfları şu varFarklı ad alanı ve aynı JAXB sınıfı ile iki farklı son noktaya nasıl sahip olabilirim?
@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);
}
}
ardından karmaşık tip
@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.
}
I @XmlRegistry ek açıklamaları ile aşağıdaki sınıfı I sabun hale bitiş noktaları
@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
}
}
tekabül istek, sabun isteğinde uç noktalarda verilen NAMESPACE_URI kullanıyorum. Ben son noktada NAMESPACE_URI olarak "
http://namespace/url" kullanmak ve sabun istekte düzgün bir yanıt alıyorum ama diğerlerinden farklı olmasını çalışırsanız
İşte
, bu durumda, ben tepki
<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>
aşağıdaki alıyorum İki farklı isim aralığına sahip iki uç nokta daha sonra çalışmıyor ve yukarıdaki yanıtı veriyor.
Aynı JAXB sınıfına sahip iki farklı uç nokta için iki farklı ad alanını nasıl kullanabilirim? Ben bahar ve web servisine tamamen yeniyim.
Ek bilgi: Bir pakette ve package-info.java ad alanında RequestMessageType sınıf ve ObjectFactory sınıfı vardır
@javax.xml.bind.annotation.XmlSchema(namespace="http://namespace/url",elementFormDefault=javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.example
ben package-info.java dosyada bir değişiklik gerekiyor mu nedir?
ben' benim şemalar herhangi bir durumda da üretilen WSDL görmek iyi olurdu d iki istek ve cevap öğesini tanımlar. Bu elemanlar aynı tipte olacaktır. Eğer zamanım varsa, github hesabımdaki basit bir projeyi paylaşabilirim –
Bir RequestMessageType özeti hazırlamanızı ve ondan genişletmek için 2 sınıf yapmayı öneririm. Bu sınıflar ayrı ayrı kaydedilir.Bunu yaparak: wsdls'leriniz farklı ad alanlarına sahip olur, ancak servis katmanınız değiştirilemez. –