Я использую Spring Boot и Lombock, и у меня есть bean-компонент, который инициализируется некоторыми свойствами String и предоставляет их другим классам:
@Getter
@Configuration
@PropertySource(value = "classpath:texts.properties")
public class TextProvider {
@Value("${some.text.value}")
private String text1;
@Value("${other.text.value}")
private String text2;
}
Когда Lombok создает геттеры для этого класса, он копирует аннотацию @Value в методы получения, в результате чего Spring AutowiredAnnotationBeanPostProcessor печатает следующую информацию при запуске системы: «Автоматическую аннотацию следует использовать только для методов с параметрами: " + method.
Есть ли способ не копировать эти аннотации в геттер?
3 ответа
Я всегда советую не использовать аннотацию @Value
для извлечения значений из файлов свойств. Используйте для этого класс свойств:
@ConfigurationProperties(...)
@Getter
public class TextProperties {
private String text1;
private String text2;
}
Теперь прочитайте это в своем классе конфигурации:
@Configuration
@PropertySource(value = "classpath:texts.properties")
@EnableConfigurationProperties(TextProperties.class)
public class TextProvider {
...
}
Таким образом, вы можете автоматически подключить TextProperties
везде, где вам это нужно:
@Autowired
private TextProperties textProperties
Подробнее о том, как настроить @ConfigurationProperties
аннотацию и как назвать свои свойства.
Почему бы вам не использовать аннотацию @Value
в конструкторе всех аргументов?
Подобно
@Getter
@Configuration
@PropertySource(value = "classpath:texts.properties")
public class TextProvider {
private String text1;
private String text2;
public TextProvider(@Value("${some.text.value}") String text1,@Value("${other.text.value}") String text2){
this.text1 = text1;
this.text2 = text2;
}
}
Таким образом, весна счастлива, и вы все еще можете использовать аннотацию @Getter
Ломбока.
По умолчанию Lombok не будет создавать метод, который уже был закодирован, поэтому вы можете просто написать свой собственный геттер.
Недостатком является то, что в этом случае Lombok сгенерирует предупреждение, поэтому лучше на самом деле сказать Lombok даже не думать об этом, указав AccessLevel.NONE, поэтому:
@Getter
@Configuration
@PropertySource(value = "classpath:texts.properties")
public class TextProvider {
@Value("${some.text.value}")
@Getter(AccessLevel.NONE)
private String text1;
@Value("${other.text.value}")
@Getter(AccessLevel.NONE)
private String text2;
public String getText1()
{
return text1;
}
public String getText2()
{
return text2;
}
}
Конечно, строго для этого примера это делает использование @Getter на уровне класса совершенно бесполезным, но это подход для общего случая класса со многими свойствами.
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].