【问题标题】:Bean validation with EJB使用 EJB 进行 Bean 验证
【发布时间】:2013-07-07 20:02:45
【问题描述】:

我已经阅读了很多关于 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 会发生什么?我将如何验证这一点?

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

【问题讨论】:

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


    【解决方案1】:

    你的问题有几个问题。首先,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 无能为力。

    【讨论】:

    • 谢谢,里面有很多有用的信息。实际上我正在使用带有 glassfish 4.0 运行时环境的 Java EE 7。我认为然后方法级别的验证是默认完成的,就像你说的那样。我想我应该为参数列表较长的方法编写自己的验证器,以免内联参数的所有约束。感谢您的帮助!
    • 正确,带有 Glassfish 4 的 EE7 根据我提到的规范部分启用了方法验证。关于自定义约束,您当然可以创建自己的约束,但我看不出这如何减少注释的数量。当然,除非您想将多个约束组合成一个组合约束。这当然会减少要放置在参数上的注释数量。
    猜你喜欢
    • 2013-12-07
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 2015-11-16
    • 2014-03-24
    • 2012-11-03
    • 2014-04-11
    相关资源
    最近更新 更多