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

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

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

dubbo配置类代码:

[java] view plain copy
  1. @Configuration  
  2. public class DubboConfig {  
  3.   
  4.     /** 
  5.      * 应用名称 
  6.      */  
  7.     @Value("${dubbo.application.name}")  
  8.     private String applicationName;  
  9.   
  10.     /** 
  11.      * 应用版本号 
  12.      */  
  13.     @Value("${dubbo.application.version}")  
  14.     private String applicationVersion;  
  15.   
  16.     /** 
  17.      * 组织 
  18.      */  
  19.     @Value("${dubbo.application.organization}")  
  20.     private String organization;  
  21.   
  22.     /** 
  23.      * 负责人 
  24.      */  
  25.     @Value("${dubbo.application.owner}")  
  26.     private String owner;  
  27.   
  28.     /** 
  29.      * 注册中心地址 
  30.      */  
  31.     @Value("${dubbo.registry.address}")  
  32.     private String registryAddress;  
  33.   
  34.     /** 
  35.      * 缓存文件地址 
  36.      */  
  37.     @Value("${dubbo.registry.file}")  
  38.     private String registryFile;  
  39.   
  40.     /** 
  41.      * dubbo协议端口号 
  42.      */  
  43.     @Value("${dubbo.protocol.port}")  
  44.     private Integer protocolPort;  
  45.   
  46.     /** 
  47.      * 应用相关配置 
  48.      * 
  49.      * @return 
  50.      */  
  51.     @Bean  
  52.     public ApplicationConfig applicationConfig() {  
  53.         ApplicationConfig applicationConfig = new ApplicationConfig();  
  54.         applicationConfig.setName(applicationName);  
  55.         applicationConfig.setVersion(applicationVersion);  
  56.         applicationConfig.setOrganization(organization);  
  57.         applicationConfig.setOwner(owner);  
  58.         return applicationConfig;  
  59.     }  
  60.   
  61.     /** 
  62.      * 注册中心配置 
  63.      * 基于zookeeper 
  64.      * 
  65.      * @return 
  66.      */  
  67.     @Bean  
  68.     public RegistryConfig registryConfig() {  
  69.         RegistryConfig registryConfig = new RegistryConfig();  
  70.         registryConfig.setProtocol("zookeeper");  
  71.         registryConfig.setAddress(registryAddress);  
  72.         registryConfig.setFile(registryFile);  
  73.         registryConfig.setTimeout(30000);  
  74.         return registryConfig;  
  75.     }  
  76.   
  77.     /** 
  78.      * 协议配置 
  79.      * 基于dubbo 
  80.      * 
  81.      * @return 
  82.      */  
  83.     @Bean  
  84.     public ProtocolConfig protocolConfig() {  
  85.         ProtocolConfig protocolConfig = new ProtocolConfig();  
  86.         protocolConfig.setName("dubbo");  
  87.         protocolConfig.setPort(protocolPort);  
  88.         return protocolConfig;  
  89.     }  
  90.   
  91.     /** 
  92.      * 监控配置 
  93.      * 监控的地址从注册中心中找 
  94.      * 
  95.      * @return 
  96.      */  
  97.     @Bean  
  98.     public MonitorConfig monitorConfig() {  
  99.         MonitorConfig monitorConfig = new MonitorConfig();  
  100.         monitorConfig.setProtocol("registry");  
  101.         return monitorConfig;  
  102.     }  
  103.   
  104.     /** 
  105.      * 设置dubbo扫描包 
  106.      * 
  107.      * @return 
  108.      */  
  109.     @Bean  
  110.     public static AnnotationBean annotationBean() {  
  111.         AnnotationBean annotationBean = new AnnotationBean();  
  112.         annotationBean.setPackage("com.vocedu.web.service.dubbo");  
  113.         return annotationBean;  
  114.     }  
  115.   
  116.     /** 
  117.      * 提供者配置 
  118.      * 
  119.      * @return 
  120.      */  
  121.     @Bean(name = "defaultProvider")  
  122.     @ConditionalOnClass(Exporter.class)  
  123.     public ProviderConfig providerConfig() {  
  124.         ProviderConfig providerConfig = new ProviderConfig();  
  125.         providerConfig.setApplication(applicationConfig());  
  126.         providerConfig.setProtocol(protocolConfig());  
  127.         providerConfig.setRegistry(registryConfig());  
  128.         providerConfig.setMonitor(monitorConfig());  
  129.         providerConfig.setTimeout(30000);  
  130.         providerConfig.setRetries(0);  
  131.         providerConfig.setDelay(30000);  
  132.         return providerConfig;  
  133.     }  
  134.   
  135.     /** 
  136.      * 消费者配置 
  137.      * 
  138.      * @return 
  139.      */  
  140.     @Bean(name = "defaultConsumer")  
  141.     @ConditionalOnClass(Invoker.class)  
  142.     public ConsumerConfig consumerConfig() {  
  143.         ConsumerConfig consumerConfig = new ConsumerConfig();  
  144.         consumerConfig.setApplication(applicationConfig());  
  145.         consumerConfig.setRegistry(registryConfig());  
  146.         consumerConfig.setMonitor(monitorConfig());  
  147.         consumerConfig.setCheck(false);  
  148.         consumerConfig.setTimeout(60000);  
  149.         consumerConfig.setRetries(0);  
  150.         return consumerConfig;  
  151.     }  
  152. }  

DubboSupport部分代码:

[java] view plain copy
  1. @Component  
  2. public class DubboSupport {  
  3.   
  4.     @Reference(interfaceName = "com.vocedu.api.sys.AccountService")  
  5.     public AccountService accountService;  
  6.   
  7.     @Reference(interfaceName = "com.vocedu.api.sys.AuthOauthClientService")  
  8.     public AuthOauthClientService authOauthClientService;  
  9. }  

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

[java] view plain copy
  1. @Autowired  
  2. private DubboSupport dubboSupport;  

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

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

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

[java] view plain copy
  1. @Configuration  
  2. public class ShiroConfiguration {  
  3.   
  4.     @Bean  
  5.     public static DubboSupport getDubboSupport() {  
  6.         DubboSupport dubboSupport = new DubboSupport();  
  7.         return dubboSupport;  
  8.     }  
  9.   
  10.     //将自己的验证方式加入容器  
  11.     @Bean  
  12.     public ShiroRealm shiroRealm() {  
  13.         ShiroRealm shiroRealm = new ShiroRealm(getDubboSupport());  
  14.         return shiroRealm;  
  15.     }  
  16. ………………………………………………………………  
  17. ……………………………………………………  
  18. }  

此时,DubboSupport中修改为:

[java] view plain copy
  1. //@Component  
  2. public class DubboSupport {  
  3.   
  4.     @Reference(interfaceName = "com.vocedu.api.sys.AccountService")  
  5.     public static AccountService accountService;  
  6.   
  7.     @Reference(interfaceName = "com.vocedu.api.sys.AuthOauthClientService")  
  8.     public static AuthOauthClientService authOauthClientService;  
  9. ………………………………  
  10. ………………  
  11. }  

ShiroRealm做一下修改

[java] view plain copy
  1. public class ShiroRealm extends AuthorizingRealm{  
  2.   
  3.     //@Autowired  
  4.     private DubboSupport dubboSupport;  
  5.   
  6.     public ShiroRealm(DubboSupport dubboSupport) {  
  7.         this.dubboSupport = dubboSupport;  
  8.     }  
  9. …………………………  
  10. …………………………  
  11. }  
最终启动项目,成功了
上一篇:非常经典动物形状标志


下一篇:hdu 1505 City Game(0和1 中的最大子矩阵)