@@ -20,7 +20,12 @@ public class Jtd {
2020 private final Map <String , JtdSchema > compiledDefinitions = new java .util .HashMap <>();
2121
2222 /// Stack frame for iterative validation with path and offset tracking
23- record Frame (JtdSchema schema , JsonValue instance , String ptr , Crumbs crumbs ) {}
23+ record Frame (JtdSchema schema , JsonValue instance , String ptr , Crumbs crumbs , String discriminatorKey ) {
24+ /// Constructor for normal validation without discriminator context
25+ Frame (JtdSchema schema , JsonValue instance , String ptr , Crumbs crumbs ) {
26+ this (schema , instance , ptr , crumbs , null );
27+ }
28+ }
2429
2530 /// Lightweight breadcrumb trail for human-readable error paths
2631 record Crumbs (String value ) {
@@ -145,7 +150,8 @@ void validatePropertiesSchema(Frame frame, JtdSchema.PropertiesSchema propsSchem
145150 }
146151
147152 // Check for additional properties if not allowed
148- if (!propsSchema .additionalProperties ()) {
153+ // RFC 8927 §2.2.8: In discriminator context, variant schemas ignore additionalProperties enforcement
154+ if (!propsSchema .additionalProperties () && frame .discriminatorKey () == null ) {
149155 for (String key : obj .members ().keySet ()) {
150156 if (!propsSchema .properties ().containsKey (key ) && !propsSchema .optionalProperties ().containsKey (key )) {
151157 JsonValue value = obj .members ().get (key );
@@ -232,10 +238,10 @@ void pushChildFrames(Frame frame, java.util.Deque<Frame> stack) {
232238 String discriminatorValueStr = discStr .value ();
233239 JtdSchema variantSchema = discSchema .mapping ().get (discriminatorValueStr );
234240 if (variantSchema != null ) {
235- // Push variant schema for validation
236- Frame variantFrame = new Frame (variantSchema , instance , frame .ptr , frame .crumbs );
241+ // Push variant schema for validation with discriminator key context
242+ Frame variantFrame = new Frame (variantSchema , instance , frame .ptr , frame .crumbs , discSchema . discriminator () );
237243 stack .push (variantFrame );
238- LOG .finer (() -> "Pushed discriminator variant frame for " + discriminatorValueStr );
244+ LOG .finer (() -> "Pushed discriminator variant frame for " + discriminatorValueStr + " with discriminator key: " + discSchema . discriminator () );
239245 }
240246 }
241247 }
0 commit comments