프로젝트 마녀에서 작동하는 두 개의 데이터 소스가 있습니다. 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는 실제로 존재하며 컨텍스트에서 봄에 의해 인스턴스화되었습니다.
감사합니다. 감사합니다.
런타임시 스프링 컨텍스트가 하나만 있는지 확인하십시오. 문제는 여러 컨텍스트가있을 수 있습니다. 데이터 소스는 하나에서 선언되고 다른 데이터 소스에 주입됩니다. 두 개의 컨텍스트가있는 상황의 예 : Spring MVC를 사용하는 경우 일반적으로 응용 프로그램 bean (서비스, DAO 등)에 대한 하나의 컨텍스트와 Spring MVC 컨트롤러에 대한 하나의 컨텍스트가 있습니다. –
"BeanPostProcessors"경고가있는 항목이 두 개 표시되는 이유는 무엇입니까? BasicDataSource 라인이 아닌 JndiObjectFactoryBean 라인만을 볼 것으로 예상됩니다. 또한 앱을 두 항목 중 하나만 사용하도록 설정할 수 있습니까? – enl8enmentnow