How can I have two different endpoint with different namespace and same JAXB class?

Viewed 3583

I am using spring soap ws.

I have following JAXB domain classes correspond to complex types

@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 have following class with @XmlRegistry annotations

@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);
    }    
}

Following are endpoints

   @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 

        }
    }

When I make Soap request, I am using NAMESPACE_URI given in endpoints in soap request.

Here, in this case, I am getting following response

<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 &lt;{http://namespace/url}request-message&gt;</faultstring>
        </SOAP-ENV:Fault>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

If I use "http://namespace/url" as NAMESPACE_URI in endpoint and in soap request I am getting the proper response but I try to make it different for two endpoints with two different namespaces then it is not working and gives above response.

How can I use two different namespaces for two different endpoints with same JAXB class? I am completely new to spring and web service.

Additional info : RequestMessageType class and ObjectFactory class are in one package and in package-info.java namespace is

@javax.xml.bind.annotation.XmlSchema(namespace="http://namespace/url",elementFormDefault=javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.example

Do I need to change anything in package-info.java file ?

1 Answers
Related