JAXB编组和泛型

史蒂夫·斯克拉(Steve Skrla):

我正在尝试使用JAXB的自省功能来编组和分解所有使用JAXB批注标记的现有域对象。大多数事情都按预期运行,但是要获得一个相当简单的类进行序列化,我会遇到很多麻烦。此类在许多bean上用作@XmlElement,看起来像:

public class Range<E extends Comparable<E>> implements Serializable {
    protected boolean startInclusive, endInclusive;
    protected E       start, end;

    public Range(){
            startInclusive = endInclusive = true;
    }

    public boolean contains(E value){...}

    public E getEnd() {
            return end;
    }

    public void setEnd(E end) {
            this.end = end;
    }

    public boolean isEndInclusive() {
            return endInclusive;
    }

    public void setEndInclusive(boolean endInclusive) {
            this.endInclusive = endInclusive;
    }

    public E getStart() {
            return start;
    }

    public void setStart(E start) {
            this.start = start;
    }

    public boolean isStartInclusive() {
            return startInclusive;
    }

    public void setStartInclusive(boolean startInclusive) {
            this.startInclusive = startInclusive;
    }
}

我尝试执行以下操作,但没有成功,JAXB仍然对接口Comparable感到愤怒。

public class DoubleRange extends Range<Double> {}

将Range和DoubleRange都用作bean getter的返回类型会产生如下异常:

java.lang.Comparable是一个接口,JAXB无法处理接口。
    此问题与以下位置有关:
        在java.lang.Comparable 
        处在受保护的java.lang.Comparable com.controlpath.util.Range.start 
        在example.util.Range 
        处在example.util.DoubleRange 
        处在公共example.util.DoubleRange处example.domain.SomeBean.getRange()
        在example.domain.SomeBean

我意识到在大多数情况下List <T>和Map <T,U>只能工作,因为当在bean上遇到JAXB规范对这些类型有特殊规定时,但是有什么方法可以将我想要的内容传达给JAXB内省引擎,而不必重新实现非通用字段的范围?

ivan_ivanovich_ivanoff:

您可以通过执行以下操作来编写自定义适配器(不使用JAXB的XmlAdapter):

1)声明一个接受各种元素并具有JAXB批注的类,并按需要处理它们(在我的示例中,我将所有内容都转换为String)

@YourJAXBAnnotationsGoHere
public class MyAdapter{

  @XmlElement // or @XmlAttribute if you wish
  private String content;

  public MyAdapter(Object input){
    if(input instanceof String){
      content = (String)input;
    }else if(input instanceof YourFavoriteClass){
      content = ((YourFavoriteClass)input).convertSomehowToString();
    }else if(input instanceof .....){
      content = ((.....)input).convertSomehowToString();
    // and so on
    }else{
      content = input.toString();
    }
  }
}

// I would suggest to use a Map<Class<?>,IMyObjToStringConverter> ...
// to avoid nasty if-else-instanceof things

2)在您要编组的班级中使用此类而不是E

笔记

  • 当然,这不适用于复杂的(嵌套)数据结构。
  • 您必须考虑如何再次将其解组,这可能会更加棘手。如果太棘手,请等待比我更好的建议;)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章