From df9cfd241a4c22f682c593926067c74ad1d66996 Mon Sep 17 00:00:00 2001 From: Richard Startin Date: Sun, 30 Jan 2022 12:10:58 +0000 Subject: [PATCH] respect SUPPRESS_EXCEPTIONS configuration (#767) --- .../internal/path/EvaluationContextImpl.java | 14 +++++++-- .../jsonpath/TestSuppressExceptions.java | 31 +++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 json-path/src/test/java/com/jayway/jsonpath/TestSuppressExceptions.java diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/path/EvaluationContextImpl.java b/json-path/src/main/java/com/jayway/jsonpath/internal/path/EvaluationContextImpl.java index 3fc7e487..0d35c9dd 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/path/EvaluationContextImpl.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/path/EvaluationContextImpl.java @@ -48,6 +48,7 @@ public class EvaluationContextImpl implements EvaluationContext { private final List updateOperations; private final HashMap documentEvalCache = new HashMap(); private final boolean forUpdate; + private final boolean suppressExceptions; private int resultIndex = 0; @@ -61,7 +62,8 @@ public class EvaluationContextImpl implements EvaluationContext { this.configuration = configuration; this.valueResult = configuration.jsonProvider().createArray(); this.pathResult = configuration.jsonProvider().createArray(); - this.updateOperations = new ArrayList(); + this.updateOperations = new ArrayList<>(); + this.suppressExceptions = configuration.containsOption(Option.SUPPRESS_EXCEPTIONS); } public HashMap documentEvalCache() { @@ -129,7 +131,10 @@ public class EvaluationContextImpl implements EvaluationContext { @Override public T getValue(boolean unwrap) { if (path.isDefinite()) { - if(resultIndex == 0){ + if(resultIndex == 0) { + if (suppressExceptions) { + return null; + } throw new PathNotFoundException("No results for path: " + path.toString()); } int len = jsonProvider().length(valueResult); @@ -145,7 +150,10 @@ public class EvaluationContextImpl implements EvaluationContext { @SuppressWarnings("unchecked") @Override public T getPath() { - if(resultIndex == 0){ + if(resultIndex == 0) { + if (suppressExceptions) { + return null; + } throw new PathNotFoundException("No results for path: " + path.toString()); } return (T)pathResult; diff --git a/json-path/src/test/java/com/jayway/jsonpath/TestSuppressExceptions.java b/json-path/src/test/java/com/jayway/jsonpath/TestSuppressExceptions.java new file mode 100644 index 00000000..f0e1fba6 --- /dev/null +++ b/json-path/src/test/java/com/jayway/jsonpath/TestSuppressExceptions.java @@ -0,0 +1,31 @@ +package com.jayway.jsonpath; + +import com.jayway.jsonpath.spi.json.JacksonJsonProvider; +import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider; +import org.junit.Test; + +import static org.junit.Assert.assertNull; + + +public class TestSuppressExceptions { + + @Test + public void testSuppressExceptionsIsRespected() { + ParseContext parseContext = JsonPath.using( + new Configuration.ConfigurationBuilder().jsonProvider(new JacksonJsonProvider()) + .mappingProvider(new JacksonMappingProvider()).options(Option.SUPPRESS_EXCEPTIONS) + .build()); + String json = "{}"; + assertNull(parseContext.parse(json).read(JsonPath.compile("$.missing"))); + } + + @Test + public void testSuppressExceptionsIsRespectedPath() { + ParseContext parseContext = JsonPath.using( + new Configuration.ConfigurationBuilder().jsonProvider(new JacksonJsonProvider()) + .mappingProvider(new JacksonMappingProvider()).options(Option.SUPPRESS_EXCEPTIONS, Option.AS_PATH_LIST) + .build()); + String json = "{}"; + assertNull(parseContext.parse(json).read(JsonPath.compile("$.missing"))); + } +}