springboot整合dubbo、shiro 无.xml配置文件遇到的坑

springboot整合dubbo、shiro 无.xml配置文件在自定义的ShrioRealm中无法注入dubbo服务,全网各种找资料发现除了增加一个dubbo配置文件,别的都不行,本人一点一点的排查可能出现的问题,最终解决,在此作为记录,希望能为再碰到此坑的人提供一点小小的帮助。

springboot整合dubbo、shiro 无.xml配置文件,在只有springboot和dubbo没有碰到问题,dubbo服务可以正常注入。

dubbo配置类代码:

@Configuration
public class DubboConfig {

    /**
     * 应用名称
     */
    @Value("${dubbo.application.name}")
    private String applicationName;

    /**
     * 应用版本号
     */
    @Value("${dubbo.application.version}")
    private String applicationVersion;

    /**
     * 组织
     */
    @Value("${dubbo.application.organization}")
    private String organization;

    /**
     * 负责人
     */
    @Value("${dubbo.application.owner}")
    private String owner;

    /**
     * 注册中心地址
     */
    @Value("${dubbo.registry.address}")
    private String registryAddress;

    /**
     * 缓存文件地址
     */
    @Value("${dubbo.registry.file}")
    private String registryFile;

    /**
     * dubbo协议端口号
     */
    @Value("${dubbo.protocol.port}")
    private Integer protocolPort;

    /**
     * 应用相关配置
     *
     * @return
     */
    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName(applicationName);
        applicationConfig.setVersion(applicationVersion);
        applicationConfig.setOrganization(organization);
        applicationConfig.setOwner(owner);
        return applicationConfig;
    }

    /**
     * 注册中心配置
     * 基于zookeeper
     *
     * @return
     */
    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setProtocol("zookeeper");
        registryConfig.setAddress(registryAddress);
        registryConfig.setFile(registryFile);
        registryConfig.setTimeout(30000);
        return registryConfig;
    }

    /**
     * 协议配置
     * 基于dubbo
     *
     * @return
     */
    @Bean
    public ProtocolConfig protocolConfig() {
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setName("dubbo");
        protocolConfig.setPort(protocolPort);
        return protocolConfig;
    }

    /**
     * 监控配置
     * 监控的地址从注册中心中找
     *
     * @return
     */
    @Bean
    public MonitorConfig monitorConfig() {
        MonitorConfig monitorConfig = new MonitorConfig();
        monitorConfig.setProtocol("registry");
        return monitorConfig;
    }

    /**
     * 设置dubbo扫描包
     *
     * @return
     */
    @Bean
    public static AnnotationBean annotationBean() {
        AnnotationBean annotationBean = new AnnotationBean();
        annotationBean.setPackage("com.vocedu.web.service.dubbo");
        return annotationBean;
    }

    /**
     * 提供者配置
     *
     * @return
     */
    @Bean(name = "defaultProvider")
    @ConditionalOnClass(Exporter.class)
    public ProviderConfig providerConfig() {
        ProviderConfig providerConfig = new ProviderConfig();
        providerConfig.setApplication(applicationConfig());
        providerConfig.setProtocol(protocolConfig());
        providerConfig.setRegistry(registryConfig());
        providerConfig.setMonitor(monitorConfig());
        providerConfig.setTimeout(30000);
        providerConfig.setRetries(0);
        providerConfig.setDelay(30000);
        return providerConfig;
    }

    /**
     * 消费者配置
     *
     * @return
     */
    @Bean(name = "defaultConsumer")
    @ConditionalOnClass(Invoker.class)
    public ConsumerConfig consumerConfig() {
        ConsumerConfig consumerConfig = new ConsumerConfig();
        consumerConfig.setApplication(applicationConfig());
        consumerConfig.setRegistry(registryConfig());
        consumerConfig.setMonitor(monitorConfig());
        consumerConfig.setCheck(false);
        consumerConfig.setTimeout(60000);
        consumerConfig.setRetries(0);
        return consumerConfig;
    }
}

DubboSupport部分代码:

@Component
public class DubboSupport {

    @Reference(interfaceName = "com.vocedu.api.sys.AccountService")
    public AccountService accountService;

    @Reference(interfaceName = "com.vocedu.api.sys.AuthOauthClientService")
    public AuthOauthClientService authOauthClientService;
}

但是当整合shiro时自定义的shiroRealm通过

@Autowired
private DubboSupport dubboSupport;

调用服务一直报空。纠结了好久,网上查各种资料最靠谱的说是整合shiro时不能用@Reference注解而要把自定义的shiroRealm中需要用到的服务使用dubbo的.xml配置

此种方法亲测确实可行。但是本人就是感觉别扭这样违背了springboot零配置文件的原则,于是不达目的不罢休,亲自研究。

把ShiorConfiguration配置类修改一下,先注入DubboSupport然后传入到ShiroRealm中

@Configuration
public class ShiroConfiguration {

    @Bean
    public static DubboSupport getDubboSupport() {
        DubboSupport dubboSupport = new DubboSupport();
        return dubboSupport;
    }

    //将自己的验证方式加入容器
    @Bean
    public ShiroRealm shiroRealm() {
        ShiroRealm shiroRealm = new ShiroRealm(getDubboSupport());
        return shiroRealm;
    }
………………………………………………………………
……………………………………………………
}

此时,DubboSupport中修改为:

//@Component
public class DubboSupport {

    @Reference(interfaceName = "com.vocedu.api.sys.AccountService")
    public static AccountService accountService;

    @Reference(interfaceName = "com.vocedu.api.sys.AuthOauthClientService")
    public static AuthOauthClientService authOauthClientService;
………………………………
………………
}

ShiroRealm做一下修改

public class ShiroRealm extends AuthorizingRealm{

    //@Autowired
    private DubboSupport dubboSupport;

    public ShiroRealm(DubboSupport dubboSupport) {
        this.dubboSupport = dubboSupport;
    }
…………………………
…………………………
}
最终启动项目,成功了。


  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值