Java Spring引导未从属性文件读取

Java Spring引导未从属性文件读取,java,spring,spring-boot,Java,Spring,Spring Boot,我尝试了web上的每个选项,但无法使用以下方法设置值: @Configuration @PropertySource("classpath:application.properties") public class MyDataSource { @Value("${db.driver}") private String DB_DRIVER; @Value("${db.url}") private String DB_URL; @Value("${db

我尝试了web上的每个选项,但无法使用以下方法设置值:

@Configuration
@PropertySource("classpath:application.properties")
public class MyDataSource {
    @Value("${db.driver}") 
    private String DB_DRIVER;

    @Value("${db.url}")
    private String DB_URL;

    @Value("${db.username}")
    private String DB_USERNAME;

    @Value("${db.password}")
    private String DB_PASSWORD;


    @Bean
    public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    public DataSource getDataSource() {
         DriverManagerDataSource dataSource = new DriverManagerDataSource();
         dataSource.setDriverClassName(DB_DRIVER);
         dataSource.setUrl(DB_URL);
         dataSource.setUsername(DB_USERNAME);
         dataSource.setPassword(DB_PASSWORD);

         return dataSource;
     }
}
My application.properties位于main/resources文件夹中,可以在调试模式下的变量中看到值。但在正在运行的应用程序上,它显示属性“”不能为空

编辑:我不确定在第一种情况下会出现什么问题? 因此,按照建议更改了application.property文件,代码如下:

@Autowired
protected JdbcTemplate jdbcTemp;

public List<> getData(String id) {

    return jdbcTemp.query("SELECT ........,new RowMapper());
}

但是获取java.lang.NullPointerException:

如果您使用的是Spring Boot,您可以通过声明一些条目来利用application.properties文件:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
这样,就不需要实现@Configuration类来在SpringBoot中设置数据库连接

您可以在此处进一步了解:


顺便说一句,看看java配置的

,使用环境实例获取属性似乎是首选方法,因为默认情况下,${..}占位符不会被解析

您可以使用类似以下内容:

@Autowired
private Environment env;

@Bean
public DataSource getDataSource() {
     DriverManagerDataSource dataSource = new DriverManagerDataSource();
     dataSource.setDriverClassName(env.getProperty("db.driver");

     .....

     return dataSource;
 }
原因来自:

这是不一致的@PropertySource是ConfigurableEnvironmentaddPropertySource的声明性对应项。我们没有添加一个 在后一种情况下,它将 在前者中这样做是不一致的。这将不是用户想要的 在任何情况下,甚至在大多数情况下都适用。 这是完全可能的,甚至建议@Configuration类用户完全放弃${…}属性替换,以支持 EnvironmentgetProperty在@Bean方法中查找。对于用户 根据这项建议,自动注册 PropertySorucesPlaceholderConfigurer在被发现时会感到困惑, 而且通常不受欢迎,因为它是另一个运动部件。是的,是的 存在是良性的,但不是免费的。PSPC必须访问每个bean 定义在容器中查询PropertyValue,只做 在用户使用 EnvironmentgetProperty方法。 这是可以解决的,并且已经通过文档解决了。正确使用@PropertySource、PropertySourcesplaceConfigurer和其他 组件在Javadoc中有相当全面的文档记录 @配置已经完成,参考文档即将发布。
我在尝试从MySQL切换到MSSQL时也遇到了错误。实际的问题是我忘记将MSSQL依赖项放在服务中。我使用了mssql jdbc

您应该从应用程序配置数据源。属性没有得到您的支持。是的,我的数据源属性在application.properties中。但我无法将它们移植到上面的getDatSorce方法中。请尝试从WebMVCConfigureAdapter扩展MyDataSource类。加上添加EnableWebMvc注释并添加方法@Override public void addResourceHandlers最终ResourceHandlerRegistry注册表{registry.addResourceHandler/resources/**.addResourceLocations/resources/;registry.setOrderOrdered.HIGHEST_priority;}你正在使用SpringBoot,那你为什么还要自己做这些事情呢?Spring Boot已经做到了这一点,您基本上是在努力不使用Spring Boot。对于Spring Boot来说,情况并非如此,因为它自动配置了PropertySourcesPlaceholderConfigurer,所以默认情况下会解析${…}占位符。如果您的意思是不需要PropertySourcesPlaceholderConfigurer,是的,我将获得${…}中的值。但是我不能在bean getDataSource中使用它们?我一直在强调的一点是,您可能会切换到env.getProperty而不是${..}。