Spring Загрузка @Value Properties

У меня есть приложение загрузки Spring и в одном из классов я пытаюсь ссылаться на свойство из файла application.properties, используя @Value. Но собственность не решена. Я просмотрел похожие должности и попытался выполнить эти предложения, но это не помогло. Класс:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class PrintProperty {

  @Value("${file.directory}")
  private String fileDirectory;

  public void print() {
    System.out.println(fileDirectory);
  }
}

У меня есть файл file.directory в application.properties. У меня есть и другие поля.

Ответы

Ответ 1

У меня была такая же проблема, как у тебя. Вот мой код ошибки.

@Component
public class GetExprsAndEnvId {
    @Value("hello")
    private String Mysecret;


    public GetExprsAndEnvId() {
        System.out.println("construct");
    }


    public void print(){
        System.out.println(this.Mysecret);
    }


    public String getMysecret() {
        return Mysecret;
    }

    public void setMysecret(String mysecret) {
        Mysecret = mysecret;
    }
}

Это не такая проблема, но мы должны использовать это так:

@Autowired
private GetExprsAndEnvId getExprsAndEnvId;

не так:

getExprsAndEnvId = new GetExprsAndEnvId();

Здесь поле, аннотированное @Value, имеет значение null, потому что Spring не знает о копии GetExprsAndEnvId, созданной с помощью new, и не знает, как вставить в нее значения.

Ответ 2

Убедитесь, что ваш файл application.properties находится в каталоге src/main/resources/application.properties. Это один из способов пойти. Затем добавьте @PostConstruct следующим образом

Образец заявки. Свойства

file.directory = somePlaceOverHere

Образец Java-класса

@ComponentScan
public class PrintProperty {

  @Value("${file.directory}")
  private String fileDirectory;

  @PostConstruct
  public void print() {
    System.out.println(fileDirectory);
  }
}

Код выше выведет "somePlaceOverhere"

Ответ 3

Я хотел бы отметить, что я использовал весеннюю загрузку версии 1.4.0, и с этой версии вы можете написать только:

@Component
public class MongoConnection {

@Value("${spring.data.mongodb.host}")
private String mongoHost;

@Value("${spring.data.mongodb.port}")
private int mongoPort;

@Value("${spring.data.mongodb.database}")
private String mongoDB;
}

Тогда вводите класс, когда захотите.

Ответ 4

Чтобы прочитать значения из application.properties, нам нужно просто аннотировать наш основной класс @SpringBootApplication и класс, в котором вы читаете @Component или его разнообразие. Ниже приведен образец, где я прочитал значения из application.properties, и он работает нормально, когда вызывается веб-служба. Если вы разворачиваете тот же код, что и есть, и пытаетесь получить доступ из http://localhost:8080/hello, вы получите значение, которое вы сохранили в application.properties для ключа сообщение.

package com.example;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

    @Value("${message}")
    private String message;

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

    @RequestMapping("/hello")
    String home() {
        return message;
    }

}

Попробуйте и дайте мне знать

Ответ 5

У меня была похожая проблема, и приведенные выше примеры не помогают мне читать свойства. Я разместил полный класс, который поможет вам прочитать значения свойств из файла application.properties в приложении SpringBoot по ссылке ниже.

Spring Boot - среда @Autowired создает исключение NullPointerException

Ответ 6

Как вы используете загрузку Spring, единственный способ, по-моему, в настоящий момент не работает, потому что вы не добавили аннотацию @PropertySource.

Попробуйте и дайте мне знать ваши отзывы. Спасибо!

@Configuration
@ComponentScan
@PropertySource("classpath:/application.properties")
@EnableAutoConfiguration
public class PrintProperty {

  @Value("${file.directory}")
  private String fileDirectory;

  public void print() {
    System.out.println(fileDirectory);
  }
}

Ответ 7

Попробуйте изменить следующее:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class PrintProperty {

  @Autowired
  Environment environment;

  public void print() {
    System.out.println(environment.getProperty("file.directory"));
  }
}

Вы можете избавиться от @ComponentScan и @EnableAutoConfiguration, если они уже присутствуют в вашем классе SpringbootApplication.

Как почему @Value не работает, не уверен!

Ответ 8

Вы не включили декларации пакетов в OP, но возможно, что ни @SpringBootApplication, ни @ComponentScan не сканируют ваш @Component.

@ComponentScan Javadoc утверждает:

Либо basePackageClasses, либо basePackages (или его псевдоним value) могут быть для определения определенных пакетов для сканирования. Если конкретные пакеты не определены, сканирование будет происходить из пакета класса который объявляет эту аннотацию.

ISTR тратит много времени на это раньше и обнаружил, что проще всего просто переместить класс приложения в самый высокий пакет в моем дереве пакетов приложений.

Совсем недавно я столкнулся с вопросом о том, что свойство было прочитано до того, как была выполнена вставка значений. Ответ Джесси помог, поскольку @PostConstruct кажется самым ранним вы можете прочитать вставленные значения, и, конечно же, вы должны позволить Spring вызвать это.

Ответ 9

Ваша проблема в том, что вам нужно static определение Bean- static PropertySourcesPlaceholderConfigurer в вашей конфигурации. Я говорю статично с акцентом, потому что у меня был нестатический, и он не работал.

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