Мне удалось разобрать приведенную ниже структуру в List, используя стандартную библиотеку Oracle JDK 1.8.
<parent>
<child>1234 1234 1234</child>
<child>1231 1313 1331</child>
</parent>
, где у меня есть классы XmlAdapter и, как показано ниже, для токенизации String в int [] и наоборот с использованием XMlJavaTypeAdapterв корневом классе XML, как показано ниже.
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
в полученном объекте.Я не поменял родителя, поэтому теперь unmarshaller создает другой объект с помощью отражения или что-то еще?Разве это не сломано?