使用 JSON 使用 Spring Boot 格式化 Java 时间

San*_*Rey 0 java spring json jackson spring-boot

我想在 Spring Boot v1.5.14.RELEASE 应用程序中实现一个自定义验证器。首先,我创建一个自定义约束注释:

我有这个对象:

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
@SuperBuilder
public class Hotel {

    @JsonFormat(pattern = "yyyy-MM-dd")
    private OffsetDateTime interactionDurationStart;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private OffsetDateTime interactionDurationEnd;

}
Run Code Online (Sandbox Code Playgroud)

在yml中:

spring:
  jackson:
    mapper:
      DEFAULT_VIEW_INCLUSION: true
    serialization:
      WRITE_DATES_AS_TIMESTAMPS: false
Run Code Online (Sandbox Code Playgroud)

在我的配置文件中:

@Primary
@Bean
public ObjectMapper objectMapper() {

    ObjectMapper objectMapper = new ObjectMapper();
    //objectMapper.registerModule(new JavaTimeModule());
    SimpleModule simpleModule = new SimpleModule();
    simpleModule.addSerializer(OffsetDateTime.class, new JsonSerializer<OffsetDateTime>() {
        @Override
        public void serialize(OffsetDateTime offsetDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
            jsonGenerator.writeString(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(offsetDateTime));
        }
    });
    objectMapper.registerModule(simpleModule);

    return objectMapper;
}
Run Code Online (Sandbox Code Playgroud)

但这是我在 API 响应中看到的

"interactionDurationEnd" : {
      "offset" : {
        "totalSeconds" : 7200,
        "id" : "+02:00",
        "rules" : {
          "transitionRules" : [ ],
          "transitions" : [ ],
          "fixedOffset" : true
        }
      },
Run Code Online (Sandbox Code Playgroud)

Edu*_*iek 5

Spring MVC使用Jackson作为默认的 json 对象映射器。Jackson默认不支持 java8 的 Time API 的序列化/反序列化,但它提供了一个模块来集成它。只需将此依赖项包含在您的pom.xml

<dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
  </dependency>
Run Code Online (Sandbox Code Playgroud)

Spring Boot自动配置将检测Jackson模块类JavaTimeModule并将其添加到ObjectMapper实例中。

如果您ObjectMapper手动创建实例,则可以使用以下行添加模块:

objectMapper.registerModule(new JavaTimeModule());
Run Code Online (Sandbox Code Playgroud)

  • 这不是我的主场,但我的印象是 jackson-datatype-jsr310 已合并到 [jackson-modules-java8](https://github.com/FasterXML/jackson-modules-java8),并且您应该现在更喜欢使用后者。 (2认同)