当前位置: 首页 > 知识库问答 >
问题:

什么时候使用Bean验证和定制的验证框架?

海新霁
2023-03-14

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

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

在另一次尝试中,我使用spring的validator接口执行了自己的验证。如果使用自定义验证器,如spring接口,它似乎更干净,并且允许您自由地为不同的情况生成多个验证器。而且,类似乎不会被注释重载,并且验证是独立于类的。验证程序示例:

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....

    }
}
  • 何时使用一个或另一个?
  • 每种方法的利弊是什么?

共有1个答案

章誉
2023-03-14

我认为这是一个品味和用例的问题。我同意,有时会感觉到一个人最终会出现某种类型的注释过载。

使用Bean验证的一些原因是它是一种标准。约束注释是标准化的,并且许多框架都与之集成,例如,如果您想添加另一个基于注释的框架,则使用JPA;-)

使用像spring这样的东西将您绑定到特定的库/框架。您的代码的可移植性将会降低。当然,如果你从来没有看到过把spring抛在身后的情景,这也许并不重要。

当然,您可以做一些完全自生的东西,但在这种情况下,您需要将整个集成代码写进例如spring、REST和JPA等。

此外,编写一个通用的验证框架也不是一件容易的事。有很多事情要考虑。

 类似资料:
  • 我正在尝试使用自定义Bean验证来验证应该大于零的数值,但问题是使用如下单个自定义验证器来验证任何数值:整数、浮点数、双......: 整数int; @PositiveNumber双倍双; 这可能吗?

  • 首先,我是Vaadin7的新手。当我发现BeanFieldGroup.class时,我正在尝试一些vaadin演示。正如我所看到的,这个类将一个字段绑定到一个bean属性。在bean中,使用验证约束注释对属性进行注释(JSR303)。在本例中,我的pom.xml包含hibernate验证器依赖项: 我创建了validationmessage.properties文件,并在其中放了一些消息(带有匈牙

  • 我是一个新的Mockito,遵循这一点,并试图找出验证方法做什么。它似乎是用来确保所选方法被调用一次。我有下面的代码,通过查看代码,我可以发现我调用了addBook方法两次,所以为什么我要使用verify?我的意思是,在任何情况下,都很容易确保一个方法被称为oncem,那么为什么我们要使用verify方法呢?

  • 我正在尝试编写一个自定义bean验证器,并根据用户界面上的语言环境显示验证消息。 为此,我创建了一个验证器,如下所示: 我还注册了messageSource和validator bean: 在我的控制器中,我使用initBinder注册我的验证器: 不过,验证错误消息在用户界面上显示为{myproject.myclass.validation.name}。即使我设置了LocalValidatorF

  • 但是,当我执行以下测试时,不会引发验证异常: 当保存一个已经持久化的对象时,我如何使验证器触发器?最好是通过Java配置。 我的验证依赖项:

  • 我正在利用JAXB实现一个SOAP服务的内存API网关。其中一个模式元素是“choice”,choice块中有几个元素。 我试图在客户机名称空间中镜像生成的JAXB类,因此对于这个“选择”场景,我有一个具有多个属性的bean类,其中只有一个属性是非null的。 我试图使用javax中的@NotNull注释。验证,以及验证工厂和验证程序。然而,一个“选择”的场景让这变得有点复杂。我猜这将需要一个自定