我有一个具有以下结构的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
检测为项目的默认配置文件。我究竟做错了什么?
答案 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。