即使违反约束,Hibernate 验证程序也执行 JAX-RS REST 端点
Hibernate validator executing JAX-RS REST end point even on constraint violation
我正在使用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;
}
}
@有效名称
@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 { };
}
名称验证器
@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 层。验证器没有停止执行验证,我的后端在验证前用不干净的数据更新
我搜索了官方文档但没有帮助。
类路径中有一个正在处理 sessionContext 的 jar。它上面有@Stateless 注释。出于某种原因,它允许验证 bypass.I 无法删除此 jar,因为它是 Web 应用程序所必需的,并且我正在同一路径上部署 Reast-easy。所以需要找到解决方法
我正在使用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;
}
}
@有效名称
@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 { };
}
名称验证器
@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 层。验证器没有停止执行验证,我的后端在验证前用不干净的数据更新
我搜索了官方文档但没有帮助。
类路径中有一个正在处理 sessionContext 的 jar。它上面有@Stateless 注释。出于某种原因,它允许验证 bypass.I 无法删除此 jar,因为它是 Web 应用程序所必需的,并且我正在同一路径上部署 Reast-easy。所以需要找到解决方法