无法在spring启动服务中从application.properties加载值

时间:2017-05-26 19:07:27

标签: java spring spring-boot

我有一个具有以下结构的spring boot REST服务:

├── src
│   ├── main
│   │   ├── java
│   │   │   ├── daos
│   │   │   ├── db
│   │   │   │   └── DBConnector.java
│   │   │   ├── serviceComponents
│   │   │   │   └── serviceResources
│   │   │   │       ├── Application.java
│   │   │   │       ├── UserController.java
│   │   │   │       └── UserDAO.java
│   │   │   └── serviceRepresentations
│   │   │       └── User.java
│   │   └── resources
│   │       └── application.properties

与此问题相关的主要文件是:

Application.java

package serviceComponents.serviceResources;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication(exclude = {ErrorMvcAutoConfiguration.class})
@ComponentScan
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

DBConnector.java

package db;

import java.sql.Connection;
import java.sql.SQLException;

import oracle.jdbc.pool.OracleDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;


@Component
public class DBConnector {
    @Value("${current.app.url}")
    String dbUrl;

    @Value("${current.app.sid}")
    String dbSid;

    @Value("${current.app.port}")
    String dbPort;

    @Value("${current.app.user}")
    String dbUser;

    @Value("${current.app.password}")
    String dbPassword;

    String jdbcUrl = String.format("jdbc:oracle:thin:@%s:%s:%s", dbUrl, dbPort, dbSid);
    Connection conn;

    int count = 0;

    public DBConnector() {}

    @PostConstruct
    private void init() {

        try {
            Class.forName("oracle.jdbc.OracleDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        OracleDataSource ds = null;

        try {
            ds = new OracleDataSource();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        ds.setURL(jdbcUrl);

        try {
            conn = ds.getConnection(dbUser, dbPassword);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public Connection getDBConnection() throws SQLException {
        if (count == 0) {
            init();
            count++;
        }

        return conn;
    }
}

properties文件:

server.port = 8089

test.app.url = 127.0.0.1
test.app.sid = XE
test.app.port = 1521
test.app.user = foouser
test.app.password = barbazpass

current.app.url = test.app.url
current.app.sid = test.app.sid
current.app.port = test.app.port
current.app.user = test.app.user
current.app.password = test.app.password

控制器中有相关的代码:

@RestController
@RequestMapping("/v1/user/")
public class UserController {

    DBConnector dbConnector = new DBConnector();
    UserDAO userDAO = new UserDAO(dbConnector);

但是,当我运行应用程序时,DBConnector.java注释为@Value的字段未填充配置文件中的预期值。我知道spring boot会将application.properties检测为项目的默认配置文件。我究竟做错了什么?

1 个答案:

答案 0 :(得分:1)

或许可以尝试使用@Autowired:

@Autowired DBConnector dbConnector = new DBConnector();

我尝试用我们不同的一些注释替换当前Spring应用程序的部分内容,但唯一导致我发现的问题(但是,NullPointerException,所以也许不是与您遇到的问题相同的问题是当我在控制器中删除@Autowired注释时。

编辑:我一开始并没有注意到,但我的NPE显然是因为我只是自动装配一个引用,而不是实例化。对你来说,等价物是:

@Autowired DBConnector dbConnector;

编辑2:我的应用程序并不像你的那样完全实例化,所以这可能不起作用,但我有一个这样的类:

@SpringBootApplication
public class ParameterClassConfigurator
{
    @Value("${my.first.property}") String property1;
    @Value("${my.second.property}") String property2;

    @Bean
    public ParameterClass parameterClass()
    {
        ParameterClass params = new ParameterClass(property1, property2);
        return params;
    }
}

关键似乎是@Bean注释。没有它,我的Spring启动应用程序将无法启动,抛出org.springframework.beans.factory.UnsatisfiedDependencyException。