【问题标题】:JAX-B annotations for elements that inherit from a parent从父级继承的元素的 JAX-B 注释
【发布时间】:2012-10-19 04:44:20
【问题描述】:

为 Java 类添加 JAX-B Java 注释时 - 如果我有一个父 Class Entry,有两个孩子,BookJournalArticle ,

我会为所有三个类添加这些注释吗:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement

即:

@XmlSeeAlso({au.com.library.Book.class, au.com.library.JournalArticle.class})
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public abstract class Entry implements Serializable{


private static final long serialVersionUID = -1895155325179947581L;

@XmlElement(name="title")
protected String title;
@XmlElement(name="author")
protected String author;
@XmlElement(name="year")
protected int year;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Book extends Entry {

@XmlElement(name="edition")
private String edition;
@XmlElement(name="publisher")
private String publisher;
@XmlElement(name="placeOfPublication")
private String placeOfPub;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class JournalArticle extends Entry {

@XmlElement(name="journalTitle")
private String journalTitle;
@XmlElement(name="volume")
private String volume;
@XmlElement(name="issue")
private String issue;
@XmlElement(name="pageNumbers")
private String pgNumbers;

【问题讨论】:

  • 只有当这些类将被 JAX-B 进程编组/解组时,您才应该添加注释。请记住,WS 发送/检索父类或子类是不同的。它们将被视为不同的类。
  • @Luiggi Mendoza - 我希望它们都被视为“条目”类型。我正在制作这些 Entry 对象的列表,当我添加到列表中时,我首先检查该对象是否存在,并且仅在列表中不存在该对象时添加(使用 List().contains() 方法) - 但它不断重新添加相同的项目 - 当我调试时,当它检查对象是否已经存在时(当我添加已经在列表中具有相同属性的 SAME Book() 对象时)它给出了新书与现有 Book 对象不同的 ID 号(具有完全相同的属性)。
  • 请注意,由 JAX-B 编组/解组的类不能有任何业务逻辑方法(即equals 方法)。当列表被解组(在消费者或提供者端)时,您将获得一个全新的元素(与您发送的元素不同)。对于您的情况,我会在方法中使用自定义 Comparator<Entry> 而不是 List#contains

标签: java jaxb


【解决方案1】:

注解XmlAccessorType可以被继承,所以我相信在子类上再次声明它不是强制性的。

@Inherited
@Retention(value=RUNTIME)
@Target(value={PACKAGE,TYPE})
public @interface XmlAccessorType

XmlRootElement 不是这种情况,因此您必须用它注释每个基类。

您可以在 javadoc 上找到有关 @Inherited 注释的更多信息。

更新您的评论:

@Retention(value=RUNTIME) 表示该类即使在运行时也保留此注解,即程序可以使用 Java 反射 API 来检查该注解是否存在于类上。

@Target(value={PACKAGE,TYPE}) 表示此注解可用于注解类、接口或枚举(这是针对value=TYPE),也可以在整个包级别(这是针对value=PACKAGE)。您可以看到 this thread 解释这如何有用。

有关 Javadoc 的更多信息:

【讨论】:

  • 感谢您的回复 - 那么在这种情况下,@Retention(value=?) 和 @Target(value=?) 会相等吗?
猜你喜欢
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多