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
进行注释。