springboot:shiro注入dubbo服務空指針問題

問題描述

最近搭建springboot+dubbo+shiro微服務時,自定義的shiro的realm組件中:

@Component
public class AuthRealm extends AuthorizingRealm {
    @Reference
    private AccountService accountService;

調用dubbo服務accountService時,出現了空指針的異常。

問題原因

dubbo的@Reference機制,是在spring bean全部註冊完成後,再注入的spring bean中。
而shiro的authRealm調用代碼:

    @Autowired
    private AuthRealm authRealm;

    @Bean
    public SessionsSecurityManager securityManager(){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(authRealm);
        return securityManager;
    }

在代碼中我們可以看到,註冊securityManager這個bean的時候,會將authRealm賦值給securityManager,但是此時accountService還未注入到authRealm中去,所以securityManager的authRealm屬性中accountService字段爲null。

解決方案

在將authRealm賦值給securityManager時,手動將accountService注入到authRealm中。

@Component
public class AuthRealm extends AuthorizingRealm {

    private AccountService accountService;
    
    @Autowired
    private DubboProperties properties;

    ...

    /**
     * 手動注入dubbo服務
     */
    public void setAccountService() {
        ReferenceConfig<AccountService> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setApplication(properties.getApplication());
        referenceConfig.setRegistry(properties.getRegistry());
        referenceConfig.setInterface(AccountService.class);
        this.accountService = referenceConfig.get();
    }
}

@Configuration
public class ShiroConfig {

    @Autowired
    private AuthRealm authRealm;

    @Bean
    public SessionsSecurityManager securityManager(){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        authRealm.setAccountService();
        securityManager.setRealm(authRealm);
        return securityManager;
    }
    ...
}

項目源碼:https://github.com/ksyzz/spri...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章