MOXy JAXB无法解组到List <int []>

时间:2018-10-25 14:38:06

标签: java jaxb eclipselink moxy

我能够使用Oracle JDK 1.8标准库将下面的结构解编为List。

fread2(void *ptr, size_t size, size_t nmemb, FILEPAIR *filePair)

我在下面有一个和XmlAdapter类,将String标记为int [],反之亦然,并在根XML类上使用XMlJavaTypeAdapter,如下所示。

<parent>
    <child>1234 1234 1234</child>
    <child>1231 1313 1331</child>
</parent>

但是当我切换为使用EclipseLink MOXy实现时,出现了异常。 有人尝试过吗?

class ChildAdapter extends XmlAdapter<String,int[]> {
    ...
}


@XmlRootElement(name="parent")
class Parent {
    ...
    private List<int[]> children;
    ...
    @XmlElement(name="child")
    @XmlJavaTypeAdapter(ChildAdapter.class)
    public void setChildren(List<int[]> children) {
        ...
    }
    ...
}

...

使用Moxy,唯一的方法是我需要创建一个Wrapper类来保存int [],如下所示,但这不是我真正想要的。

Exception [EclipseLink-33] (Eclipse Persistence Services - 2.7.3.v20180807-4be1041): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Trying to invoke [setChildren] on the object with the value [[I@1f9f6368].  The number of actual and formal parameters differs, or an unwrapping conversion has failed.
Internal Exception: java.lang.IllegalArgumentException: argument type mismatch
Mapping: org.eclipse.persistence.oxm.mappings.XMLDirectMapping[childrenList-->child/text()]
Descriptor: XMLDescriptor(mypackage.Parent --> [DatabaseTable(Parent)])
at org.eclipse.persistence.exceptions.DescriptorException.illegalArgumentWhileSettingValueThruMethodAccessor(DescriptorException.java:714)
at org.eclipse.persistence.internal.descriptors.MethodAttributeAccessor.setAttributeValueInObject(MethodAttributeAccessor.java:286)
at org.eclipse.persistence.internal.descriptors.MethodAttributeAccessor.setAttributeValueInObject(MethodAttributeAccessor.java:239)

将适配器更改为class ChildWrapper { private int[] childs; public void setChilds(int[] childs) { this.childs = childs } public int[] getChilds() { return childs; } }

令人惊讶的是,class ChildAdapter extends XmlAdapter<String, ChildWrapper>现在已成为结果对象中的List<int[]> children。我没有更改父对象,因此解组器现在通过反射或其他方式创建了另一个对象?这不是坏吗?

1 个答案:

答案 0 :(得分:0)

我有一个解决方法。 似乎这里的问题Moxy不喜欢列表List<List<T>>的列表。

我创建了<String,Object>类型的XML适配器,并将对象转换为List并用于@XMLJavaTypeAdapter(ChildAdapter.class)注释。

public class ChildAdapter extends XmlAdapter<String, Object> {

    @Override
    public Object unmarshall(String v) {
         List<Integer> result = new ArrayList<>();
         ...Tokenize your String v and add them to result...
         return result;
    }


    @Override
    public String marshall(Object v) {
         List<Integer> l = (List<Integer)v;
         StringBuilder b = new StringBuilder();
         ...Loop l and append b...
         return b.toString();
    }
}