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;
}
}
的第一件事是:元帅和适配器的解组是没有得到所谓的我。在这一点卡住了
答
您可以使用StAX XmlStreamReader
来解析XML,然后将其推进到根元素,当它位于根元素事件时,请检查type
属性的值。 Class
你应该通过unmarshal
方法,需要一个Class
和XmlStreamReader
以获得您要查找的结果。
+1
This Works ...谢谢。 – 2014-10-21 05:03:49
在你连接的问题中给出的答案不使用Moxy。 “@ XmlJavaTypeAdapter”的用法是纯JAXB。 – Victor 2014-10-17 07:58:11
@胜利者这个答案在这里也不相关。更新:我错了,它是相关的。 – lexicore 2014-10-17 08:39:18
[Java/JAXB:Unmarshall XML属性到特定Java对象属性]的可能重复(http://stackoverflow.com/questions/3284786/java-jaxb-unmarshall-xml-attributes-to-specific-java-object-attributes ) – lexicore 2014-10-17 08:40:20