0

我有一个注释为的方法,@Cacheable并且 Gemfire 也配置为缓存。

该方法在返回 Not Null 值时工作正常。但是如果它返回 Null 则 Gemfire 会抛出异常,如下所示:

Caused by: java.lang.NullPointerException: value must not be null
com.gemstone.gemfire.internal.cache.LocalRegion.newUpdateEntryEvent(LocalRegion.java:1744)
at com.gemstone.gemfire.internal.cache.LocalRegion.put(LocalRegion.java:1705)
at com.gemstone.gemfire.internal.cache.AbstractRegion.put(AbstractRegion.java:286)
at org.springframework.data.gemfire.support.GemfireCache.put(GemfireCache.java:68)

方法如下:

    @Override
    @Cachable("date_cache")     
    public String getData(String value){
       return myDataRepository.getLabelByValue(value);
    }

如果 myDataRepository.getLabelByValue(value)为 null,则在 Gemfire 中抛出 NullPointerException,并且从数据库中返回一些数据,然后它可以正常工作。

如果有任何配置可以忽略 Gemfire 中的空值缓存,请提供帮助。

4

1 回答 1

0

在查看 GemFire 的源代码时,没有办法(例如 GemFire 分布式配置系统属性)来避免 NPE...

1744: if (value == null) { 1745: throw new NullPointerException(LocalizedStrings 1746: .LocalRegion_VALUE_MUST_NOT_BE_NULL.toLocalizedString()); 1747: }

抱歉,很遗憾,您的数据存储库必须返回非空值。这甚至适用于 GemFire 8(新版本)。

在短期内,您始终可以通过扩展 Spring Data GemFire 的CacheManager .getCache() 方法来解决此限制,以返回一个包装版本的Cache,该版本丢弃 put(key, value) 上的空值,这有点额外的工作,或者等待JIRA-327

于 2014-09-13T09:04:13.957 回答