【问题标题】:What is the proper way to validate requests with Resteasy?使用 Resteasy 验证请求的正确方法是什么?
【发布时间】:2015-09-06 12:51:24
【问题描述】:

我使用 Resteasy-Guice 将 Resteasy 与 Google Guice 结合使用。我一直在寻找验证我的请求正文的方法。我想做的例子:

public static class MyPojo {

   @NotEmpty private String contents;

}

然后在我的资源中使用

@POST
@ValidateRequest
public void doPost(@Valid MyPojo myPojo) {
   // use myPojo only if valid
}

我一直在使用 resteasy-hibernate-validator-provider。但是由于我切换到较新的版本,这引入了(不需要的?)对 EJB 的依赖。另请参阅:RESTEASY-1056。在 cmets 中声明您应该改用较新的 validator-11:

切换到 resteasy-validator-provider-11,它实现了更新的 Bean Validation 1.1 规范。

docs 说:

默认开启验证(假设 resteasy-validator-provider-11-.jar 可用),但参数和返回值验证可以在validation.xml 配置文件中关闭或修改。有关详细信息,请参阅 Hibernate 验证器文档。

然而,我并没有设法让这个工作适应我的配置,因为我发现自己包括像 hibernate-validatorjavax.el-apijavax.elhibernate-validator-cdi 这样的依赖项以及像 ValidateOnExecution 这样的注释。但是,我没有发现其中任何一个被实例化或无效请求被拒绝。

使用 Resteasy 进行验证的首选、轻量级和可行的方法是什么?

【问题讨论】:

    标签: java jboss jax-rs resteasy hibernate-validator


    【解决方案1】:
    • 我不小心对hibernate-validator-provider 产生了传递依赖,这导致之前的尝试失败。确保您没有对hibernate-validator-provider 的传递依赖。对我来说,这导致了以下异常:issues.jboss.org/browse/RESTEASY-826。
    • 基于 Thomas answer,我向 javax.validationresteasy-validator-provider-11hibernate-validator 添加了依赖项。
    • 然后我仍然收到异常 (java.lang.NoClassDefFoundError: javax/el/PropertyNotFoundException)。基于this 的答案,我添加了javax.el-apiel-impl 作为依赖项。我认为这是因为我使用了嵌入式 servlet 容器。
    • 我不得不删除资源上的@ValidateOnRequest 注释,它们不再需要了

    最终工作配置:

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-validator-provider-11</artifactId>
            <version>3.0.11.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.0.1.Final</version>
        </dependency>
        <dependency>
            <groupId>javax.el</groupId>
            <artifactId>javax.el-api</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>el-impl</artifactId>
            <version>2.2</version>
        </dependency>
    

    【讨论】:

    • 不需要添加hibernate-validator依赖(现在groupIdorg.hibernate.validator),因为它已经包含在resteasy-validator-provider-11中(从4.0.0版本的RestEasy开始就是resteasy-validator-provider )
    【解决方案2】:

    您不必在资源本身上指定任何注释或进行额外配置。仅 POJO 上的约束注释就足够了。

    我的设置如下:

    资源方法:

    @POST
    public void doPost(@Valid MyPojo myPojo) {
       // use myPojo only if valid
    }
    

    POJO:

    public static class MyPojo {
       @NotEmpty private String contents;
    }
    

    使用以下依赖项进行测试:

    javax.validation版本1.1.0.Final

    resteasy-validator-provider-11版本3.0.11.Final

    hibernate-validator 版本5.0.0.Final5.0.1.Final

    【讨论】:

    • 我删除了所有验证依赖项,然后插入了相同版本的验证依赖项。然而,我现在遇到了以下问题:issues.jboss.org/browse/RESTEASY-826
    • 顶级提示。我在字段上有条目,但缺少@Valid
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 2020-03-10
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    相关资源
    最近更新 更多