問題描述
最近搭建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;
}
...
}