通常我们在调用dubbo的服务时,会用@Reference进行注入,如下
@Component
public class MyShiroRealm extends AuthorizingRealm {
@Reference
UserService userService;
但是这样写会出现一个问题,就是调用userService时会出现空指针。
这里我们来分析一下原因,在看解决办法。
原因:
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后,authRealm会赋值给它,但这时我们@Reference调用的服务还没有注入到authRealm中,所以securityManager中的realm属性为空。当我们在自定义的授权和认证方法中调用dubbo服务时,就会报NullPointerException。
接下来我们来看一下解决方案:
我们在resource文件夹下创建一个spring-dubbo.xml文件,注意配置中的最后两条
把需要注入的服务用dubbo:reference/创建一个远程服务代理,同时加上dubbo:annotation/支持注解配置,扫描注解。
最后将自定义Realm中需要引入的服务改为@Autowired注解注入。
这里说一下dubbo服务可以同时以注解和配置文件的形式存在,其他地方依然可以用@Reference的注解形式。