Idea开启springboot 热加载,导致的Shiro类型转换异常

本文探讨了在Spring Boot环境下使用Shiro时,因spring-boot-devtools导致的ClassCastException异常。深入分析了异常原因,即不同类加载器导致的类型转换问题,并提供了三种解决方案:禁用热部署、配置排除热重启的类或使用BeanUtils进行属性拷贝。

开发环境

springboot-2.0.3,shiro-1.4,开启spring-boot-devtools

起因

开发shiro的自定义realm时,抛出实体转换异常

 @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) {

        User user = (User) SecurityUtils.getSubject().getPrincipal();
        String userName = user.getUsername();

        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();

        // 获取用户角色集
        List<Role> roleList = this.roleService.findUserRole(userName);
        Set<String> roleSet = roleList.stream().map(Role::getRoleName).collect(Collectors.toSet());
        simpleAuthorizationInfo.setRoles(roleSet);

        // 获取用户权限集
        List<Menu> permissionList = this.menuService.findUserPermissions(userName);
        Set<String> permissionSet = permissionList.stream().map(Menu::getPerms).collect(Collectors.toSet());
        simpleAuthorizationInfo.setStringPermissions(permissionSet);
        return simpleAuthorizationInfo;
    }

其中 User user = (User) SecurityUtils.getSubject().getPrincipal();会抛出下面的异常

exception:java.lang.ClassCastException:cn.system.model.User cannot be cast to cn.system.model.User,

原因分析

项目启动时候加载项目当中的类所使用到的加载器是 org.springframework.boot.devtools.restart.classloader.RestartClassLoader , 这是因为之前在项目当中引入了 spring-boot-devtools 这个热部署包来提高效率。而我从 shiro session 取对象时候所用到的类加载器并不是这个,而是 sun.misc.Launcher.AppClassLoader ,从而导致我的类型的转换的异常。

解决办法

  1. 不使用spring-boot-devtools热部署
  2. 在 resources 目录下面创建 META_INF 文件夹,然后创建 spring-devtools.properties文件,文件加上类似下面的配置:
restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar

对取出的对象属性进行拷贝,代码如下:

    public static Subject getSubjct() {
        return SecurityUtils.getSubject();
    }

   public static User getUser() {
        User user = null;
        Object obj = getSubjct().getPrincipal();
        if (StringUtils.isNotNull(obj)) {
            user = new User();
            BeanUtils.copyBeanProp(user, obj);
        }
        return user;
    }

(想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程。完全免费哦!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值