Я использую 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.

Есть ли способ не копировать эти аннотации в геттер?

2
Ido Raz 19 Янв 2022 в 10:43

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 аннотацию и как назвать свои свойства.

1
Seelenvirtuose 19 Янв 2022 в 13:55

Почему бы вам не использовать аннотацию @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 Ломбока.

0
Shreyas B 19 Янв 2022 в 11:34
Это хорошо в примере с 2 полями, но на самом деле у меня много полей, что сделает конструктор противным и заставит определять каждое поле дважды - само поле и в конструкторе, чего ломбок помогает избежать
 – 
Ido Raz
19 Янв 2022 в 12:48

По умолчанию 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 на уровне класса совершенно бесполезным, но это подход для общего случая класса со многими свойствами.

0
racraman 19 Янв 2022 в 11:44
Да, я понял это, но надеялся, что есть способ избежать этого.
 – 
Ido Raz
19 Янв 2022 в 12:50