解决三更博客项目中出现的BUG-01-忽略流程分析

一、问题引入

今天我在实现三更博客项目的注册功能时,使用postman进行测试,一直报下图错误:
在这里插入图片描述

好久都不知道是啥原因,哎,还是我太菜了,其实bug说得很明白了ClassCastException类型转换异常,但是我当时一直摸不着头绪,因为我看见这个UserLogin就很疑惑,想着我在写注册的代码时,也没用到这个类呀,我反正只记得在权限那一块使用了这个类,为此我还傻不拉几的去看真的跑去权限那块的代码去看,实际上做了无用功,其实和权限根本就没关系
于是我就只能静下心去认真看报错了, 其实早应该这么做的。

二、问题分析

但凡我在往下翻一点,都能马上找到错误,其实这就是惯性思维,总觉得报错信息就在最上面,这也是吃了教训了,这是下面的报错:
在这里插入图片描述
下面有inserFill,很明显就是这的问题,开始的疑惑到这里也想明白了,因为我为User类中的公共字段设置了自动填充:
在这里插入图片描述
其实开始三更的代码也是没用这个的,我是为了让注册用户时就有相应信息,才设置这个,设置了哪些字段应该在什么时候填充,下面就是设置填充的规则了,如下图所示:
在这里插入图片描述
添加填充配置器,就是实现MetaObjectHandler接口,~~啰嗦一句
关键就是这一句:

Long userId  = securityUtils.getUserId();

而securityUtils内部实现是这样的:

@Component
public class SecurityUtils {
    /**
     * 获取Authentication
     * @return
     */
    public  Authentication getAuthentication(){
        return SecurityContextHolder.getContext().getAuthentication();
    }

    /**
     * 获取UserLogin
     * @return
     */
    public  UserLogin getUserLogin(){
        return (UserLogin) getAuthentication().getPrincipal();
    }
    /**
     * 获取用户Id
     * @return
     */
    public  Long getUserId(){
        return getUserLogin().getUser().getId();
    }

    /**
     * 判断用户是否为管理员
     */
    public  boolean isAdmin(){
        Long id = getUserId();
        return id!=null && id == 1L;
    }
}

具体原因是这一句:

public  UserLogin getUserLogin(){
        return (UserLogin) getAuthentication().getPrincipal();
    }

因为这个注册接口是不需要认证的,所以自然也就没走认证过滤器,在认证过滤器中才setAuthentication,才设置了Principal,就是过滤器器中的下面这一句:

 UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser,null,null);
        SecurityContextHolder.getContext().setAuthentication(authenticationToken);

正是没有设置过,所以Principal默认是一段字符串,而在

public  UserLogin getUserLogin(){
        return (UserLogin) getAuthentication().getPrincipal();
    }

这里进行了强转,从字符串转为UserLogin类型,自然就类型转换异常了

三、解决办法

这里不在工具类中添加逻辑代码,在字段填充配置器中,添加特判即可:

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Autowired
    private SecurityUtils securityUtils;

    @Override
    public void insertFill(MetaObject metaObject) {
        Long userId  ;
        if(! (securityUtils.getAuthentication().getPrincipal() instanceof UserLogin)){
            userId = -1L;
        }else{
            userId = securityUtils.getUserId();
        }
        setFieldValByName("createTime",new Date(),metaObject);
        setFieldValByName("createBy",userId,metaObject);
        setFieldValByName("updateTime",new Date(),metaObject);
        setFieldValByName("updateBy",userId,metaObject);
        setFieldValByName("delFlag",0,metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        Long userId ;
        if(! (securityUtils.getAuthentication().getPrincipal() instanceof UserLogin)){
            userId = -1L;
        }else{
            userId = securityUtils.getUserId();
        }
        setFieldValByName("updateTime",new Date(),metaObject);
        setFieldValByName("updateBy",userId,metaObject);
        setFieldValByName("delFlag",0,metaObject);
    }
}

关键代码:

  Long userId  ;
        if(! (securityUtils.getAuthentication().getPrincipal() instanceof UserLogin)){
            userId = -1L;
        }else{
            userId = securityUtils.getUserId();
        }

四、总结

1 . 看报错,不能只看前面,应该将报错信息看全
2. 刨根问底,思考报错原因

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值