天天看点

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.     @Value("${dubbo.application.name}")  
  7.     private String applicationName;  
  8.      * 应用版本号 
  9.     @Value("${dubbo.application.version}")  
  10.     private String applicationVersion;  
  11.      * 组织 
  12.     @Value("${dubbo.application.organization}")  
  13.     private String organization;  
  14.      * 负责人 
  15.     @Value("${dubbo.application.owner}")  
  16.     private String owner;  
  17.      * 注册中心地址 
  18.     @Value("${dubbo.registry.address}")  
  19.     private String registryAddress;  
  20.      * 缓存文件地址 
  21.     @Value("${dubbo.registry.file}")  
  22.     private String registryFile;  
  23.      * dubbo协议端口号 
  24.     @Value("${dubbo.protocol.port}")  
  25.     private Integer protocolPort;  
  26.      * 应用相关配置 
  27.      * 
  28.      * @return 
  29.     @Bean  
  30.     public ApplicationConfig applicationConfig() {  
  31.         ApplicationConfig applicationConfig = new ApplicationConfig();  
  32.         applicationConfig.setName(applicationName);  
  33.         applicationConfig.setVersion(applicationVersion);  
  34.         applicationConfig.setOrganization(organization);  
  35.         applicationConfig.setOwner(owner);  
  36.         return applicationConfig;  
  37.     }  
  38.      * 注册中心配置 
  39.      * 基于zookeeper 
  40.     public RegistryConfig registryConfig() {  
  41.         RegistryConfig registryConfig = new RegistryConfig();  
  42.         registryConfig.setProtocol("zookeeper");  
  43.         registryConfig.setAddress(registryAddress);  
  44.         registryConfig.setFile(registryFile);  
  45.         registryConfig.setTimeout(30000);  
  46.         return registryConfig;  
  47.      * 协议配置 
  48.      * 基于dubbo 
  49.     public ProtocolConfig protocolConfig() {  
  50.         ProtocolConfig protocolConfig = new ProtocolConfig();  
  51.         protocolConfig.setName("dubbo");  
  52.         protocolConfig.setPort(protocolPort);  
  53.         return protocolConfig;  
  54.      * 监控配置 
  55.      * 监控的地址从注册中心中找 
  56.     public MonitorConfig monitorConfig() {  
  57.         MonitorConfig monitorConfig = new MonitorConfig();  
  58.         monitorConfig.setProtocol("registry");  
  59.         return monitorConfig;  
  60.      * 设置dubbo扫描包 
  61.     public static AnnotationBean annotationBean() {  
  62.         AnnotationBean annotationBean = new AnnotationBean();  
  63.         annotationBean.setPackage("com.vocedu.web.service.dubbo");  
  64.         return annotationBean;  
  65.      * 提供者配置 
  66.     @Bean(name = "defaultProvider")  
  67.     @ConditionalOnClass(Exporter.class)  
  68.     public ProviderConfig providerConfig() {  
  69.         ProviderConfig providerConfig = new ProviderConfig();  
  70.         providerConfig.setApplication(applicationConfig());  
  71.         providerConfig.setProtocol(protocolConfig());  
  72.         providerConfig.setRegistry(registryConfig());  
  73.         providerConfig.setMonitor(monitorConfig());  
  74.         providerConfig.setTimeout(30000);  
  75.         providerConfig.setRetries(0);  
  76.         providerConfig.setDelay(30000);  
  77.         return providerConfig;  
  78.      * 消费者配置 
  79.     @Bean(name = "defaultConsumer")  
  80.     @ConditionalOnClass(Invoker.class)  
  81.     public ConsumerConfig consumerConfig() {  
  82.         ConsumerConfig consumerConfig = new ConsumerConfig();  
  83.         consumerConfig.setApplication(applicationConfig());  
  84.         consumerConfig.setRegistry(registryConfig());  
  85.         consumerConfig.setMonitor(monitorConfig());  
  86.         consumerConfig.setCheck(false);  
  87.         consumerConfig.setTimeout(60000);  
  88.         consumerConfig.setRetries(0);  
  89.         return consumerConfig;  
  90. }  

DubboSupport部分代码:

  1. @Component  
  2. public class DubboSupport {  
  3.     @Reference(interfaceName = "com.vocedu.api.sys.AccountService")  
  4.     public AccountService accountService;  
  5.     @Reference(interfaceName = "com.vocedu.api.sys.AuthOauthClientService")  
  6.     public AuthOauthClientService authOauthClientService;  

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

  1. @Autowired  
  2. private DubboSupport dubboSupport;  

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

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

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

  1. public class ShiroConfiguration {  
  2.     public static DubboSupport getDubboSupport() {  
  3.         DubboSupport dubboSupport = new DubboSupport();  
  4.         return dubboSupport;  
  5.     //将自己的验证方式加入容器  
  6.     public ShiroRealm shiroRealm() {  
  7.         ShiroRealm shiroRealm = new ShiroRealm(getDubboSupport());  
  8.         return shiroRealm;  
  9. ………………………………………………………………  
  10. ……………………………………………………  

此时,DubboSupport中修改为:

  1. //@Component  
  2.     public static AccountService accountService;  
  3.     public static AuthOauthClientService authOauthClientService;  
  4. ………………………………  
  5. ………………  

ShiroRealm做一下修改

  1. public class ShiroRealm extends AuthorizingRealm{  
  2.     //@Autowired  
  3.     private DubboSupport dubboSupport;  
  4.     public ShiroRealm(DubboSupport dubboSupport) {  
  5.         this.dubboSupport = dubboSupport;  
  6. …………………………  

最终启动项目,成功了