springboot: shiro injecting dubbo service null pointer

Problem description

When the springboot+dubbo+shiro microservice is set up recently, in the custom shiro's realm component:

@Component
public class AuthRealm extends AuthorizingRealm {
    @Reference
    private AccountService accountService;

A null pointer exception occurred while calling dubbo service accountService.

Problem reason

dubbo's @ Reference mechanism is injected into spring beans after all the spring beans are registered.
shiro's authRealm call code:

    @Autowired
    private AuthRealm authRealm;

    @Bean
    public SessionsSecurityManager securityManager(){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(authRealm);
        return securityManager;
    }

In the code, we can see that when registering the security manager bean, the authRealm will be assigned to the security manager, but the accountService has not yet been injected into the authRealm, so the accountService field in the authRealm property of the security manager is null.

Solution

When assigning authRealm to security manager, manually inject accountService into authRealm.

@Component
public class AuthRealm extends AuthorizingRealm {

    private AccountService accountService;
    
    @Autowired
    private DubboProperties properties;

    ...

    /**
     * Manual injection of dubbo service
     */
    public void setAccountService() {
        ReferenceConfig<AccountService> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setApplication(properties.getApplication());
        referenceConfig.setRegistry(properties.getRegistry());
        referenceConfig.setInterface(AccountService.class);
        this.accountService = referenceConfig.get();
    }
}

@Configuration
public class ShiroConfig {

    @Autowired
    private AuthRealm authRealm;

    @Bean
    public SessionsSecurityManager securityManager(){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        authRealm.setAccountService();
        securityManager.setRealm(authRealm);
        return securityManager;
    }
    ...
}

Project source code: https://github.com/ksyzz/spri...

Tags: Java Dubbo Shiro Spring SpringBoot

Posted on Tue, 03 Dec 2019 14:52:52 -0500 by brauchi