RestEasy - 参数绑定 - 验证和错误 - EJB

时间:2013-07-02 20:43:59

标签: java binding error-handling ejb resteasy

假设我使用传递给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参数,你可以注入。 这里的等价物是什么?

有什么想法吗?

1 个答案:

答案 0 :(得分:13)

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<MethodConstraintViolationException>实现来处理验证错误。

    与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.
        }
    }
    
  4. 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的实例 将被抛出。

    4. 文档:3.0.1.Final Validation Documentation