簡體   English   中英

XMLAdapter - 是否可以在適配器內調用默認編組方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM