Я новичок в Spring Boot и использую Spring Annotations. Я пытаюсь создать образец приложения загрузки Spring, в котором я получаю значение для своего свойства java, используя файл свойств. Я пытаюсь использовать параметр @Component и @ConfigurationProperties. Я следил за множеством руководств в Интернете, и это Статья StackOverflow помогло, но значение моего свойства по-прежнему null
Вот мой код.
Просмотрел:-
невозможно прочитать свойства, используя аннотацию configurationproperties
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
Если вы проверите, firstName будет только null в конструкторе TestConf и отлично напечатает метод main в классе Main
Кроме того, почему у вас есть метод main в классе TestConf?




Код нуждается в паре незначительных изменений:
@Component
@ConfigurationProperties("classpath:application.properties")
public class TestConf {
@Value("pres.firstName")
private String firstName;
Не решит проблемы, связанные с отсутствием управляемого компонента и использованием неустановленных полей из конструктора.
Это кажется стандартным. Тем не менее, вы можете попробовать с комбинацией
@Component
@PropertySource("classpath:applciation.properties")
@ConfigurationProperties
в TestConf.Java
Будьте осторожны, вы неправильно написали «приложение».
У вас есть две фундаментальные проблемы:
Ваш экземпляр new TestConf() не является объектом, управляемым Spring, и поэтому вообще не внедряется.
Внедрение сеттера (или поля) по своей сути означает, что значения не устанавливаются до тех пор, пока не запустится конструктор.
Если вы хотите использовать 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
Вы должны указать, где он расположен, так как вы перемещаетесь в местоположение по умолчанию. Spring boot всегда ищет файл свойств в папке ресурсов. чтобы изменить, вы можете использовать это свойство
--spring.config.location = "file:/path/to/application.properties"