美文网首页
SpringBoot+Shiro使用注解@RequiresPer

SpringBoot+Shiro使用注解@RequiresPer

作者: 蓝雄威 | 来源:发表于2018-12-31 14:58 被阅读0次

问题描述:

在写代码测试的时候,发现事务并没有起效,抛出异常之后,事务并没有回滚。但是这段代码我上星期才刚测试完,是没问题的,但是今天怎么测试都是不行.手动在启动类上贴@EnableTransactionManagement或者使用xml的方式配置事务都是不起效.
接着通过断点的方式查看该sevice对象,发现并没有被代理.
后面通过排除法的方式,发现把Shiro相关配置注释掉后就没问题了.

原因分析

在Shiro配置中,如果要@RequiresPermissions生效需要在配置文件中添加如下配置:

@Bean
    public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){
        DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
        advisorAutoProxyCreator.setProxyTargetClass(true);
        return advisorAutoProxyCreator;
    }

    /**
     * 开启aop注解支持
     * @param securityManager
     * @return
     */
    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(org.apache.shiro.mgt.SecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
        return authorizationAttributeSourceAdvisor;
}

DefaultAdvisorAutoProxyCreator就是通过AOP的方式对贴了@RequiredPermission的类进行增强,生成对应的代理类对象.

但是由于ShiroFilterFactoryBean实现了FactoryBean接口,所以它会提前被初始化。又因为SecurityManager,SecurityManager依赖于Realm实现类、Realm实现类又依赖于UserService,所以引发所有相关的bean提前初始化,导致UserService并没有被事务AOP包裹着.
所以就出现了事务无效的问题.

解决方案

在Realm中Service声明上加入@Lazy注解,延迟Realm实现中Service对象的初始化时间,这样就可以保证Service实际初始化的时候会被BeanPostProcessor拦截,创建具有事务功能的代理对象。

@Component
public class UserRealm extends AuthorizingRealm {
    @Autowired
    @Lazy
    private IUserService userService;
    @Autowired
    @Lazy
    private IPermissionService permissionService;
    @Override
    public String getName() {
        return "UserRealm";
    }
    .....
}

相关文章

  • SpringBoot+Shiro使用注解@RequiresPer

    问题描述: 在写代码测试的时候,发现事务并没有起效,抛出异常之后,事务并没有回滚。但是这段代码我上星期才刚测试完,...

  • java注解

    内容: 注解的定义 注解的语法 源码级别的注解的使用 运行时注解的使用 编译时注解的使用 Android 预置的注...

  • 【JAVA】注解

    元注解 用来定义、声明注解的注解。 @Inherited注解 使用此注解声明出来的自定义注解,在使用此自定义注解时...

  • Spring讲解(四)

    Spring 中使用注解注入 注解:就是一个类,使用 @ 注解名称。实际开发中:使用注解取代 xml 配置文件。 ...

  • SpringBoot集成Shiro实现多数据源认证授权与分布式会

    项目背景 在最近重构后的项目中使用了springboot+shiro的技术栈,shiro是一个强大且易用的Java...

  • Java注解的使用

    Java注解的使用 参考 廖雪峰java教程 使用注解 什么是注解(Annotation)?注解是放在Java源码...

  • springboot + shiro 权限注解、统一异常处理、请

    shiro注解的使用 shiro权限注解 Shiro 提供了相应的注解用于权限控制,如果使用这些注解就需要使用AO...

  • 模仿java的@Test

    定义注解 使用自定义注解 解析注解

  • Spring的bean管理(注解)

    注解介绍 1 代码里面特殊标记,使用注解可以完成功能 2 注解写法 @注解名称(属性名称=属性值) 3 注解使用在...

  • Spring 常用注解

    一、注解的分类    主要分为两大类:使用Bean注解、注册Bean注解。 使用Bean的注解    @Autow...

网友评论

      本文标题:SpringBoot+Shiro使用注解@RequiresPer

      本文链接:https://www.haomeiwen.com/subject/xfnilqtx.html