在spring boot app中,我有一个rest控制器,它接受一个包含Java 8类型LocalDate
的有效负载。
我也插入了这个库:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
控制器在被调用时工作正常,但{400}整合测试在该字段上失败,包含400个HTTP代码和此例外:
@WebMvcTest
生产调用中的日期和测试调用将传递为:
Resolved Exception:
Type = org.springframework.http.converter.HttpMessageNotReadableException
如果重要的话。
有没有办法让"date":"2017-03-21"
能够使用Java8类型?
答案 0 :(得分:2)
您应该使用MockMvcBuilders
注册您拥有的任何转换器,例如:
MockMvcBuilders
.standaloneSetup(controller)
.setMessageConverters(converter) // register..
.build();
或者简单地说(我这样做)有@Bean
返回已配置的ObjectMapper
(带ObjectMapper#registerModule(new JavaTimeModule())
)并返回。这个@Configuration
应该在你的测试中使用。
答案 1 :(得分:1)
受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()
}
答案 2 :(得分:0)
对于java.time.LocalDate,您可以直接将LocalDate解析/格式化为一个String,然后由您的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 ...
}
}