2017-02-27 157 views
0

我有一个属性的类配置属性为空春季启动

@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值使用

applicationContext.getBean(ShiroProperties.class) 

我的应用等级:

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

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

+0

我不知道,但我觉得你应该加上'@ Component'为'ShiroProperties'(按[春季启动外部配置文件](HTTPS ://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html)) –

+0

我看到之前,我试过了,但它没有工作。无论如何,谢谢 – Dean

+0

我发现这个奇怪问题的原因,如果添加由'@ Bean'注释的'LifecycleBeanPostProcessor',那么'@ Autowired'不起作用。 'LifecycleBeanPostProcessor'类来自shiro。 – Dean

回答

0

您可以尝试在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; 
} 
+0

谢谢,它不工作,添加''@ Component''会抛出NoUniqueBeanDefinitionException,换句话说''ConfigurationProperties''已经在Spring Context中创建bean – Dean

+0

尝试移除applicationContext.getBean(ShiroProperties.class); – mhshimul

0

这是为你的应用的另一个配置类应@Configuration注释加以装饰,使一个bean创建和注入的背景下从另一个类布线。

+0

对不起,我不明白你的意思 – Dean

+0

对不起,不清楚。我的意思是把你的班级更新为'@Configuration @ConfigurationProperties(prefix = ShiroProperties.SHIRO_PREFIX) public class ShiroProperties {0} {0} public static final String SHIRO_PREFIX =“shiro”; private String urlLogin; 私人字符串urlSuccessed;' –

0

我遇到了同样的问题作为@Dean说,我做的就是把LifecycleBeanPostProcessor豆是另一种配置类,而在另一个配置类配置其他四郎,见下面的例子:

@Configuration 
public class ShiroLifecycleBeanPostProcessorConfig { 

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

} 

主要四郎配置分类:

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

希望这段代码能帮助你,谢谢。

+0

嗨,感谢您的解决方案,我已经将框架更改为Spring Security,并且我知道实际问题是什么,具有@Autowired的属性将成功注入,如果使用public而不是private – Dean

0

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

  1. ApplicationContextAwareProcessor
  2. ApplicationListenerDetector
  3. ConfigurationClassPostProcessor $ ImportAwareBeanPostProcessor
  4. PostProcessorRegistrationDelegate $ BeanPostProcessorChecker
  5. CommonAnnotationBeanPostProcessor会

是指你的配置bean时,你的bean将不会被自动装配p未加载由于AutowiredAnnotationBeanPostProcessor而创建之后的roperties。

例如,属性为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; 
    } 
    } 
}