我们有一个场景,需要使用管理员帐户更新userPriceGroup.根据用户级别的不同,我们网站中的一个产品可以有多个价格.当我们调用ProductsController的此终结点/{base SiteId}/Products/{ProductCode}时,就会出现问题.在更改层后,它不会立即返回正确的价格.我们注意到,在返回正确的响应时会有轻微延迟.然后,我们再次判断了控制器,并注意到@cacheable注释.有没有办法在我们的后端禁用下面的代码?我们是否需要覆盖此控制器并在该子控制器中删除@cacheable?提前感谢任何能在我们的困境中提供知识的人.

@CacheControl(directive = CacheControlDirective.PRIVATE, maxAge = 120)
    @Cacheable(value = "productCache", key = "T(de.hybris.platform.commercewebservicescommons.cache.CommerceCacheKeyGenerator).generateKey(true,true,#productCode,#fields)")

Scenario:个 管理员将层从青铜更改为黄金

  • 铜价:582
  • 金价:552
  • 预计在层更新后:552
  • 等级更新后的实际值:582

推荐答案

在Hybra中,@Cacheable注释用于缓存方法的结果,它可能会影响控制器的响应时间.如果要禁用特定控制器或方法的缓存,可以考虑以下几种方法:

方法1:覆盖控制器

您可以通过扩展现有的ProductsController来创建自定义控制器,并覆盖使用@Cacheable的特定方法.在您的自定义控制器中,您可以 Select 不使用@Cacheable.

@Controller
@RequestMapping(value = "/{baseSiteId}/products")
public class CustomProductsController extends ProductsController {

    @Override
    @CacheControl(directive = CacheControlDirective.PRIVATE, maxAge = 120)
    public ProductData getProductForCodeAndOptions(@PathVariable final String baseSiteId,
                                                  @PathVariable final String productCode,
                                                  @RequestParam(required = false) final Set<Options> options,
                                                  @RequestParam(defaultValue = DEFAULT_FIELD_SET) final String fields) {
        // Your custom logic without @Cacheable
    }
}

Approach 2: Use SpEL Expression in @Cacheable

如果您想要更细粒度的控制,可以使用@Cacheable批注中的Spel(Spring表达式语言)来有条件地启用或禁用缓存.

@CacheControl(directive = CacheControlDirective.PRIVATE, maxAge = 120)
@Cacheable(value = "productCache", key = "T(de.hybris.platform.commercewebservicescommons.cache.CommerceCacheKeyGenerator).generateKey(true,true,#productCode,#fields)", condition = "#useCache")
public ProductData getProductForCodeAndOptions(@PathVariable final String baseSiteId,
                                              @PathVariable final String productCode,
                                              @RequestParam(required = false) final Set<Options> options,
                                              @RequestParam(defaultValue = DEFAULT_FIELD_SET) final String fields,
                                              @RequestParam(defaultValue = "true") boolean useCache) {
    // Your method logic
}

在这种方法中,您可以将一个参数(useCache)传递给该方法,并根据它的值控制缓存.

Java相关问答推荐

@ EnableRouting注释在Kotlin项目中不工作

当切换javaFX场景时,stage的大小正在Minimize

Cucumber TestNG Assert失败,出现java. lang. Numbercycle异常

取消按钮,但没有任何操作方法引发和异常

使用动态ID从json获取详细信息的Jolt规范

我找不到&Quot;配置&的位置

在Java 17中使用两个十进制数字分析时间时出错,但在Java 8中成功

将Spring Boot 3.2.0升级到3.2.1后查询执行错误

try 从REST API返回对象列表时出错

Java Telnet客户端重复的IAC符号

在Ubuntu 23.10上使用mp3创建JavaFX MediaPlayer时出错

Java.lang.invke.LambdaConversionException:实例方法InvokeVirtual的参数数量不正确

Oj算法 MatrixR032从字符串、归一化和余弦相似度计算创建

我如何为我的Java抵押贷款代码执行加薪操作(&Q)

寻找Thread.sky()方法的清晰度

嘲笑黄瓜中的对象

如何通过Java java.lang.Foreign API访问本机字节数组

在Java Spring JPA中插入包含对其他实体的引用的列

多线程、并发和睡眠未按预期工作

try 添加;按流派搜索;在Web应用程序上,但没有;I don’我不知道;It’这个代码错了