Skip to content

Commit fa59d56

Browse files
authored
Be more lenient when deserializing error parameters (#1085)
Be more lenient when deserializing error parameters
1 parent 493f9ca commit fa59d56

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

errors/src/main/java/com/palantir/conjure/java/api/errors/SerializableError.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,15 @@
1818

1919
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
2020
import com.fasterxml.jackson.annotation.JsonProperty;
21+
import com.fasterxml.jackson.core.JsonParser;
22+
import com.fasterxml.jackson.databind.DeserializationContext;
23+
import com.fasterxml.jackson.databind.JsonDeserializer;
24+
import com.fasterxml.jackson.databind.JsonNode;
2125
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
2226
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
2327
import com.palantir.logsafe.Arg;
2428
import com.palantir.logsafe.exceptions.SafeIllegalStateException;
29+
import java.io.IOException;
2530
import java.io.Serializable;
2631
import java.util.Map;
2732
import java.util.Objects;
@@ -82,6 +87,7 @@ public String errorInstanceId() {
8287
}
8388

8489
/** A set of parameters that further explain the error. */
90+
@JsonDeserialize(contentUsing = ParameterDeserializer.class)
8591
public abstract Map<String, String> parameters();
8692

8793
/**
@@ -129,4 +135,18 @@ public static final class Builder extends ImmutableSerializableError.Builder {}
129135
public static Builder builder() {
130136
return new Builder();
131137
}
138+
139+
static final class ParameterDeserializer extends JsonDeserializer<String> {
140+
141+
@Override
142+
public String deserialize(JsonParser parser, DeserializationContext _ctxt) throws IOException {
143+
JsonNode node = parser.readValueAsTree();
144+
String textValue = node.textValue();
145+
if (textValue != null) {
146+
return textValue;
147+
} else {
148+
return node.toString();
149+
}
150+
}
151+
}
132152
}

errors/src/test/java/com/palantir/conjure/java/api/errors/SerializableErrorTest.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,61 @@ public void testDeserializationFailsWhenNeitherErrorNameNorMessageIsSet() {
193193
.hasNoArgs();
194194
}
195195

196+
@Test
197+
public void testDeserializeWithJsonObjectParameter() throws Exception {
198+
String serialized = "{\"errorCode\":\"PERMISSION_DENIED\",\"errorName\":\"Product:SomethingBroke\","
199+
+ "\"parameters\":{\"key\":{\"nested\": \"value\"}}}";
200+
assertThat(deserialize(serialized))
201+
.isEqualTo(SerializableError.builder()
202+
.from(ERROR)
203+
.putParameters("key", "{\"nested\":\"value\"}")
204+
.build());
205+
}
206+
207+
@Test
208+
public void testDeserializeWithJsonArrayParameter() throws Exception {
209+
String serialized = "{\"errorCode\":\"PERMISSION_DENIED\",\"errorName\":\"Product:SomethingBroke\","
210+
+ "\"parameters\":{\"key\":[\"nested\"]}}";
211+
assertThat(deserialize(serialized))
212+
.isEqualTo(SerializableError.builder()
213+
.from(ERROR)
214+
.putParameters("key", "[\"nested\"]")
215+
.build());
216+
}
217+
218+
@Test
219+
public void testDeserializeWithJsonBooleanParameter() throws Exception {
220+
String serialized = "{\"errorCode\":\"PERMISSION_DENIED\",\"errorName\":\"Product:SomethingBroke\","
221+
+ "\"parameters\":{\"key\":true}}";
222+
assertThat(deserialize(serialized))
223+
.isEqualTo(SerializableError.builder()
224+
.from(ERROR)
225+
.putParameters("key", "true")
226+
.build());
227+
}
228+
229+
@Test
230+
public void testDeserializeWithJsonNumberParameter() throws Exception {
231+
String serialized = "{\"errorCode\":\"PERMISSION_DENIED\",\"errorName\":\"Product:SomethingBroke\","
232+
+ "\"parameters\":{\"key\":1.1}}";
233+
assertThat(deserialize(serialized))
234+
.isEqualTo(SerializableError.builder()
235+
.from(ERROR)
236+
.putParameters("key", "1.1")
237+
.build());
238+
}
239+
240+
@Test
241+
public void testDeserializeWithJsonStringParameter() throws Exception {
242+
String serialized = "{\"errorCode\":\"PERMISSION_DENIED\",\"errorName\":\"Product:SomethingBroke\","
243+
+ "\"parameters\":{\"key\":\"value\"}}";
244+
assertThat(deserialize(serialized))
245+
.isEqualTo(SerializableError.builder()
246+
.from(ERROR)
247+
.putParameters("key", "value")
248+
.build());
249+
}
250+
196251
private static SerializableError deserialize(String serialized) throws IOException {
197252
return mapper.readValue(serialized, SerializableError.class);
198253
}

0 commit comments

Comments
 (0)