【发布时间】:2014-01-19 21:29:56
【问题描述】:
我有一个简单的类,它使用boolean isValid() 方法进行了验证,该方法有效,当然错误消息是在类/类型级别。
这是我的简单课程:
public class NewPasswordDTO {
@NotNull
public String password;
@NotNull
public String confirmation;
@AssertTrue(message="Passwords must match.")
protected boolean isValid() {
return password.equals(confirmation);
}
}
但我真正想要的是这样的:
public class NewPasswordDTO {
@NotNull
@Equals("confirmation", message="...")
public String password;
@NotNull
public String confirmation;
}
因此错误消息将设置在字段级别而不是类/类型级别。
这有可能吗?也许为该类使用自定义验证器?
提前致谢!
解决方案:
感谢贡纳尔!我刚刚想出了一个很好的通用解决方案:-)。我只是使用(意味着复制和粘贴)来自 Hibernates @ScriptAssert 和 ScriptAssertValidator 的代码并稍作修改:
@ScriptAssert:
- 添加新的
String field()。 (这是附加错误消息的地方)
ScriptAssertValidator:
在
initialize方法中,确保同时保存fieldName和message属性,因为我们需要在下一步中访问它们-
在
isValid方法的底部添加这个sn-p:context.buildConstraintViolationWithTemplate(errorMessage) .addPropertyNode(fieldName).addConstraintViolation(); 还要在
isValid方法内的某处添加context.disableDefaultConstraintViolation();以不生成默认错误消息,否则将在类级别附加。
就是这样。现在我可以这样使用它了:
@FieldScriptAssert(lang="javascript", script="_this.password.equals(_this.confirmation)", field="password", message="...")
public class NewPasswordDTO { ... }
【问题讨论】:
标签: java validation bean-validation hibernate-validator