即使违反约束,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。所以需要找到解决方法