JSR 303 Bean验证 - 为什么getter和未设定装置?

问题描述 投票:27回答:4

我不明白为什么JSR 303(Bean验证)是getter方法,而不是设定装置?是不是更符合逻辑把它放在setter方法,因为这是入口点到字段和验证应在此之前,进行检查?

bean-validation getter
4个回答
27
投票

注解干将并不意味着调用一个getter当执行该验证。它只是用来识别与约束应适用财产。

把制约(通常是public)干将,而不是上(通常是私有)领域的一大优点是约束类型的公共API方式的一部分。他们甚至会被添加到生成的Javadoc。一个类型的用户都知道这样其约束适用于它没有寻找到它的内部实现。

注释吸气剂的另一优点是,约束可以在上基类或接口的方法来把并且也适用于任何的子类型/实施方式。


6
投票

它是一个非常好的问题和事情,我从来没有重视。但我想我知道答案(以及为什么我从来没有这个问题,我自己)。

如果您正在寻找在此,从该点,标注定义了验证会发生,然后把它放在吸气没有意义。 (同时存储本身的价值,为什么不验证。)。但这不是它是如何工作的?

程序员需要告诉验证框架,其性质有待进一步验证。所以,你可以直接放在该属性的注释(我喜欢),或者你可以把它放在吸气。他们都表示读操作。该框架需要读取你的类的所有属性,必须进行验证。所以在这种情况下,将在二传是没有意义的。要理解的关键是角度...

我希望这是有道理的。


5
投票

考虑以下代码:

public class BeanValidation {

    private int nameSetCount = 0;
    private int nameGetCount = 0;
    private String name;

    public String getName() {
        this.nameGetCount++;
        return name;
    }

    public void setName(String name) {
        this.nameSetCount++;
        this.name = name;
    }

}

把注释了private String name;

注释识别领域容易只是望着场中。

把注释了public String getName()

注释识别领域容易只看返回现场。

把注释了public void setName(String name)

注释不能识别领域看修改后的字段,因为可以有不止一个。


0
投票

Bean验证被称为是有原因的方式。它适用于初始化的豆。所以,首先,你用你拥有的一切初始化,然后你通过它(或者有明确传递)给Bean验证实现,访问字段时,这将依赖于验证注解。在Spring MVC验证的情况下,处理开始于:

result = execVal.validateParameters(
                invocation.getThis(), methodToValidate, invocation.getArguments(), groups);

里面MethodValidationInterceptor。从这里开始,它传递给验证实现,在大多数情况下,Hibernate。 invocation.getArguments()将包含所有已经使用给定值初始化的方法参数,无论验证注解。

© www.soinside.com 2019 - 2024. All rights reserved.