Как использовать аннотации JAXB во время выполнения - PullRequest
1 голос
/ 31 октября 2011

У меня есть следующий класс бобов

@XmlRootElement(name = "book")
//Optional
@XmlType(propOrder = {"name" })
public class Book {

private String name;
private int num;

@XmlTransient
public int getNum() {
    return num;
}

public void setNum(int num) {
    this.num = num;
}

// name for your XML-Output:
@XmlElement(name = "bookName")
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
}

и соответствующий код сортировки

private static void marshalXML(Book bookstore) {

    Writer w = null;
    try {
        // create JAXB context and instantiate marshaller
        JAXBContext context = getContext();
        if (context != null) {
            Marshaller m = context.createMarshaller();
            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            m.marshal(bookstore, System.out);
            w = new FileWriter(BOOKSTORE_XML);
            m.marshal(bookstore, w);
        }
    } catch (Exception e) {
        System.out.println("error in marshalling");
    } finally {
        try {
            w.close();
        } catch (Exception e) {
        }
    }
}

Я хочу сделать атрибуты настраиваемыми во время выполнения, я хочу указать @xmltransient для "num" во время выполнения, а не во время компиляции. Как я могу это сделать?

Ответы [ 3 ]

3 голосов
/ 31 октября 2011

Примечание: Я EclipseLink JAXB (MOXy) и являюсь членом JAXB 2 (JSR-222) expert group.

Реализация MOXy JAXB предлагает возможность манипулировать метаданными сопоставления во время выполнения через расширение MetadataSource.Для подробного примера см .:

2 голосов
/ 31 октября 2011

Можно добавлять аннотации во время выполнения.

Парень из нашей компании попробовал это на занятиях, посмотрите код:

https://github.com/OlivierCroisier/AnnotationInjector/blob/master/src/main/java/net/thecodersbreakfast/annotationinjector/AnnotationInjector.java

Обратите внимание, что он только добавляет аннотации к классу. Он говорит, что сложнее сделать то же самое с методами или конструктором. Я не уверен, что понимаю все, что он говорит в своих французских слайдах (http://www.slideshare.net/Zenika/annotations-paris-jug в конце) но кажется, что то, что вы хотите, может быть возможным, но ваши аннотации будут только на тех экземплярах, в которых вы их изменяете, а не на всех экземплярах (но, возможно, это то, что вы хотите?)

Однако он не сказал, как получить карту аннотаций на поле или метод конкретного экземпляра, и я не вижу, как его получить. Обратите внимание, что многие методы JDK возвращают скопированные значения, поэтому вы не можете просто изменить массив getAnnotations (), он не будет иметь никакого эффекта ... (но кажется необходимым инициализировать поле аннотаций в классе, см. Его код)

Удачи, возможно, попытайтесь связаться с ним.

Изменить: вы могли бы просто сделать 2 разных класса и выбрать правильный для использования во время выполнения? это кажется мне легче, если вы не можете использовать МОКСИ. Но я думаю, что вы не сможете переопределить метод с / без xmltransient, потому что они не являются @Inherited для этой аннотации JAXB, как мне кажется (но я могу ошибаться, но никогда не проверял наследование аннотаций ...

0 голосов
/ 31 октября 2011

Вы, вероятно, можете написать собственный адаптер (см. Javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter и XmlAdapter).Но почему ты хочешь это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...