springSecurityFilterChain-ObjectPostProcessor是必需的bean异常

时间:2018-11-09 19:37:59

标签: java spring spring-boot spring-security spring-web

我正在使用Spring Security(spring-boot-starter-web和spring-boot-starter-security)构建一个Spring Boot应用程序。我在启动过程中从应用程序收到以下错误:

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is java.lang.IllegalStateException: org.springframework.security.config.annotation.ObjectPostProcessor is a required bean. Ensure you have used @EnableWebSecurity and @Configuration
        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:625) ~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE]
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:455) ~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1288) ~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE]
...

我的应用程序类包含以下内容:

@SpringBootApplication
public class CustomPropertiesApplication {

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

下一个类中的bean似乎是问题所在。如果排除了该应用程序,则该应用程序将启动而不会出错。

@Configuration
@EnableWebSecurity
public class MyConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public CustomPropertyPlaceholderConfigurer propertyConfigurer(ApplicationContext context) {
        return new CustomPropertyPlaceholderConfigurer();
    }

}

现在,这个CustomPropertyPlaceholderConfigurer类什么也不做,我有一些类似的旧类,但是在尝试解决此问题时,我从测试应用程序中消除了其他所有内容。

public class CustomPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
}

我不知道下一步该怎么做。我在Spring Security和Spring Boot中寻找了有关构建自定义属性占位符配置器的详细信息,但我发现没有什么有用的。

版本:Spring Boot-2.1.0.RELEASE | Spring Security-5.1.1。发布| JDK 1.8

此外,我意识到这个应用程序实际上并没有做任何事情,有一个更大的应用程序,它的逻辑更加复杂,这里的示例应用程序只是为了复制我的问题,以减小堆栈溢出量。

1 个答案:

答案 0 :(得分:0)

我现在看到答案在输出日志中是正确的,而我只是看不到它。

o.s.c.a.ConfigurationClassEnhancer:@Bean方法 MyConfig.propertyConfigurer是非静态的,并返回可分配给Spring的BeanFactoryPostProcessor接口的对象。这将导致无法在方法的声明@Configuration类中处理诸如@ Autowired,@ Resource和@PostConstruct之类的注释。在此方法中添加“静态”修饰符可避免这些容器生命周期问题;有关完整的详细信息,请参见@Bean javadoc。

向我的bean添加静态功能解决了该问题。