Java 继承类的Spring MVC验证

Java 继承类的Spring MVC验证,java,spring,validation,spring-mvc,hibernate-validator,Java,Spring,Validation,Spring Mvc,Hibernate Validator,我很难相信我是唯一一个想这样做的人,但我找不到任何参考资料来帮助我克服困难。使用Spring MVC和基于注释的验证(我使用框架4和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() {

我很难相信我是唯一一个想这样做的人,但我找不到任何参考资料来帮助我克服困难。使用Spring MVC和基于注释的验证(我使用框架4和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个字符

多谢各位,
Rob

在派生类中创建一个新字段并重写方法

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;
    }
}

简而言之,在Bean验证中不可能禁用超类中的约束。这里有一个功能请求,建议引入@OverrideConstraint或@IgnoreInheritedConstraint类型的注释。但到目前为止,这是不可能做到的

另请参见和。

您可以在getter方法上添加
@Size(max=12,message=“名称必须为12个字符或更少。”)
注释

所以,只需覆盖name字段并将您的个性化注释放在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;
        }
}

我看到了。我在重写的getter方法上尝试了“累积”方法,但没有对基类进行验证。结果是验证根本没有发生。我在不同的地方尝试过使用@Valid,但仍然无法让验证器在覆盖的getter上启动。我是否必须在基类上设置'@Size'验证器,然后在扩展类上进一步约束它?比如基类上的max=1000,然后扩展上的max=12,以利用注释验证的“累积”性质?关键是,由于这种累积性质,JSR303注释不可能重写。我想我必须接受这个答案,即使我不喜欢它。:-/Thank,@gadget.Thank,但这不是违背了拥有抽象基类的目的吗?如果您只使用抽象类来保存
名称
字段,是的。如果抽象类包含其他公共字段、方法等,那么它可能是值得的。我明白你的意思。远离我过于简化的“Foo-Bar-Bang”示例,它基本上是一个抽象的Person类,包含了更多特定类型的人可以扩展的所有公共属性。这个解决方案似乎不正确!首先,Bar没有name字段,因为它在超类中是私有的。其次,Getter方法不是Setter方法!!它是setter,不是getter,getter序列化,setter在验证工作时反序列化期间工作。