Java Spring@Transactional注释使我的类无法自动连接

Java Spring@Transactional注释使我的类无法自动连接,java,spring,spring-mvc,transactions,spring-transactions,Java,Spring,Spring Mvc,Transactions,Spring Transactions,我有一个类SaveRoute,它有一个自动连接的属性SaveProcessor。 此SaveProcessor类具有一个用@Transactional annotation注释的方法。当我尝试运行我的应用程序时,Java抛出了一个异常,即bean SaveProcessor依赖项注入失败。当我从SaveProcess类方法中删除@Transactional注释时,它工作正常 SaveRoute public class SaveRoute implements RouteBuilder{

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

SaveRoute

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

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

  }
}
存储处理器

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

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

  }
}

如果有人能在这方面帮助我,那就太好了
@Transactional
使SaveProcessor类不再适合自动布线

在自动关联该类时,应使用
处理器
接口,而不是
保存处理器
具体类:

@Autowired
private Processor saveProcessor;

我想出了一个解决办法。 添加

@范围(proxyMode=ScopedProxyMode.TARGET_类)

在我的SaveProcessor类之上解决了我的问题

我不能用

@自动连线 公共处理器

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

同意答案, 通过接口自动连线是一种很好的做法, 当你设定

@交易的

spring为您的SaveProcessor对象创建代理, 因为它实现了处理器,所以spring将使用DynamicProxy。 所以在上下文中没有一个带有类SaveProcessor的bean,而是有一个带有calss Proxy$的bean。。实现嵌入式表面处理器

这就是spring找不到候选人的原因

如果您有多个处理器实现,这不是问题, 只用

@限定词

,或由beanName自动布线。就你而言

@Autowired
private Processor saveProcessor;

这将是可行的,因为bean具有名称saveProcessor

您可能需要提供更多的上下文。您如何激活Spring AOP?你在用靴子吗?你的构建依赖项是什么样子的?@tsolakp的副本清楚地解释了这个问题,但是它已经过时了,所以我还不打算重复这个问题。@chrylis,在过去的2,5年中,
事务性的
注释的工作方式没有真正的变化。诚然,这实际上会导致依赖解析错误,这有点奇怪。然而,这个问题的答案仍然是完全正确的。@M.Prokhorov同意,但现代方法是完全绕过该配置并使用Boot。这不是唯一的解决方案。另一种方法是使用CGLIB。我不能使用处理器接口,因为处理器接口在我的应用程序中有不同的实现。spring的
@Qualifier
注释应该有用如果您使用多个实现,那么您可以使用
@Qualifier
。若您使用接口进行自动连接(使用基于接口的代理)会更好,但若您使用基于类的自动连接,那个么您的类也应该是spring组件。这意味着您的类应该使用
@Component
@Service
@Repository
进行注释。