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

时间:2017-05-26 10:19:33

标签: json spring spring-mvc spring-boot java-8

在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类型?

3 个答案:

答案 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 ...
    }
}