Skip to content

GraalVM native-image: Missing inner classes in reachability-metadata.json for expression resolution #1737

@felipekj

Description

@felipekj

Description

The reachability-metadata.json in DataFaker 2.5.3 is incomplete for GraalVM native-image support. Expression resolution like #{IDNumber.ssn_valid} fails in native images because several inner classes of FakeValuesService are not registered.

Error

java.lang.RuntimeException: Unable to resolve #{IDNumber.ssn_valid} directive for FakerContext

Missing Classes

The following inner classes are essential for expression resolution but are not included in META-INF/native-image/reachability-metadata.json:

  • net.datafaker.service.FakeValuesService$MethodResolver
  • net.datafaker.service.FakeValuesService$MethodAndCoercedArgs
  • net.datafaker.service.FakeValuesService$MethodAndCoercedArgsResolver
  • net.datafaker.service.FakeValuesService$ValueResolver
  • net.datafaker.service.FakeValuesService$SafeFetchResolver
  • net.datafaker.service.FakeValuesService$ConstantResolver
  • net.datafaker.service.FakeValuesService$RegExpContext

Reproduction

  1. Use DataFaker 2.5.3 in a Spring Boot 3.x application
  2. Call faker.idNumber().valid() which uses #{IDNumber.ssn_valid} expression
  3. Compile to native image with GraalVM
  4. Run native tests - expression resolution fails

Workaround

Add Spring RuntimeHintsRegistrar with the missing classes:

String[] serviceClasses = {
    "net.datafaker.service.FakeValuesService$MethodResolver",
    "net.datafaker.service.FakeValuesService$MethodAndCoercedArgs",
    "net.datafaker.service.FakeValuesService$MethodAndCoercedArgsResolver",
    "net.datafaker.service.FakeValuesService$ValueResolver",
    "net.datafaker.service.FakeValuesService$SafeFetchResolver",
    "net.datafaker.service.FakeValuesService$ConstantResolver",
    "net.datafaker.service.FakeValuesService$RegExpContext"
};

for (String className : serviceClasses) {
    hints.reflection().registerType(
        classLoader.loadClass(className),
        MemberCategory.INVOKE_DECLARED_CONSTRUCTORS,
        MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS,
        MemberCategory.INVOKE_DECLARED_METHODS,
        MemberCategory.INVOKE_PUBLIC_METHODS,
        MemberCategory.DECLARED_FIELDS,
        MemberCategory.PUBLIC_FIELDS
    );
}

Environment

  • DataFaker version: 2.5.3
  • GraalVM version: 21+
  • Spring Boot: 3.4.x
  • Java: 21

Expected Behavior

Expression resolution like #{IDNumber.ssn_valid} should work in native images without requiring additional configuration.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions