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. }  
最终启动项目,成功了
相关文章
|
5月前
|
Java Spring
Spring boot 运行服务jar外配置配置文件方式总结
Spring boot 运行服务jar外配置配置文件方式总结
974 0
|
1月前
|
Java 数据库连接 数据库
springboot启动配置文件-bootstrap.yml常用基本配置
以上是一些常用的基本配置项,在实际应用中可能会根据需求有所变化。通过合理配置 `bootstrap.yml`文件,可以确保应用程序在启动阶段加载正确的配置,并顺利启动运行。
188 2
|
1月前
|
Dubbo Java 应用服务中间件
深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案
本文深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案。通过检查GraalVM版本兼容性、配置反射列表、使用代理类、检查配置文件、禁用不支持的功能、查看日志文件、使用GraalVM诊断工具和调整GraalVM配置等步骤,帮助开发者快速定位并解决问题,确保服务的正常运行。
54 1
|
1月前
|
Java Spring 容器
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
127 3
|
2月前
|
Java 测试技术 Spring
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
这篇文章介绍了Spring Boot中配置文件的语法、如何读取配置文件以及如何通过静态工具类读取配置文件。
185 0
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
|
2月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
176 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
3月前
|
消息中间件 NoSQL 安全
(转)Spring Boot加载 不同位置的 application.properties配置文件顺序规则
这篇文章介绍了Spring Boot加载配置文件的顺序规则,包括不同位置的application.properties文件的加载优先级,以及如何通过命令行参数或环境变量来指定配置文件的名称和位置。
115 0
|
4月前
|
Dubbo Java Nacos
【实战攻略】破解Dubbo+Nacos+Spring Boot 3 Native打包后运行异常的终极秘籍——从零开始彻底攻克那些让你头疼不已的技术难题!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但使用Dubbo+Nacos+Spring Boot 3进行GraalVM native打包后常遇运行异常。本文剖析此问题及其解决策略:确认GraalVM版本兼容性;配置反射列表以支持必要类和方法;采用静态代理替代动态代理;检查并调整配置文件;禁用不支持的功能;利用日志和GraalVM诊断工具定位问题;根据诊断结果调整GraalVM配置。通过系统排查方法,能有效解决此类问题,确保服务稳定运行。
116 0
|
4月前
|
Java 测试技术 Spring
Java SpringBoot 加载 yml 配置文件中字典项
Java SpringBoot 加载 yml 配置文件中字典项
51 0
|
5月前
|
XML Java 关系型数据库
Action:Consider the following: If you want an embedde ,springBoot配置数据库,补全springBoot的xml和mysql配置信息就好了
Action:Consider the following: If you want an embedde ,springBoot配置数据库,补全springBoot的xml和mysql配置信息就好了