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

服务层和spring事务中的验证

马新觉
2023-03-14

我过去认为,在分层应用程序(控制器或服务)中,将验证逻辑放在何处并不重要,但最近正在开发需要事务的服务(使用spring@Transactional)。Spring使用方面创建代理,Spring代码如下所示:

org.springframework.transaction.interceptor.事务支持

if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) {
    // Standard transaction demarcation with getTransaction and commit/rollback calls.
    TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
    Object retVal = null;
    try {
        // This is an around advice: Invoke the next interceptor in the chain.
        // This will normally result in a target object being invoked.
        retVal = invocation.proceedWithInvocation();
    }
    catch (Throwable ex) {
        // target invocation exception
        completeTransactionAfterThrowing(txInfo, ex);
        throw ex;
    }
    finally {
        cleanupTransactionInfo(txInfo);
    }
    commitTransactionAfterReturning(txInfo);
    return retVal;
}

所以从我这里看到的,spring首先打开事务,然后执行代码。考虑到验证可能会失败,并且根本不需要DB调用,这是否意味着将验证逻辑置于服务层将在数据库上产生额外负载,例如应用程序将在没有任何原因的情况下打开/回滚事务?(回滚,因为验证通常会引发一些验证异常)。

共有1个答案

惠志
2023-03-14

使用验证器层非常方便,它只是验证对象。没什么事实。通常使用Spring@Transactionl i时,首先通过验证层验证对象,然后传递到服务层。

如果你真的关心db打开关闭,你可以检查@Transactional(传播=传播。必需的)注释。您可以检查这个答案@Transactional(传播=传播。需要)

 类似资料:
  • 在我的示例中,我有一个Hibernate实体和一个DAO。 当我以这种方式使用DAO时 数据库中只保存了一行(Action2)。当我删除注释时,两行(Action1和Action2)都被保存(这是我需要的行为)。我的问题是服务层上的事务注释如何影响事务(方法executeTransaction())的执行。为什么没有服务层上的事务性注释,这两行都保存在数据库中,而只有最后一行与此注释一起保存?

  • 我有一个DTO,它在控制器层通过BeanValidation(javax.validation)和定制验证器(org.springframework.validation.Validator)的组合进行验证。通过这种方式,我可以检查提供的输入是否有效,然后转换实体中的DTO并将其转发到服务层。 然后是业务逻辑验证。例如:@Entity用户的startDate必须在某个事件发生之后,如果最后创建的用

  • 答案可能涵盖所有框架,但我对SpringMVC案例特别感兴趣。我正在重构一个访问内部数据库和远程服务的服务层。这些方法应该是事务性的,它们需要来自远程服务的数据。下面是类似的伪代码: 这样更容易实现。但是有许多缺点,例如当远程服务调用失败时不必要地创建和回滚事务,由于远程服务调用而导致的事务更长,并且可能更复杂。我正在考虑将服务调用移动到单独的非事务性方法,并调用事务性方法,如下面的代码段所示 假

  • 我正在使用当前层拓扑: 1)道2)服务3)控制器(演示) 在我的一个控制器中,我收到以下呼叫(来自客户端): 控制器现在应该将调用委托给服务层。 问题是,如果我创建一个如下方法: 在我的服务中,我实际上让我的服务层意识到DTO对象! 我认为这是一种不好的做法(或者不是?) 因此,我提出的另一个选择是创建一个新类: 然后调用我的控制器: 这个解决方案的问题是我在我的项目中根本没有使用这个类,所以它看

  • 问题内容: 我需要有关Spring AOP的帮助。我有以下代码: application-context.xml application-context-aop.xml 当我尝试在Tomcat上加载应用程序时,出现以下异常: 我在Web层具有与记录我的应用程序相同的配置,并且工作正常,但是当我将AOP放在Service层时,会遇到此异常。 我正在使用Spring MVC,并在web.xml上配置了