2

I have XML as follows

<request type="1">
    <request-header/>
    <request-details>
    <!--  Some more tags -->
    </request-details>
</request>

For mapping this XML I have class structure as follows :

public class Request1
{
    private RequestDetail_1;
    //other members
}

public class Request2
{
    private RequestDetail_2;
    //other members
} 

public class RequestDetail_1
{
    //members
}

public class RequestDetail_2
{
    //Members
}

What I want to do is ... If attribute type is 1 then I need to create object of type Request_1 , if type is 2 then object type will be Request_2 and so on.

I have gone through this link for reference but still couldn't figure out a way to do this. I want to use pure JAXB and not MOXY or any other such frame works... :( .

Partial code :

@XmlJavaTypeAdapter(RequestAdaptor.class)
@XmlRootElement(name="request")
public class AuthRequest extends Request
{
    private AuthRequestDetails requestDetails;

    public RequestDetails getRequestDetails() 
    {
        return requestDetails;
    }

    @Override
    public void setRequestDetails(RequestDetails requestDetails) 
    {
        this.requestDetails = (AuthRequestDetails)requestDetails;
    }
}

@XmlAccessorType(XmlAccessType.FIELD)
public class AuthRequestDetails extends RequestDetails
{
    @XmlElement(name="user-name")
    private String userName;
    @XmlElement(name="password")
    private String password;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlJavaTypeAdapter(RequestAdaptor.class)
public abstract class Request 
{
    @XmlAttribute
    protected String type;

    @XmlElement(name="request-header")
    protected RequestHeader requestHeader;

    public RequestHeader getRequestHeader() 
    {
        return requestHeader;
    }

    public void setRequestHeader(RequestHeader requestHeader) 
    {
        this.requestHeader = requestHeader;
    }

    public String getType() 
    {
        return type;
    }

    public void setType(String type) 
    {
        this.type = type;
    }

    public abstract void setRequestDetails(RequestDetails requestDetails);

    public abstract RequestDetails getRequestDetails();


}

public class RequestAdaptor extends XmlAdapter<RequestDTO, Request>
{
    @Override
    public RequestDTO marshal(Request v) throws Exception 
    {
        System.out.println("marshal");
        RequestDTO lRequestDTO= new RequestDTO();
        lRequestDTO.setRequestHeader(v.getRequestHeader());
        lRequestDTO.setType(v.getType());
        if(v.getType().equals("5"))
        {
            AuthRequest lRequest = (AuthRequest)v;

        }
        else
        {
            PingRequest lRequest = (PingRequest)v;
        }
        return lRequestDTO;
    }

    @Override
    public Request unmarshal(RequestDTO v) throws Exception 
    {
        System.out.println("unmarshal");
        if(v.getType().equals("5"))
        {
            AuthRequest lRequest = new AuthRequest();
            lRequest.setRequestHeader(v.getRequestHeader());
            lRequest.setType(v.getType());
            return lRequest;
        }
        else
        {
            PingRequest lRequest = new PingRequest();
            lRequest.setRequestHeader(v.getRequestHeader());
            lRequest.setType(v.getType());
            return lRequest;
        }
    }

}
@XmlAccessorType(XmlAccessType.FIELD)
public class RequestDTO 
{
    @XmlAttribute
    protected String type;

    @XmlElement(name="request-header")
    private RequestHeader requestHeader;

    @XmlElement(name="request-details")
    private RequestDetails requestDetails;

    public RequestHeader getRequestHeader() 
    {
        return requestHeader;
    }

    public void setRequestHeader(RequestHeader requestHeader) 
    {
        this.requestHeader = requestHeader;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public RequestDetails getRequestDetails() {
        return requestDetails;
    }

    public void setRequestDetails(RequestDetails requestDetails) {
        this.requestDetails = requestDetails;
    }

}

@XmlAccessorType(XmlAccessType.FIELD)
public class RequestHeader 
{
    @XmlElement(name="name")
    String Name;

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

}

First thing is : Marshal and Unmarshal of Adaptor is not getting called. I am stuck at this point.

Community
  • 1
  • 1
  • The answer given in the question you have linked does not use Moxy. The usage of `@XmlJavaTypeAdapter` is pure JAXB. – Victor Oct 17 '14 at 07:58
  • @Victor That answer is also not relevant here. Update: I am wrong it is relevant. – lexicore Oct 17 '14 at 08:39
  • possible duplicate of [Java/JAXB: Unmarshall XML attributes to specific Java object attributes](http://stackoverflow.com/questions/3284786/java-jaxb-unmarshall-xml-attributes-to-specific-java-object-attributes) – lexicore Oct 17 '14 at 08:40
  • Have you actually tried it? Show us your code, how far did you managed? – lexicore Oct 17 '14 at 08:41

1 Answers1

0

You can use a StAX XmlStreamReader to parse the XML. Then advance it to the root element. When it's at the root element event check the value of the type attribute. Use this value to determine which Class you should pass to the unmarshal method that takes a Class and XmlStreamReader to get the result you are looking for.

bdoughan
  • 147,609
  • 23
  • 300
  • 400