Статья содержит код, который можно найти на GitHub project.
В данном примере представлена ситуация и ее решение в случае если необходимый spring бин отсутствет в контексте. Например, бин включается по условию.
Представим, что есть такой компонент:
@Component
@ConditionalOnProperty(value = "bean", havingValue = "true")
public class UpperCaseProcessor implements Processor {
@Override
public String process(String str) {
return str.toUpperCase();
}
}
Данный компонент будет создан только если будет задано соответствующее свойство в файле конфигурации.
bean : true
Иначе — бина не будет. И если есть код, который использует методы данного бина, мы получим исключение. Для того, чтобы избежать такой ситуации, один из вариантов — использовать для инжекта бина поле типа Optional как представлено в данном фрагменте:
@SpringBootApplication
public class EmptyBeanApplication implements ApplicationRunner {
private final Optional<Processor> processor;
В таком случае, можно обработать ситуацию, когда бин отсутствует, следующим образом:
@Override
public void run(ApplicationArguments args) {
value = processor.map(p -> p.process(value)).orElse(value);
}