Skip to content

Commit e66412c

Browse files
committed
fix: use custom JSON parsing for eval targetId to not crash when target_id is not defined on the API response from the DevCycle Bucketing API
1 parent 9755b9f commit e66412c

File tree

3 files changed

+53
-10
lines changed

3 files changed

+53
-10
lines changed

src/main/java/com/devcycle/sdk/server/common/api/IDevCycleApi.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,24 @@
11
package com.devcycle.sdk.server.common.api;
22

3-
import com.devcycle.sdk.server.common.model.*;
3+
import java.util.Map;
4+
5+
import com.devcycle.sdk.server.common.model.BaseVariable;
6+
import com.devcycle.sdk.server.common.model.DevCycleResponse;
7+
import com.devcycle.sdk.server.common.model.DevCycleUser;
8+
import com.devcycle.sdk.server.common.model.DevCycleUserAndEvents;
9+
import com.devcycle.sdk.server.common.model.Feature;
10+
import com.devcycle.sdk.server.common.model.ProjectConfig;
11+
import com.devcycle.sdk.server.common.model.Variable;
412
import com.devcycle.sdk.server.local.model.EventsBatch;
5-
import retrofit2.Call;
6-
import retrofit2.http.*;
713

8-
import java.util.Map;
14+
import retrofit2.Call;
15+
import retrofit2.http.Body;
16+
import retrofit2.http.GET;
17+
import retrofit2.http.Header;
18+
import retrofit2.http.Headers;
19+
import retrofit2.http.POST;
20+
import retrofit2.http.Path;
21+
import retrofit2.http.Query;
922

1023
public interface IDevCycleApi {
1124
/**

src/main/java/com/devcycle/sdk/server/common/model/EvalReason.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
package com.devcycle.sdk.server.common.model;
22

3+
import java.io.IOException;
4+
35
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
46
import com.fasterxml.jackson.annotation.JsonInclude;
57
import com.fasterxml.jackson.annotation.JsonProperty;
8+
import com.fasterxml.jackson.core.JsonParser;
9+
import com.fasterxml.jackson.databind.DeserializationContext;
10+
import com.fasterxml.jackson.databind.JsonDeserializer;
11+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
612

713
import io.swagger.v3.oas.annotations.media.Schema;
814
import lombok.AllArgsConstructor;
@@ -24,7 +30,8 @@ public class EvalReason {
2430

2531
@Schema(description = "Target ID")
2632
@JsonProperty("target_id")
27-
@JsonInclude(value=JsonInclude.Include.NON_EMPTY, content=JsonInclude.Include.NON_NULL)
33+
@JsonInclude(value=JsonInclude.Include.NON_NULL)
34+
@JsonDeserialize(using = TargetIdDeserializer.class)
2835
private String targetId;
2936

3037
private EvalReason(String reason, String details) {
@@ -33,13 +40,33 @@ private EvalReason(String reason, String details) {
3340
}
3441

3542
public static EvalReason defaultReason(DefaultReasonDetailsEnum details) {
36-
return new EvalReason("DEFAULT", details.getValue());
43+
String defaultDetails = details.getValue();
44+
System.out.println("Setting default reason to " + defaultDetails);
45+
return new EvalReason("DEFAULT", defaultDetails);
3746
}
3847

3948
public String getReason() {
4049
return reason == null ? "UNKNOWN" : reason;
4150
}
4251

52+
// Simple deserializer to handle target_id as string or object
53+
public static class TargetIdDeserializer extends JsonDeserializer<String> {
54+
@Override
55+
public String deserialize(JsonParser parser, DeserializationContext context) throws IOException {
56+
// Skip the current token and read the value as Object
57+
Object value = parser.readValueAs(Object.class);
58+
59+
if (value == null) {
60+
return null;
61+
} else if (value instanceof String) {
62+
return (String) value;
63+
} else {
64+
// For any other type (object, number, boolean), convert to string
65+
return value.toString();
66+
}
67+
}
68+
}
69+
4370
public enum DefaultReasonDetailsEnum {
4471
MISSING_CONFIG("Missing Config"),
4572
USER_NOT_TARGETED("User Not Targeted"),

src/main/java/com/devcycle/sdk/server/common/model/Variable.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import java.util.HashMap;
44
import java.util.LinkedHashMap;
55

6+
import com.fasterxml.jackson.annotation.JsonIgnore;
67
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
8+
import com.fasterxml.jackson.annotation.JsonProperty;
79
import com.fasterxml.jackson.annotation.JsonValue;
810

911
import io.swagger.v3.oas.annotations.media.Schema;
@@ -33,13 +35,14 @@ public class Variable<T> {
3335
@Builder.Default
3436
private Boolean isDefaulted = false;
3537

36-
@Builder.Default
37-
@Deprecated()
38-
private String evalReason = null;
39-
4038
@Schema(description = "Evaluation reason")
39+
@JsonProperty("eval")
4140
private EvalReason eval;
4241

42+
@Deprecated()
43+
@JsonIgnore
44+
private final String evalReason = null;
45+
4346
public enum TypeEnum {
4447
STRING("String"),
4548
BOOLEAN("Boolean"),

0 commit comments

Comments
 (0)