FasterXML - расширение Джексона XML переводит значения в null в pojo

Я решил дать Джексону XML шанс в моем проекте для преобразования строк XML в POJO.

Поэтому я использовал следующий отличный веб-сайт для создания pojo из моей строки xml.

Итак, он создал нужные мне классы, а затем я попытался прочитать значения xml в эти объекты.

К сожалению, некоторые значения были установлены как нулевые в объектах, и я не могу понять, почему:

Это начало строки xml:

<?xml version="1.0" encoding="UTF-8"?>
<schedule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" generated_at="2018-02-23T16:55:45+00:00" xmlns="http://schemas.thesite.com/jobsapi/v1/myjob" xsi:schemaLocation="http://schemas.thesite.com/jobsapi/v1/myjob http://schemas.thesite.com/asb/myjob/v1/xml/endpoints/myjob/schedule.xsd">
    <job_event id="sr:task:12004724" scheduled="2018-02-23T17:00:00+00:00" start_time_tbd="false" status="not_started">
        <task type="group" number="23"/>

И классы у меня есть:

public class Schedule
{
    private String generated_at;
    private String xmlns;
    private Job_event[] job_events;

    public String getGenerated_at ()
    {
        return generated_at;
    }

    public void setGenerated_at (String generated_at)
    {
        this.generated_at = generated_at;
    }

    public String getXmlns ()
    {
        return xmlns;
    }

    public void setXmlns (String xmlns)
    {
        this.xmlns = xmlns;
    }

    public Job_event[] getjob_events ()
    {
        return job_events;
    }

    public void setjob_events (Job_event[] job_events)
    {
        this.job_events = job_events;
    }

    @Override
    public String toString()
    {
        return "Schedule [generated_at = "+generated_at+", xmlns = "+xmlns+", job_events = "+job_events+"]";
    }
}

А также

public class Job_event {

    private String id;
    private String scheduled;
    private String start_time_tbd;
    private String status;

        //more fields, getters and setters   
}

Затем я использую это для преобразования строки в pojos:

ObjectMapper xmlMapper = new XmlMapper();
xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Schedule sched = xmlMapper.readValue(xmlString, Schedule.class);
Job_event[] job_events = sched.getJob_events();

И там я нахожу в каждом значении события в job_events, что значения членов, такие как id и статус, а остальные равны нулю.

Почему это? Строка xml в порядке.

Благодарю вас!


person dushkin    schedule 24.02.2018    source источник


Ответы (1)


Вы можете исправить это, выполнив следующие действия

  1. Используйте аннотацию @JacksonXmlProperty(isAttribute = true) для сопоставления полей Pojo с атрибутами XML.
  2. Используйте List вместо массива
  3. Используйте аннотацию @JacksonXmlElementWrapper(useWrapping = false), чтобы указать, что ваш список List<JobEvent> представлен как повторяющийся элемент XML.
  4. Я также думаю, что вы должны аннотировать свои поля с помощью localName , чтобы оставаться совместимым с соглашениями об именах Java

После этого он будет выглядеть

@JsonIgnoreProperties(ignoreUnknown = true)
public class JobEvent {
    @JacksonXmlProperty(isAttribute = true)
    private String id;
    @JacksonXmlProperty(isAttribute = true)
    private String scheduled;
    @JacksonXmlProperty(isAttribute = true, localName = "start_time_tbd")
    private String startTimeTbd;
    @JacksonXmlProperty(isAttribute = true)
    private String status;

    @Override
    public String toString() {
        return id + " " + scheduled + " " + " " + startTimeTbd + " " + status;
    }
}

Расписание.java

public class Schedule {
    @JacksonXmlProperty(isAttribute = true,localName="generated_at")
    public String generatedAt;
    @JacksonXmlProperty(isAttribute = true)
    public String xmlns;
     @JacksonXmlElementWrapper(useWrapping = false)
    public List<JobEvent> job_event;

    @Override
    public String toString()
    {
        return "Schedule [generated_at = "+generatedAt+", xmlns = "+xmlns+", job_events = "+job_event.toString()+"]";
    }
}

Тестовый звонок

@Test
    public void readXmlToSelfDefinedPojo2() throws Exception {

        ObjectMapper mapper = new XmlMapper();
        Schedule pojo = mapper.readValue(
                        Thread.currentThread().getContextClassLoader().getResourceAsStream("48963966.xml"),
                        Schedule.class);
        System.out.println(pojo + "");
    }

Для файла XML 48963966.xml

Будет печатать

Schedule [generated_at = 2018-02-23T16:55:45+00:00, xmlns = null, job_events = [sr:task:12004724 2018-02-23T17:00:00+00:00  false not_started, sr:task:12004725 2018-02-25T17:00:00+00:00  false not_started]]
person jschnasse    schedule 25.02.2018