2

我已经阅读了很多关于 Java EE 6+ 附带的 Bean Validation API 的内容,并且我了解验证 api 如何工作的基础知识,但是在我一直在阅读的文档中,所有示例都是单元测试,而不是帮助我了解在哪里实施验证操作。

我正在开发一个三层架构系统。我想将验证放在服务层,因此如果表示层不同(即 Jax-RS、JSF 等),我可以重用验证代码。但我对如何实施上述操作感到困惑。这是我卡住的地方:

我有与模型中不同实体交互的 bean。例如,这是我的 bean 中用于用户交互的方法 ->

public User getUser(
            @Min(value = 0, message = "Must have a positive userId") int uid)
            throws RetrievalNotFoundException {

        try {

            // I WANT TO VALIDATE UID HERE

            // find User with provided uid
            User foundUser = em.find(User.class, uid);

            // IF the user is inactive
            if (foundUser.getIsActive() == 0) {
                // cannot find the content
                throw new RetrievalNotFoundException();
            }

            // close the entity manager
            em.close();
            // return the user
            return foundUser;


    }

这是休眠文档中的示例:

Car object = new Car( "Morris" );
Method method = Car.class.getMethod( "drive", int.class );
Object[] parameterValues = { 80 };
Set<ConstraintViolation<Car>> violations = executableValidator.validateParameters(
        object,
        method,
        parameterValues  
);

assertEquals( 1, violations.size() );
Class<? extends Annotation> constraintType = violations.iterator()
        .next()
        .getConstraintDescriptor()
        .getAnnotation()
        .annotationType();
assertEquals( Max.class, constraintType );

我真的应该再次实例化 bean 以访问它的方法 getUser() 吗?我很困惑。我遇到的另一个问题是,如果有人决定为 uid 放入一个溢出 int 容器的 int 会发生什么?我将如何验证这一点?

非常感谢您的帮助,我真的很感激。

4

1 回答 1

4

对你的问题的一些评论。首先,Bean Validation 确实是 EE 6 和 EE 7 的一部分。但是,EE 6 仅包含 Bean Validation 1.0,而 EE 7 包含 Bean Validation 1.1。不同之处在于 Bean Validation 1.0 还不包括方法验证,这就是您在示例中展示的内容。从版本 4 开始,Hibernate Validator 包含一个 Hibernate Validator 特定的方法验证 API,但这不是标准的一部分,与 Bean Validation 1.1 和 Hibernate Validator 5 中指定的内容略有不同。

第二条评论是关于执行方法验证所需的代码。Bean Validation 仅提供进行方法级别验证的机制。这是您在示例中引用的 API。在大多数情况下,您需要某种拦截技术来利用它。例如,Java EE 7 默认使用 CDI 拦截器进行方法验证。它是标准的一部分。请参阅http://beanvalidation.org/1.1/spec/#integration-cdi。如果您想使用 EE 6,您将需要使用您选择的技术编写自己的拦截逻辑。

关于你的最后一个问题。我认为通常无法检测到溢出。在这种情况下,Bean Validation 无能为力。

于 2013-07-08T08:43:36.590 回答