From d864978c8e90d31bb0de0b6a32f265f7873eef96 Mon Sep 17 00:00:00 2001 From: vinceh121 Date: Tue, 3 Oct 2023 01:16:51 +0200 Subject: [PATCH 1/2] feat: option to throw an exception on unknown relationships --- .../jasminb/jsonapi/DeserializationFeature.java | 10 +++++++++- .../github/jasminb/jsonapi/ResourceConverter.java | 4 ++++ .../exceptions/UnknownRelationshipException.java | 12 ++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/github/jasminb/jsonapi/exceptions/UnknownRelationshipException.java diff --git a/src/main/java/com/github/jasminb/jsonapi/DeserializationFeature.java b/src/main/java/com/github/jasminb/jsonapi/DeserializationFeature.java index 6f199e1..1891423 100644 --- a/src/main/java/com/github/jasminb/jsonapi/DeserializationFeature.java +++ b/src/main/java/com/github/jasminb/jsonapi/DeserializationFeature.java @@ -3,6 +3,8 @@ import java.util.HashSet; import java.util.Set; +import com.github.jasminb.jsonapi.exceptions.UnknownRelationshipException; + /** * Enumeration that defines list of deserialization features that can be set to {@link ResourceConverter}. * @@ -25,7 +27,13 @@ public enum DeserializationFeature { * This option determines if relationship (collection) can have unknown type. * Can be use with polymorphic relationship. */ - ALLOW_UNKNOWN_TYPE_IN_RELATIONSHIP(false); + ALLOW_UNKNOWN_TYPE_IN_RELATIONSHIP(false), + + /** + * This option determines whether encountering undeclared relationships throws + * an {@link UnknownRelationshipException} during conversion + */ + ALLOW_UNKNOWN_RELATIONSHIPS(false); private final boolean enabledByDefault; diff --git a/src/main/java/com/github/jasminb/jsonapi/ResourceConverter.java b/src/main/java/com/github/jasminb/jsonapi/ResourceConverter.java index 5af6617..06ca382 100644 --- a/src/main/java/com/github/jasminb/jsonapi/ResourceConverter.java +++ b/src/main/java/com/github/jasminb/jsonapi/ResourceConverter.java @@ -14,6 +14,7 @@ import com.github.jasminb.jsonapi.annotations.Relationship; import com.github.jasminb.jsonapi.annotations.Type; import com.github.jasminb.jsonapi.exceptions.DocumentSerializationException; +import com.github.jasminb.jsonapi.exceptions.UnknownRelationshipException; import com.github.jasminb.jsonapi.exceptions.UnregisteredTypeException; import com.github.jasminb.jsonapi.models.errors.Error; @@ -543,6 +544,9 @@ private void handleRelationships(JsonNode source, Object object) } } } + } else if (!deserializationFeatures.contains(DeserializationFeature.ALLOW_UNKNOWN_RELATIONSHIPS)) { + throw new UnknownRelationshipException( + "Trying to parse unknown relationship '" + field + "' in " + object.getClass()); } } } diff --git a/src/main/java/com/github/jasminb/jsonapi/exceptions/UnknownRelationshipException.java b/src/main/java/com/github/jasminb/jsonapi/exceptions/UnknownRelationshipException.java new file mode 100644 index 0000000..db04b10 --- /dev/null +++ b/src/main/java/com/github/jasminb/jsonapi/exceptions/UnknownRelationshipException.java @@ -0,0 +1,12 @@ +package com.github.jasminb.jsonapi.exceptions; + +public class UnknownRelationshipException extends RuntimeException { + + public UnknownRelationshipException(String message, Throwable cause) { + super(message, cause); + } + + public UnknownRelationshipException(String message) { + super(message); + } +} From ec5c92288a5dcb83501058f451417e5869d2842a Mon Sep 17 00:00:00 2001 From: vinceh121 Date: Tue, 3 Oct 2023 01:19:58 +0200 Subject: [PATCH 2/2] test: fix unknown inclusion test --- .../java/com/github/jasminb/jsonapi/ResourceConverterTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/com/github/jasminb/jsonapi/ResourceConverterTest.java b/src/test/java/com/github/jasminb/jsonapi/ResourceConverterTest.java index a43a150..9c5ec64 100644 --- a/src/test/java/com/github/jasminb/jsonapi/ResourceConverterTest.java +++ b/src/test/java/com/github/jasminb/jsonapi/ResourceConverterTest.java @@ -546,6 +546,7 @@ public void testEnableAllowUnknownInclusions() throws IOException { @Test public void testEnableAllowUnknownInclusionsTwo() throws IOException { converter.enableDeserializationOption(DeserializationFeature.ALLOW_UNKNOWN_INCLUSIONS); + converter.enableDeserializationOption(DeserializationFeature.ALLOW_UNKNOWN_RELATIONSHIPS); InputStream rawData = IOUtils.getResource("included_fail.json"); converter.readDocument(rawData, City.class).get();