使用 Resteasy 验证请求的正确方法是什么?

What is the proper way to validate requests with Resteasy?

我使用 Resteasy 结合 Google 使用 Resteasy-Guice 的 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。评论中指出您应该改用较新的 validator-11:

Switch to resteasy-validator-provider-11, which implements the newer Bean Validation 1.1 specification.

docs 说:

Validation is turned on by default (assuming resteasy-validator-provider-11-.jar is available), though parameter and return value validation can be turned off or modified in the validation.xml configuration file. See the Hibernate Validator documentation for the details.

然而,我无法使它在我的配置中起作用,因为我发现自己包含了 hibernate-validatorjavax.el-apijavax.elhibernate-validator-cdi 等依赖项以及注释喜欢 ValidateOnExecution。然而,我没有发现任何被实例化或被拒绝的无效请求。

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

您不必在资源本身上指定任何注释或进行其他配置。仅 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

  • 我不小心对 hibernate-validator-provider 产生了传递依赖,导致之前的尝试失败。确保您没有对 hibernate-validator-provider 的传递依赖性。对我来说,这导致了以下异常:issues.jboss.org/browse/RESTEASY-826 .
  • 基于 Thomas 我添加了对 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>