无法在Spring Boot中获取属性

时间:2017-08-16 20:55:09

标签: java spring spring-boot properties

我正在尝试在SpringBoot Appilcation中使用属性。但是当我试图调用new MappingProperties().getLogin()时,我总是得到一个空值。拜托,有人可以解释一下我做错了吗?

申请类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.support.SpringBootServletInitializer;

@EnableConfigurationProperties
@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

以下是我尝试访问属性的方法

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
@PropertySource("classpath:mapping.properties")
@ConfigurationProperties(prefix = "user")
public class MappingProperties {
    private String login;

    public String getLogin(){
        return login;
    }

    public void setLogin(String login){
        this.login = login;
    }
}

这是我的mapping.properties文件,位于src\main\resources\mapping.properties

user.login = /login

此处还有build.gradle

buildscript {
    repositories {
        maven { url 'http://repo.spring.io/plugins-release' }
    }
    dependencies {
        classpath 'io.spring.gradle:propdeps-plugin:0.0.9.RELEASE'
    }
}

plugins {
    id 'org.springframework.boot' version '1.5.4.RELEASE'
}

configure(allprojects) {
    apply plugin: 'propdeps'
    apply plugin: 'propdeps-maven'
    apply plugin: 'propdeps-idea'
    apply plugin: 'propdeps-eclipse'
}

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-actuator:1.5.4.RELEASE'
    compile 'org.springframework.boot:spring-boot-devtools:1.5.4.RELEASE'

    optional "org.springframework.boot:spring-boot-configuration-processor"

    testCompile 'org.springframework.boot:spring-boot-starter-test:1.5.4.RELEASE'
}

3 个答案:

答案 0 :(得分:3)

@yurii您正在创建始终返回null的新的MappingProprties new MappingProperties().getLogin()。您必须从spring上下文获取MappingProperties的对象。根据您的代码,spring DI不知道您的new MappingProperites对象。

(如果你想使用new,那么每次你必须注入login字段的值,但我认为这不是一个很好的方式来在春季工作<) / EM>  我正在使用您的代码作为参考。

//simple and basic config for any spring boot application
@SpringBootApplication 
@EnableAutoConfiguration 
public class Application extends SpringBootServletInitializer {

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(Application.class);
}

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
 }
}

没有。使用属性文件的方法。我们将讨论其中两个(您将这些概念相互混合)。让我们清楚地理解它。

第一种方式:

►通过这种方式,我们必须告诉属性文件的名称,以便将字段值注入到spring

►创建anyname.properties文件      anyname.properties

user.login:/login

►创建新的配置java文件     PropConfig.java

@Configuration
@PropertySource(value="classpath:anyname.properties")
public class PropConfig{

//you can inject property values anywhere in the code that is under spring context(e.g. @Service, @Repository, @Component etc)
@Value("${user.login}")
private String login;

public String getUserLogin(){
    return login;
}
}

第二种方式:

►我们将使用注释@ConfigurationProperties

►创建NewProps.java文件

@ConfigurationProperties(prefix = "user")
public class NewProps{
//value of this field will be automatically mapped to "user.login" in "anyName.properties" file
private String login;
 public String getUserLogin(){
    return login;
 }
}

►根据{em> @ConfigurationProperties documentation

  

外部化配置的注释。将其添加到课程中   定义或a       如果要绑定和验证,请在{@code @Configuration}类中使用{@code @Bean}方法       一些外部属性(例如来自.properties文件)。

//here we are making property values as fields of custom bean
//now property values will be accessed in a way, as field of some ordinary java bean
@Configuration
public class NewConfig {

 @Bean
 NewProps newProps(){
    return new NewProps();
 }
}

►访问属性值

@Autowired
NewProps newProps;


//in your code
...
newProps.getUserLogin();
...

注意:如果您对此有任何疑问,请与我们联系

答案 1 :(得分:1)

您必须通过依赖注入或在Spring容器中连接它们来管理两个类之间的依赖关系。

因此,通过自动装配将 MappingProperties 作为实例变量注入调用类

@Autowired
private MappingProperties mappingProperties; 

...
mappingProperties.getLogin();
...

答案 2 :(得分:0)

Spring并不知道您的登录字段,我的意思是它不知道必须在那里注入某些东西。你应该告诉spring注入值。

尝试使用private String login;注释@Value("${login}")

或删除@ConfigurationProperties(prefix = "user")并使用@Value("${user.login}")

进行注释