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(应该),但是我想处理这个格式错误的日期并使用我的自定义异常抛出一个异常。
如何添加呢?
由于尚不支持OP请求的功能:https : //github.com/FasterXML/jackson- annotations/issues/130
通过对字段使用自定义反序列化器,尝试使用更长的方法来做同样的事情 timestamp
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": 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 } }