为什么@EnableWebMvc会破坏JSON反序列化?

问题描述 投票:0回答:1

在我的示例应用程序中,我有一个简单的 @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;

}

没有什么特别的,只是 Lombok 生成一些样板代码。

但是,当我在应用程序配置中添加

@EnableWebMvc
注解时,post 请求失败并返回此错误

{
    "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:无法评估 Jackson 类型 [[简单类型,类 app.springtest.api.book.BookRequest]]: com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无效 类型

app.springtest.api.book.BookRequest
的类型定义: 参数 #0 没有属性名称,不可注入:不能用作 Creator [app.springtest.api.book.BookRequest 的构造函数, 注释:{接口 com.fasterxml.jackson.annotation.JsonCreator=@com.fasterxml.jackson.annotation.JsonCreator(mode=DEFAULT)}]

反序列化怎么会停止工作?

编辑:当

@RestController
不存在时,为什么
@EnableWebMvc
类可以在这种情况下工作?这不就是让 MVC 在 Spring 中工作的注解吗?

java spring-boot spring-mvc jackson lombok
1个回答
0
投票

当您依赖 spring boot 自动配置时,它会自动发现自定义 JsonSerializer、Converter 和许多其他 spring mvc 东西。这是在 WebMvcAutoConfiguration 中处理的。这种自动配置通常是通过

@SpringBootApplication

触发的

一旦添加

@EnableWebMvc
(注意包名称,来自
spring-web
),它将导入
DelegatingWebMvcConfiguration
。一旦导入此配置,
@ConditionalOnMissingBean
上的注释
WebMvcAutoConfiguration
将不再是真实的

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
public class WebMvcAutoConfiguration {

调试此类行为的一个好方法是在

application.yaml

中启用调试日志记录
debug: true

然后您将得到这些类型的报告: Conditional missing bean

© www.soinside.com 2019 - 2024. All rights reserved.