我很难相信我是唯一一个想要这样做的人,但我找不到任何可以帮助我克服障碍的人。使用Spring MVC和基于注释的验证(我使用框架4.0和Java 1.7),考虑一个简单的类层次结构,如下所示:
abstract class Foo {
@Size(max=10, message = "The name has to be 10 characters or less.")
private String name;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
class Bar extends Foo {
}
class Bang extends Foo {
}
如果我将一个名称放在一个大于10个字符的Bar或Bang实例中,我会收到我期待的验证错误。但是,假设我仍然希望Bar和Bang从抽象基类Foo派生,但我希望子类的name属性具有不同的验证。
如何对Bar和Bang进行注释,以便 Bar.name 的最大长度为12个字符,而 Bang.name 的最大长度为8个字符?
非常感谢, 罗布
答案 0 :(得分:1)
在派生类中创建一个新字段并覆盖这些方法。
class Bar extends Foo {
@Size(max=12, message = "The name has to be 12 characters or less.")
private String name;
@Override
public String getName() {
return this.name;
}
@Override
public void setName(String name) {
this.name = name;
}
}
答案 1 :(得分:1)
简短的回答是,在Bean Validation中无法禁用超类中的约束。这里有一个功能请求https://hibernate.atlassian.net/browse/BVAL-256,建议引入@OverrideConstraint或@IgnoreInheritedConstraint类型的注释。截至目前,虽然不可能这样做。
另请参阅http://lists.jboss.org/pipermail/beanvalidation-dev/2012-January/000128.html和https://hibernate.atlassian.net/browse/HV-548。
答案 2 :(得分:1)
您也可以在getter方法上添加@Size(max=12, message = "The name has to be 12 characters or less.")
注释。
因此,只需覆盖名称字段,并将您的个性化注释放在getter方法上。 它与将验证注释放在字段上的工作方式相同。见下面的例子:
class Bar extends Foo
{
@Override
@Size(max=12, message = "The name has to be 12 characters or less.")
public void getName(String name)
{
this.name = name;
}
}