Spring框架中的Jackson反序列化错误处理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring框架中的Jackson反序列化错误处理相关的知识,希望对你有一定的参考价值。
我正在寻找一种干净的方法来处理REST Web请求的杰克逊反序列化错误。
更确切地说:我在传入的DTO对象中有一个枚举,从JSON映射。但是如果用户发送了错误的值,则返回400 Bad Request
。我想用正确的信息返回422 Unprocessable Entity
。
一种选择是接受String,并使用bean验证。但是,不可能将所有枚举值作为列表传递给注释(而不是常量),因此我需要单独传递所有枚举值并使它们保持最新。这在整个应用程序中非常容易出错。我正在寻找一种更具结构性的方法来处理这个问题。
答案
我通过在DTO中使用String并使用public @interface EnumValue
as注释解决了这个问题。
Enum值:
@ReportAsSingleViolation
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EnumValueValidator.class)
@Target(ElementType.FIELD)
public @interface EnumValue {
Class<? extends Enum> value();
String message() default "The input contains validation errors.";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
验证者:
public class EnumValueValidator implements ConstraintValidator<EnumValue, String> {
private Class<? extends Enum> enumClass;
private String message;
@Override
public void initialize(final EnumValue constraintAnnotation) {
this.enumClass = constraintAnnotation.value();
this.message = constraintAnnotation.message();
}
@Override
public boolean isValid(final String value, final ConstraintValidatorContext context) {
boolean valid = false;
for (final Enum enumValue : enumClass.getEnumConstants()) {
if (enumValue.name().equals(value)) {
valid = true;
}
}
if (!valid) {
context.buildConstraintViolationWithTemplate(message) //
.addConstraintViolation();
}
return valid;
}
}
以上是关于Spring框架中的Jackson反序列化错误处理的主要内容,如果未能解决你的问题,请参考以下文章
spring boot中各种数据不匹配如何处理jackson反序列化错误
Spring + Jackson + joda time:如何指定序列化/反序列化格式?
漏洞预警:Jackson-databind 反序列化漏洞(CVE-2017-17485)
使用 Spring Boot 2 和 Kotlin 进行 Jackson 反序列化,无法构造 `java.time.LocalDate` 的实例