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

835 阅读6分钟
原文链接: click.aliyun.com

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;  
    }  
…………………………  
…………………………  
}  
最终启动项目,成功了