我在Junit测试中遇到了反序列化问题。我有一个简单的RESTAPI,它返回一些DTO对象。当我调用我的endpoint时,响应没有问题-它是正确的。然后我尝试编写单元测试,获得MvcResult,并使用ObjectMapper将其转换为我的DTO对象。但我仍然收到:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.time.LocalDateTime` out of START_ARRAY token
at [Source: (String)"{"name":"Test name","firstDate":[2019,3,11,18,34,43,52217600],"secondDate":[2019,3,11,19,34,43,54219000]}"; line: 1, column: 33] (through reference chain: com.mylocaldatetimeexample.MyDto["firstDate"])
我试着使用JsonFormat并添加编译组:“com.fasterxml.jackson”。数据类型,名称:“jackson-datatype-jsr310”,版本:“2.9.8”到我的构建。gradle,但我使用的是Spring Boot 2.1.3。释放它,使其参与其中。我不知道如何修复它。我的简单endpoint和单元测试如下:
@RestController
@RequestMapping("/api/myexample")
public class MyController {
@GetMapping("{id}")
public ResponseEntity<MyDto> findById(@PathVariable Long id) {
MyDto myDto = new MyDto("Test name", LocalDateTime.now(), LocalDateTime.now().plusHours(1));
return ResponseEntity.ok(myDto);
}
}
MyDto类
public class MyDto {
private String name;
private LocalDateTime firstDate;
private LocalDateTime secondDate;
// constructors, getters, setters
}
单元测试
public class MyControllerTest {
@Test
public void getMethod() throws Exception {
MyController controller = new MyController();
MockMvc mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/api/myexample/1"))
.andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
String json = mvcResult.getResponse().getContentAsString();
MyDto dto = new ObjectMapper().readValue(json, MyDto.class);
assertEquals("name", dto.getName());
}
}
您可以在测试类中创建新的对象映射器:
MyDto dto = new ObjectMapper().readValue(json, MyDto.class);
尝试从Spring上下文注入ObjectMapper或手动注册模块:
mapper.registerModule(new JavaTimeModule());
另请参见:
问题内容: 我有按类别序列化为ISO-8601格式的字段。 当我收到以下JSON时, 我想通过工厂方法反序列化。我所有的尝试都以: 无法从值()实例化类型[简单类型,类]的值;没有单一的构造函数/工厂方法 我该如何实现?如何指定工厂方法? 编辑: 通过将jackson-datatype-jsr310模块包含到项目中并与一起使用,解决了该问题 。 问题答案: 香草杰克逊没有一种方法来 反序列化 一个
我已经将Spring Boot应用程序配置为以我希望的格式()返回日期,但是在JSON中接受这种格式的值有问题。 这些都是我到目前为止所做的事情: 为添加了maven依赖项: 在我的数据库中,我以以下格式将此日期存储为时间戳:。 如果我通过我的控制器访问这个实体,它将返回具有正确startDate格式的JSON。但是,当我尝试使用格式发布并反序列化它时,我会遇到以下异常: 我知道有很多关于这个话题
问题内容: 我已经在SO中阅读了一些关于答案的问题,这些问题与JSON属性之间的序列化和反序列化有关,但我似乎无法使其正常工作。 我已经设法将Spring Boot应用程序配置为以所需的格式()返回日期,但在以JSON格式接收值时遇到问题。 这些是我到目前为止所做的所有事情: 增加了对Maven的依赖: 在我的主要课程中指定: 禁用序列化作为时间戳记: 这是我的日期时间实体映射: 在我的数据库中,
我有一个字段,它通过类序列化为ISO-8601格式。 当我收到以下JSON时, 通过将jackson-datatype-jsr310模块包含到项目中,并使用和解决了这个问题。
好的,我做了更改,下面是我得到的JSON响应 它现在导致一个嵌套异常是java.lang.IllegalArgumentException:参数类型不匹配 NestedServletException:请求处理失败;嵌套异常是java.lang.IllegalArgumentException:参数类型不匹配org.springframework.web.servlet.framework.ser
我正在构建一个简单的项目与Spring boot和sping-kafka,我不能配置它,使其工作,它是一个简单的应用程序,生成笔记(作者,内容,createddatetime,lastmodefieddatetime)和发送基于笔记的事件,当他们被创建。 我已经玩了两天了,但我想我还没学会。 这是我的配置,我很确定它有很多锅炉板,但我已经用了几个例子来使我的工作。 我有2个生产者和消费者工厂,因为