Spring DefaultAdvisorAutoProxyCreator带有@Transactional导致问题
我正在从事一个SpringMVC项目,并试图为安全性集成ApacheShiro。一切都进行得很顺利,直到我意识到Hibernate在一次查询后过早地关闭了会话/连接,并导致lazyinit异常。毫不奇怪,我所做的应该在事务中完成,这样会话就不会关闭 困境…Spring DefaultAdvisorAutoProxyCreator带有@Transactional导致问题,spring,aop,shiro,Spring,Aop,Shiro,我正在从事一个SpringMVC项目,并试图为安全性集成ApacheShiro。一切都进行得很顺利,直到我意识到Hibernate在一次查询后过早地关闭了会话/连接,并导致lazyinit异常。毫不奇怪,我所做的应该在事务中完成,这样会话就不会关闭 困境… 我试着在我的控制器方法上加上@Transactional,但是我得到了404。查看我的日志,我可以看到当Spring引导时,如果@Transactional注释位于控制器中的任何方法上,它会忽略HomeController中的任何映射 如果没
我请求帮助是因为我现在完全不知道如何继续。这通常是因为当您在方法上放置@Transactional时,Spring会为该bean创建一个动态代理-如果该bean实现了一个接口,则会基于该接口创建动态代理,否则,将使用CGLIB创建代理 我猜,在您的情况下,问题在于您可能已经将控制器基于某个接口,或者您正在基于基类对其进行扩展。这最终会基于该接口创建一个代理,因为当需要为您的请求创建映射时,SpringMVC可能无法从bean中找到您的映射 解决方案可能是: a。您可以尝试并强制代理基于事务的CGLIB:
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
b。您可以使用纯Aspectj,加载时编织或编译时编织
c。您可以将@Transactional移动到服务(具有接口)中,并将调用从控制器委托给服务,这样可以避免控制器上的@TransactionOK,这可能是因为正在创建的CGLIB代理没有为@RequestMapping注释携带,推荐肯定是上面的c点。抱歉,无意中提交了之前的评论,然后删除了它。我没有HomeController扩展或实现任何接口,所以可能不是这样,尽管从那时起我就这样做了。当DefaultAdvisorAutoProxyCreator为Shiro试图连接的切入点创建AOP代理(纯java,而不是cglib)时,可能会发生类似的情况?有没有办法为所有代理指定cglib?哦,好的-
proxy target class=“true”
强制为@Transaction场景指定基于cglib的代理。只是想更新,以便每个人都能看到选项B解决了我的问题。我试图在根本不使用aspectj的情况下过日子,但在Shiro/Apache创建代理之前,我无法让RequestMappingHandlerAdapter映射@RequestMapping。即使使用cglib,它也无法正确读取。添加spring方面并使用它可以让它工作得很好。谢谢你的帮助!