Spring中Service类String参数方法加@Cacheable报错的问题
问题分析与解决方案
你遇到的两个错误,核心原因是导入了错误的@Cacheable注解包,以及可能未开启Spring缓存支持,具体分析和解决步骤如下:
错误原因拆解
@Cacheable注解位置不合法:
若你导入的是javax.cache.annotation.Cacheable(JSR-107标准注解),该注解通常要求标注在接口方法上,而非类的实现方法,因此IDE会提示位置不允许。String转boolean类型不匹配:
javax.cache.annotation.Cacheable的第一个参数是condition(接收返回boolean的EL表达式字符串),而非缓存名称。当你写@Cacheable("zip-city-state")时,字符串会被传递给condition参数,Spring解析时会尝试将其转为布尔值,从而触发类型转换错误。
解决方案
1. 导入正确的Spring Cache注解
确保使用Spring框架提供的@Cacheable,替换错误的导入语句:
import org.springframework.cache.annotation.Cacheable;
2. 开启Spring缓存支持
在Spring Boot的启动类或配置类上添加@EnableCaching注解,启用缓存功能:
import org.springframework.cache.annotation.EnableCaching; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @EnableCaching public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
3. 修正后的Service代码
import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service public class AddressService { @Cacheable("zip-city-state") public CityState getCityState(String zipcode) { // ... DAO calls // ... Stored Procedure calls return cityStateResult; } }
补充说明
- 关于缓存键:你无需额外配置
key属性,Spring Cache默认会将方法的单个参数(这里的zipcode)作为缓存键,完全符合你的需求。 - 缓存管理器:Spring Boot默认会自动配置
ConcurrentMapCacheManager用于本地缓存,若需要分布式缓存(如Redis),只需添加对应依赖并配置即可。
内容的提问来源于stack exchange,提问作者gene b.
相关产品推荐
相关产品推荐

