Skip to content

Commit 38ff4c1

Browse files
committed
fix idempotency when only string
1 parent 950bac4 commit 38ff4c1

File tree

4 files changed

+60
-1
lines changed

4 files changed

+60
-1
lines changed

powertools-idempotency/src/main/java/software/amazon/lambda/powertools/idempotency/internal/IdempotencyHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ private Object handleForStatus(DataRecord record) {
127127
Class<?> returnType = ((MethodSignature) pjp.getSignature()).getReturnType();
128128
try {
129129
LOG.debug("Response for key '{}' retrieved from idempotency store, skipping the function", record.getIdempotencyKey());
130+
if (returnType.equals(String.class))
131+
return record.getResponseData();
130132
return JsonConfig.get().getObjectMapper().reader().readValue(record.getResponseData(), returnType);
131133
} catch (Exception e) {
132134
throw new IdempotencyPersistenceLayerException("Unable to get function response as " + returnType.getSimpleName(), e);

powertools-idempotency/src/main/java/software/amazon/lambda/powertools/idempotency/persistence/BasePersistenceStore.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,12 @@ public void configure(IdempotencyConfig config, String functionName) {
108108
public void saveSuccess(JsonNode data, Object result, Instant now) {
109109
ObjectWriter writer = JsonConfig.get().getObjectMapper().writer();
110110
try {
111-
String responseJson = writer.writeValueAsString(result);
111+
String responseJson;
112+
if (result instanceof String) {
113+
responseJson = (String) result;
114+
} else {
115+
responseJson = writer.writeValueAsString(result);
116+
}
112117
DataRecord record = new DataRecord(
113118
getHashedIdempotencyKey(data),
114119
DataRecord.Status.COMPLETED,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package software.amazon.lambda.powertools.idempotency.handlers;
2+
3+
import com.amazonaws.services.lambda.runtime.Context;
4+
import com.amazonaws.services.lambda.runtime.RequestHandler;
5+
import software.amazon.lambda.powertools.idempotency.Idempotent;
6+
import software.amazon.lambda.powertools.idempotency.model.Product;
7+
8+
public class IdempotencyStringFunction implements RequestHandler<Product, String> {
9+
10+
private boolean handlerCalled = false;
11+
12+
public boolean handlerCalled() {
13+
return handlerCalled;
14+
}
15+
16+
@Override
17+
@Idempotent
18+
public String handleRequest(Product input, Context context) {
19+
handlerCalled = true;
20+
return input.getName();
21+
}
22+
}

powertools-idempotency/src/test/java/software/amazon/lambda/powertools/idempotency/internal/IdempotencyAspectTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,36 @@ public void secondCall_notExpired_shouldGetFromStore() throws JsonProcessingExce
114114
assertThat(function.handlerCalled()).isFalse();
115115
}
116116

117+
@Test
118+
public void secondCall_notExpired_shouldGetStringFromStore() {
119+
// GIVEN
120+
Idempotency.config()
121+
.withPersistenceStore(store)
122+
.withConfig(IdempotencyConfig.builder()
123+
.withEventKeyJMESPath("id")
124+
.build()
125+
).configure();
126+
127+
doThrow(IdempotencyItemAlreadyExistsException.class).when(store).saveInProgress(any(), any());
128+
129+
Product p = new Product(42, "fake product", 12);
130+
DataRecord record = new DataRecord(
131+
"42",
132+
DataRecord.Status.COMPLETED,
133+
Instant.now().plus(356, SECONDS).getEpochSecond(),
134+
p.getName(),
135+
null);
136+
doReturn(record).when(store).getRecord(any(), any());
137+
138+
// WHEN
139+
IdempotencyStringFunction function = new IdempotencyStringFunction();
140+
String name = function.handleRequest(p, context);
141+
142+
// THEN
143+
assertThat(name).isEqualTo(p.getName());
144+
assertThat(function.handlerCalled()).isFalse();
145+
}
146+
117147
@Test
118148
public void secondCall_inProgress_shouldThrowIdempotencyAlreadyInProgressException() throws JsonProcessingException {
119149
// GIVEN

0 commit comments

Comments
 (0)