diff --git a/json-utils/pom.xml b/json-utils/pom.xml
index eb92b634..64d55468 100644
--- a/json-utils/pom.xml
+++ b/json-utils/pom.xml
@@ -20,7 +20,7 @@
https://github.com/sonallux/spotify-web-api
- 2.6.0
+ 2.7.0
de.sonallux.spotify.json
diff --git a/json-utils/src/main/java/de/sonallux/json/patching/AddOperation.java b/json-utils/src/main/java/de/sonallux/json/patching/AddOperation.java
index 4060cbe7..8f8ec2ed 100644
--- a/json-utils/src/main/java/de/sonallux/json/patching/AddOperation.java
+++ b/json-utils/src/main/java/de/sonallux/json/patching/AddOperation.java
@@ -24,7 +24,7 @@ public JsonNode apply(JsonNode node) throws PatchException {
var jsonPath = JsonPath.compile(path);
return jsonPath.add(node.deepCopy(), value, JSON_PATH_CONFIG);
} catch (JsonPathException e) {
- throw new PatchException(e.getMessage(), e);
+ throw wrapException(e);
}
}
}
diff --git a/json-utils/src/main/java/de/sonallux/json/patching/DeleteOperation.java b/json-utils/src/main/java/de/sonallux/json/patching/DeleteOperation.java
index f258dffe..aa6dc5f2 100644
--- a/json-utils/src/main/java/de/sonallux/json/patching/DeleteOperation.java
+++ b/json-utils/src/main/java/de/sonallux/json/patching/DeleteOperation.java
@@ -18,7 +18,7 @@ public JsonNode apply(JsonNode node) throws PatchException {
var jsonPath = JsonPath.compile(path);
return jsonPath.delete(node.deepCopy(), JSON_PATH_CONFIG);
} catch (JsonPathException e) {
- throw new PatchException(e.getMessage(), e);
+ throw wrapException(e);
}
}
}
diff --git a/json-utils/src/main/java/de/sonallux/json/patching/PatchOperation.java b/json-utils/src/main/java/de/sonallux/json/patching/PatchOperation.java
index 74cc7389..36b067a8 100644
--- a/json-utils/src/main/java/de/sonallux/json/patching/PatchOperation.java
+++ b/json-utils/src/main/java/de/sonallux/json/patching/PatchOperation.java
@@ -4,6 +4,7 @@
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jayway.jsonpath.Configuration;
+import com.jayway.jsonpath.JsonPathException;
import com.jayway.jsonpath.spi.json.JacksonJsonNodeJsonProvider;
import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider;
import lombok.AccessLevel;
@@ -41,4 +42,12 @@ public abstract class PatchOperation {
protected final String path;
public abstract JsonNode apply(JsonNode node) throws PatchException;
+
+ protected PatchException wrapException(JsonPathException e) {
+ var message = e.getMessage();
+ if (message == null) {
+ message = e.getClass().getSimpleName();
+ }
+ return new PatchException(message, e);
+ }
}
diff --git a/json-utils/src/main/java/de/sonallux/json/patching/PutOperation.java b/json-utils/src/main/java/de/sonallux/json/patching/PutOperation.java
index ec7689c6..17a2bd3e 100644
--- a/json-utils/src/main/java/de/sonallux/json/patching/PutOperation.java
+++ b/json-utils/src/main/java/de/sonallux/json/patching/PutOperation.java
@@ -29,7 +29,7 @@ public JsonNode apply(JsonNode node) throws PatchException {
var jsonPath = JsonPath.compile(path);
return jsonPath.put(node.deepCopy(), key, value, JSON_PATH_CONFIG);
} catch (JsonPathException e) {
- throw new PatchException(e.getMessage(), e);
+ throw wrapException(e);
}
}
}
diff --git a/json-utils/src/main/java/de/sonallux/json/patching/RenameOperation.java b/json-utils/src/main/java/de/sonallux/json/patching/RenameOperation.java
index a4983161..ef8c1cb3 100644
--- a/json-utils/src/main/java/de/sonallux/json/patching/RenameOperation.java
+++ b/json-utils/src/main/java/de/sonallux/json/patching/RenameOperation.java
@@ -29,7 +29,7 @@ public JsonNode apply(JsonNode node) throws PatchException {
var jsonPath = JsonPath.compile(path);
return jsonPath.renameKey(node.deepCopy(), oldKey, newKey, JSON_PATH_CONFIG);
} catch (JsonPathException e) {
- throw new PatchException(e.getMessage(), e);
+ throw wrapException(e);
}
}
}
diff --git a/json-utils/src/main/java/de/sonallux/json/patching/SetOperation.java b/json-utils/src/main/java/de/sonallux/json/patching/SetOperation.java
index 6b7a9ebd..751efc7e 100644
--- a/json-utils/src/main/java/de/sonallux/json/patching/SetOperation.java
+++ b/json-utils/src/main/java/de/sonallux/json/patching/SetOperation.java
@@ -25,7 +25,7 @@ public JsonNode apply(JsonNode node) throws PatchException {
var jsonPath = JsonPath.compile(path);
return jsonPath.set(node.deepCopy(), value, JSON_PATH_CONFIG);
} catch (JsonPathException e) {
- throw new PatchException(e.getMessage(), e);
+ throw wrapException(e);
}
}
}
diff --git a/json-utils/src/main/java/de/sonallux/json/patching/TestOperation.java b/json-utils/src/main/java/de/sonallux/json/patching/TestOperation.java
index 02c33227..963f6167 100644
--- a/json-utils/src/main/java/de/sonallux/json/patching/TestOperation.java
+++ b/json-utils/src/main/java/de/sonallux/json/patching/TestOperation.java
@@ -38,7 +38,7 @@ public JsonNode apply(JsonNode node) throws PatchException {
throw new PatchException("Path did not exist", e);
}
catch (JsonPathException e) {
- throw new PatchException(e.getMessage(), e);
+ throw wrapException(e);
}
}
}
diff --git a/json-utils/src/test/java/de/sonallux/json/patching/DeleteOperationTest.java b/json-utils/src/test/java/de/sonallux/json/patching/DeleteOperationTest.java
index 8f75285c..5d3c850e 100644
--- a/json-utils/src/test/java/de/sonallux/json/patching/DeleteOperationTest.java
+++ b/json-utils/src/test/java/de/sonallux/json/patching/DeleteOperationTest.java
@@ -31,6 +31,16 @@ void testOperationIsApplied(OperationTestData.SuccessTestCase t
assertPatchIsApplied(testCase);
}
+ static Stream testOperationThrowsError() {
+ return testData.failureCases.stream().map(Arguments::of);
+ }
+
+ @ParameterizedTest
+ @MethodSource
+ void testOperationThrowsError(OperationTestData.FailureTestCase testCase) {
+ assertPatchThrowsError(testCase);
+ }
+
@Test
void testDeserialization() throws IOException {
var opAsJson = "{\"op\": \"delete\", \"path\":\"$.a\"}";
diff --git a/json-utils/src/test/resources/patching/delete.json b/json-utils/src/test/resources/patching/delete.json
index a750b48f..08ff777e 100644
--- a/json-utils/src/test/resources/patching/delete.json
+++ b/json-utils/src/test/resources/patching/delete.json
@@ -7,9 +7,7 @@
},
"node": {},
"message": "Missing property in path $['x']"
- }
- ],
- "successCases": [
+ },
{
"op": {
"op": "delete",
@@ -18,10 +16,10 @@
"node": {
"x": {}
},
- "expected": {
- "x": {}
- }
- },
+ "message": "PathNotFoundException"
+ }
+ ],
+ "successCases": [
{
"op": {
"op": "delete",
diff --git a/json-utils/src/test/resources/patching/set.json b/json-utils/src/test/resources/patching/set.json
index 0c9c560f..0f19a568 100644
--- a/json-utils/src/test/resources/patching/set.json
+++ b/json-utils/src/test/resources/patching/set.json
@@ -21,13 +21,22 @@
{
"op": {
"op": "set",
- "path": "$.x.y",
+ "path": "$.a",
+ "value": 2
+ },
+ "node": {},
+ "message": "PathNotFoundException"
+ },
+ {
+ "op": {
+ "op": "set",
+ "path": "$.a.y",
"value": 42
},
"node": {
"a": {}
},
- "message": "Missing property in path $['x']"
+ "message": "PathNotFoundException"
}
],
"successCases": [
@@ -60,15 +69,6 @@
2
]
},
- {
- "op": {
- "op": "set",
- "path": "$.a",
- "value": 2
- },
- "node": {},
- "expected": {}
- },
{
"op": {
"op": "set",