Skip to content

DataFetchingEnvironment#getDataLoader does not allow nullable DataLoader values in Kotlin #4374

@samuelAndalon

Description

@samuelAndalon

Describe the bug
DataFetchingEnvironment#getDataLoader exposes DataLoader values as non-null to Kotlin in graphql-java 25, even though java-dataloader 6 allows nullable value type parameters.
DataFetchingEnvironment is now @NullMarked, and getDataLoader is declared as:

@Nullable
<K, V> DataLoader<K, V> getDataLoader(String dataLoaderName);

Kotlin reads this as:

fun <K : Any, V : Any> getDataLoader(dataLoaderName: String): DataLoader<K, V>?

This prevents using V?, even though org.dataloader.DataLoader itself allows

DataLoader<K, V extends @Nullable Object>
CompletableFuture<V> load(...)

So DataLoader<K, V?> is valid for java-dataloader but cannot be retrieved through DataFetchingEnvironment#getDataLoader without unchecked casts.

To Reproduce

fun fetchUniversity(dfe: DataFetchingEnvironment): CompletableFuture<University?> {
    val loader = dfe.getDataLoader<Int, University?>("UniversityDataLoader")
    return loader.load(1)
}

With GraphQL Java 25, this fails to compile in Kotlin:

Type argument is not within its bounds: must be subtype of 'Any'

A workaround requires retrieving as Any and casting:

@Suppress("UNCHECKED_CAST")
fun fetchUniversity(dfe: DataFetchingEnvironment): CompletableFuture<University?> {
    val loader = dfe.getDataLoader<Int, Any>("UniversityDataLoader") as DataLoader<Int, University?>
    return loader.load(1)
}

Expected Behavior
getDataLoader should preserve java-dataloader nullable value bound, likely something like:

@Nullable
<K extends Object, V extends @Nullable Object> DataLoader<K, V> getDataLoader(String dataLoaderName);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions