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

时间:2017-02-27 11:16:01

标签: java spring spring-boot

我有一个属性类

@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为null,但我可以在ShiroConfig中找到它的值

applicationContext.getBean(ShiroProperties.class)

我的应用类:

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

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

5 个答案:

答案 0 :(得分:0)

这是应用程序的另一个配置类,应该使用@Configuration注释进行修饰,以便创建bean并将其注入上下文,以便从另一个类进行连接。

答案 1 :(得分:0)

我遇到了同样的问题,因为@Dean说,我做的是把LifecycleBeanPostProcessor bean放到另一个配置类,并在另一个配置类中配置其他Shiro,见下面的例子:

@Configuration
public class ShiroLifecycleBeanPostProcessorConfig {

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

}

主要的Shiro配置类:

@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;
    }
}

希望这段代码对你有所帮助,谢谢。

答案 2 :(得分:0)

通常, AutowiredAnnotationBeanPostProcessor 在Spring加载FactoryBean类的阶段设置由@Autowired注释的此类属性。如果是以下工厂bean:

  1. ApplicationContextAwareProcessor
  2. ApplicationListenerDetector
  3. ConfigurationClassPostProcessor $ ImportAwareBeanPostProcessor
  4. PostProcessorRegistrationDelegate $ BeanPostProcessorChecker
  5. CommonAnnotationBeanPostProcessor会
  6. 引用您的配置bean,由于未加载AutowiredAnnotationBeanPostProcessor,您的bean在创建后将不会是自动装配的属性。

    例如,properties为null并抛出NullPointerException

    @Component
    public class BeanFactoryTest {
    
    @Autowired
    private IdGenProperties properties;
    
    @Bean
    public SnowflakeServer snowflakeServer() {
        System.out.println(properties.getBaseUrl());
        return null;
    }
    
    @Bean(name = "conversionService")
    public ConversionServiceFactoryBean getConversionService() {
        ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();
        Set<Converter> converters = new HashSet<>();
        converters.add(new StringToDateConverter());
        bean.setConverters(converters);
        return bean;
    }
    
    public static class StringToDateConverter implements Converter<String, Date> 
    {
        public Date convert(String source) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            try {
                return sdf.parse(source);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return null;
        }
       }
    }
    

答案 3 :(得分:0)

springBootVersion ='2.0.4.RELEASE'中的相同问题

更新为springBootVersion ='2.1.0.RELEASE'

解决

答案 4 :(得分:-1)

尝试在ShiroProperties.class中添加@Component

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

  private String urlLogin;
  private String urlSuccessed;
}