首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring-framework中的Jackson反序列化错误处理

spring-framework中的Jackson反序列化错误处理
EN

Stack Overflow用户
提问于 2017-12-15 23:45:16
回答 1查看 587关注 0票数 1

我正在寻找一种干净的方法来处理REST web请求的Jackson反序列化错误。

更准确地说:我在从JSON映射的传入DTO对象中有一个Enum。但如果用户发送了错误的值,则会返回一个400 Bad Request。我想返回一个包含正确消息的422 Unprocessable Entity

一种选择是接受一个字符串,并使用bean验证。但是,不可能将所有枚举值作为列表(而不是常量)传递给注释,因此我需要分别传递所有枚举值并使它们保持最新。在整个应用程序中,这将非常容易出错。我正在寻找一种更结构化的方式来处理这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-20 21:45:50

我通过在DTO中使用字符串并使用public @interface EnumValue作为注释解决了这个问题。

EnumValue:

代码语言:javascript
复制
@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 { };
}

验证器:

代码语言:javascript
复制
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;
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47835645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档