即使违反约束,也执行JAX-RS REST端点的休眠验证器

问题描述 投票:0回答:1

我正在使用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层的更复杂的情况,我使用相同的方案。验证程序未停止执行验证,并且在验证之前,我的后端已使用不干净的数据进行了更新

我搜索了官方文档,但没有找到帮助。

java jax-rs bean-validation hibernate-validator
1个回答
0
投票

[classpath中有一个jar正在处理sessionContext。它上面有@Stateless批注。出于某种原因,它允许绕过验证。我无法删除此jar,因为它是Web应用程序所需要的,并且我将Reast-easy部署在同一路径上。因此需要找出解决方法

© www.soinside.com 2019 - 2024. All rights reserved.