Spring MVC验证继承类

时间:2014-02-17 23:14:24

标签: java spring validation spring-mvc hibernate-validator

我很难相信我是唯一一个想要这样做的人,但我找不到任何可以帮助我克服障碍的人。使用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个字符?

非常感谢, 罗布

3 个答案:

答案 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.htmlhttps://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;
        }
}