【问题标题】:Custom error message for type mismatch binding errors [duplicate]类型不匹配绑定错误的自定义错误消息[重复]
【发布时间】:2015-04-14 14:12:23
【问题描述】:

考虑以下方法:

@RequestMapping(value="/foo", method=RequestMethod.POST)
public void doIt(@Valid PojoRequest request, BindingResult result) throw Exception
{
    if(result.hasErrors())
    {
        throw new Exception(result.getFieldError().getDefaultMessage());
    }
}

class PojoRequest {
    String int id;
    //getter
}

当我使用String 参数正确测试此方法时,我收到以下错误:

无法将类型“java.lang.String”的属性值转换为属性“id”所需的类型“int”;嵌套异常是 java.lang.NumberFormatException: For input string: "abc"

我可以从BindingResult 找到这些数据,但我想做的是给字段本身添加一个注释并将错误消息写入注释中。这可能吗?

【问题讨论】:

  • 为什么要让客户端设置数据库密钥?
  • 这只是一个伪代码。虽然原始代码与此类似,但在此代码部分附近没有任何数据库操作。我不知道你为什么这么说。 @NeilMcGuigan
  • 所以你只想改错误信息...

标签: java spring spring-mvc


【解决方案1】:

以一种方式解决,我会感谢其他方式。

这不是一个可读的答案,这实际上是一个 hack,请谨慎使用。

我用自定义验证器定义了一个自定义注解:

@Documented
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ValidIntegerValidator.class)
public @interface ValidInteger {
    String message() default "not a valid integer!";
    int min() default 1;
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

public class ValidIntegerValidator implements ConstraintValidator<ValidInteger, Object> {
    @Override
    public void initialize(ValidInteger constraintAnnotation) {

    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        try {
            Integer.parseInt((String) value);
        } catch (NumberFormatException e) {
            return false;
        }
        return true;
    }
}

然后,我将 pojo 字段更改如下:

class PojoRequest {
    @ValidInteger(message = "id is faulty")
    private Object id;
    public int getId() {
        return (int) id;
    }

    public void setStartHour(Object id) {
        this.id = id;
    }
}

Setter 不是必需的,但如果你定义一个,你应该把Object 作为参数。

这满足了我的需求,而且非常难看。更漂亮的解决方案受到赞赏。

【讨论】:

    猜你喜欢
    • 2020-10-02
    • 2018-08-19
    • 1970-01-01
    • 2019-10-13
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2013-11-04
    相关资源
    最近更新 更多