当前位置: 首页 > 知识库问答 >
问题:

Hibernate验证器即使在违反约束的情况下也执行JAX-RS RESTendpoint

长孙谦
2023-03-14

我使用的是Hibernate Validator5.x和javax Validation1.x(由于一些原因,无法升级)。这个场景可以在hibernate Validator6.x和Validation2.x中工作

在违反约束时,Validator会启动并显示正确的错误响应,但同时它会执行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"
}

我搜索了官方文件,但没有帮助。

共有1个答案

米裕
2023-03-14

类路径中有一个jar正在处理SessionContext。它上面有@Stateless注释。由于某种原因,它允许绕过验证。我不能删除这个jar,因为它是web应用程序所需要的,我正在相同的路径上部署reast-easy。所以需要找个工作

 类似资料:
  • 我正在使用Spring和Hibernate,我得到了这个例外。以下是我试图获得的:我有User和UserSettings类,它们以OneToMany和ManyToOne注释为界,如下所示: 现在,我想为用户添加设置,我是这样做的: 问题来了:UserSettings中的用户持有旧设置和新设置的集合(设置,我刚刚创建并想要添加),但旧设置持有用户的集合,其中没有新设置。我想这就是为什么我会遇到异常,

  • 我想通过使用Spring Boot和Hibernate Validator进行字段验证,而不保存数据。

  • 问题内容: 我有一个带有优先级列的“任务”表,该表具有唯一的约束。 我试图交换两行的优先级值,但我一直违反约束。我在类似情况下的某个地方看到了该语句,但MySQL却没有。 这将导致错误: 是否可以在MySQL中完成此操作而不使用伪造的值和多个查询? 编辑: 这是表的结构: 问题答案: 是否可以在MySQL中完成此操作而不使用伪造的值和多个查询? 不 (我想不到的)。 问题是MySQL如何处理更新。

  • 帮助我如何解决这个问题?我正在使用java进行NetSuite集成,我将所需的jar文件添加到我的项目中。添加jboss 6.1.0中部署的jar后。添加此jar后org.apache.sling.commons.log-2.0.6.jar获得以下异常。这是我的堆栈跟踪。

  • 我有一个JavaWeb7项目,在该项目中,我希望在每个事件上,直接在支持bean中管理的实体实例上编写JSF组件值。只要添加一个JSR303验证约束,就可以很好地工作,比如在实体属性之一上添加。只要违反约束,就不再在具有约束的属性上设置值。没有根据NetBeans调试器调用setter;另一个属性工作很好,这使我相信我已经隔离了问题。我想在我想要的时候执行验证,因此,如果我想要的话,可以设置无效的

  • 我有一个MathematicsAnswer引用的实体数学。如果对数学执行post请求,我会得到一个例外,即MathsAnswer上的字段不能为空。但我确实在球场上跳了起来。拜托,我需要这个解决方案<代码>java.sql。SQLIntegrityConstraintViolationException:列'question_id'不能为空。 sql架构: 实体类: MathsAnswers.jav