编组时如何避免 JAXB、MOXY 实现中的类型擦除?
How to avoid type erasue in JAXB, MOXY implementation while marshalling?
我必须编组以下 class ;
@XmlRootElement(name = "SYSMessage")
@XmlAccessorType(XmlAccessType.FIELD)
public class Message<T> {
@XmlPath("Personel")
private Personel personel;
@XmlPath("AccountType")
private T accountType;
...
因此在生产中我设置了通用帐户类型 class 和一些名为 "DebitAccount" 的对象
我必须使用通用类型,因为 debitAccount 会更改很多次。
Message<DebitAccount> msg = new Msg<>();
DebitAccount dAccount= new DebitAccount();
msg.setAccountType(dAccount);
当我整理 class 消息时,我得到以下 xml 结果作为帐户类型;
...
org.demo.blabla.DebitAccount@123123
...
在借记账户中class;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class DebitAccount{
@XmlPath("ID")
private String id;
@XmlPath("Visa")
private String visaNo;
我发现这是因为类型擦除而发生的。 Moxy就是不能简单的理解我的对象是DebitAccount。所以它将对象视为字符串。我怎样才能让 moxy 理解我的复合对象。
您必须使用 @XmlSeeAlso 注释将 DebitAccount class 绑定到 Message class 的相同 XML 上下文。您可以用花括号列出多个 classes。使用泛型类型(T 或 ?)时,您必须指定哪些 class 是同一上下文的一部分。
@XmlRootElement(name = "SYSMessage")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({DebitAccount.class})
public class Message<T> { ... }
我必须编组以下 class ;
@XmlRootElement(name = "SYSMessage")
@XmlAccessorType(XmlAccessType.FIELD)
public class Message<T> {
@XmlPath("Personel")
private Personel personel;
@XmlPath("AccountType")
private T accountType;
...
因此在生产中我设置了通用帐户类型 class 和一些名为 "DebitAccount" 的对象 我必须使用通用类型,因为 debitAccount 会更改很多次。
Message<DebitAccount> msg = new Msg<>();
DebitAccount dAccount= new DebitAccount();
msg.setAccountType(dAccount);
当我整理 class 消息时,我得到以下 xml 结果作为帐户类型; ... org.demo.blabla.DebitAccount@123123 ...
在借记账户中class;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class DebitAccount{
@XmlPath("ID")
private String id;
@XmlPath("Visa")
private String visaNo;
我发现这是因为类型擦除而发生的。 Moxy就是不能简单的理解我的对象是DebitAccount。所以它将对象视为字符串。我怎样才能让 moxy 理解我的复合对象。
您必须使用 @XmlSeeAlso 注释将 DebitAccount class 绑定到 Message class 的相同 XML 上下文。您可以用花括号列出多个 classes。使用泛型类型(T 或 ?)时,您必须指定哪些 class 是同一上下文的一部分。
@XmlRootElement(name = "SYSMessage")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({DebitAccount.class})
public class Message<T> { ... }