JAX-B的多种配置

时间:2018-03-18 16:44:46

标签: java configuration annotations jaxb

我们遇到的问题是我们必须为同一个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配置。

谢谢

瓦伦斯坦

1 个答案:

答案 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绑定)。