2014-09-09 2 views
0

내 응용 프로그램에서 모든 스프링 응용 프로그램 컨텍스트를 일반적인 방식으로 구성하려고합니다.
나는 ConcretteDSConfiguration 같은IllegalArgumentException : 가져 오기 클래스에 @EnableTransactionManagement가 없습니다.

@Configuration 
@EnableTransactionManagement 
public class GeneralDSConfiguration implements InitializingBean { 

    private String databaseURL; 
    private String databaseUserName; 
    private String databasePassword; 

    public GeneralDSConfiguration(String databaseURL, String databaseUserName, String databasePassword) { 
     this.databaseURL = databaseURL; 
     this.databaseUserName = databaseUserName; 
     this.databasePassword = databasePassword; 
    } 

    @Override 
    public void afterPropertiesSet() throws Exception { 
     Assert.hasText(databaseURL); 
    } 

    @Bean 
    public DataSource dataSource() { 
     BasicDataSource ds = new BasicDataSource(); 
     ds.setDriverClassName("org.postgresql.Driver"); 
     ds.setAccessToUnderlyingConnectionAllowed(true); 
     ds.setUrl(databaseURL); 
     ds.setUsername(databaseUserName); 
     ds.setPassword(databasePassword); 

     return ds; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager(DataSource dataSource) { 
     return new DataSourceTransactionManager(dataSource); 
    } 
    } 

여러 개의 클래스는 애플리케이션 컨텍스트를 구축하는 데 사용되는 일반적인 구성을하다 GeneralDSConfiguration 클래스가 있습니다. 내가 new AnnotationConfigApplicationContext(ConcretteDSConfiguration.class)와 애플리케이션 컨텍스트를로드 할 때

@Configuration 
public class ConcretteDSConfiguration extends GeneralDSConfiguration { 

    public ConcretteDSConfiguration() { 
     super("jdbc:postgresql://localhost/database", "postgres", ""); 
    } 
} 

는, IllegalArgumentException가 슬로우됩니다 내가 ConcretteDSConfiguration 클래스에 @EnableTransactionManagement 주석을 넣으면 때문에

Exception in thread "main" java.lang.IllegalArgumentException: @EnableTransactionManagement is not present on importing class 'foo.bar.ConcretteDSConfiguration' as expected 
    at org.springframework.util.Assert.notNull(Assert.java:112) 
    at org.springframework.context.annotation.AdviceModeImportSelector.selectImports(AdviceModeImportSelector.java:72) 
    at org.springframework.context.annotation.ConfigurationClassParser.processImport(ConfigurationClassParser.java:328) 
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:232) 
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:153) 
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:139) 
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:282) 
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:223) 
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:630) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461) 
    at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:73) 

그것은 모든 상속 함께 definitelly의 모든 것이 잘 작동 . 하지만 일반 구성을 작성하는 방법을 찾으려고하고 모든 구성 클래스에이 주석을 넣고 싶지 않습니다.

제안 사항이 있으십니까?

답변

0

@EnableTransactionManagement@Inherited이 아니기 때문에 작동하지 않습니다.

어쨌든 @Enable... 주석을 사용자의 @Configuration에 배치하는 것만으로 충분하므로 모델을 검토하고 여러 구성 클래스로 분할하여이를 사용하여 AnnotationConfigApplicationContext을 빌드 할 수 있습니다.

모든 상속인이 같은 콩을 채우므로 하나의 bean이 다른 bean을 대체 할 때 문제가 발생하기 때문에 상속에 대한 좋은 해결책을 얻는 방법이 명확하지 않습니다. dataSource(), transactionManager() 등 ...

각 대상 컨텍스트마다 @PropertySource이 다른 데이터베이스 등록 정보를 채우고 GeneralDSConfiguration@EnableTransactionManagement 및 해당 빈을 채우십시오.