使用EJB进行Bean验证

时间:2013-07-07 20:02:46

标签: java-ee ejb java-ee-6 bean-validation java-ee-7

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

我正在开发一个三层架构系统。我想将验证放在服务层,因此如果表示层不同(即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;


    }

以下是hibernate文档中的示例:

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()吗?我很迷惑。我遇到的另一个问题是,如果某人决定为溢出int容器的uid放入一个int,会发生什么?我该如何验证?

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

1 个答案:

答案 0 :(得分:4)

对您的问题提出一些意见。首先,Bean Validation确实是EE 6和EE 7的一部分。但是,EE 6仅包括Bean Validation 1.0,而EE 7包括Bean Validation 1.1。区别在于Bean Validation 1.0尚未包含方法验证,这就是您在示例中显示的内容。 Hibernate Validator从版本4开始包含一个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无法做任何事情。