我有以下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而不是编译时间。我可以这样做吗?
答案 0 :(得分:3)
注意:我是EclipseLink JAXB (MOXy)负责人,是 JAXB 2(JSR-222)专家组的成员。
MOXy JAXB实现提供了通过其MetadataSource
扩展在运行时操作映射元数据的功能。有关详细示例,请参阅:
答案 1 :(得分:2)
可以在运行时注入注释。
我们公司的一个人在课上尝试过这个,看看代码:
请注意,它只会在类上注入注释。他说,使用方法或构造函数做同样的事情更难。我不太清楚他的法语幻灯片中的所有内容(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)。但是你为什么要那样做?