Обработка отсутствующих в контексте spring бинов

Статья содержит код, который можно найти на 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);
}