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接口