Spring рекомендует аннотировать только конкретные классы (и методы конкретных классов) аннотацией @ Cache *, вместо аннотирования интерфейсов. Вы, конечно, можете разместить аннотацию @ Cache * на интерфейсе (или методе интерфейса), но это работает только так, как вы ожидаете, если вы используете прокси на основе интерфейса. Тот факт, что аннотации Java не наследуются от интерфейсов, означает, что если вы используете прокси на основе классов (proxy-target-class = "true") или аспект на основе ткачества (mode = "aspectj"), тогда настройки кеширования будут не распознается инфраструктурой проксирования и переплетения, и объект не будет заключен в кэширующий прокси, что было бы определенно плохо.
Вероятно, ваша конфигурация кеша противоречит тому, как Spring создает реализации интерфейсов вашего репозитория во время выполнения.
Вы можете проверить свою конфигурацию кеширования, чтобы она хорошо взаимодействовала с данными Spring (см. здесь для различных вариантов конфигурации кеширования).
Или вы можете сделать это:
В итоге я использовал ваш второй вариант через службу и кэшировал его. Я считаю это довольно громоздким, так как вам нужна дополнительная услуга. Я ожидал, что люди Spring также включат @Cacheable в репозиториях. Спасибо за ответ!
public interface SiteRepository extends PagingAndSortingRepository<Site, String>{
List<Site> findByStatus(Site.Status status);
}
@Service
public class CachedSiteService {
@Autowired
private SiteRepository siteRepository;
@Cacheable("sites")
List<Site> findByStatus(Site.Status status) {
return siteRepository.findByStatus(status);
}
}
person
ESala
schedule
29.10.2015