2013-03-06 4 views
0

Как RuntimeAnnotationReader может использоваться для аннотаций JAXB для чтения пользовательских аннотаций и полей класса управления во время выполнения. Если поиск в google я нашел эту ссылку http://glassfish.10926.n7.nabble.com/injecting-JAXB-annotations-at-runtime-td59852.html, но я не смог собрать много информации о RuntimeAnnotationReader. У меня есть следующий reqirement: Предположим, у меня есть имя класса Person.javaRuntimeAnnoatationReader для чтения пользовательских аннотаций

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-вывода показывает полезную нагрузку как тэг, но я хочу, чтобы учащийся должен появиться в тэге.

Marshal выход:

<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 должен быть Student.

+0

Посмотрите, поможет ли этот ответ на SO. http://stackoverflow.com/questions/9799837/insert-custom-annotation-in-java-field-using-annotate-plugin-jaxb-upon-xsd –

+0

аннотировать плагин позволяет загружать аннотаций из XML-ресурса, должен быть создан до компиляции. Я хочу добавить аннотацию в поле во время выполнения. – user2122853

ответ

0

Чтобы ответить на ваш вопрос, см Annox для примера пользовательской реализации Аннотация чтения:

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;