尝试使用@Value注释作为函数参数访问时,无法从属性文件解析变量

时间:2019-08-26 10:54:04

标签: java spring-boot

这可能是一个愚蠢的问题,但是我无法找到任何令人满意的解决方案。在Java中,我们没有默认变量的概念,因此我试图使用@Value注释将属性文件中的默认值提供给我的函数参数/参数,但是我总是会得到null,并且我无法弄清楚为什么是这种情况。请帮助我解决问题或提供一些可能解决我问题的适当链接/参考。

MainApplication.java

@SpringBootApplication
public class Application 
{

    public static void main(String[] args) 
    {
        ApplicationContext context = SpringApplication.run(NetappApplication.class, args);
        Sample sample = context.getBean(Sample.class);
        System.out.println(sample.check(null));
    }

}

Sample.java

public interface Sample 
{
    public String check(String message);
}

SampleImpl.java

@Service
@PropertySource("classpath:app.properties") 
public class SampleImpl implements Sample
{

    @Value("${test}") 
    String message1;

    @Override
    public String check(@Value("${test}") String message) 
    {
        return message;
    }

}

app.properties

test=anand

1 个答案:

答案 0 :(得分:0)

但是您正在将空值传递给您的方法...

如果属性文件中未定义未定义,也许您想做的就是为test分配默认值:

@Value("${test:default}");

然后,如果占位符解析程序未从props文件中获取值,则Spring通过属性自动连接属性时,它将使用:之后的内容。

(我能想到的)最好的用例是创建Spring配置时。

假设您有一个配置类:用于数据库访问。简单地说:

@Configuration
public class DbConfig {

  @Value("${url:localhost}")
  String dbUrl;

  // rest for driver, user, pass etc

  public DataSource createDatasource() {
    // here you use some DataSourceBuilder to configure connection
  }
}

现在,当Spring应用程序启动时,属性的值将被解析,并且正如我上面所写的,您可以在属性值和默认值之间切换。但是,只有在应用启动并由Spring创建您的bean时,它才完成一次。

如果要在运行时检查传入的参数,则简单的null检查就足够了。

@Value("${test}")
String message1;

@Override
public String check(String message) {
  if (message == null) {
    return message1;
  }
}