springBoot+dubbo+shiro整合时realm中调用服务出现空指针

本文探讨了在Spring框架下,使用Dubbo远程调用服务时遇到的空指针异常问题,特别是在Shiro权限管理框架中。分析了问题根源在于Dubbo服务注入时机与ShiroRealm初始化顺序的冲突,并提出了通过调整配置文件和使用@Autowired替换@Reference的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通常我们在调用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的注解形式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值