Java Spring RequestBody无法正确解析datetime时区

Java Spring RequestBody无法正确解析datetime时区,java,spring,datetime,Java,Spring,Datetime,我有一个简单的rest服务来存储时间范围,但是Spring无法正确解析带有时区的datetime格式 该实体是 @Data @Entity public class TimeRange { @Setter(AccessLevel.NONE) @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = true) private LocalDateTime startTim

我有一个简单的rest服务来存储时间范围,但是Spring无法正确解析带有时区的datetime格式

该实体是

@Data
@Entity
public class TimeRange {
@Setter(AccessLevel.NONE)
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = true)
private LocalDateTime startTime;

@Column(nullable = true)
private LocalDateTime endTime;
}
控制器是:

@PostMapping(path = "/time", consumes = "application/json", produces = "application/json")
public Boolean setTime(@RequestBody TimeRange timeRange) {
    timeRangeRepository.save(timeRange);
    return true;
}
实际请求是

url = f'http://localhost/api/time'
data = {
  "startTime": "2019-12-03T19:58:29.047820+08:00",
  "endTime": "2019-12-04T19:58:29.047820+08:00"}
resp = requests.post(url, json=data, timeout=10)
pprint(resp.json())
spring报告了一个错误,它说:

 esolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: 
Cannot deserialize value of type `java.time.LocalDateTime` from String "2019-12- 
03T19:58:29.047820+08:00“:未能反序列化java.time.LocalDateTime: (java.time.format.DateTimeParseException)无法找到文本“2019-12-03T19:58:29.047820+08:00” 在索引26处找到已解析、未解析的文本;嵌套异常为 com.fasterxml.jackson.databind.exc.InvalidFormatException:无法反序列化类型的值
java.time.LocalDateTime
来自字符串“2019-12-03T19:58:29.047820+08:00”:未能反序列化 java.time.LocalDateTime:(java.time.format.DateTimeParseException)文本“2019-12- 无法分析03T19:58:29.047820+08:00',在索引26处找到未分析的文本

处,用以下内容注释LocalDateTime字段:

@JsonSerialize(using = LocalDateTimeSerializer.class)

您有一个带有偏移量的日期,如果所有日期的格式都相同,则可以创建如下自定义反序列化器

public class CustomLocalDateTimeDeserializer extends StdDeserializer<LocalDateTime> {
   private static final long serialVersionUID = 1L;

    public CustomLocalDateTimeDeserializer () {
        this(null);
    }

    protected CustomLocalDateTimeDeserializer (Class<?> vc) {
        super(vc);
    }

    @Override
    public LocalDateTime deserialize(JsonParser arg0, DeserializationContext arg1)
        throws IOException, JsonProcessingException {
        return LocalDateTime.parse(arg0.getValueAsString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME);
    }

}

如果您想用相同的格式序列化日期,您必须创建一个自定义序列化程序

这是否回答了您的问题?尝试了jackson-modules-java8,仍然会出现相同的错误,我可能无法在途中获取findAndRegisterModules。这是否回答了您的问题?这是一个重复的问题。请看问题:您是否有意将反序列化为
java.time.LocalDateTime
(丢失区域信息),而不是
java.time.ZonedDateTime
@JsonDeserialize(using = CustomLocalDateTimeDeserializer.class)
private LocalDateTime startTime;

@JsonDeserialize(using = CustomLocalDateTimeDeserializer.class)
private LocalDateTime endTime;