Spring 的 @WebMvcTest 不适用于 Java 8 类型

Posted

技术标签:

【中文标题】Spring 的 @WebMvcTest 不适用于 Java 8 类型【英文标题】:Spring's @WebMvcTest doesn't work with Java 8 types 【发布时间】:2017-10-27 04:49:57 【问题描述】:

在 Spring Boot 应用程序中,我有一个休息控制器,它接收一个包含 Java 8 类型 LocalDate 的有效负载。 我也插入了这个库:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

控制器在调用时工作正常,但是在该字段上的 @WebMvcTest 集成测试失败,出现 400 HTTP 代码和此异常:

Resolved Exception:
             Type = org.springframework.http.converter.HttpMessageNotReadableException 

生产调用和测试调用中的日期为:

"date":"2017-03-21"

如果这很重要。

有没有办法让@WebMvcTest 与 Java8 类型一起工作?

【问题讨论】:

【参考方案1】:

您应该使用MockMvcBuilders 注册您拥有的任何转换器,例如:

MockMvcBuilders
        .standaloneSetup(controller)
        .setMessageConverters(converter) // register..
        .build();

或者简单地说(我这样做)有一个@Bean,它返回已经配置的ObjectMapper(带有ObjectMapper#registerModule(new JavaTimeModule()))并返回它。这个@Configuration 应该在你的测试中使用。

【讨论】:

JSR310Module() 已弃用,应使用 JavaTimeModule()【参考方案2】:

受 Eugene 的提示启发,在测试配置中添加了以下 bean 配置:

@Bean
@Primary
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) 
    return builder.modules(new JavaTimeModule()).build();

这解决了问题。

编辑: 使用更简单的配置(类路径中的 Spring Boot + jackson-datatype-jsr310 库)可以正常工作:

@Bean
@Primary
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) 
    return builder.build()

【讨论】:

【参考方案3】:

至于 java.time.LocalDate,您可以直接将 LocalDate 解析/格式化为字符串,然后由 RestControllerMethod 解析回 LocalDate:

@RestController
@RequestMapping("/api/datecontroller/")
public class YourDateController

@GetMapping(value = "myDateMethod/" + "date")
public void yourDateMethod(@PathVariable("date") @DateTimeFormat(pattern="yyyy-MM-dd") final LocalDate date) 
// ... your code ...
    

【讨论】:

以上是关于Spring 的 @WebMvcTest 不适用于 Java 8 类型的主要内容,如果未能解决你的问题,请参考以下文章

带有 @EnableJpa* 注释的 Spring @WebMvcTest

在 Spring Boot 中禁用 @WebMvcTest 的 Spring Security 配置类

在 Spring Boot 测试类上使用 @WebMvcTest 注释时出错

错误:在为 Spring Controller 执行 @WebMvcTest 时找不到 @SpringBootConfiguration

Spring Annotation @WebMvcTest 在具有 Jpa 存储库的应用程序中不起作用

在 Spring Boot 1.4 MVC 测试中使用 @WebMvcTest 设置 MockMvc