Почему @EnableWebMvc нарушает десериализацию JSON? - PullRequest
5 голосов
/ 10 мая 2019

В моем примере приложения у меня есть простой контроллер @RestController:

package app.springtest.api.book;

import app.springtest.service.BookService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

@RestController
@RequestMapping("api/v1/book")
@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class BookController {

    private final BookService bookService;

    @PostMapping
    public ResponseEntity upsertBook(@Valid @RequestBody BookRequest bookRequest) {
        final BookResponse response = bookService.addBook(bookRequest);
        return ResponseEntity.ok().body(response);
    }
}

Он потребляет этот объект Json.

package app.springtest.api.book;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Wither;

import javax.validation.constraints.NotBlank;

@Data
@RequiredArgsConstructor(onConstructor = @__(@JsonCreator))
@Wither
public class BookRequest {

    @NotBlank
    @JsonProperty(value = "isbn", required = true)
    private final String isbn;

    @NotBlank
    @JsonProperty(value = "name", required = true)
    private final String name;

    @JsonProperty(value = "author", required = true)
    @NotBlank
    private final String author;

}

В этом нет ничего особенного, просто Ломбок генерирует некоторый шаблонный код.

Однако, когда я добавляю аннотацию @EnableWebMvc в конфигурацию приложения, почтовый запрос завершается неудачно и возвращает эту ошибку

{
    "timestamp": 1557494204976,
    "status": 415,
    "error": "Unsupported Media Type",
    "message": "Content type 'application/json;charset=UTF-8' not supported",
    "path": "/api/v1/book"
}

и в журнале произошла следующая ошибка:

.c.j.MappingJackson2HttpMessageConverter: не удалось оценить Джексона десериализация для типа [[простой тип, класс app.springtest.api.book.BookRequest]]: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Invalid определение типа для типа app.springtest.api.book.BookRequest: Аргумент # 0 не имеет имени свойства, не может быть введен: не может использоваться как Создатель [конструктор для app.springtest.api.book.BookRequest, аннотации: {интерфейс com.fasterxml.jackson.annotation.JsonCreator=@com.fasterxml.jackson.annotation.JsonCreator (режим = по умолчанию)}]

Как может быть, что десериализация перестает работать?

Редактировать: А почему класс @RestController работает в ситуации, когда @EnableWebMvc нет? Разве это не аннотация, которая заставляет MVC работать весной?

...