Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring DefaultAdvisorAutoProxyCreator带有@Transactional导致问题_Spring_Aop_Shiro - Fatal编程技术网

Spring DefaultAdvisorAutoProxyCreator带有@Transactional导致问题

Spring DefaultAdvisorAutoProxyCreator带有@Transactional导致问题,spring,aop,shiro,Spring,Aop,Shiro,我正在从事一个SpringMVC项目,并试图为安全性集成ApacheShiro。一切都进行得很顺利,直到我意识到Hibernate在一次查询后过早地关闭了会话/连接,并导致lazyinit异常。毫不奇怪,我所做的应该在事务中完成,这样会话就不会关闭 困境… 我试着在我的控制器方法上加上@Transactional,但是我得到了404。查看我的日志,我可以看到当Spring引导时,如果@Transactional注释位于控制器中的任何方法上,它会忽略HomeController中的任何映射 如果没

我正在从事一个SpringMVC项目,并试图为安全性集成ApacheShiro。一切都进行得很顺利,直到我意识到Hibernate在一次查询后过早地关闭了会话/连接,并导致lazyinit异常。毫不奇怪,我所做的应该在事务中完成,这样会话就不会关闭

困境…

  • 我试着在我的控制器方法上加上@Transactional,但是我得到了404。查看我的日志,我可以看到当Spring引导时,如果@Transactional注释位于控制器中的任何方法上,它会忽略HomeController中的任何映射

  • 如果没有@Transactional,它可以正常加载,Ih可以看到RequestMappingHandlerMappingBean可以看到控制器中的所有@RequestMapping注释

  • 使用@Transactional但不使用DefaultAdvisorAutoProxyCreator,它可以工作,但Shiro注释被忽略

  • tldr:Shiro需要DefaultAdvisorAutoProxyCreator,但是如果我创建了这个bean,Spring在使用@Transactional注释时就会崩溃


    我请求帮助是因为我现在完全不知道如何继续。

    这通常是因为当您在方法上放置@Transactional时,Spring会为该bean创建一个动态代理-如果该bean实现了一个接口,则会基于该接口创建动态代理,否则,将使用CGLIB创建代理

    我猜,在您的情况下,问题在于您可能已经将控制器基于某个接口,或者您正在基于基类对其进行扩展。这最终会基于该接口创建一个代理,因为当需要为您的请求创建映射时,SpringMVC可能无法从bean中找到您的映射

    解决方案可能是:

    a。您可以尝试并强制代理基于事务的CGLIB:

    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
    
    
    
    b。您可以使用纯Aspectj,加载时编织或编译时编织


    c。您可以将@Transactional移动到服务(具有接口)中,并将调用从控制器委托给服务,这样可以避免控制器上的@Transaction

    OK,这可能是因为正在创建的CGLIB代理没有为@RequestMapping注释携带,推荐肯定是上面的c点。抱歉,无意中提交了之前的评论,然后删除了它。我没有HomeController扩展或实现任何接口,所以可能不是这样,尽管从那时起我就这样做了。当DefaultAdvisorAutoProxyCreator为Shiro试图连接的切入点创建AOP代理(纯java,而不是cglib)时,可能会发生类似的情况?有没有办法为所有代理指定cglib?哦,好的-
    proxy target class=“true”
    强制为@Transaction场景指定基于cglib的代理。只是想更新,以便每个人都能看到选项B解决了我的问题。我试图在根本不使用aspectj的情况下过日子,但在Shiro/Apache创建代理之前,我无法让RequestMappingHandlerAdapter映射@RequestMapping。即使使用cglib,它也无法正确读取。添加spring方面并使用它可以让它工作得很好。谢谢你的帮助!