前言
本篇文章僅限于某個特殊未生效吐槽講解。
- 其他常見未生效請移步其他文章
問題描述
使用Shiro不謹(jǐn)慎造成的特殊Bug。
僅僅只在一個
用戶service中未生效。其余全部生效(環(huán)境多模塊不影響)測試了很多類,新建,刪除代碼。最終發(fā)現(xiàn)(自己未謹(jǐn)慎)竟然是某個未加入容器的類調(diào)用了
用戶service竟然成功了;
@Slf4j
public class LoginRealm extends CustomRealm {
@Autowired
UserService userService;
@Autowired
RedisUtil redisUtil;
...
- 查到原因才發(fā)現(xiàn),左邊小圖標(biāo)沒有(是未加入的標(biāo)志),可惡的是竟然運行成功(數(shù)據(jù)毫無問題,能取到Service的數(shù)據(jù),其他接口調(diào)用Service也是正常的),而且竟然沒報錯。(不要問繼承問題,可以自己去試試)

image.png
大概原因就是這個類被重新實列化了。屬于Shiro的驗證領(lǐng)域(登錄時候去調(diào)用Service獲取用戶信息)。
問題找到了就好解決了,吐槽吐槽,謹(jǐn)慎謹(jǐn)慎同時也是知識的匱乏
解決方案
- 獲取service和redisUtil的單列。
private static UserService instance;
@PostConstruct
public void build() {
instance = this;
}
public static UserService getInstance() {
return instance;
}
ps
這個
LoginRealm被其他加入Spring容器實列化了(new),所以能找到值。這個問題造成了該模塊下事務(wù)和異步未生效。特此謹(jǐn)記!