【问题标题】:Spring MVC Validation of Inherited Classes继承类的 Spring MVC 验证
【发布时间】:2014-03-17 11:08:58
【问题描述】:

我很难相信我是唯一一个想要这样做的人,但我找不到任何参考资料来帮助我克服障碍。使用 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 {

}

如果我将 name 放在大于 10 个字符的 Bar 或 Bang 的实例中,我会收到预期的验证错误。不过,假设我仍然希望 Bar 和 Bang 从抽象基类 Foo 派生,但我希望子类的 name 属性具有不同的验证。

如何注释 Bar 和 Bang,以便 Bar.name 的最大长度为 12 个字符,而 Bang.name 的最大长度为 8 个字符?

非常感谢, 抢

【问题讨论】:

  • 我看到了。我在覆盖的 getter 方法上尝试了“累积”的东西,而在基类上没有验证。发生的事情是验证根本没有发生。我已经尝试在各个地方使用@Valid,但我仍然无法让验证器在被覆盖的 getter 上触发。我是否必须在基类上设置一个“@Size”验证器,然后在扩展类上进一步限制它?像基类上的 max=1000 和扩展上的 max=12 一样利用注释验证的“累积”性质?
  • 重点是,由于这种累积性质,JSR303 注释无法覆盖。
  • 我想我必须接受这个答案,即使我不喜欢它。 :-/ 谢谢,@gadget。

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


【解决方案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】:

    在派生类中创建一个新字段并覆盖方法。

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

    【讨论】:

    • 谢谢,但这样不是违背了拥有抽象基类的目的吗?
    • 如果您只使用抽象类来保存name 字段,是的。如果抽象类包含其他常见的字段、方法等,它可能是值得的。
    • 我明白你的意思。远离我过于简化的“Foo Bar Bang”示例,它基本上是一个抽象的 Person 类,包含更多特定类型的人可以扩展的所有常见属性。
    【解决方案3】:

    你也可以在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;
            }
    }
    

    【讨论】:

    • 这个解决方案似乎不正确!首先, Bar 没有 name 字段,因为它在超类中是私有的。其次,Getter 方法不是 Setter 方法!!
    • 它是 setter,而不是 getter,getter 序列化,setter 在反序列化期间验证工作。
    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2013-01-21
    相关资源
    最近更新 更多