考虑以下方法:
@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
找到这些数据,但我想要做的是在字段本身添加注释并将错误消息写入注释。这可能吗?
答案 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
作为参数。
这满足了我的需求,也非常难看。更好的解决方案是值得赞赏的。