Джексон неправильно распаковывает xml в Spring

Я хотел бы написать службу отдыха, которая принимает и создает XML или JSON на основе информации из заголовков. Для этого я следовал одному из учебников. Проблема в том, что когда я пытаюсь прочитать поля dto в контроллере Spring, все они имеют значение null.

В целях тестирования я отправляю в теле DTO, а в контроллере возвращаю его, объединяя строку Changed с двумя его полями.

В теле отправляю:

<?xml version="1.0" encoding="UTF-8"?>
<name>name</name>
<description>description</description>

Однако я получаю:

<Dto name="null Changed" description="null Changed"/>

Отправляю запрос почтальоном:

введите здесь описание изображения

Вот моя конфигурация:

Контроллер

@RestController
public class Controller {

    @RequestMapping(value = "/endpoint", method = RequestMethod.POST,
            consumes = {APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE},
            produces = {APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE})

    public Dto getAndReturnEntity(@RequestBody Dto dto) {

    dto.setName(dto.getName() + " Changed");
    dto.setDescription(dto.getDescription() + " Changed");
    return dto;
    }
}

DTO

@JacksonXmlRootElement
public class Dto {

@JacksonXmlProperty(isAttribute = true) // I also tried without it
private String name;

@JacksonXmlProperty(isAttribute = true)
private String description;

// getters and setters ommited for brevity
}

Конфигурация для Spring

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.favorPathExtension(true).
                favorParameter(false).
                parameterName("mediaType").
                ignoreAcceptHeader(false).
                useJaf(false).
                defaultContentType(MediaType.APPLICATION_JSON).
                mediaType("xml", MediaType.APPLICATION_XML).
                mediaType("json", MediaType.APPLICATION_JSON);
    }
}

Соответствующая часть pom.xml

   <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>

person menteith    schedule 24.09.2019    source источник
comment
Я не уверен в остальном, но это недопустимый XML. XML должен иметь ровно один корневой элемент, который содержит все остальные элементы в качестве своих потомков.   -  person kumesana    schedule 24.09.2019
comment
Ваш XML недействителен, он должен быть заключен в элемент <dto>.   -  person M. Deinum    schedule 24.09.2019


Ответы (1)


Входной XML должен быть таким:

<Dto>
  <name>abcd</name>
  <description>desc</description>
</Dto>

Если вы хотите, чтобы имена тегов отличались от тех, что вы можете использовать либо пользовательский сопоставитель объектов, либо добавить @JsonProperty.

person Gaurav Gupta    schedule 24.09.2019