【问题标题】:RestEasy - Parameters Binding - Validation and Errors - EJBRestEasy - 参数绑定 - 验证和错误 - EJB
【发布时间】:2013-07-02 20:43:58
【问题描述】:

假设我用传递给 REST 调用的参数定义了一个 POJO

 class MyVO {
    @NotNull
    @PathParam("name")
    private String name;

    @NotNull
    @PathParam("age")
    private Integer age;
    // getters and setters
 }

 public class RESTclass {
   public postData( @Form MyVO vo ) {
   }
 }

它会自动绑定 MyVO 中的对象。但是我在哪里得到验证错误? 它会在绑定期间触发验证吗?如果没有,如何触发验证?

Spring 在所有这些方面都做得很好。它具有您可以注入的 BindingResult 参数。 这里的等价物是什么?

有什么想法吗?

【问题讨论】:

    标签: java binding error-handling ejb resteasy


    【解决方案1】:

    3.0.1.Final 之前的 RestEasy 版本

    对于 bean 验证 1.0,Resteasy 有一个自定义验证提供程序,它在后台使用 hibernate 的 bean 验证器实现。

    为了在 Resteasy 中启动和运行验证,您需要执行以下操作:

    1. resteasy-hibernatevalidator-provider 依赖项添加到您的项目中。如果您使用的是 maven,这里是 maven pom 条目:

      <dependency>
          <groupId>org.jboss.resteasy</groupId>
          <artifactId>resteasy-hibernatevalidator-provider</artifactId>
          <version>${resteasy.version}</version>
      </dependency>
      
    2. 使用 @ValidateRequest 注释在您希望进行验证的资源类中添加注释。

      @Named 
      @Path("/users") 
      @ValidateRequest 
      public class UserResource extends BaseResource 
      {   
          @POST
          @Consumes({MediaType.APPLICATION_JSON})
          @Produces({MediaType.APPLICATION_JSON})
          public Response createUser(@Valid User user)
          {
              //Do Something Here
          }
      }
      

      Resteasy 将自动检测类路径上的HibernateValidatorAdapter 并开始调用 bean 验证。

    3. 创建一个ExceptionMapper&lt;MethodConstraintViolationException&gt; 实现来处理验证错误。

      与 Spring 中您必须检查 BindingResult 不同,当在 Resteasy 中遇到验证错误时,hibernate 验证器将抛出 MethodConstraintViolationExceptionMethodConstraintViolationException 将包含其中的所有验证错误。

      @Provider
      public class MethodConstraintViolationExceptionMapper extends MyBaseExceptionMapper
              implements ExceptionMapper<MethodConstraintViolationException>
      {
          @Override
          public Response toResponse(MethodConstraintViolationException exception) 
          {
              //Do Something with the errors here and create a response.
          }
      }
      

    RestEasy 版本 3.0.1.Final

    Resteasy 最新版本现已支持 bean 验证规范 1.1,并更改了 api 和抛出的异常。

    1. 你要去的是resteasy-hibernatevalidator-provider 需要resteasy-validator-provider-11 依赖。

    2. 您无需将@ValidateRequest 添加到您的资源类中 因为验证测试​​默认打开 resteasy-validator-provider-11.

    3. 而不是抛出 MethodConstraintViolationException 时 检测到违规,RESTEasyViolationException 的实例 会被抛出。

    文档:3.0.1.Final Validation Documentation

    【讨论】:

    • 您是否设法使用 Resteasy 3.0.1 进行验证?我似乎无法捕捉 ResteasyViolationExceptions...
    • 查看您的 ExceptionMapper 实现以及如何注册它。您是使用类路径扫描,将其添加到 web.xml 中的 resteasy.providers,还是通过 Spring 注册?
    • 正如我所见,resteasy-3.0.6 不会抛出任何异常:docs.jboss.org/resteasy/docs/3.0.6.Final/userguide/html_single/…
    • 很好的答案,但是当我在 url 中指定一些像 abc 这样的字符串时,我没有得到验证异常,但 org.jboss.resteasy.spi.BadRequestException: Unable to extract parameter from http request: javax.ws.rs.PathParam("age") value is 'abc' for private java.lang.Integer 不适合客户端。同样的问题是日期。验证应该在将参数转换为 java 对象之前执行,而不是之后,因为它似乎是这种情况。知道如何以这种方式配置它吗?
    • 非常感谢您的回答!
    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多