最近搭建springboot+dubbo+shiro微服務時,自定義的shiro的realm組件中:git
@Component public class AuthRealm extends AuthorizingRealm { @Reference private AccountService accountService;
調用dubbo服務accountService時,出現了空指針的異常。github
dubbo的@Reference機制,是在spring bean所有註冊完成後,再注入的spring bean中。
而shiro的authRealm調用代碼:spring
@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。springboot
在將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...this