Язык весеннего выражения: @Bean не может найти себя - PullRequest
0 голосов
/ 27 августа 2018

В моем классе SimpleBookRepository я пытаюсь получить доступ к методу экземпляра из аннотации @Cacheable Spring, чтобы определить, использовать ли мне кэширование или нет. Когда я пытаюсь запустить приложение, оно не запускается и сообщает мне:

Описание:

Для компонента требуется компонент с именем SimpleBookRepository, который не может быть найден.

Действие:

Рассмотрите возможность определения bean-компонента с именем SimpleBookRepository в вашей конфигурации.

Это меня очень смущает, потому что приложение отлично работает, когда я удаляю бит условие = "@ SimpleBookRepository.useCache ()". Я бы подумал, что оценка состояния и, следовательно, разрешение бина будут происходить во время выполнения после автопроводки, и было бы невозможно вызвать метод getByIsbn () без существующего бина. Даже когда я явно объявляю bean-компонент в конфигурации, например:

@Bean
public SimpleBookRepository simpleBookRepository(){
    return new SimpleBookRepository();
}

Я получаю ту же ошибку.

Я был бы очень признателен, если бы кто-то мог объяснить мне это поведение.

У меня есть следующие классы:

SimpleBookRepository.java

package com.mycompany.app;

@Component
public class SimpleBookRepository implements BookRepository{

    @Value("${cache.use}")
    private boolean useCache;

    public boolean useCache(){
        return useCache;
    }

    @Override
    @Cacheable(cacheNames="books", condition = "@SimpleBookRepository.useCache()")
    public Book getByIsbn(String isbn){
        //Get mock data
    }

}

Application.java

package com.mycompany.app;

@SpringBootApplication
@EnableCaching
public class Application {

    public static void main(String[] args){
        SpringApplication.run(Application.class, args);
    }

}

CachingConfiguration.java

package com.mycompany.app;

@EnableCaching
@EnableAutoConfiguration
@Configuration
public class CachingConfiguration {
    //Configure CacheManager bean
}

AppRunner.java

package com.mycompany.app;

@Component
public class AppRunner implements CommandLineRunner {

    private static final Logger logger = LoggerFactory.getLogger(AppRunner.class);
    private final BookService bookService;

    @Autowired
    public AppRunner(BookService bookService){
        this.bookService = bookService;
    }

    @Override
    public void run(String... args) throws Exception{
        getBooks();

    }
}

BookService.java

package com.mycompany.app;

@Service
public class BookService {

    private BookRepository bookRepository;

    @Autowired
    public BookService(BookRepository bookRepository){
        this.bookRepository = bookRepository;
    }

    public Book getByIsbn(String isbn){
        return bookRepository.getByIsbn(isbn);
    }

}

BookRepository.java

package com.mycompany.app

@Component
public interface BookRepository {

    Book getByIsbn(String isbn);

}

1 Ответ

0 голосов
/ 27 августа 2018

Я на самом деле только что нашел правильный способ делать то, что я хочу в SpEL. Я изменил условие на

condition = "#root.target.useCache()"

Спасибо всем, кто ответил.

...