diff --git a/spring-context-support/src/main/java/org/springframework/cache/jcache/JCacheCache.java b/spring-context-support/src/main/java/org/springframework/cache/jcache/JCacheCache.java index 84d2e3f9bc..2c49c9e73d 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/jcache/JCacheCache.java +++ b/spring-context-support/src/main/java/org/springframework/cache/jcache/JCacheCache.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -98,8 +98,8 @@ public class JCacheCache extends AbstractValueAdaptingCache { @Override @Nullable public ValueWrapper putIfAbsent(Object key, @Nullable Object value) { - boolean set = this.cache.putIfAbsent(key, toStoreValue(value)); - return (set ? null : get(key)); + Object previous = this.cache.invoke(key, PutIfAbsentEntryProcessor.INSTANCE, toStoreValue(value)); + return (previous != null ? toValueWrapper(previous) : null); } @Override @@ -125,6 +125,22 @@ public class JCacheCache extends AbstractValueAdaptingCache { } + private static class PutIfAbsentEntryProcessor implements EntryProcessor { + + private static final PutIfAbsentEntryProcessor INSTANCE = new PutIfAbsentEntryProcessor(); + + @Override + @Nullable + public Object process(MutableEntry entry, Object... arguments) throws EntryProcessorException { + Object existingValue = entry.getValue(); + if (existingValue == null) { + entry.setValue(arguments[0]); + } + return existingValue; + } + } + + private class ValueLoaderEntryProcessor implements EntryProcessor { @SuppressWarnings("unchecked") diff --git a/spring-context-support/src/test/java/org/springframework/cache/jcache/JCacheEhCacheApiTests.java b/spring-context-support/src/test/java/org/springframework/cache/jcache/JCacheEhCacheApiTests.java index 7a802b020d..289bb82008 100644 --- a/spring-context-support/src/test/java/org/springframework/cache/jcache/JCacheEhCacheApiTests.java +++ b/spring-context-support/src/test/java/org/springframework/cache/jcache/JCacheEhCacheApiTests.java @@ -24,9 +24,12 @@ import javax.cache.spi.CachingProvider; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.context.testfixture.cache.AbstractValueAdaptingCacheTests; +import static org.assertj.core.api.Assertions.assertThat; + /** * @author Stephane Nicoll */ @@ -79,4 +82,22 @@ public class JCacheEhCacheApiTests extends AbstractValueAdaptingCacheTests