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

Spring、JSR 303验证和Hibernate

闻人望
2023-03-14

我目前正在用Spring开发一个应用程序,使用Hibernate作为ORM。我知道,默认情况下,Hibernate在持久化或加载实体时都会使用JSR-303 Bean验证。由于此应用程序支持草稿(我希望在持久化后执行验证),因此必须将其添加到persistence.xml中:

<validation-mode>NONE</validation-mode>
@RequestMapping(value = "/entity/{entity_id}", method = RequestMethod.POST)
public String completeEntity(@PathVariable("entity_id") Long entity_id)
{
    //myEntityService was autowired in the controller
    MyEntity myEntity = myEntityService.findById(entity_id);
    //Here comes the bean validation
    DataBinder binder = new DataBinder(myEntity);
    //validator was also autowired
    binder.setValidator(validator);
    binder.validate();
    BindingResult result = binder.getBindingResult();
    if (result.hasErrors()) {
        //handleErrors
    }
    //continue doing stuff, marking the entity as 'not draft' and persisting it...
}

模型实体代码:

@Entity
@Table(name = "myEntity")
public class MyEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotBlank 
    String foo;

    // bi-directional one-to-many association to Bar
    //Note the valid annotation, as i want all related Bar's to be validated
    //when a MyEntity is validated
    @Valid
    @OneToMany(mappedBy = "myEntity")
    private List<Bar> bars;

    //Getters and Setters...
}

@Entity
@Table(name = "bar")
public class Bar{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotBlank 
    String barFoo;

    // bi-directional many-to-one association to MyEntity
    @ManyToOne
    private MyEntity myEntity;

    //Getters and Setters...
}

我想知道如何传播bean验证,以便每当MyEntity实例被验证时,所有相关联的bar也被验证,而不必在验证之前强制加载这些实体。

共有1个答案

薛弘阔
2023-03-14

您可以实现一个自定义的可遍历解析器,并配置Bean验证来使用这个解析器。

默认实现确保没有从数据库加载对象(假设它们在上次写入时已经成功验证),但您可以根据需求重写特定关联。

 类似资料:
  • 我缺少一些真正基本的东西(与EAR或EAR配置中的类加载相关)。我不明白,为什么我的JSR303验证和Hibernate验证不是从EAR内部触发的...如果我创建一个新的战争项目,它就会触发。 我正在Weblogic Server10.3上用Maven、JSF2.0、Open-JPA、EJB3.0建立一个新项目。我使用maven原型创建了所有项目。我有一个最终的EAR构建,它的结构如下: 项目名称

  • 我正在使用spring(4.2.0.RELEASE)、hibernate validator(5.2.1.Final)和validation api(1.1.0.Final)对后端应用程序进行JSR验证,配置如下:, 但是没有一个JSR303注释在我的应用程序中工作。 注意:在POJO类上添加了JSR303注释,在服务类(使用POJO)上添加了@Validated注释,还尝试在方法级别添加@Val

  • null 问题是: 当添加以下依赖项以实现“Spring Webflux+SpringFox+JSR303”时, 我得到以下错误, 另外,如果当前不支持JSR303,那么除了JSR303之外,还可以使用哪些其他验证注释?我不想使用Swagger核心注释,只是因为它会扰乱代码的可读性。

  • 我按照这个教程https://spring framework . guru/spring-boot-restful-API-documentation-with-swagger-2/生成了一个swagger文档。它可以工作,但是当我试图在bean中添加一些验证时,我在文档中找不到信息: 带有验证注释的我的实体: 这里,https://github.com/springfox/springfox/

  • 问题内容: 问题已经解决了这里,但没有工作,我(不相同的弹簧引导版本我猜)本 尝试编写自定义约束验证器代码,以在保留之前检查帐户电子邮件是否存在。 // ------------------------------------------------ -------------------------- // --------------------------------------------

  • 问题已经在这里解决了,但对我不起作用(我猜不是同一个Spring启动版本) 尝试编写自定义约束验证器,在持久化之前检查帐户电子邮件是否存在。 // -------------------------------------------------------------------------- // ------------------------------------------------

  • 你能帮帮我吗? 致以最诚挚的问候

  • 你能提供一个链接到这些问题的解释(或者告诉我我做错了什么?)。我想我在谷歌搜索它失败了,因为互联网上充斥着关键词JSF和验证,对不起。