Memcached + SpringBoot 从常量文件中读取缓存键值

Memcached + SpringBoot read cache key value from a constant file

我想在缓存和清除数据时从 java 常量文件中读取内存缓存密钥。我不想从 属性 文件中读取,只是从常量文件中读取。

例如在缓存数据时:

BookConstant.java

public class BookConstant
{
    public static final String CACHE_BY_BOOK_ID = "book_id";
}

BookServiceImpl.java

@Override
@Cacheable(cacheNames = BookConstant.CACHE_NAME, key = "#BookConstant.CACHE_BY_BOOK_ID + '_' + #id")
public Book getById(Long id)
{
    Optional<Book> book = bookRepository.findById(id);
    return book.orElse(null);
}

我的目的是生成密钥:

book_id_1234

并且在逐出数据时:

@Override
public Book updateBook(Book book)
{
    book.setModifiedDate(new Date());
    Book newBook = bookRepository.save(book);

    bookSearchService.insertBookIndex(newBook);

    memcachedClient.evict(BookConstant.CACHE_BY_BOOK_ID + "_" + book.getId());

    return newBook;
}

所以它在缓存数据时抛出错误:

SpelEvaluationException: EL1007E: Property or field 'CACHE_BY_BOOK_ID' cannot be found on null

因为它尝试从 属性 文件中读取密钥。

我不确定是否可以动态地从常量文件中读取密钥,但这就是问题所在。如果可能的话,你能帮帮我吗?谢谢。

用于访问 @Cacheable 注释中使用的常量值的 SpEL 不正确。您需要使用包指定完整的 class 名称,例如如果你的包裹是 com.example 那么指定它是这样的:

@Cacheable(cacheNames = BookConstant.CACHE_NAME, key = "T(com.example.BookConstant).CACHE_BY_BOOK_ID + '_' + #id")
public Book getById(Long id) {
    //...
}

对于更新,您不需要直接使用 memcachedClient 逐出,而是使用 @CacheEvict 注释,例如

@CacheEvict(cacheNames = BookConstant.CACHE_NAME, key = "T(com.example.BookConstant).CACHE_BY_BOOK_ID + '_' + #book.id")
public Book updateBook(Book book) {
    // ...
}