何时使用 Bean Validation 与自定义验证框架?

When to use Bean Validation vs a customized validation framework?

我正在验证我的数据访问对象 classes 的字段。在一次尝试中,我开始向属性添加 Bean Validation 注释(@NotNull、@NotBlank、@Min、@Max 等等)。我还有更多用于 swagger 库和文档 (@Api (...)) 的注释 Jackson (JsonProperty (..))。在我看来 class 非常 "dirty" 有很多注释(每个 属性 至少有三个注释)。一个字段的示例:

@JsonProperty("ownName")
@Api(description="it is my own name" required=true)
@Valid
@NotNull
private SomeObject object; 

在另一次尝试中,我使用 Spring Validator 界面执行了自己的验证。如果使用自定义验证器(例如 Spring 接口),它似乎更清晰,并且还允许您针对不同情况自由生成多个验证器。此外,class 似乎并没有因为注释而超载,并且验证独立于 class。 Validator示例:

public class UserValidator implements Validator {

    @Override
    public boolean supports(Class<?> arg0) {
        return User.class.isAssignableFrom(arg0);
    }

    @Override
    public void validate(Object obj, Errors error) {
        User user = (User) obj;
        if(user.getPassword().length() < 10)
        {
            error.reject("Password must be lesser than 10");
        }

        //more validations....

    }
}

我认为这是品味和用例的问题。我同意有时感觉会以某种注释过载告终。

使用 Bean Validation 的一些原因是它是一个标准。约束注解是标准化的,许多框架与之集成,例如 JPA,以防您想添加另一个基于注解的框架;-)

使用 Spring 之类的东西会将您绑定到特定的 library/framework。您的代码将不那么便携。如果您当然从未见过将 Spring 抛在后面的情况,那么这可能无关紧要。

当然你可以做一些自己开发的东西,但在这种情况下你需要将整个集成代码写入 Spring、REST、JPA 等

编写通用验证框架也很重要。有很多事情要考虑。