使用shiro时发生的报错处理

2 篇文章 0 订阅

1.Unable to evaluate the expression Method threw 'org.hibernate.LazyInit no Session
Hibernate 懒加载在查询实体的时候,不立即加载关联属性,但是在一次主体查询完成后关闭了Session。假如这样把用户对象保存到redis,就会产生no session的问题。
在网上经常看见有人说这个问题有两个解决方案。1:把懒加载LAZY改成饥饿加载EAGER,这个我尝试过没有效果。并且违背了懒加载的设计思想。2:在使用到user对象getRoles的Service方法上加上@Transactional,以此保持Session。好像也是没什么卵用。并且有个很魔幻的操作,只有我在IDEA中监视user展开他的roles才不会报错,否则还是报错。这里的原因就是我监视查看了user的role,懒加载把role加载了。然后保存到redis,这个role也会保存。所以,
经过多方查验,比较优秀的解决方法是使用DTO,不要在业务逻辑代码中直接使用PO,就不存在hibernate的Session问题。
实在是不行的话,试一下这个方法:
在application.yml中配置spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true。
这个配置的意思就是在没有事务的情况下允许懒加载

2.shiro 在doGetAuthenticationInfo方法返回时报错
(1)检查redis配置,较新版本的redis的host属性格式是127.0.0.1:6379,不是127.0.0.1
(2)对象序列化,return new SimpleAuthenticationInfo(user, user.getPassword(), ByteSource.Util.bytes(user.getSalt()), getName());这里的对象user以及所有关联的对象注入role和resource必须实现了Serializable接口

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值