Невозможно получить значение из файла свойств с помощью аннотаций Spring @Value, @ConfigurationProperties

Я новичок в Spring Boot и использую Spring Annotations. Я пытаюсь создать образец приложения загрузки Spring, в котором я получаю значение для своего свойства java, используя файл свойств. Я пытаюсь использовать параметр @Component и @ConfigurationProperties. Я следил за множеством руководств в Интернете, и это Статья StackOverflow помогло, но значение моего свойства по-прежнему null

Вот мой код.

Просмотрел:-

  1. невозможно прочитать свойства, используя аннотацию configurationproperties

  2. https://www.mkyong.com/spring/spring-propertysources-example/

Мой класс приложения SpringBoot


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

@EnableAutoConfiguration
@SpringBootApplication
public class Main {


  public static void main(String[] args) {
    ApplicationContext context =   SpringApplication.run(Main.class, args);
    TestConf t = context.getBean(TestConf.class);
    System.out.println(t.toString());
  }
}

Класс TestConf


import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties("pres")
public class TestConf {

  private String firstName;

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  public TestConf()
  {
    System.out.println("inside constructor");
    System.out.println("first name:" + firstName);
  }


  public static void main(String[] args){
    TestConf t = new TestConf();
  }

  @Override
  public String toString() {
    return "firstName:" + firstName;
  }
}

приложение.свойства

pres.firstName=JACQUELYN

наконец, мой pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
  xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>phil</groupId>
  <artifactId>springTuit</artifactId>
  <version>1.0-SNAPSHOT</version>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.2.RELEASE</version>
  </parent>

  <properties>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    <!-- Optional, for bootstrap -->
    <dependency>
      <groupId>org.webjars</groupId>
      <artifactId>bootstrap</artifactId>
      <version>4.3.1</version>
    </dependency>

  </dependencies>
  <build>
    <plugins>
      <!-- Package as an executable jar/war -->
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.22.0</version>
      </plugin>
    </plugins>
  </build>

</project>

Чего не хватает для правильного извлечения значения из application.properties в firstName? Имеет ли значение, где лежит мой файл application.properties? Хотя он находится на своем традиционном месте под src/main/resources, а мои java-файлы под src/main/java

Вы должны указать, где он расположен, так как вы перемещаетесь в местоположение по умолчанию. Spring boot всегда ищет файл свойств в папке ресурсов. чтобы изменить, вы можете использовать это свойство --spring.config.location = "file:/path/to/application.properti‌​es"

soorapadman 27.03.2019 06:23

Если вы проверите, firstName будет только null в конструкторе TestConf и отлично напечатает метод main в классе Main

Madhu Bhat 27.03.2019 06:27

Кроме того, почему у вас есть метод main в классе TestConf?

Madhu Bhat 27.03.2019 06:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
5 753
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Код нуждается в паре незначительных изменений:

@Component
@ConfigurationProperties("classpath:application.properties")
public class TestConf {

  @Value("pres.firstName")
  private String firstName;

Не решит проблемы, связанные с отсутствием управляемого компонента и использованием неустановленных полей из конструктора.

chrylis -cautiouslyoptimistic- 27.03.2019 06:43
Ответ принят как подходящий

Это кажется стандартным. Тем не менее, вы можете попробовать с комбинацией

@Component
@PropertySource("classpath:applciation.properties") 
@ConfigurationProperties 

в TestConf.Java

Будьте осторожны, вы неправильно написали «приложение».

Qrom 28.06.2019 09:11

У вас есть две фундаментальные проблемы:

  1. Ваш экземпляр new TestConf() не является объектом, управляемым Spring, и поэтому вообще не внедряется.

  2. Внедрение сеттера (или поля) по своей сути означает, что значения не устанавливаются до тех пор, пока не запустится конструктор.

Если вы хотите использовать bean-компонент Spring из какой-либо задачи, которая запускается при запуске вашего загрузочного приложения, используйте CommandLineRunner и внедрите bean-компонент, желательно с внедрением конструктора.

you can try with the combination..it will work....

@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "pres")
@Data
public class TestConf {

  private String firstName;

.............

}

Вы можете использовать @Value, чтобы получить значение свойства или, когда вы пытаетесь получить конфигурации с помощью класса конфигурации, нижеприведенный пример может быть полезен.

Класс контроллера:

@RestController
public class ConfigurationController {

//@Value("${app.name:Movies}") 
//private String name;
//Alternative of configuration class

@Autowired
private Configuration configuration;

@GetMapping("/config")
public MovieConfiguration retrieveConfiguration() {

    return new MovieConfiguration(configuration.getName());
}

Класс Pojo

public class MovieConfiguration {

private String name;

public MovieConfiguration(String name) {
    this.name=name;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}}

Класс конфигурации

@Component
@ConfigurationProperties("app")
public class Configuration {

private String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}}

Характеристики

server.port=8091
app.name=SpaceDrama

Таким образом, казалось, что причина, по которой я не получил свое значение, была не из-за кода, а из-за того, что порт использовался. Я думал, что это не должно быть проблемой, но оказалось, что как только я убил процесс, используя порт, и запустил там свое приложение, все заработало, как и ожидалось. Итак, мой код был правильным для начала.

Спасибо за ваши ответы, сообщество stackoverflow

Другие вопросы по теме