我正在使用Hibernate验证程序5.x和javax验证1.x(由于某些原因,无法升级)。此方案适用于休眠验证器6.x和验证2.x]
在违反约束时,验证器会启动并显示正确的错误响应,但同时它会执行REST方法主体。
REST端点
@POST
@Path("/book")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createBook(@Valid Book book) {
System.out.println("Book "+book);
return Response.status(Response.Status.OK).entity(book).build();
}
书
@ValidName
public class Book {
private String name;
private Author author;
private double price;
public Book() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Author getAuthor() {
return author;
}
public void setAuthor( Author author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
@ ValidName
@Constraint(validatedBy = { NameValidator.class })
@Target({ METHOD, FIELD, PARAMETER, TYPE })
@Retention(RUNTIME)
public @interface ValidName {
String message() default "Author name is mandatory";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
NameValidator
@Provider
public class NameValidator implements ConstraintValidator<ValidName, Book>{
@Override
public boolean isValid(Book book, ConstraintValidatorContext context) {
if(book == null) return true;
if(book.getName().equals("")) {
return true;
}else {
return !(book.getAuthor().getName().equals(""));
}
}
}
控制台输出
12:53:31,971 INFO [stdout] (default task-1) Book com.arfat.entity.Book@3238e1e1
邮递员输出
{
"data": {},
"messages": [
"1. Author name is mandatory"
],
"status": "ERROR-Bad Request"
}
对于涉及服务和DOA层的更复杂的情况,我使用相同的方案。验证程序未停止执行验证,并且在验证之前,我的后端已使用不干净的数据进行了更新
我搜索了官方文档,但没有找到帮助。
[classpath中有一个jar正在处理sessionContext。它上面有@Stateless批注。出于某种原因,它允许绕过验证。我无法删除此jar,因为它是Web应用程序所需要的,并且我将Reast-easy部署在同一路径上。因此需要找出解决方法