Spring @Transactional注释使我的课无法自动装配

时间:2017-12-28 17:59:12

标签: java spring spring-mvc transactions spring-transactions

我有一个类SaveRoute,它有一个自动连接属性SaveProcessor。 这个SaveProcessor类有一个用@Transactional注释注释的方法。当我尝试运行我的应用程序时,Java抛出了一个异常,即Bean SaveProcessor依赖注入失败。当我从@Transactional类方法中删除SaveProcess注释时,它工作正常。

SaveRoute

public class SaveRoute implements RouteBuilder{
    @Autowired
    private SaveProcessor saveProcessor;
}

SaveProcessor

public class SaveProcessor implements Processor{

  @Override
  public void Process(Exchange exchange){
    this.save();
  }
  @Transactional
  public void Save(){

  }
}

如果有人可以帮助我,那就太好了。 @Transactional使SaveProcessor类不是自动布线的候选者。

3 个答案:

答案 0 :(得分:0)

在自动装配时,您应该使用Processor接口而不是SaveProcessor具体类:

@Autowired
private Processor saveProcessor;

答案 1 :(得分:0)

我能够找到解决方案。 添加

@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)

在我的SaveProcessor类之上的

解决了我的问题。

我无法使用

@Autowire public Processor SaveProcessor;

这是因为我的应用程序中的处理器有多个实现。

答案 2 :(得分:0)

同意Spring @Transactional annotation making my class not able to Autowire回答, 通过界面自动装配是一种很好的做法, 当你设置

  

@Transactional

spring代理您的 SaveProcessor 对象, 因为它实现 Processor spring将使用 DynamicProxy 。 所以你没有在上下文中使用类 SaveProcessor 的bean,你有一个带有calss Proxy $ ..的bean。它实现intarface Processor

这就是春天无法找到候选人的原因。

如果您有多个 Processor 的实现,那么这不是问题, 只需使用

  

@Qualifier

,或通过beanName自动装配。在你的情况下

@Autowired
private Processor saveProcessor;

将起作用,因为bean具有名称​​ saveProcessor