为什么JAXB突然在Java 7的新ArrayList $ SubList类上停顿?

时间:2014-02-12 06:36:27

标签: jaxb

我们今天在一个客户站点的生产中注意到,在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下工作,这里建议的解决方法是什么?

3 个答案:

答案 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中尝试过给定的测试 - 没有故事。