如何在运行时使用JAXB注释

时间:2011-10-31 17:20:10

标签: java jaxb

我有以下bean类

@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) {
        }
    }
}

我想在运行时使属性可配置,我想在运行时在“num”上指定@xmltransient而不是编译时间。我可以这样做吗?

3 个答案:

答案 0 :(得分:3)

注意:我是EclipseLink JAXB (MOXy)负责人,是 JAXB 2(JSR-222)专家组的成员。

MOXy JAXB实现提供了通过其MetadataSource扩展在运行时操作映射元数据的功能。有关详细示例,请参阅:

答案 1 :(得分:2)

可以在运行时注入注释。

我们公司的一个人在课上尝试过这个,看看代码:

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()数组,它不会产生任何影响......(但似乎有必要初始化类上的注释字段,参见他的代码)< / p> 祝你好运,也许试着联系他。

编辑:您可以简单地制作2个不同的类,并选择在运行时使用的正确类?如果你不能使用MOXy,这对我来说似乎更容易。 但我认为你无法覆盖带/不带xmltransient的方法,因为它们似乎没有@Inherited对JAXB注释(但我可能是错的,从未测试过注释继承...

答案 2 :(得分:0)

您可能可以编写自定义适配器(请参阅javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter和XmlAdapter)。但是你为什么要那样做?