Spring Cacheable,除非条件不起作用

我在Springboot中开发了一个REST端点,该端点带有一个String ID,并以一个ModelAndView进行响应。该端点标记有@Cacheable注释。现在,在给定的端点上可能会发生两件事。

情况1:请求ID存在于数据库中,并产生一个需要重定向到的URL。在这种情况下,应该缓存响应,以便在连续请求相同ID的情况下,可以从缓存中获取结果

情况2:请求的ID在数据库中不存在,因此重定向应该发生在特定的URL上,并且在这种情况下不应该进行缓存。

所以下面是我的方法

@GetMapping("{id}")
    @Cacheable(value = "url-single",key = "#id",unless = "#result.view!=\"redirect:/notfound\"")
    public ModelAndView redirect(@PathVariable("id") String id,ServletRequest servletRequest,ServletResponse servletResponse) {
        HttpServletRequest request = HttpServletRequest.class.cast(servletRequest);
        LOG.info("Redirection request from: {} for Short URL Key: {}",request.getRemoteAddr(),id);
        try {
            Optional<String> originalUrlOptional = urlManagerService.retrieveOriginalUrl(id);
            if (originalUrlOptional.isPresent() && !StringUtils.isEmpty(originalUrlOptional.get())) {
                LOG.info("Found Original URL: {} for Short URL Key: {}",originalUrlOptional.get(),id);
                return new ModelAndView("redirect:https://" + originalUrlOptional.get());
            }

        } catch (NoSuchElementException e) {
            LOG.error("Error while redirecting: {}",e.getMessage(),e);
        }
        return new ModelAndView("redirect:/notfound");
    }

如果我从here正确地理解了它,则unless中的关键字@Cacheable适用于返回类型,并且可以访问返回类型对象,我们必须将其称为#result.attributeName <comparison> <value>

那么为什么我的Redis缓存中没有存储任何内容?如果删除unless条件,则所有内容都会存储。条件不正确吗?

jiansiliangjian 回答:Spring Cacheable,除非条件不起作用

我一直在看你的除非声明:

unless = "#result.view!=\"redirect:/notfound\""

所以这意味着如果result.view没有重定向:/ notfound,它将被缓存。

我的假设是要缓存它,除非重定向:/ notfound。 这里有一个“双重否定”。

所以您可能应该使用:

unless = "#result.view==\"redirect:/notfound\""

(因此请使用'=='而不是'!=')

让我知道这是否可行!

,

使用unless条件关键字一段时间后,我发现我出了问题。 #result关键字的双引号(“)中的unless是要返回的对象,从字面上看。这意味着,您可以调用可以调用的任何方法该对象。

语句"#result.view==\"redirect:/notfound\""失败,因为该对象未公开任何名为view的成员变量。使用表达式unless = "#result.getViewName().equals(\"redirect:/notfound\")"实际上可以解决问题,因为在对象上有一个方法getViewName()返回了String并在其上调用了equals()进行了实际比较。

我想我被困在这里是因为我对 Spring Expression Language SpEL

不熟悉
本文链接:https://www.f2er.com/2759050.html

大家都在问