【问题标题】:Programmatically determine if a JAXB annotation will result in a xsi:type annotation?以编程方式确定 JAXB 注释是否会导致 xsi:type 注释?
【发布时间】:2012-08-24 15:26:44
【问题描述】:

考虑到 JAXB 注释对象,有没有办法确定一个类/字段/方法是否会在编组期间产生 xsi:type 属性?

是XmlElement注解,
annotation.type != javax.xml.bind.annotation.XmlElement.DEFAULT.class
我需要担心的唯一情况是什么?

我正在编写一个 Lua 解组器,我们在其中删除了许多常用的 xml 类型信息,我正在尝试弄清楚如何将传入的 Lua 与 JAXB 匹配。

谢谢。

--更新--

这是一个显示问题的简单示例:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement()
@XmlSeeAlso({ Cat.class, Dog.class })
public class Animal {
  @XmlElement()
  public List<Animal> critters;
  @XmlAttribute
  public String type;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement()
public class Dog extends Animal {
  public Dog() {
    this.type = "German Shepherd";
  }
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement()
public class Cat extends Animal {
  public Cat() {
    this.type = "Black";
  }
}

当我收到一个 Animal 对象时,我可以查询 critter 的注释以检测它应该是 Dog 还是 Cat 而不是 Animal?

【问题讨论】:

    标签: jaxb


    【解决方案1】:

    在某些情况下,JAXB (JSR-222) 实现会写出 xsi:type 属性。

    1. 如果字段/属性的类型为 Object(或使用 @XmlElement(type=Object.class) 进行注释)且未使用 @XmlAnyElement(lax=true) 映射,并且包含 JAXBContext 具有映射的 Object 实例。
    2. 表示继承的默认机制将产生一个xsi:type 属性来表示子类(参见:http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html)。

    【讨论】:

    • 谢谢布莱斯。案例 #2 是我感兴趣的,如何检测继承?注释中有什么东西还是我需要在别处寻找?
    • @Mike - 没有跨 JAXB 实现工作的标准方法。如果您提供有关您尝试映射的内容的更多信息,我也许可以提供帮助。我对 JAXB 和继承非常熟悉:blog.bdoughan.com/search/label/Inheritance)
    • 抱歉回复延迟。我们正在使用 Oracle 的参考实现。我的工作是通过超类递归地构建注释图,到目前为止这是可行的。能够询问注释它期望什么类型会很方便。我将尝试提出简单的示例并将其发布。感谢您的宝贵时间。
    猜你喜欢
    • 2019-07-28
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2013-07-23
    • 2013-06-17
    相关资源
    最近更新 更多