RuntimeAnnoatationReader读取自定义注释

时间:2013-03-06 05:50:38

标签: java jaxb annotations

RuntimeAnnotationReader如何用于JAXB注释以在运行时读取自定义注释和控制类字段。在谷歌搜索时我发现此链接http://glassfish.10926.n7.nabble.com/injecting-JAXB-annotations-at-runtime-td59852.html但我无法收集有关RuntimeAnnotationReader的更多信息。 我有以下要求: 假设我有一个类名Person.java

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;

@XmlRootElement(name="Person")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({Student.class})
public class Person <T>{

private T payload;
@XmlElement(name = "Person-Name")
private String name;

public void setPayload(T payload){
    this.payload = payload;
}

public T getPayload(){
    return payload;
}

public void setName(String name){
    this.name = name;
}

public String getName(){
    return name;
}
}

和student.java:

  package RuntimeAnnotation;

  import javax.xml.bind.annotation.XmlAccessType;
  import javax.xml.bind.annotation.XmlAccessorType;
  import javax.xml.bind.annotation.XmlElement;
  import javax.xml.bind.annotation.XmlRootElement;

  @XmlRootElement
  @XmlAccessorType(XmlAccessType.FIELD)
  public class Student {

@XmlElement
private String name;

@XmlElement
private String id;

public void setName(String name) {
    this.name = name;
}

public String getName(){
    return name;
}

public void setId(String id){
    this.id = id;
}

public String getId(){
    return id;
}
  }

在初始化人类对象时,我将有效负载字段设置为学生对象。现在,虽然编组XML输出显示有效负载作为标记名,但我希望学生应该出现在标记名。

元帅输出:

 <Person>
     <payload xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="student">
      <name>ABC</name>
      <id>239423</id>
  </payload>
<Person-Name>XYZ</Person-Name>
</Person>

预期产出:

<Person>
<T>
    <name>ABC</name>
    <id>239423</id>
<T>
<Person-Name>XYZ</Person-Name>
</Person>

P.S。:应该是参数化的类名。在上述情况下,T应该是学生。

1 个答案:

答案 0 :(得分:0)

要回答您的问题,请参阅Annox以获取自定义Annotation Reader实现的示例:

https://svn.java.net/svn/annox~svn/trunk/core/src/main/java/org/jvnet/annox/xml/bind/AnnoxAnnotationReader.java

免责声明:我是Annox和许多其他JAXB实用程序的作者。

但除此之外我不认为你真的需要这个运行时技巧来实现你的目标。阅读有关@XmlElementRef和JAXBElement的更多信息。您可以通过具有以下有效负载来获取XML:

@XmlElementRef
JAXBElement<T> payload;