gpt4 book ai didi

java - 无法从 Spring Boot 服务中的 application.properties 加载值

转载 作者:行者123 更新时间:2023-12-02 13:04:00 25 4
gpt4 key购买 nike

我有一个具有以下结构的 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

并且有来自 Controller 的相关代码:

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

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

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

最佳答案

也许可以尝试使用@Autowired:

@Autowired DBConnector dbConnector = new DBConnector();

我尝试用您的一些注释替换我当前的 Spring 应用程序的部分内容,但我还没有发现唯一导致问题的原因(尽管是 NullPointerException,所以可能与你正在经历的)是当我在我的 Controller 中删除@Autowired注释时。

编辑:我一开始没有注意到,但我的 NPE 显然是引起的,因为我只是 Autowiring 引用,而不是实例化。对于您来说,相当于:

@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 boot 应用程序将无法启动,并抛出 org.springframework.beans.factory.UnsatisfiedDependencyException。

关于java - 无法从 Spring Boot 服务中的 application.properties 加载值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44208612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com