Spring - 如何从application.properties

时间:2017-12-26 22:11:09

标签: java spring oracle

在我的application.properties中,我有一些spring.datasource个字段

spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.username=talon
spring.datasource.password=talon

这些应该从@Configuration带注释的类

中检索
@Configuration
public class Db {

    @NotNull
    private String username;
    @NotNull
    private String password;
    @NotNull
    private String url;

    public void setUsername(String username) {
        this.username = username;
    }

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

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

    public Db() {
        OracleDataSource dataSource = null;
        try {
            dataSource = new OracleDataSource();
            dataSource.setUser(username);
            dataSource.setPassword(password);
            dataSource.setURL(url);
            dataSource.setImplicitCachingEnabled(true);
            dataSource.setFastConnectionFailoverEnabled(true);
            Connection connection = dataSource.getConnection();
            Statement statement = connection.createStatement();
            ResultSet rs = statement.executeQuery("select * from BOOK");
            rs.next();
            System.out.println(rs.getString(2));
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

但我无法从那里检索username passwordurl,我是否应该在某处添加其他注释或我在做什么

像这样我有错误: java.sql.SQLException:指定的Oracle URL无效:OracleDataSource.makeURL

如果我使用dataSource.setURL("jdbc:oracle:thin:@localhost:1521:XE");设置了正确的网址,则无法读取usernamepassword,因为它们为空,我有 java.sql.SQLException:ORA- 01017:用户名/密码无效;登录被拒绝

1 个答案:

答案 0 :(得分:1)

您有两个问题:

  1. 您需要使用其他注释才能填充字段。因此,使用@ConfigurationProperties("spring.datasource")

  2. 注释班级
  3. 您无法直接在构造函数中初始化OracleDataSource(即Db()),因为在构造函数调用期间未填充属性(您的用户名/密码/ url字段),因此您可以做的一件事是创建另一个方法并使用@PostContruct添加注释,以便正确创建dataSource

  4. 一个例子:

    @PostConstruct
    private void init() {
        // your data source initialization
    
    }
    

    一个建议是改变初始化dataSource的方式,而不是尝试在构造函数中创建它,您可以创建一个新方法,您可以使用@Bean进行注释并使其返回您的dataSource和您可以稍后使用@Autowired

    来使用它