JAVA/JAXB:元帅/解组使用属性在XML或类成员

问题描述:

我有XML如下JAVA/JAXB:元帅/解组使用属性在XML或类成员

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

对于映射此XML我有类结构如下:

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 
} 

我想要做的是...如果属性类型是1,那么我需要创建Request_1类型的对象,如果类型是2,那么对象类型将是Request_2等等。

我已经通过this链接作为参考,但仍然无法找到一种方法来做到这一点。我想用纯JAXB,而不是MOXY或任何其他这样的框架工作... :(

部分代码:

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

} 

的第一件事是:元帅和适配器的解组是没有得到所谓的我。在这一点卡住了

+0

在你连接的问题中给出的答案不使用Moxy。 “@ XmlJavaTypeAdapter”的用法是纯JAXB。 – Victor 2014-10-17 07:58:11

+0

@胜利者这个答案在这里也不相关。更新:我错了,它是相关的。 – lexicore 2014-10-17 08:39:18

+0

[Java/JAXB:Unmarshall XML属性到特定Java对象属性]的可能重复(http://*.com/questions/3284786/java-jaxb-unmarshall-xml-attributes-to-specific-java-object-attributes ) – lexicore 2014-10-17 08:40:20

您可以使用StAX XmlStreamReader来解析XML,然后将其推进到根元素,当它位于根元素事件时,请检查type属性的值。 Class你应该通过unmarshal方法,需要一个ClassXmlStreamReader以获得您要查找的结果。

+1

This Works ...谢谢。 – 2014-10-21 05:03:49