提问者:小点点

如何停止杰克逊时区转换而不应用本地偏移量


由于我不发送任何时区,杰克逊将UTC作为默认时区,但当去中心化时,它将偏移CST(我的本地时间)作为结果,我的代码中的日期(11/27/2020)落后一天

进口java.util.Date;

@JsonFormat(pattern = "MM/dd/yyyy")
private Date dispOn;

我如何将相同的日期发送到我的代码中


共1个答案

匿名用户

正如Andreas在评论中提到的,从Date更改为LocalDate就足够了。有关更多信息,我使用LocalDateTime向您展示了如何配置格式。我还在类级别使用Lombok的注释进行日志记录和getter/setter生成。请记住,LocalDate和LocalDateTime仅从Java8开始可用。

下面是一个完整的DTO示例,我在其中解析JSON

@Slf4j
@Getter
@Setter
@JsonIgnoreProperties(ignoreUnknown = true) // optional annotation
public class MyMessage implements Deserializer<MyMessage> {

    @JsonProperty("EVENT_TIMESTAMP")
    @JsonFormat(shape = JsonFormat.Shape.STRING,
                pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
    private LocalDateTime eventTimestamp;
    @JsonProperty("MESSAGE")
    private String message;

    @Override
    public void configure(Map<String, ?> configs, boolean isKey) {
        Deserializer.super.configure(configs, isKey);
    }

    @Override
    public MyMessage deserialize(String s, byte[] bytes) {
        ObjectMapper mapper = new ObjectMapper();
        MyMessage event = null;
        try {
            event = mapper
                    .registerModule(new JavaTimeModule())
                    .readValue(bytes, MyMessage.class);
        } catch (Exception e) {
            log.error("Something went wrong during the deserialization of the MyMessage: {}", e.getMessage());
        }
        return event;
    }

    @Override
    public MyMessage deserialize(String message, Headers headers, byte[] data) {
        return Deserializer.super.deserialize(message, headers, data);
    }

    @Override
    public void close() {
        Deserializer.super.close();
    }

我要发送的JSON:

{
"EVENT_TIMESTAMP": "2022-03-15T14:14:05.945",
"MESSAGE": "Test 123"
}