为包装值指定适配器

时间:2015-07-24 13:33:54

标签: java xml jaxb

  

问题:给定一个通用的包装类,如何在这种类型的字段上指定XmlAdapter,然后将其用于序列化包装的值?

情况:“一袋财产”

我有一个包含几个通用类型成员的类(包含一些业务逻辑,但它归结为此问题的类型化包装类),我想序列化,同时使用注释指定包装值的XmlAdapter该领域。

假设我们有一袋属性:

class Bag {
   public Property<TypeA> propertyA = new Property<TypeA>();
   public Property<TypeB> propertyB = new Property<TypeB>();
}

class Property<T extends Object> {
   T value;

   @XmlElement
   public T getValue()
   public T setValue(T value)
   // ...
}

只要TypeA或TypeB知道XmlAdapter或者按照定义可序列化,就可以很好地序列化/反序列化。

<Bag>
   <propertyA>myAValue</propertyA>
   <property>myBValue</propertyB>
</Bag>

如何为“属性”的值指定适配器?

在某些情况下,propertyA的值必须使用特定的XmlAdapter进行(反)序列化,例如:因为ist运行时值是从XML中的信息动态创建的。

  

要为类的成员指定XmlAdapter,通常可以使用@XmlJavaTypeAdapter Annotation。

据我所知,这个过程并不直接适用于此。 就我而言,我想在序列化Propertys值(例如propertyA.getValue())时使用适配器来注释“propertyA”字段。

理想情况下,它应如下所示。

class Bag {
   @PropertyValueAdapter(TypeAdapterForA.class)
   public Property<TypeA> propertyA = new Property<TypeA>();
   //...
} 

// This generically adapts TypeA
class TypeAdapterForA extends XmlAdapter<Object, TypeA> {
  public TypeA unmarshal(Object element){
  // ...
}

然而,我找不到实现这个的好方法。当然,我们可以为我们想要与Property一起使用的每个Type实现适配器类,然后基本上只转发编组,使适配器的数量加倍。一般的方式是可取的。

平庸的解决方法

使用XmlAdapters,(Un)Marshaller.Listener等进行了解决,我想出了一个使用XmlAdapter for Property类的解决方法,它在(通常)设置在对Bag的beforeUnmarshal调用中,以便它可以访问注释并可以手动选择正确的编组。但是,JAXB无法理解此连接(该模型现在不再与生成的XML相对应)。

这感觉不太理想。除了复杂且容易出错外,该模型不再正确反映数据;在解组时,我们无法找到目标(例如我们解组的Bag中的字段)。

所以问题仍然存在,给定一个通用的包装类,如何在这种类型的字段上指定XmlAdapter,然后应该使用它来序列化包装的值?

0 个答案:

没有答案