我正在尝试使用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内省引擎,而不必重新实现非通用字段的范围?
您可以通过执行以下操作来编写自定义适配器(不使用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] 删除。
我来说两句