有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring在尝试创建数据源bean或JDBC模板时无法解析占位符

注意:当我删除datasource和jdbctemplate的bean时,错误就消失了。我确实在https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto-data-access中尝试了这个解决方案 他们都没有工作。当我移除bean时,属性会自动连接到正确的字段中

这是申请表。特性:

app.datasource.url=jdbc:db2://stha7n0g7.iad.ca.inet:50001/icmnlsdb
app.datasource.username=<username>
app.datasource.password=<password>
app.datasource.driverClassName=com.ibm.db2.jcc.DB2Driver

这里是DB2Config:

package com.intactfc.soa.document.docpostmonitoring.configuration;


import java.lang.reflect.InvocationTargetException;
import java.sql.Driver;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.util.ClassUtils;

import com.intactfc.soa.document.docpostmonitoring.model.DB2ConfigModel;

@Configuration
public class DB2Configuration {
    
    @Value("${app.datasource.username}")    
    private String username;
    
    @Value("${app.datasource.password}")
    private String password;
    
    @Value("${app.datasource.driverClassName}")
    private String driverClass;
    
    @Value("${app.datasource.url}")
    private String dataSourceURL;
    
    @Autowired
    DB2ConfigModel model;
    
//@Autowired
//Environment env;
//  

//    @Bean
//    public DataSource getDataSource2() 
//    { 
//      System.out.println(model.getUrl());
//      return DataSourceBuilder.create().build();
//    }

@Bean
@Primary
public JdbcTemplate jdbcTemplate() throws IllegalAccessException, InvocationTargetException, InstantiationException {
    // extract this 4 parameters using your own logic
    final String driverClassName = driverClass;
    final String jdbcUrl = dataSourceURL;
    final String usernameL = username;
    final String passwordL = password;
    System.out.println("test"+driverClassName+jdbcUrl+usernameL+passwordL);
    // Build dataSource manually:
    final Class<?> driverClass = ClassUtils.resolveClassName(driverClassName, this.getClass().getClassLoader());
    final Driver driver = (Driver) ClassUtils.getConstructorIfAvailable(driverClass).newInstance();
//    final DataSource dataSource = new SimpleDriverDataSource(driver, jdbcUrl, username, password);
    // or using DataSourceBuilder:
    final DataSource dataSource = DataSourceBuilder.create().driverClassName(driverClassName).url(jdbcUrl).username(username).password(password).build();
    // and make the jdbcTemplate
    return new JdbcTemplate(dataSource);
}
}

共 (1) 个答案

  1. # 1 楼答案

    AsSpring document

    the @Value annotation is performed by a BeanPostProcessor which in turn means that you cannot use @Value within BeanPostProcessor or BeanFactoryPostProcessor types

    这意味着在带有@Bean@Autowired注释的方法中,您无法获得注入值。你只在创建bean之后才得到它们
    初始化bean时,可以使用Environmentapplication.properties获取值

    var username = environment.getProperty("app.datasource.username");
    var password = environment.getProperty("app.datasource.password");
    ...