gpt4 book ai didi

spring - @Transactional 在 @Validated 时不起作用

转载 作者:行者123 更新时间:2023-12-02 06:58:56 25 4
gpt4 key购买 nike

如果我将 @Validated 注释添加到我的服务的接口(interface)/实现中,则该服务不再是事务性的。 Stacktrace 显示没有 TransactionInterceptor,但我只看到 MethodValidationInterceptor。如果我删除 @Validated 那么我会看到 TransactionInterceptorMethodValidationInterceptor 当然消失了。这些方面是相互排斥的吗?

@Service
//@Validated <- here is my problem :)
public interface AdminService {
String test(String key, String result);
}

public class AdminServiceImpl implements AdminService, BeanNameAware, ApplicationContextAware {

@Override
@Transactional(transactionManager = "transactionManager")
public String test(String key, String result) {

return "hehe";
}
}

@Configuration
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableTransactionManagement(order = AspectPrecedence.TRANSACTION_MANAGEMENT_ORDER)
public class AppConfiguration {..}

enter image description here

enter image description here

最佳答案

已解决

当服务使用 ApplicationContextAware 接口(interface)注入(inject)自己的代理时,

@Transactional@Validated 不能一起工作,如下所示:

  private String beanName;

private AdminService self;

@Override
public void setBeanName(String beanName) {
this.beanName = beanName;
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
self = applicationContext.getBean(beanName, AdminService.class);
}

在调试过程中,我注意到 setApplicationContext() 方法在后处理阶段由 ApplicationContextAwareProcessor 调用,其中 MethodValidationPostProcessor (@Validated)和 AnnotationAwareAspectJAutoProxyCreator(@Transactional@Aspects)将原始 bean 包装到代理实例中。

在此过程中调用 getBean() 方法会导致 Bean 未完全初始化,因为未应用某些后处理操作。就我而言,未添加 TransactionInterceptor

enter image description here

为了将自己的代理注入(inject)到服务中,我最终创建了专门的 Ordered BeaNPostProcessor,使用 LOWEST_PRECEDENCE 执行,以确保我在完全初始化的 bean 上进行操作。

关于spring - @Transactional 在 @Validated 时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49073081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com