From 8fa0adda4ddf8abd0e7321eead4cd2f1c0f8785d Mon Sep 17 00:00:00 2001 From: Xia Zuojie Date: Tue, 23 Mar 2021 15:42:06 +0800 Subject: [PATCH 1/2] Use Mono.empty() instead of a State with null value --- sdk/src/main/java/io/dapr/client/DaprClientGrpc.java | 9 ++++++--- sdk/src/main/java/io/dapr/client/DaprClientHttp.java | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/sdk/src/main/java/io/dapr/client/DaprClientGrpc.java b/sdk/src/main/java/io/dapr/client/DaprClientGrpc.java index 92cb523f69..d9c9043101 100644 --- a/sdk/src/main/java/io/dapr/client/DaprClientGrpc.java +++ b/sdk/src/main/java/io/dapr/client/DaprClientGrpc.java @@ -283,7 +283,7 @@ public Mono> getState(GetStateRequest request, TypeRef type) { this.createMono( it -> intercept(context, asyncStub).getState(envelope, it) ) - ).map( + ).flatMap( it -> { try { return buildStateKeyValue(it, key, options, type); @@ -369,7 +369,7 @@ private State buildStateKeyValue( return new State<>(key, value, etag, item.getMetadataMap(), null); } - private State buildStateKeyValue( + private Mono> buildStateKeyValue( DaprProtos.GetStateResponse response, String requestedKey, StateOptions stateOptions, @@ -377,11 +377,14 @@ private State buildStateKeyValue( ByteString payload = response.getData(); byte[] data = payload == null ? null : payload.toByteArray(); T value = stateSerializer.deserialize(data, type); + if (value == null) { + return Mono.empty(); + } String etag = response.getEtag(); if (etag.equals("")) { etag = null; } - return new State<>(requestedKey, value, etag, response.getMetadataMap(), stateOptions); + return Mono.just(new State<>(requestedKey, value, etag, response.getMetadataMap(), stateOptions)); } /** diff --git a/sdk/src/main/java/io/dapr/client/DaprClientHttp.java b/sdk/src/main/java/io/dapr/client/DaprClientHttp.java index 76a8c6c058..3ba895c24f 100644 --- a/sdk/src/main/java/io/dapr/client/DaprClientHttp.java +++ b/sdk/src/main/java/io/dapr/client/DaprClientHttp.java @@ -350,7 +350,7 @@ public Mono> getState(GetStateRequest request, TypeRef type) { .invokeApi(DaprHttp.HttpMethods.GET.name(), pathSegments, queryParams, null, context) ).flatMap(s -> { try { - return Mono.justOrEmpty(buildState(s, key, options, type)); + return buildState(s, key, options, type); } catch (Exception ex) { return DaprException.wrapMono(ex); } @@ -513,15 +513,18 @@ public Mono deleteState(DeleteStateRequest request) { * @return A State instance * @throws IOException If there's a issue deserializing the response. */ - private State buildState( + private Mono> buildState( DaprHttp.Response response, String requestedKey, StateOptions stateOptions, TypeRef type) throws IOException { // The state is in the body directly, so we use the state serializer here. T value = stateSerializer.deserialize(response.getBody(), type); + if (value == null) { + return Mono.empty(); + } String etag = null; if (response.getHeaders() != null && response.getHeaders().containsKey("Etag")) { etag = response.getHeaders().get("Etag"); } - return new State<>(requestedKey, value, etag, stateOptions); + return Mono.just(new State<>(requestedKey, value, etag, stateOptions)); } /** From db4e6d3b77d9fc274423060a8892cb9a9231dd6a Mon Sep 17 00:00:00 2001 From: Xia Zuojie Date: Wed, 24 Mar 2021 11:29:40 +0800 Subject: [PATCH 2/2] change: only null and empty byte[] are considered empty --- sdk/src/main/java/io/dapr/client/DaprClientGrpc.java | 4 ++-- sdk/src/main/java/io/dapr/client/DaprClientHttp.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sdk/src/main/java/io/dapr/client/DaprClientGrpc.java b/sdk/src/main/java/io/dapr/client/DaprClientGrpc.java index d9c9043101..426856ff10 100644 --- a/sdk/src/main/java/io/dapr/client/DaprClientGrpc.java +++ b/sdk/src/main/java/io/dapr/client/DaprClientGrpc.java @@ -376,10 +376,10 @@ private Mono> buildStateKeyValue( TypeRef type) throws IOException { ByteString payload = response.getData(); byte[] data = payload == null ? null : payload.toByteArray(); - T value = stateSerializer.deserialize(data, type); - if (value == null) { + if (data == null || data.length == 0) { return Mono.empty(); } + T value = stateSerializer.deserialize(data, type); String etag = response.getEtag(); if (etag.equals("")) { etag = null; diff --git a/sdk/src/main/java/io/dapr/client/DaprClientHttp.java b/sdk/src/main/java/io/dapr/client/DaprClientHttp.java index 3ba895c24f..11ca07e6a8 100644 --- a/sdk/src/main/java/io/dapr/client/DaprClientHttp.java +++ b/sdk/src/main/java/io/dapr/client/DaprClientHttp.java @@ -516,10 +516,10 @@ public Mono deleteState(DeleteStateRequest request) { private Mono> buildState( DaprHttp.Response response, String requestedKey, StateOptions stateOptions, TypeRef type) throws IOException { // The state is in the body directly, so we use the state serializer here. - T value = stateSerializer.deserialize(response.getBody(), type); - if (value == null) { + if (response.getBody() == null || response.getBody().length == 0) { return Mono.empty(); } + T value = stateSerializer.deserialize(response.getBody(), type); String etag = null; if (response.getHeaders() != null && response.getHeaders().containsKey("Etag")) { etag = response.getHeaders().get("Etag");