Идея открытой springboot тепловая нагрузка, что приводит к аномальному преобразованию типа из Shiro

среда разработки

springboot-2.0.3, Сиро-1,4, 开启 springboot-DevTools

должное

Пользовательская область разработки Сиро, генерируется исключением преобразования объекта

 @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;
    }
复制代码

В котором пользователь Пользователь = (Пользователь) SecurityUtils.getSubject () getPrincipal () ;. Выдает следующее исключение

exception:java.lang.ClassCastException:cn.system.model.User cannot be cast to cn.system.model.User,
复制代码

Cause Analysis

Когда проект начал загрузку проекта между загрузчиком класса, используемым быть org.springframework.boot.devtools.restart.classloader.RestartClassLoader, потому что перед введением пружинного загрузочного-Devtools этого горячего пакета развертывания, в котором проект по повышению эффективности , И я беру объекты Shiro сессии, когда загрузчик классов не привык к этому, но sun.misc.Launcher.AppClassLoader, что приводит к ненормальному конвертировать мой тип.

Решения

  1. Не используйте пружинный Boot-DevTools горячего развертывания
  2. Создание каталога в следующей папке ресурсов META_INF, а затем создать spring-devtools.properties файлов, а также похожий на следующую конфигурацию:
restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
复制代码
  1. Чтобы удалить свойство объекта копии, следующим образом:
    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;
    }
复制代码

рекомендация

отjuejin.im/post/5da46ac1e51d457806260f1a