在Spring Boot中@Autowired的配置属性为null

在Spring Boot中@Autowired的配置属性为null

问题描述:

我有一个属性类

@ConfigurationProperties(prefix = ShiroProperties.SHIRO_PREFIX)
public class ShiroProperties {
  public static final String SHIRO_PREFIX = "shiro";

  private String urlLogin;
  private String urlSuccessed;

和一个配置类

@Configuration
@EnableConfigurationProperties({ ShiroProperties.class })
public class ShiroConfig implements ApplicationContextAware {

  ApplicationContext applicationContext;
  @Autowired
  private ShiroProperties shiroProperties ;

shiroProperties为空,但我可以在使用的ShiroConfig中找到它的值

shiroProperties is null, but i can find it value in ShiroConfig used

applicationContext.getBean(ShiroProperties.class)

我的应用程序类:

@SpringBootApplication
public class Bootstrap {
  public static void main(String[] args) {
    SpringApplication.run(Bootstrap.class, args);
  }
}

太奇怪了,我可以在其他项目中使用类似的代码来成功运行,但是.

So weird, i can run success with similar code in other project, but this.

我遇到了与@Dean所说的相同的问题,我所做的是将LifecycleBeanPostProcessor bean是另一个配置类,并在另一个配置类中配置其他Shiro ,请参见以下示例:

I met this same issue as @Dean said,I had done is put the LifecycleBeanPostProcessor bean is another configure class ,and configure other Shiro in another configuration class ,see below example:

@Configuration
public class ShiroLifecycleBeanPostProcessorConfig {

    /**
     * 
     * 
     * @return
     */
    @Bean(name = "lifecycleBeanPostProcessor")
    public LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
        return new LifecycleBeanPostProcessor();
    }

}

主要的Shiro配置类:

The main Shiro Configuration class:

@Configuration
@AutoConfigureAfter(value = ShiroLifecycleBeanPostProcessorConfig.class)
public class ShiroConfiguration {

    public static final String cacheFile = "encache.xml";
    private static final String active_cache_name = "activeSessionCache";

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 
     * 
     * @throws UnknownHostException
     */
    @Bean(name = "shiroFilter")
    @ConditionalOnMissingBean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager)
            throws UnknownHostException {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

        shiroFilterFactoryBean.setSecurityManager(securityManager);

        shiroFilterFactoryBean.setLoginUrl(ShiroSecurityUrls.LOGIN_PAGE);
        // shiroFilterFactoryBean.setSuccessUrl(ShiroSecurityUrls.LOGIN_SUCCESS_URL);
        shiroFilterFactoryBean.setUnauthorizedUrl("/error");

        Map<String, Filter> filters = new LinkedHashMap<String, Filter>();
        LogoutFilter logoutFilter = new LogoutFilter();
        logoutFilter.setRedirectUrl(ShiroSecurityUrls.LOGIN_PAGE);
        filters.put(DefaultFilter.logout.name(), logoutFilter);
        shiroFilterFactoryBean.setFilters(filters);

        Map<String, String> filterChainDefinitionManager = new LinkedHashMap<String, String>();

        filterChainDefinitionManager.put("/static/**", DefaultFilter.anon.name());
        filterChainDefinitionManager.put("/node_modules/**", DefaultFilter.anon.name());
        filterChainDefinitionManager.put("/pages/**", DefaultFilter.anon.name());

        filterChainDefinitionManager.put(ShiroSecurityUrls.LOGIN_PAGE, DefaultFilter.anon.name());
        filterChainDefinitionManager.put(ShiroSecurityUrls.LOGOUT_URL, DefaultFilter.logout.name());
        filterChainDefinitionManager.put(ShiroSecurityUrls.REGISTER_PROCESS_URL, DefaultFilter.anon.name());
        filterChainDefinitionManager.put("/**", DefaultFilter.user.name());

        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionManager);

        return shiroFilterFactoryBean;
    }

    /**
     * 
     * 
     * @throws UnknownHostException
     */
    @Bean(name = "securityManager")
    @DependsOn(value = { "ehCacheManager", "rememberMeManager", "sessionManager", "credentialsMatcher" })
    public DefaultWebSecurityManager securityManager(EhCacheManager ehCacheManager, RememberMeManager rememberMeManager,
            SessionManager sessionManager, CredentialsMatcher credentialsMatcher) throws UnknownHostException {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 1. Cache Support
        securityManager.setCacheManager(ehCacheManager);
        // 2. Session Support,inject the cacheManager from securitymanager
        securityManager.setSessionManager(sessionManager);
        // 3. Rememberme Support
        securityManager.setRememberMeManager(rememberMeManager);

        // 4. JDBC,LDAP Realm implements
        Collection<Realm> authorizingRealms = Lists.newArrayList(shiroDatabaseRealm(credentialsMatcher),
                shiroActiveDirectoryRealm(credentialsMatcher));
        securityManager.setRealms(authorizingRealms); // inject the cacheManager
                                                        // from securitymanager
        if (securityManager.getAuthenticator() instanceof ModularRealmAuthenticator) {
            ModularRealmAuthenticator modularRealmAuthenticator = (ModularRealmAuthenticator) securityManager
                    .getAuthenticator();
            modularRealmAuthenticator.setAuthenticationStrategy(new FirstSuccessfulStrategy());
        }

        return securityManager;
    }
}

希望此代码对您有所帮助.

Hope this code helps you ,thanks.