【发布时间】:2020-10-06 22:34:52
【问题描述】:
我正在使用 spring-boot 2.1.6,并且有一个 API 可以接受包含如下日期的表单:
@Data
public class MyForm {
private LocalDate date;
...
}
@Controller
public class MyController {
@PostMapping("...")
public ResponseEntity<...> post(@RequestBody MyForm myForm) {
...
}
}
spring MVC 默认接受这种 JSON 格式:
{
"date": [2020, 6, 17],
...
}
所以在前端,我的 JavaScript 代码只需提交一个这样的表单,即 JS 会将日期转换为数组。
但是当我运行 spring-boot 测试时,这个序列化不起作用,代码如下:
private ObjectMapper mapper = new ObjectMapper();
@Autowired
private MockMvc mockMvc;
@Test
public void doTest() {
MyForm form = ...
MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post("/...").
contentType("application/json").content(mapper.writeValueAsString(form)).andReturn();
...
}
这是因为 Jackson 默认将 LocalDate 序列化为:
{
"date": {
"year":2020,
"month":"JUNE",
"monthValue":6,
...
}
...
}
这里提到:LocalDate Serialization: date as array?,有很多配置可以强制 spring-boot 将数据序列化为格式yyyy-MM-dd。但我不想更改我的 JS 代码。我只是想让我的测试用例工作。
如何配置ObjectMapper 以强制Jackson 将LocalDate 序列化为数组?我只想得到这个:
{
"date": [2020, 6, 17],
...
}
更新
LocalDate 这里是java.time.LocalDate 但不是org.joda.time.LocalDate。
【问题讨论】:
-
您可以尝试从
.json文件中读取.content(...)。一种解决方法,而不是为测试编写自定义序列化程序。 -
但在我的测试用例中,MyForm 是由一堆 Java 代码生成的 :-(
标签: java json spring date jackson