有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用JSON通过Spring引导格式化Java时间

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

我有一个目标:

@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;

}

在yml中:

spring:
  jackson:
    mapper:
      DEFAULT_VIEW_INCLUSION: true
    serialization:
      WRITE_DATES_AS_TIMESTAMPS: false

在我的配置文件中:

@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;
}

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

"interactionDurationEnd" : {
      "offset" : {
        "totalSeconds" : 7200,
        "id" : "+02:00",
        "rules" : {
          "transitionRules" : [ ],
          "transitions" : [ ],
          "fixedOffset" : true
        }
      },

共 (3) 个答案

  1. # 1 楼答案

    这是因为spring使用的ObjectMapper默认只识别日期。如果要使用OffsetDateTime字段,需要注册一个序列化程序/反序列化程序来完成这项工作,请查看此Jackson date-format for OffsetDateTime in Spring Boot

    如果您想将字段类型更改为Date,那么我不确定JsonFormat是否可以工作,因为我从未使用过它。我解决这个问题的方法是提供一个ObjectMapper bean,让spring使用objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"))来实现这一点

    希望有帮助

  2. # 2 楼答案

    什么版本的杰克逊数据绑定

    尝试添加形状

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-mm-dd")
    

    如果它能工作,那么你的问题是旧版本的jackson bind有一个bug,需要使用shape,或者默认情况下它会是any

  3. # 3 楼答案

    Spring MVC使用Jackson作为默认的json对象映射器<默认情况下,em>Jackson不支持java8的时间API的序列化/反序列化,但它提供了一个模块来集成它。只需在^{中包含此依赖项即可:

    <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
      </dependency>
    

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

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

    objectMapper.registerModule(new JavaTimeModule());