前言
本篇文章仅限于某个特殊未生效吐槽讲解。
- 其他常见未生效请移步其他文章
问题描述
使用Shiro不谨慎造成的特殊Bug。
仅仅只在一个
用户
service中未生效。其余全部生效(环境多模块
不影响)测试了很多类,新建,删除代码。最终发现(自己未谨慎)竟然是某个未加入容器的类调用了
用户
service竟然成功了;
@Slf4j
public class LoginRealm extends CustomRealm {
@Autowired
UserService userService;
@Autowired
RedisUtil redisUtil;
...
- 查到原因才发现,左边小图标没有(是未加入的标志),可恶的是竟然运行成功(数据毫无问题,能取到Service的数据,其他接口调用Service也是正常的),而且竟然没报错。(不要问继承问题,可以自己去试试)
大概原因就是这个类被重新实列化了。属于Shiro的验证领域(登录时候去调用Service获取用户信息)。
问题找到了就好解决了,吐槽吐槽,谨慎谨慎同时也是知识的匮乏
解决方案
- 获取service和redisUtil的单列。
private static UserService instance;
@PostConstruct
public void build() {
instance = this;
}
public static UserService getInstance() {
return instance;
}
ps
这个
LoginRealm
被其他加入Spring容器实列化了(new),所以能找到值。这个问题造成了该模块下事务和异步未生效。特此谨记!