@Value аннотация не работает, всегда дает нулевые значения в конфигурации Spring на основе XML - PullRequest
0 голосов
/ 02 мая 2019

Я хотел прочитать файл application.properties, используя аннотацию @Value в Spring Bean. Но всегда получаю нулевые значения.

root-context.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:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <mvc:annotation-driven />
    <import resource="./application-security.xml" /> 
    <context:component-scan base-package="com.test.changed"/>
    <context:property-placeholder location="classpath:application.properties" />

</beans>

Это класс, в котором я создаю объект источника данных. Если я использую жестко заданное значение для установки url, username, password и driverClassName, это работает нормально, но когда я пытаюсь извлечь эти значения из application.properties, он не может их извлечь. Я что-то здесь пропустил?

import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@ComponentScan(basePackages = "com.test.changed")
@PropertySource("classpath:application.properties")
public class Test {

    @Value("${dataSource.url}")
    private String url;

    @Value("${dataSource.driverClassName}")
    private String driverClassName;

    @Value("${dataSource.userName}")
    private String userName;

    @Value("${dataSource.password}")
    private String password;

    @Bean
    public DataSource dataSource() {
        System.out.println("dataSource-url: " + url);
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUsername(userName);
        dataSource.setPassword(password);
        return dataSource;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getDriverClassName() {
        return driverClassName;
    }

    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

Error in console :-
Caused by: java.lang.RuntimeException: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:223)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:87)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.start(UndertowDeploymentService.java:72)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
    ... 3 more
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:391)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:471)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:481)
    at org.springframework.jdbc.core.JdbcTemplate.queryForList(JdbcTemplate.java:521)
    at com.boeing.cscape.commons.DbProperties.<init>(DbProperties.java:17)
    at com.boeing.cscape.commons.DbPropertyPlaceholder.postProcessBeanFactory(DbPropertyPlaceholder.java:22)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:265)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:162)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:606)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:462)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:434)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:173)
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:194)
    ... 7 more
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
    at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452)
    at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
    ... 22 more
Caused by: java.lang.NullPointerException
    at com.microsoft.sqlserver.jdbc.Util.parseUrl(Util.java:155)
    at com.microsoft.sqlserver.jdbc.SQLServerDriver.acceptsURL(SQLServerDriver.java:1049)
    at java.sql.DriverManager.getDriver(Unknown Source) [rt.jar:1.8.0_162]
    at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
    ... 26 more

application.properties :-
dataSource.url=jdbc:sqlserver://host:port;instanceName=MSSQLSERVER;databaseName=db_name_changed;
dataSource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
dataSource.userName=user
dataSource.password=pass
...