假设我使用传递给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参数,你可以注入。 这里的等价物是什么?
有什么想法吗?
答案 0 :(得分:13)
对于bean验证1.0,Resteasy有一个自定义验证提供程序,它使用hibernate的bean验证器实现。
为了在Resteasy中启动并运行验证,您需要执行以下操作:
将resteasy-hibernatevalidator-provider
依赖项添加到项目中。如果您使用maven,这是maven pom条目:
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-hibernatevalidator-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>
使用@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验证。
创建ExceptionMapper<MethodConstraintViolationException>
实现来处理验证错误。
与Spring不同,你必须检查BindingResult,当在Resteasy中遇到验证错误时,hibernate验证器将抛出MethodConstraintViolationException
。 MethodConstraintViolationException
将包含其中的所有验证错误。
@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现在支持bean验证规范1.1并且已经改变了抛出的api和异常。
而不是你要去的resteasy-hibernatevalidator-provider
需要resteasy-validator-provider-11
依赖。
您无需在资源类中添加@ValidateRequest
因为默认情况下启用了验证测试
resteasy-validator-provider-11
。
而不是在什么时候抛出MethodConstraintViolationException
检测到违规,RESTEasyViolationException
的实例
将被抛出。