jackson Java 8本地日期时间引发JsonString异常

olmpazwi  于 2022-11-08  发布在  Java
关注(0)|答案(3)|浏览(522)

我正在测试我的控制器的spring-boot代码。为此我写了如下测试

@RunWith(SpringRunner.class)
@WebMvcTest(AnimalController.class)
class AnimalControllerTest {

    @Autowired
    MockMvc mvc;
    @MockBean
    AnimalService animalService;

    @Test
    void addAnimal() throws Exception {
        AnimalDto animalDto = new AnimalDto();
        mvc.perform(MockMvcRequestBuilders
                   .post("/animal/add")
                   .content(asJsonString(new AnimalDto(null, "dog", LocalDateTime.now(),null, null, null, null)))
                   .contentType(MediaType.APPLICATION_JSON)
                   .accept(MediaType.APPLICATION_JSON))
                   .andExpect(status().isOk())
                   .andDo(MockMvcResultHandlers.print())
                   .andExpect(MockMvcResultMatchers.jsonPath("$.id").exists());

    }
}
 private String asJsonString(Object animalDto) {
        try {
            return new ObjectMapper().writeValueAsString(animalDto);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

但我在错误下面

java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: com.self.zoo.dto.AnimalDto["located"])

    at com.self.zoo.controller.AnimalControllerTest.asJsonString(AnimalControllerTest.java:63)
    at com.self.zoo.controller.AnimalControllerTest.addAnimal(AnimalControllerTest.java:50)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: com.self.zoo.dto.AnimalDto["located"])
    at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)

但是我在类路径中看到JSR-310 jar和Java faster-json-Java8 jar。x1c 0d1x添加以下内容是Maven依赖项:

<dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency>
<dependency>
            <groupId>com.fasterxml.jackson.module</groupId>
            <artifactId>jackson-modules-java8</artifactId>
            <version>2.13.3</version>
            <type>pom</type>
            <scope>runtime</scope>
        </dependency>
5kgi1eie

5kgi1eie1#

在你的代码中,你正在使用一个新示例化的ObjectMapper,它没有注册所有的模块。相反,使用Sping Boot 提供的预先配置的ObjectMapper。你可以在你的测试中使用@Autowired

@Autowired
private ObjectMapper mapper;

private String asJsonString(Object animalDto) {
  try {
    return mapper.writeValueAsString(animalDto); 
  } catch (JsonProcessingException e) {
    throw new RuntimeException(e); 
  }
}

在依赖项中,您不需要添加jackson-datatype-jsr310jackson-modules-java8。默认情况下,这些依赖项已经由Sping Boot 提供并自动配置。因此,请删除这些依赖项。

cetgtptt

cetgtptt2#

您需要使用ObjectMapper示例显式注册JavaTimeModule。

@Bean
public ObjectMapper mapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JavaTimeModule());
    return mapper;
}

您可以访问https://github.com/FasterXML/jackson-modules-java8#usage

8mmmxcuj

8mmmxcuj3#

使用注解对属性进行注解

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")

下面是这个问题的完整答案,解释了这一切:Spring Data JPA - ZonedDateTime format for json serialization

相关问题