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