乐趣区

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…

退出移动版