JAXB немаршальные дочерние атрибуты без создания дочернего класса - PullRequest
0 голосов
/ 07 января 2019

Я хочу разобрать (упрощенную) структуру XML следующим образом:

<parent>
    <a>AValue</a>
    <b>BValue</b>
    <c someAttribute = "true">CValue</c>
</parent>

Я знаю, как это сделать, объявив класс C следующим образом:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "c", propOrder = {
        "someAttribute"
    })
public class C{
    @XmlValue
    private String c;
    @XmlAttribute ( name="someAttribute")
    private boolean someAttribute;
    //getters and setters
}

И получить его в качестве члена класса parent следующим образом:

public class Parent{
   private String a;
   private String b;
   private C c;
   //getters and setters for c,b,a
}

Это работает, и я могу получить доступ к значению C через parent.getC().getC(); Мой вопрос состоит в том, как добиться того, чтобы мне не нужно было создавать класс C и получать value и attribute из C в качестве члена parent без редактирования parent Пойо с новыми членами и другими добытчиками и сеттерами. Я уже пытался сделать это через слушателей и искал похожие структуры, но у меня не осталось никаких идей.

1 Ответ

0 голосов
/ 07 января 2019

Я наконец понял, как этого добиться. Необходимо использовать аннотацию @XmlJavaTypeAdapter и пометить класс C как @XmlRootElement, а также @XmlAccessorType(XmlAccessType.FIELD). Кроме того, необходимо использовать @XmlTransient на получателе элемента String, который был помечен @XmlJavaTypeAdapter.

Полное решение:

Класс C:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class C{
    @XmlValue
    private String c;

    @XmlAttribute
    private boolean someAttribute;
    //getters and setters for both

Адаптер класса:

public class Adapter extends XmlAdapter<C, String> {

    public String unmarshal(C pC) throws Exception {
        //some possible handling with the attribute over pC.getSomeAttribute();
        return pC.getC();
    }

    public C marshal(String pC) throws Exception {
       C c = new C();
       c.setC(pC)
       //some possible handling to set the attribute to c
       return c;
    }

Родитель класса:

public class Parent{
   private String a;
   private String b;
   @XmlJavaTypeAdapter(Adapter.class)
   private String c;

   @XmlTransient
    public String getC() {
        return c;
    }
   //getters and setters for b,a and setter for C
}
...