2013-07-16 2 views
2

프로젝트 마녀에서 작동하는 두 개의 데이터 소스가 있습니다. securityDataSource를 삽입하려면 spring이 defaultDataSource를 대신 삽입합니다.복수 데이터 소스 설정

applicationContext.xml :

<bean id="defaultDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName"> 
     <value>${default.jndi.datasource.name}</value> 
    </property> 
</bean> 

<bean id="securityDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName"> 
     <value>${security.jndi.datasource.name}</value> 
    </property> 
</bean> 

세터 : 보안과 기본 데이터 소스에 대한 (분명하지만 아무것도 차단되지 않음)

@Required 
@Resource 
public void setSecurityDataSource(DataSource securityDataSource) { 
    jdbcTemplate = new JdbcTemplate(securityDataSource); 
} 

서버 로그이 :

10:28:23.912 [INFO ] o.s.w.c.s.XmlWebApplicationContext - Bean 'defaultDataSource' of type [class org.springframework.jndi.JndiObjectFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 
10:28:24.345 [INFO ] o.s.w.c.s.XmlWebApplicationContext - Bean 'defaultDataSource' of type [class org.apache.commons.dbcp.BasicDataSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 
10:28:24.922 [INFO ] o.s.w.c.s.XmlWebApplicationContext - Bean 'securityDataSource' of type [class org.springframework.jndi.JndiObjectFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 
10:28:25.444 [INFO ] o.s.w.c.s.XmlWebApplicationContext - Bean 'securityDataSource' of type [class org.apache.commons.dbcp.BasicDataSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 

스택 추적은 코드의 아무 곳에 나 표시되지 않습니다.

내가하려고하면 :

private SecurityUserDTO retrieve(String userLogin) { 
    return jdbcTemplate.query("SELECT * FROM users WHERE username = ?", with(userLogin), new UserExtractor()); 
} 
는 (예 : 테이블을 가지고 있지 않는) 기본 데이터베이스에서 찾기 때문

최대 절전 모드 실 거예요, 데이터베이스 보안에 저장된 테이블 사용자를 찾을 수

HTTP Status 401 - PreparedStatementCallback; bad SQL grammar [SELECT * FROM users WHERE username = ?]; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'condor.users' doesn't exist 

내가 주입과 이름 securityDataSource 제공하려고하는 경우 :

@Required 
@Resource(name="securityDataSource") 
public void setSecurityDataSource(DataSource securityDataSource) { 
    jdbcTemplate = new JdbcTemplate(securityDataSource); 
} 

가 나는 얻을 것이다 stackTrace :

12:17:48.557 [ERROR] o.s.w.c.ContextLoader - Context initialization failed 
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'securityDataSource' is defined 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:529) ~[spring-beans-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1095) ~[spring-beans-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:277) ~[spring-beans-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:442) ~[spring-context-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:416) ~[spring-context-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:549) ~[spring-context-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:159) ~[spring-beans-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) ~[spring-beans-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:303) ~[spring-context-3.1.1.RELEASE.jar:3.1.1.RELEASE] 
Wrapped by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'accountService': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'securityDataSource' is defined 

그러나 bean securityDataSource는 실제로 존재하며 컨텍스트에서 봄에 의해 인스턴스화되었습니다.

감사합니다. 감사합니다.

+0

런타임시 스프링 컨텍스트가 하나만 있는지 확인하십시오. 문제는 여러 컨텍스트가있을 수 있습니다. 데이터 소스는 하나에서 선언되고 다른 데이터 소스에 주입됩니다. 두 개의 컨텍스트가있는 상황의 예 : Spring MVC를 사용하는 경우 일반적으로 응용 프로그램 bean (서비스, DAO 등)에 대한 하나의 컨텍스트와 Spring MVC 컨트롤러에 대한 하나의 컨텍스트가 있습니다. –

+0

"BeanPostProcessors"경고가있는 항목이 두 개 표시되는 이유는 무엇입니까? BasicDataSource 라인이 아닌 JndiObjectFactoryBean 라인만을 볼 것으로 예상됩니다. 또한 앱을 두 항목 중 하나만 사용하도록 설정할 수 있습니까? – enl8enmentnow

답변

0

실제로 내 defaultDataSource bean은 applicationContext.xml에 선언되었지만 securityDataSource bean은 contextContfigLocation에 의해 web.xml에서 찾아보기 위해 선언되지 않았지만 applicationContext-security.xml에있었습니다.

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
</context-param> 

하려면 : 다음은 변경된 샘플 코드입니다

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext.xml, /WEB-INF/applicationContext-security.xml</param-value> 
</context-param> 

와 그것을 작동합니다! 다른 컨텍스트에 속한 것으로 보이는 securityDataSource bean ...

관련 문제