spring 没有定义名为 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' 的 bean
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/23579561/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' is defined
提问by Mahmoud Saleh
i am trying to run full package of junit test classes, and i have an audit classes for my domain classes as follows:
我正在尝试运行完整的 junit 测试类包,并且我的域类有一个审计类,如下所示:
@PrePersist
public void prePersist(AuditableEntity e) {
UserService userService = SpringBeanFactory.getBean(UserService.class);
// some auditing here
}
- SpringBeanFactory class:
- SpringBeanFactory 类:
public class SpringBeanFactory {
private static ApplicationContext applicationContext;
public static <T> T getBean(final String name, final Class<T> requiredType) {
T bean = null;
if (applicationContext != null) {
bean = applicationContext.getBean(name, requiredType);
}
return bean;
}
public static <T> T getBean(final Class<T> requiredType) {
T bean = null;
if (applicationContext != null) {
bean = applicationContext.getBean(requiredType);
}
return bean;
}
public static void setApplicationContext(final ApplicationContext applicationContext) {
if (SpringBeanFactory.applicationContext == null) {
SpringBeanFactory.applicationContext = applicationContext;
}
}
}
-Test class config:
- 测试类配置:
@Autowired
private ApplicationContext applicationContext;
@Before
public void before() throws Exception {
SpringBeanFactory.setApplicationContext(applicationContext);
}
-SpringTestingConfig class:
-SpringTestingConfig 类:
@Configuration
@ComponentScan(basePackages = "com.myapp.data", excludeFilters = { @Filter(Configuration.class) })
@PropertySource("classpath:/test.properties")
@Profile("test")
public class SpringTestingConfig {
private static Logger log = (Logger)LoggerFactory.getLogger(SpringTestingConfig.class);
@Autowired
private ApplicationContext applicationContext;
@Bean
public DataSource XdataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
if(log.isDebugEnabled()) log.debug("profile.name", "test");
System.setProperty("profile.name", "test");
dataSource.setDriverClassName("org.h2.Driver");
String schemaName = ConfigurationUtil.config().getString("db.schema.name").toLowerCase();
log.debug("SCHEMA IS " + schemaName);
String url = "jdbc:h2:mem:test;MODE=Mysql;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE SCHEMA IF NOT EXISTS " +schemaName +"\;" + "SET SCHEMA "+schemaName;
dataSource.setUrl(url);
//dataSource.setUrl("jdbc:h2:mem:test;MODE=Mysql;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE SCHEMA IF NOT EXISTS " + schemaName);
dataSource.setUsername("sa");
//use your own local mysql in tests here...
// dataSource.setDriverClassName("com.mysql.jdbc.Driver");
// dataSource.setUrl("jdbc:mysql://localhost:3306/mv_tests?characterEncoding=UTF-8");
// dataSource.setUsername("tomcat");
// dataSource.setPassword("tomcat");
//
return dataSource;
}
@Bean
public DataSource dataSource() {
SpringBeanFactory.setApplicationContext(applicationContext);
LoggerUtils.setAllApplicationLogs("DEBUG");
DriverManagerDataSource dataSource = new DriverManagerDataSource();
if(log.isDebugEnabled()) {
log.debug("profile.name", "test");
}
System.setProperty("profile.name", "test");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
String schemaName = ConfigurationUtil.config().getString("db.schema.name");
String username = ConfigurationUtil.config().getString("db.username");
String password = ConfigurationUtil.config().getString("db.password");
if( log.isDebugEnabled() ) {
log.debug( "SCHEMA IS " + schemaName );
log.debug( "Username IS " + username );
log.debug( "Password IS " + password );
}
dataSource.setUrl("jdbc:mysql://localhost:3306/"+schemaName);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
-Test class annotations:
- 测试类注释:
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({ WebContextTestExecutionListener.class, DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class, TransactionalTestExecutionListener.class })
@ActiveProfiles("test")
@DirtiesContext
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = { SpringConfig.class, SpringTestingConfig.class, SpringLocalContainerJPAConfig.class, CustomConfiguration.class })
@Transactional
when my test method tries to save an entity, it makes call to PrePersist method which in turn makes call to the getting spring service:
当我的测试方法尝试保存实体时,它会调用 PrePersist 方法,该方法又会调用获取 spring 服务:
UserService userService = SpringBeanFactory.getBean(UserService.class);
which in turns produces the following exception:
这反过来会产生以下异常:
Error creating bean with name 'userService':
Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException:
Could not autowire field: private com.motivosity.data.repository.UserRepository com.motivosity.service.impl.UserServiceImpl.userRepository;
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepositoryImpl':
Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'springLocalContainerJPAConfig': Injection of autowired dependencies failed;
nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field:
javax.sql.DataSource com.motivosity.data.config.SpringLocalContainerJPAConfig.dataSource;
nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'springTestingConfig': Initialization of bean failed;
nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'org.springframework.cache.annotation.ProxyCachingConfiguration':
Initialization of bean failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' is defined
i have to mention that this exception occurs when running full package of test classes, but when running this test class separately no exception is produced.
我不得不提的是,在运行完整的测试类包时会发生此异常,但在单独运行此测试类时不会产生异常。
BTW, i am using spring 3.2.3.RELEASE
顺便说一句,我正在使用spring 3.2.3.RELEASE
UPDATE:when i upgraded the spring version to latest release 4.0.3, i am getting a new exception on the same get UserService line:
更新:当我将 spring 版本升级到最新版本 4.0.3 时,我在同一 get UserService 行上收到一个新异常:
org.springframework.context.support.GenericApplicationContext@3aa54263 has been closed already
please advise how to fix this exception.
请告知如何解决此异常。
采纳答案by Sam Brannen
When you annotate a test class or test method with @DirtiesContext
, you are telling Spring to closethe ApplicationContext
after that test class or method. Thus, if you later attempt to retrieve a bean from a closed context you will get an exception like you're seeing.
当你注释测试类或测试方法有@DirtiesContext
,你告诉Spring来关闭了ApplicationContext
该测试类或方法之后。因此,如果您稍后尝试从关闭的上下文中检索 bean,您将得到一个您所看到的异常。
My guess is that you are using @DirtiesContext
in other test classes within your test suite, and a result the logic in SpringBeanFactory.setApplicationContext()
is broken since it can potentially maintain a reference to a closed context. Thus, you'll need allow the currentApplicationContext
to be set for each test. In other words, remove the null
-check like follows
我的猜测是您正在@DirtiesContext
测试套件中的其他测试类中使用,结果逻辑SpringBeanFactory.setApplicationContext()
被破坏,因为它可能维护对封闭上下文的引用。因此,您需要允许为每个测试设置电流ApplicationContext
。换句话说,删除null
-check 如下
public static void setApplicationContext(final ApplicationContext applicationContext) {
// always set the current context
SpringBeanFactory.applicationContext = applicationContext;
}
Hope this helps!
希望这可以帮助!
- Sam (author of the Spring TestContext Framework)
- Sam(Spring TestContext 框架的作者)