Java 如何在运行时使用JAXB注释

Java 如何在运行时使用JAXB注释,java,jaxb,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; }

我有以下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) {
        }
    }
}

我想让属性在运行时可配置,我想在运行时而不是编译时指定@xmltransive on num。我怎么做?

您可能可以编写一个自定义适配器,请参见javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter和XmlAdapter。但是为什么要这样做呢?

您可能可以编写一个自定义适配器,请参见javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter和XmlAdapter。但是为什么要这样做呢?

可以在运行时注入注释

我们公司的一个人在课堂上试过这个,看到代码了吗

注意,它只在类上注入注释。他说,在方法或构造函数中也很难做到这一点。我不确定他在法语幻灯片上说的话是否都听懂了http://www.slideshare.net/Zenika/annotations-paris-jug 最后 但似乎您想要的是可能的,但是您的注释将只在您修改它们的实例上,而不是所有实例上,但这可能是您想要的

但是,他没有告诉我如何在字段或特定实例的方法上获得注释映射,我也不知道如何获得它。 请注意,许多JDK方法返回复制的值,因此您不能只修改getAnnotations数组,它不会产生任何效果。。。但是似乎有必要初始化类上的annotations字段,参见他的代码

祝你好运,也许试着联系他

编辑:您可以简单地创建两个不同的类,然后选择一个在运行时使用的类?如果你不能使用MOXy,这对我来说似乎更容易。
但我认为您将无法覆盖使用/不使用xmltransient的方法,因为它们在JAXB注释上没有@Inherited。这似乎是错误的,我从未测试过注释继承性…

在运行时注入注释是可能的

我们公司的一个人在课堂上试过这个,看到代码了吗

注意,它只在类上注入注释。他说,在方法或构造函数中也很难做到这一点。我不确定他在法语幻灯片上说的话是否都听懂了http://www.slideshare.net/Zenika/annotations-paris-jug 最后 但似乎您想要的是可能的,但是您的注释将只在您修改它们的实例上,而不是所有实例上,但这可能是您想要的

但是,他没有告诉我如何在字段或特定实例的方法上获得注释映射,我也不知道如何获得它。 请注意,许多JDK方法返回复制的值,因此您不能只修改getAnnotations数组,它不会产生任何效果。。。但是似乎有必要初始化类上的annotations字段,参见他的代码

祝你好运,也许试着联系他

编辑:您可以简单地创建两个不同的类,然后选择一个在运行时使用的类?如果你不能使用MOXy,这对我来说似乎更容易。 但我认为您无法覆盖使用/不使用xmltransient的方法,因为它们在JAXB注释上没有@Inherited。这似乎是错误的,我从未测试过注释继承性…

注意:我是JAXB 2 JSR-222专家组的负责人和成员

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

注意:我是JAXB2JSR-222专家组的负责人和成员

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


最好的解决方案是使用两个模型类Y扩展X:X具有正常的注释,Y具有@xmltransive on num。我希望通过一些xml或其他方式完成此配置。具体配置是什么?从XML的角度来看,我在前面的评论中忽略了这一点,您可以对两个XML标记建模,但使用不同的名称空间=X和=Y。我的代码我指定attr num在编译时为@xmltransive,我希望它在运行时完成最好的解决方案是使用两个模型类Y扩展X:X具有正常的注释,Y在num上有@xmltransive。我希望这个配置通过一些xml或其他东西来完成。具体配置是什么?从XML的角度来看,我在前面的评论中忽略了这一点,您可以对两个XML标记建模,但使用不同的名称空间=X和=Y。我的代码我指定attr num在编译时为@xmltransive,我希望它在运行时完成我希望它可以自定义,可能是这样的情况,我正在使transient的attr稍后将更改为non-transientWell,有一个解决方法:@xmlementname=bookNum,required=false public Integer getNum{if isNumTransient{return null;}else{return num;}我想使其可自定义,可能是这样,我正在制作的属性tr
ansient稍后将更改为非transientWell,有一个解决方法:@XmlElementname=bookNum,required=false public Integer getNum{if isNumTransient{return null;}else{return num;}}非常棘手的解决方案:幻灯片54包含解决方案:字段mapRef=Class.Class.getDeclaredFieldannotations;mapRef.setAccessibletrue;Map annots=Map mapRef.gettargetClass。。。mapRef.settargetClass,新注释;非常棘手的解决方案:幻灯片54包含以下解决方案:Field mapRef=Class.Class.getDeclaredFieldannotations;mapRef.setAccessibletrue;Map annots=Map mapRef.gettargetClass。。。mapRef.settargetClass,新注释;感谢项目链接!我已经尝试了404,但它的结果-也许你可以解决这个问题。另外,我认为在这个例子中应该读address.setstreet,123 A街;地址:setcity,任何城镇;感谢项目链接!我已经尝试了404,但它的结果-也许你可以解决这个问题。另外,我认为在这个例子中应该读address.setstreet,123 A街;地址:setcity,任何城镇;