Весной Джексон не отменяет правильность XML - PullRequest
0 голосов
/ 24 сентября 2019

Я хотел бы написать службу отдыха, которая принимает и производит 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"/>

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

enter image description here

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

Контроллер

@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
}

Конфигурация для пружины

@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>

1 Ответ

0 голосов
/ 24 сентября 2019

Входной XML должен выглядеть следующим образом:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...