Исключение Не найден подходящий конструктор для типа [простой тип при синтаксическом анализе XML-файла в POJO с помощью fastxml

Мне нужно десериализовать некоторый файл XML в обычный объект Java, используя jackson-dataformat-xml. Итак, я делаю:

import com.fasterxml.jackson.dataformat.xml.XmlMapper;

XmlMapper mapper = new XmlMapper();
return mapper.readValue(xmlString, Certificate.class);

xmlString имеет вид:

    <?xml version="1.0" encoding="UTF-8"?>
    <doc>
        <r  key="0">
            <ATT_SEARCH DM="dm1" DS="ds1" DocType="1"/>
            <ATT_SEARCH DM="dm2" DS="ds2" DocType="2"/>
        </r>
    </doc>

И класс Сертификат:

package ua.max;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import java.util.List;


@JacksonXmlRootElement(localName = "doc")
@XmlAccessorType(XmlAccessType.FIELD)
public class Certificate {

    @JacksonXmlProperty(localName = "r")
    private R r;

    public R getR() {
        return r;
    }

    public void setR(R r) {
        this.r = r;
    }


    public class R {

        @JacksonXmlProperty(localName = "ATT_SEARCH")
        @JacksonXmlElementWrapper(useWrapping = false)
        private List<AttSearch> attSearch;

        public List<AttSearch> getAttSearch() {
            return attSearch;
        }

        public void setAttSearch(List<AttSearch> attSearch) {
            this.attSearch = attSearch;
        }

        @JacksonXmlProperty(isAttribute = true, localName = "key")
        private String key;

        public String getKey() {
            return key;
        }

        public void setKey(String key) {
            this.key = key;
        }


        public class AttSearch {

            @JacksonXmlProperty(isAttribute = true, localName = "DM")
            private String dm;

            @JacksonXmlProperty(isAttribute = true, localName = "DS")
            private String ds;

            @JacksonXmlProperty(isAttribute = true, localName = "DocType")
            private String docType;


            public String getDm() {
                return dm;
            }

            public void setDm(String dm) {
                this.dm = dm;
            }

            public String getDs() {
                return ds;
            }

            public void setDs(String ds) {
                this.ds = ds;
            }

            public String getDocType() {
                return docType;
            }

            public void setDocType(String docType) {
                this.docType = docType;
            }


        }


    }


}

После попытки десериализовать XML я получил исключение:
"Не найден подходящий конструктор для типа [простой тип, класс ua.max.Certificate$R]: невозможно создать экземпляр из объекта JSON"

Мои попытки:
1. Если я добавлю модификатор "статический" для своих внутренних классов, он работает, я получаю объект Java, но, кроме объекта "Список 2" "ATT-SEARCH", я получил первый объект null
2. Добавление разных конструкторов не дало никакого эффекта


person maxi    schedule 22.08.2013    source источник


Ответы (1)


R и AttSearch должны быть статическими:

 public static class R {
   // other stuff

 public static class AttSearch {
   // other stuff

В противном случае компилятор создает конструктор по умолчанию со ссылкой на внешний класс в качестве параметра, поэтому fastxml не может найти конструктор без параметров и создать pojo.

person aim    schedule 22.08.2013
comment
Если я использую static, мой первый элемент List‹AttSearch› имеет значение null. - person maxi; 22.08.2013
comment
У меня есть еще один пример (без элементов списка), где все работает хорошо (я могу показать вам, если нужно). Вот почему я предполагаю, что это должно работать без статики, но я не понимаю, как я могу это сделать. Что мне делать, чтобы решить проблему с конструкторами? - person maxi; 22.08.2013
comment
Я попробовал ваш пример, и в поле attSearch (2 элемента) нет нулевого элемента. Я использую fasterxml с версией 2.2.2. - person aim; 22.08.2013
comment
Если вы не хотите делать эти классы статическими, просто переместите их на уровень пакета :) - person aim; 22.08.2013
comment
Я использую версию 2.1.3 - первый объект нулевой, но на 2.2.2 - я получил исключение: Exception in thread main java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition .getWrapperName()Lcom/fasterxml/jackson/databind/PropertyName; Насчет статики я уже согласился :) Что конкретно вы делаете, кроме добавления статики? Может быть, вы можете поделиться своим источником? - person maxi; 22.08.2013
comment
О статических и нестатических классах можно прочитать в документации по Java - person aim; 22.08.2013
comment
Большое спасибо! Со статикой и версией 2.2.2. Проблема была в многомодульном проекте - зависимость от родительского компонента (2.2.2) конфликтует с зависимостью в подмодуле - person maxi; 22.08.2013