My persistence configuration Class looks like bellow :
我的持久性配置类看起来像下面:
@Configuration
@EnableTransactionManagement
public class PersistenceConfig {
@Autowired
private Environment env;
// code here
@Bean(name = "dataSource")
public DataSource dataSource()
{
System.out.println("------------------------datasource----------------------");
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
dataSource.setUrl(env.getProperty("jdbc.url"));
dataSource.setUsername(env.getProperty("jdbc.username"));
dataSource.setPassword(env.getProperty("jdbc.password"));
return dataSource;
}
}
And i have an xml configuration class :
我有一个xml配置类:
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:sec="http://www.springframework.org/schema/security" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/security/oauth2 http://www.springframework.org/schema/security/spring-security-oauth2-2.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd ">
<authentication-manager alias="authenticationManager"
xmlns="http://www.springframework.org/schema/security">
<authentication-provider>
<user-service>
<user name="username" password="password" authorities="USER_ROLE" />
</user-service>
<jdbc-user-service data-source-ref="dataSource"
users-by-username-query="query here"
authorities-by-username-query="query here" />
</authentication-provider>
</authentication-manager>
<!-- code here -->
So i want to inject the bean called "dataSource" annotated with @Bean (in the persistence config class) , in <jdbc-user-service data-source-ref="dataSource" ... >
, how can I do it ?
所以我想注入一个名为“dataSource”的bean,用@Bean注释(在持久化配置类中),在
3 个解决方案
#1
It is happening because you are loading xml configuration before the PersistenceConfig class which is creating "dataSource" bean. Load the class first and then your xml configuration.
之所以发生这种情况,是因为您在创建“dataSource”bean的PersistenceConfig类之前加载了xml配置。首先加载类,然后加载xml配置。
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:sec="http://www.springframework.org/schema/security" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/security/oauth2 http://www.springframework.org/schema/security/spring-security-oauth2-2.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd ">
<context:component-scan base-package="your_package.PersistenceConfig" />
<context:annotation-config /><mvc:annotation-driven/>
<authentication-manager alias="authenticationManager"
xmlns="http://www.springframework.org/schema/security">
<authentication-provider>
<user-service>
<user name="username" password="password" authorities="USER_ROLE" />
</user-service>
<jdbc-user-service data-source-ref="dataSource"
users-by-username-query="query here"
authorities-by-username-query="query here" />
</authentication-provider>
</authentication-manager>
<!-- code here -->
#2
try this:
<bean class="PersistenceConfig.class"/>
in your xml config
在你的xml配置中
tip: make sure you have this post processor
提示:确保你有这个后处理器
<bean class="org.springframework.config.java.process.ConfigurationPostProcessor"/>
#3
I made it work by changing the loading order of my config files so that Spring load the config file that contains :
我通过更改配置文件的加载顺序使其工作,以便Spring加载包含以下内容的配置文件:
<context:component-scan base-package="com.rsone.*" />
<context:annotation-config />
<mvc:annotation-driven/>
before my webSecurityConfig.xml ( the above config file )
在我的webSecurityConfig.xml之前(上面的配置文件)
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
WEB-INF/mvc-servlet.xml
classpath:webSecurityConfig.xml
</param-value>
</context-param>
#1
It is happening because you are loading xml configuration before the PersistenceConfig class which is creating "dataSource" bean. Load the class first and then your xml configuration.
之所以发生这种情况,是因为您在创建“dataSource”bean的PersistenceConfig类之前加载了xml配置。首先加载类,然后加载xml配置。
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:sec="http://www.springframework.org/schema/security" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/security/oauth2 http://www.springframework.org/schema/security/spring-security-oauth2-2.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd ">
<context:component-scan base-package="your_package.PersistenceConfig" />
<context:annotation-config /><mvc:annotation-driven/>
<authentication-manager alias="authenticationManager"
xmlns="http://www.springframework.org/schema/security">
<authentication-provider>
<user-service>
<user name="username" password="password" authorities="USER_ROLE" />
</user-service>
<jdbc-user-service data-source-ref="dataSource"
users-by-username-query="query here"
authorities-by-username-query="query here" />
</authentication-provider>
</authentication-manager>
<!-- code here -->
#2
try this:
<bean class="PersistenceConfig.class"/>
in your xml config
在你的xml配置中
tip: make sure you have this post processor
提示:确保你有这个后处理器
<bean class="org.springframework.config.java.process.ConfigurationPostProcessor"/>
#3
I made it work by changing the loading order of my config files so that Spring load the config file that contains :
我通过更改配置文件的加载顺序使其工作,以便Spring加载包含以下内容的配置文件:
<context:component-scan base-package="com.rsone.*" />
<context:annotation-config />
<mvc:annotation-driven/>
before my webSecurityConfig.xml ( the above config file )
在我的webSecurityConfig.xml之前(上面的配置文件)
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
WEB-INF/mvc-servlet.xml
classpath:webSecurityConfig.xml
</param-value>
</context-param>