Skip to content

Commit 8972ece

Browse files
committed
fix feedback
1 parent 083251a commit 8972ece

File tree

2 files changed

+18
-10
lines changed

2 files changed

+18
-10
lines changed

json-java21-jtd/src/main/java/json/java21/jtd/Jtd.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,15 @@ void validatePropertiesSchema(Frame frame, JtdSchema.PropertiesSchema propsSchem
157157
}
158158

159159
// Check for additional properties if not allowed
160-
// RFC 8927 §2.2.8: In discriminator context, variant schemas ignore additionalProperties enforcement
161-
if (!propsSchema.additionalProperties() && frame.discriminatorKey() == null) {
160+
// RFC 8927 §2.2.8: Only the discriminator field is exempt from additionalProperties enforcement
161+
if (!propsSchema.additionalProperties()) {
162+
String discriminatorKey = frame.discriminatorKey();
162163
for (String key : obj.members().keySet()) {
163164
if (!propsSchema.properties().containsKey(key) && !propsSchema.optionalProperties().containsKey(key)) {
165+
// Only exempt the discriminator field itself, not all additional properties
166+
if (discriminatorKey != null && key.equals(discriminatorKey)) {
167+
continue; // Skip the discriminator field - it's exempt
168+
}
164169
JsonValue value = obj.members().get(key);
165170
// Additional property not allowed - create error with the value's offset
166171
String error = Jtd.Error.ADDITIONAL_PROPERTY_NOT_ALLOWED.message(key);

json-java21-jtd/src/test/java/json/java21/jtd/TestRfc8927.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -206,26 +206,29 @@ public void testMultipleErrorCollection() throws Exception {
206206
}
207207

208208
/// Test discriminator tag exemption
209-
/// RFC 8927 Section 3.3.8: Discriminator property is exempt from additional properties validation
209+
/// RFC 8927 §2.2.8: Only the discriminator field itself is exempt from additionalProperties enforcement
210210
@Test
211211
public void testDiscriminatorTagExemption() throws Exception {
212212
JsonValue schema = Json.parse("{\"discriminator\": \"type\", \"mapping\": {\"person\": {\"properties\": {\"name\": {\"type\": \"string\"}}}}}");
213213

214214
// Valid data with discriminator and no additional properties
215215
JsonValue validData1 = Json.parse("{\"type\": \"person\", \"name\": \"John\"}");
216216

217-
// Data with discriminator and additional properties (discriminator should be exempt)
218-
JsonValue validData2 = Json.parse("{\"type\": \"person\", \"name\": \"John\", \"extra\": \"allowed\"}");
217+
// Data with discriminator and additional properties (only discriminator field should be exempt)
218+
JsonValue invalidData2 = Json.parse("{\"type\": \"person\", \"name\": \"John\", \"extra\": \"not_allowed\"}");
219219

220220
Jtd validator = new Jtd();
221221

222-
// Both should be valid - discriminator is exempt from additional properties check
222+
// First should be valid - no additional properties
223223
Jtd.Result result1 = validator.validate(schema, validData1);
224-
Jtd.Result result2 = validator.validate(schema, validData2);
225-
226224
assertThat(result1.isValid()).isTrue();
227-
assertThat(result2.isValid()).isTrue();
228-
LOG.fine(() -> "Discriminator tag exemption test - data1: " + validData1 + ", data2: " + validData2);
225+
226+
// Second should be invalid - extra field is not exempt, only discriminator field is
227+
Jtd.Result result2 = validator.validate(schema, invalidData2);
228+
assertThat(result2.isValid()).isFalse();
229+
assertThat(result2.errors()).anySatisfy(error -> assertThat(error).contains("extra"));
230+
231+
LOG.fine(() -> "Discriminator tag exemption test - valid: " + validData1 + ", invalid: " + invalidData2);
229232
}
230233

231234
/// Counter-test: Discriminator with invalid mapping

0 commit comments

Comments
 (0)