Fix ExecutableNormalizedField to respect GraphqlFieldVisibility by Samjin · Pull Request #4204 · graphql-java/graphql-java

Problem

ExecutableNormalizedField.forEachFieldDefinition() and getOneFieldDefinition() call type.getField(fieldName) directly, bypassing the schema's configured GraphqlFieldVisibility.

This is inconsistent with other parts of graphql-java (validation, execution) that respect field visibility, and causes issues when:

  • A custom GraphqlFieldVisibility provides field definitions that differ from what's in the schema type (e.g., placeholder fields, virtual fields, or dynamically-computed fields)
  • Application code accesses DataFetchingEnvironment.getSelectionSet().getFields() in a DataFetcher
  • Normalization fails with "No field X found for type Y" because it bypasses the visibility

Reproduction

  1. Configure a custom GraphqlFieldVisibility that provides virtual/placeholder fields
  2. Execute a query that includes a field only available through the visibility
  3. Access DataFetchingEnvironment.getSelectionSet().getFields() in a DataFetcher
  4. Normalization fails because ExecutableNormalizedField.forEachFieldDefinition() calls type.getField() directly

Solution

Change the field lookup to use the schema's field visibility:

// Before
type.getField(fieldName)

// After  
schema.getCodeRegistry().getFieldVisibility().getFieldDefinition(type, fieldName)