在Java中使用Jackson反序列化Date字段时引发自定义异常

绝技:

DTO:

@Getter
@Setter
@ToString
public class TestDto {

    @NotNull
    private String id;

    @NotNull
    @DateTimeFormat(pattern = "YYYY-MM-DD'T'hh:mm:ss.SSSZ")
    private Instant timestamp;
}

当我给出这个输入

{"timestamp":"4/23/2018 11:32 PM","id":"132"}

它给出了BAD_REQUEST(应该),但是我想处理这个格式错误的日期并使用我的自定义异常抛出一个异常。

如何添加呢?

dkb:

由于尚不支持OP请求的功能:https : //github.com/FasterXML/jackson-annotations/issues/130

通过对字段使用自定义反序列化器,尝试使用更长的方法来做同样的事情 timestamp

自定义异常类:

import com.fasterxml.jackson.core.JsonProcessingException;

public class MyException extends JsonProcessingException {
    public MyException(String message) {
        super(message);
    }
}

自定义反序列化器类:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.util.Date;
public class InstantDeserializer extends StdDeserializer<Instant> {

public InstantDeserializer() {
    this(null); 
} 

public InstantDeserializer(Class<?> vc) {
    super(vc); 
}

private SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD'T'hh:mm:ss.SSS'Z'");

@Override
public Instant deserialize(JsonParser jp, DeserializationContext ctxt)
  throws IOException, JsonProcessingException {
    JsonNode node = jp.getCodec().readTree(jp);
    Date date = null;
    try {
        date = sdf.parse(node.asText());
    } catch (Exception e) {
        throw new MyException("Instant field deserialization failed");
    }
    return date.toInstant();
}
}

更新了TestDto类:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotNull;
import java.time.Instant;

@Getter
@Setter
@ToString
public class TestDto {

    @NotNull
    private String id;

    @NotNull
    @JsonDeserialize(using = InstantDeserializer.class)
    @DateTimeFormat(pattern = "YYYY-MM-DD'T'hh:mm:ss.SSS'Z'")
    private Instant timestamp;
}

无效的输入请求:

{"timestamp":"4/23/2018 11:32 PM","id":"132"}

响应:

{
    "timestamp": 1552845180271,
    "status": 400,
    "error": "Bad Request",
    "message": "JSON parse error: Instant field deserialization failed; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Instant field deserialization failed (through reference chain: TestDto[\"timestamp\"])"
}

有效输入请求:

{"timestamp":"2018-04-23T11:32:22.213Z","id":"132"}

响应:

{
    "id": "132",
    "timestamp": {
        "epochSecond": 1514700142,
        "nano": 213000000
    }
}

如果您不喜欢timestamp字段反序列化的方式并且想要更改它,那么 SO帖子将对您有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Java中使用Jackson进行JSON FIELD的自定义反序列化?

仅当存在某些字段时才使用自定义JSON反序列化(使用Jackson)

当值为“ null”时,Jackson忽略自定义字段反序列化器

使用Jackson自定义JSON反序列化

使用Jackson自定义反序列化列表

使用Jackson自定义反序列化JSON字段

在Java中使用Jackson进行反序列化异常/可抛出异常时出现的问题

使用Jackson在Java中嵌套自定义反序列化

使用Jackson的自定义JSON序列化/反序列化

JSON Jackson-使用自定义序列化程序序列化多态类时的异常

在 Jackson 中使用自定义序列化程序序列化嵌套对象时出现 JsonGenerationException

Jackson对多态对象的自定义反序列化

Jackson,针对特定字段名称的自定义反序列化

使用Jackson进行自定义反序列化:扩展默认反序列化器

使用自定义反序列化器 Jackson 将 .json 文件转换为 Java 对象

API JSON响应序列化以引发自定义消息

使用jackson-dataformat-xml自定义根元素的XML反序列化?

Jackson JSON无法使用自定义根名称反序列化元素数组?

某些字段的Jackson JSON自定义序列化

如何使用尊重自定义注释的Jackson来执行自定义JSON反序列化?

如何使用Serde使用自定义函数反序列化可选字段?

使用lombok自定义序列化和反序列化的字段名称

java-在自定义反序列化中调用标准反序列化

自定义反序列化

使用自定义IXmlSerializer反序列化注释

使用GSON自定义反序列化枚举

如何在Spring @RequestParam中使用自定义反序列化器

在PyYAML中使用自定义类密钥对字典进行反序列化失败

Jackson 的多态序列化/反序列化和自定义序列化器/反序列化器