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. }  
最终启动项目,成功了
相关文章
|
21天前
|
XML Java 数据格式
Spring从入门到入土(xml配置文件的基础使用方式)
本文详细介绍了Spring框架中XML配置文件的使用方法,包括读取配置文件、创建带参数的构造对象、使用工厂方法和静态方法创建对象、对象生命周期管理以及单例和多例模式的测试。
64 7
Spring从入门到入土(xml配置文件的基础使用方式)
|
2月前
|
安全 Java Apache
SpringBoot+Shiro(一)
SpringBoot+Shiro(一)
|
19天前
|
安全 Java 数据库
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
这篇文章是关于Apache Shiro权限管理框架的详细学习指南,涵盖了Shiro的基本概念、认证与授权流程,并通过Spring Boot测试模块演示了Shiro在单应用环境下的使用,包括与IniRealm、JdbcRealm的集成以及自定义Realm的实现。
31 3
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
|
26天前
|
Java API Apache
Springboot+shiro,完整教程,带你学会shiro
这篇文章提供了一个完整的Apache Shiro与Spring Boot结合使用的教程,包括Shiro的配置、使用以及在非Web和Web环境中进行身份验证和授权的示例。
49 2
Springboot+shiro,完整教程,带你学会shiro
|
26天前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
182 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
17天前
|
XML Java 应用服务中间件
tomcat学习一:tomcat 目录及配置文件学习 server.xml 等
这篇文章是关于Apache Tomcat服务器的目录结构、配置文件(特别是server.xml)的详细介绍和学习指南。
44 0
tomcat学习一:tomcat 目录及配置文件学习 server.xml 等
|
19天前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
31 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
19天前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
21 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
25天前
|
XML 存储 JSON
framework 的配置文件在.netcore里面不能用怎么处理?在.netcore中创建.xml配置文件
framework 的配置文件在.netcore里面不能用怎么处理?在.netcore中创建.xml配置文件
24 0
|
27天前
|
安全 内存技术
【文件上传-配置文件】crossdomain.xml跨域策略配置文件上传
【文件上传-配置文件】crossdomain.xml跨域策略配置文件上传