我们遇到的问题是我们必须为同一个JAVA对象生成不同的XML表示。
E.g。我们有一个User-Class,它包含机密信息,如lastLoginDate或birthday。
对于归档,我们需要一个带有lastLoginDate的完整XML表示 和生日。
但是,对于与外部合作伙伴的数据交换,我们不希望这样做 包括这些机密信息。
因此,对象始终是相同的,但我们希望将其编组为一个上下文中的一个XML表示,并将其编组到另一个上下文中的另一个XML表示中。
@XmlType
public class UserData implements UserInfoBean {
private String firstName;
private String lastName;
private Timestamp lastLogin;
@XmlAttribute(required = false)
public Timestamp getLastLogin() {
return lastLogin;
}
public void setLastLogin(Timestamp lastLogin) {
this.lastLogin = lastLogin;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstname) {
this.firstName = truncate(firstname, 50);
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastname) {
this.lastName = truncate(lastname, 80);
}
...
}
目前我们使用java-annotation来详细配置XML。但是我们还没有找到任何方法来提供两种不同的jaxb配置。
谢谢
瓦伦斯坦
答案 0 :(得分:3)
有几种方法可以解决这个问题。
最简单的可能是使用MOXy XML Bindings。您可以使用多个绑定并使用一个或另一个版本创建JAXBContext
:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream iStream = classLoader.getResourceAsStream("metadata/normal-xml-bindings.xml");
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, iStream);
JAXBContext ctx = JAXBContext.newInstance(new Class[] { Customer.class }, properties);
或者,您也可以编写自定义注释阅读器,并在创建JAXBContext
时使用它。例如,如果存在某个附加注释,则此自定义注释阅读器可以禁止某些属性。
public class CustomAnnotationReader extends
AbstractInlineAnnotationReaderImpl<Type, Class, Field, Method>
implements RuntimeAnnotationReader { ... }
// ....
final RuntimeAnnotationReader annotationReader = new CustomAnnotationReader();
final Map<String, Object> properties = new HashMap<String, Object>();
properties.put(JAXBRIContext.ANNOTATION_READER, annotationReader);
final JAXBContext context = JAXBContext.newInstance(
contextPath, Thread.currentThread()
.getContextClassLoader(), properties);
我个人可能会使用自定义注释阅读器 - 这将允许保留注释(而不是XML绑定)。