我有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;
}
}
的第一件事是:元帥和適配器的解組是沒有得到所謂的我。在這一點卡住了
在你連接的問題中給出的答案不使用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