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

Spring MVC:验证需要现有服务/存储库的事物的推荐方法

庄瀚玥
2023-03-14

Spring MVC通过表单上的注释(例如@NotNull)提供表单验证,以对字段的值进行简单检查,并通过自定义验证器提供表单验证,这些验证器帮助您进行跨字段验证(验证两个密码字段包含相同的值,等等)。

不过,我正在寻找推荐的验证方法。例如,验证用户名是否尚未使用,这需要调用数据库。我假设我可以简单地将我的PersonRepository注入到自定义验证器(它是一个@组件)中,但我怀疑它在事务上是否安全..或者是否非常干净。

要做到这一点,需要最少重复代码的建议方法是什么?或者我应该简单地编写自己的验证层,它抛出一些ValidationException和validationmessages列表,我必须将这些列表映射到BindingResult?

共有1个答案

司徒耀
2023-03-14

澄清一下:Spring MVC本身并不提供表单验证。它与Java Bean验证供应商(如Hibernate Validator)集成。

您是对的:如果将LocalValidatorFactoryBean配置为应用程序上下文中的bean,您将从自定义验证器中的依赖管理中受益。在我看来,没有必要在您的设置中实现自定义验证层,因为您已经有了一个强大的、通用的验证抽象,它甚至符合Java标准。

如果您担心在validator中调用存储库是否安全,请查看http://docs.spring.io/spring-data/jpa/docs/1.8.2.release/reference/html/#transactions以了解详细信息。默认情况下,CRUD操作是事务性的。如果需要具有事务上下文的更复杂的验证逻辑,则可以通过注释isvalid(...)方法使其成为事务性的,也可以使业务服务本身具有可能的事务性。这与Spring的概念完美结合。

如果需要在同一事务中处理验证和业务逻辑(检查用户名是否已经使用,如果没有,则插入新的),可以考虑将控制器层中的验证限制为基本验证(例如@Notnull)。这将确保只有语法正确的请求才能到达服务层。

在服务中,您将使用autowired验证器并手动触发整个验证约束。如果将Hibernate作为JPA供应商和Hibernate作为验证供应商的组合,您甚至可以使用两者的集成(prepersit和prepe update事件),这将导致在将更改写入数据库之前自动进行验证。

无论您如何决定,您可能会使用验证组将约束分成两组,例如“语法的”和“语义的”。如果手动调用验证器,则可以传递要考虑的组。如果将集成验证与Hibernate一起使用,则可以通过指定以下属性来控制不同事件的组:

    null
 类似资料:
  • 我正在尝试一个基本的spring boot演示。我犯了这个错误。 ... 我不知道该复制哪个代码,所以这里是演示的链接https://github.com/PetarRistevski/demo-referrals 这就是我得到的应用程序启动失败 描述: com中的字段存储库。佩塔。人口推荐。服务impl。UserServiceImpl需要一个“com”类型的bean。佩塔。人口推荐。存储库。找不

  • 问题内容: mavensearch.net在许多情况下都不知道当前版本,mvnrepository.com还是更新一些,但是没有显示可从中下载软件包的存储库,我觉得这很有用。 您使用和喜欢什么Maven仓库搜索引擎? 问题答案: 我建议使用官方网站http://search.maven.org/。随着将新工件添加到中央存储库,Maven Central的索引每小时更新一次。

  • 问题内容: 我希望Jenkins从托管在Github上的私有存储库自动获取数据。但是我不知道如何完成该任务。尝试了文档,为jenkins用户生成了ssh- key,我所看到的就是:“无法克隆存储库”。我已经检查过网址-它们是有效的。 任何线索,也许您知道一些描述此类内容的文档/博客/内容? 问题答案: 也许GitHub 对您正在寻找的部署密钥提供支持?引用该页面: 什么时候应该使用部署密钥? 很简

  • 本文向大家介绍在js中实现邮箱格式的验证方法(推荐),包括了在js中实现邮箱格式的验证方法(推荐)的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上就是小编为大家带来的在js中实现邮箱格式的验证方法(推荐)全部内容了,希望大家多多支持呐喊教程~

  • 我过去认为,在分层应用程序(控制器或服务)中,将验证逻辑放在何处并不重要,但最近正在开发需要事务的服务(使用spring)。Spring使用方面创建代理,Spring代码如下所示: org.springframework.transaction.interceptor.事务支持 所以从我这里看到的,spring首先打开事务,然后执行代码。考虑到验证可能会失败,并且根本不需要DB调用,这是否意味着将

  • 我正在从非事务类try块(由另一个EJB类调用)调用事务方法a,该块将引发RuntimeException 然后在catch块中,事务方法b将处理exp。 令人惊讶的是,我必须用“REQUIRES\u NEW”注释方法B,否则程序将出现“Transaction is not active”异常。(stacktrace与此类似) 这是否是因为方法A的事务(标记为RuntimeException的回滚