【发布时间】:2018-12-24 16:19:15
【问题描述】:
我在 Spring Boot 中遇到了这个奇怪的问题,@Cacheable 在控制器中工作,但不在服务内部。我可以在 Redis 中看到 GET 调用,但看不到 PUT 调用。
这是有效的,因为它在控制器内部
@RestController
@RequestMapping(value="/places")
public class PlacesController {
private AwesomeService awesomeService;
@Autowired
public PlacesController(AwesomeService awesomeService) {
this.awesomeService = awesomeService;
}
@GetMapping(value = "/search")
@Cacheable(value = "com.example.webservice.controller.PlacesController", key = "#query", unless = "#result != null")
public Result search(@RequestParam(value = "query") String query) {
return this.awesomeService.queryAutoComplete(query);
}
}
但是当我在这样的服务中这样做时,@Cacheable 不起作用
@Service
public class AwesomeApi {
private final RestTemplate restTemplate = new RestTemplate();
@Cacheable(value = "com.example.webservice.api.AwesomeApi", key = "#query", unless = "#result != null")
public ApiResult queryAutoComplete(String query) {
try {
return restTemplate.getForObject(query, ApiResult.class);
} catch (Throwable e) {
return null;
}
}
}
我可以在 Redis 中看到 GET 调用,但看不到 PUT 调用。
【问题讨论】:
-
它永远不会像你有
unless = "#result != null"那样缓存,这意味着如果结果不是null,就不要缓存。所以方法调用的实际结果永远不会被缓存。基本上unless与condition上的@Cachable注释相反。
标签: spring-boot redis spring-restcontroller spring-cache