[英]XMLAdapter - Is it possible to call de default marshal method inside the adapter?
當我需要將一個 XML 轉換為另一個時,我有一個系統。 為此,我有一個 model 正在解組,進行一些必要的更改,然后編組到最終的 XML。
一個 class 有一個屬性(描述),它只在最后的 XML 內部。 但此屬性依賴於原始 XML 中的另一個屬性 (ID)。
例如:
原裝 XML:
<root>
<node1>
<node2 attr1="xxx" attr2="xxx" attrN="xxx" id="1234"/>
</node1>
</root>
最終的 XML 將是:
<root>
<node1>
<node2 attr1="xxx" attr2="xxx" attrN="xxx" id="1234" description="description"/>
</node1>
</root>
XML 有許多(幾十個或更多)node1、node2 等實例。為了填充它,我正在考慮使用 XMLAdapter。 但是,為了避免手動創建 object 並按屬性填充屬性,我想有辦法調用“超級”編組和解組方法,所以它很容易生成,但我不確定它是否可能以及如何.
我有2個想法。
選項 1,在類型級別創建 XMLAdapter 並調用適配器內部的編組器編組/解組方法。
節點 2 Model:
@XmlJavaTypeAdapter(MyAdapter.class)
public class Node2 {
...
}
我的適配器:
public class MyAdapter extends XmlAdapter <String, Node2> {
@Override
public Node2 unmarshal(String s) throws Exception {
Node2 node2 = marshaller.unmarshal(s); //Can I do something like this, access the original marshaller?
node2.setDescription(myNewMethodToGetDescription(node2.getId()));
return node2;
}
@Override
public String marshal(Node2 node2) throws Exception {
return marshaller.marshal(node2); //Can I do something like this, access the original marshaller?
}
}
選項 2,在字段級別創建 XMLAdapter。 為此,我需要從節點訪問另一個屬性:
節點 2 Model:
public class Node2 {
...
@XmlAttribute(name = "id")
protected String id;
@XmlAttribute(name = "description")
@XmlJavaTypeAdapter(MyAdapter.class)
protected String description;
}
我的適配器:
public class MyAdapter extends XmlAdapter <String, String> {
@Override
public String unmarshal(String s) throws Exception {
Node2 node2 = getNode2SomeHow(); //Can I do something similar?
return myNewMethodToGetDescription(node2.getId());
}
@Override
public String marshal(String s) throws Exception {
return s;
}
}
我該怎么做?
我找到了解決方案。 其實我想的更容易。
在類型級別,我只需要在兩個參數中使用將 Node2 傳遞為 object 的 XMLAdapter,XMLAdapter 將使用未編組的 object。
所以它會是這樣的:
public class MyAdapter extends XmlAdapter <Node2, Node2> {
@Override
public Node2 unmarshal(Node2 node2) throws Exception {
node2.setDescription(myNewMethodToGetDescription(node2.getId()));
return node2;
}
@Override
public Node2 marshal(Node2 node2) throws Exception {
return node2
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.