我们今天在一个客户站点的生产中注意到,在Java 6调用的JAXB下,ArrayList
编组正常,并且在Java 7调用的JAXB下失败。具体来说,当我们使用Java 7运行代码时,我们的属性被定义为实际返回List
调用结果的ArrayList#subList(int, int)
会导致封送异常。
这与ArrayList
的内部发生了巨大变化这一事实有关。显然已经改变的一件事是ArrayList#subList(int, int)
现在返回一个新的内部类(称为SubList
)。当JAXB遇到这个类时,好吧,繁荣。这是我们看到的堆栈的一部分:
Failed to create a new JAXBInstance.
com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
java.util.ArrayList$SubList is a non-static inner class, and JAXB can't handle those.
this problem is related to the following location:
at java.util.ArrayList$SubList
鉴于编组过去曾经在Java 6下工作,这里建议的解决方法是什么?
答案 0 :(得分:1)
在我们的地方注意到这个问题,我们不得不将子列表转换为AbstractPage(这是我们自己的具有分页支持的集合类型)集合&完成序列化。
答案 1 :(得分:0)
当我在JDK 1.7.0_45上为Mac运行以下内容时,一切都适合我。这相当于你在做什么吗?
Java模型
import java.util.*;
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Foo {
private ArrayList<String> bar;
public Foo() {
bar = new ArrayList<String>(3);
bar.add("A");
bar.add("B");
bar.add("C");
bar.add("D");
}
@XmlElement
public List<String> getBarSubset() {
return bar.subList(1, 3);
}
}
<强>演示强>
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Foo.class);
Foo foo = new Foo();
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(foo, System.out);
}
}
<强>输出强>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<foo>
<barSubset>B</barSubset>
<barSubset>C</barSubset>
</foo>
答案 2 :(得分:0)
我已经在JDK7和独立的最新JAXB中尝试过给定的测试 - 没有故事。