MOXy JAXB не может отменить вызов в список - PullRequest
0 голосов
/ 25 октября 2018

Мне удалось разобрать приведенную ниже структуру в 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 создает другой объект с помощью отражения или что-то еще?Разве это не сломано?

1 Ответ

0 голосов
/ 09 ноября 2018

У меня есть обходной путь.Похоже, проблема здесь: Moxy не нравится List of List List<List<T>>.

. Я создал адаптер XML типа <String,Object>, преобразовал объект в 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();
    }
}
...