使用 Java 配置时未定义名为 'springSecurityFilterChain' 的 bean
No bean named 'springSecurityFilterChain' is defined when using Java Config
我在使用 Java 配置获取 Spring MVC 和 Spring 安全性时遇到了一些问题。我正在使用初始化器来执行初始化:
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* Profile the app runs in.
*/
private final String activeProfile = EnvironmentProfiles.DEV;
/**
*
* @return
*/
@Override
protected Class<?>[] getRootConfigClasses() {
if (this.activeProfile.equals(EnvironmentProfiles.PRODUCTION)) {
return new Class[]{ProductionMainConfig.class};
} else {
return new Class[]{DevMainConfig.class};
}
}
/**
*
* @return
*/
@Override
protected Class<?>[] getServletConfigClasses() {
if (this.activeProfile.equals(EnvironmentProfiles.PRODUCTION)) {
return new Class[]{ProductionWebMvcConfig.class};
} else {
return new Class[]{DevWebMvcConfig.class};
}
}
/**
*
* @return
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
servletContext.setInitParameter("spring.active.profile", this.activeProfile);
}
在 AppInitializer 中,activeProfile 只是一种通过上下文初始化参数设置活动配置文件的方法。
ProductionWebMvcConfig 和 DevWebMvcConfig classes 是扩展 WebMvcConfigurerAdapter 的,其中配置了视图解析器等。
我的 DevMainConfig 和 ProductionMainConfig classes 就像 RootConfiguration classes 包括其他配置 classes.
@Configuration
@Profile(EnvironmentProfiles.DEV)
@Import(value = {
DevDataSourceConfig.class,
DevInfrastructureConfig.class,
DevRepositoryConfig.class,
DevServiceConfig.class,
DevSecurityConfig.class,
DevWebMvcConfig.class
})
@ComponentScan("org.rz.app.conf.spring")
public class DevMainConfig {
/**
* Logger.
*/
private static final Logger LOG = LoggerFactory.getLogger(DevMainConfig.class);
/**
* Application environment.
*/
@Autowired
private Environment env;
/**
* {@inheritDoc}
*/
@PostConstruct
public void initApp() {
if(LOG.isInfoEnabled())
for (String profile : env.getActiveProfiles()) {
LOG.info("Detected Spring profile: {}", profile);
}
}
}
我还有一个扩展 AbstractSecurityWebApplicationInitializer 的 AppSecurityInitializer class。此 class 应该设置 Spring 安全性 "springSecurityFilterChain",因此无需进一步配置。
配置已被 Tomcat 正确检测到,因为它正在打印以下消息进行记录。
Spring WebApplicationInitializers detected on classpath: [org.rz.app.conf.spring.AppSecurityInitializer@71d07e60, org.rz.app.conf.spring.AppInitializer@5a757797]
我没有 web.xml 或任何其他 xml 配置文件,但异常
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSecurityFilterChain' is defined
仍然存在。
有什么想法吗?
谢谢。
好的。解决了。
在另一个 Tomcat 7(相同版本)中重新部署应用程序解决了问题。
我在使用 Java 配置获取 Spring MVC 和 Spring 安全性时遇到了一些问题。我正在使用初始化器来执行初始化:
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* Profile the app runs in.
*/
private final String activeProfile = EnvironmentProfiles.DEV;
/**
*
* @return
*/
@Override
protected Class<?>[] getRootConfigClasses() {
if (this.activeProfile.equals(EnvironmentProfiles.PRODUCTION)) {
return new Class[]{ProductionMainConfig.class};
} else {
return new Class[]{DevMainConfig.class};
}
}
/**
*
* @return
*/
@Override
protected Class<?>[] getServletConfigClasses() {
if (this.activeProfile.equals(EnvironmentProfiles.PRODUCTION)) {
return new Class[]{ProductionWebMvcConfig.class};
} else {
return new Class[]{DevWebMvcConfig.class};
}
}
/**
*
* @return
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
servletContext.setInitParameter("spring.active.profile", this.activeProfile);
}
在 AppInitializer 中,activeProfile 只是一种通过上下文初始化参数设置活动配置文件的方法。
ProductionWebMvcConfig 和 DevWebMvcConfig classes 是扩展 WebMvcConfigurerAdapter 的,其中配置了视图解析器等。
我的 DevMainConfig 和 ProductionMainConfig classes 就像 RootConfiguration classes 包括其他配置 classes.
@Configuration
@Profile(EnvironmentProfiles.DEV)
@Import(value = {
DevDataSourceConfig.class,
DevInfrastructureConfig.class,
DevRepositoryConfig.class,
DevServiceConfig.class,
DevSecurityConfig.class,
DevWebMvcConfig.class
})
@ComponentScan("org.rz.app.conf.spring")
public class DevMainConfig {
/**
* Logger.
*/
private static final Logger LOG = LoggerFactory.getLogger(DevMainConfig.class);
/**
* Application environment.
*/
@Autowired
private Environment env;
/**
* {@inheritDoc}
*/
@PostConstruct
public void initApp() {
if(LOG.isInfoEnabled())
for (String profile : env.getActiveProfiles()) {
LOG.info("Detected Spring profile: {}", profile);
}
}
}
我还有一个扩展 AbstractSecurityWebApplicationInitializer 的 AppSecurityInitializer class。此 class 应该设置 Spring 安全性 "springSecurityFilterChain",因此无需进一步配置。
配置已被 Tomcat 正确检测到,因为它正在打印以下消息进行记录。
Spring WebApplicationInitializers detected on classpath: [org.rz.app.conf.spring.AppSecurityInitializer@71d07e60, org.rz.app.conf.spring.AppInitializer@5a757797]
我没有 web.xml 或任何其他 xml 配置文件,但异常
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSecurityFilterChain' is defined
仍然存在。
有什么想法吗? 谢谢。
好的。解决了。
在另一个 Tomcat 7(相同版本)中重新部署应用程序解决了问题。