类型不匹配绑定错误的自定义错误消息

时间:2015-04-14 14:12:24

标签: java spring spring-mvc

考虑以下方法:

@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'的属性值要求的类型' int'对于财产' id&#39 ;;嵌套异常是java.lang.NumberFormatException:对于输入字符串:" abc"

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

1 个答案:

答案 0 :(得分:1)

以某种方式解决,我会欣赏其他人。

这不是一个可读的答案,这实际上是一个黑客,请使用极端的预防措施。

我使用自定义验证器定义了自定义注释:

@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作为参数。

这满足了我的需求,也非常难看。更好的解决方案是值得赞赏的。