MOXy JAXB 无法解编入 List<int[]>



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

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

其中我有一个如下所示的 XmlAdapter 类,将字符串标记为 int[],反之亦然,并在根 XML 类上使用 XMlJavaTypeAdapter,如下所示。

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) {
...
}
...
}

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

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)

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

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现在已List<ChildWrapper> children在生成的对象中。我没有更换父级,所以解组器现在通过反射或其他东西创建一个不同的对象?这不是坏了吗?

我有一个解决方法。 似乎这里的问题 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();
}
}

最新更新