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();
}