Skip to content
This repository was archived by the owner on Dec 19, 2023. It is now read-only.
This repository was archived by the owner on Dec 19, 2023. It is now read-only.

Cannot set objectMapperConfigurer #405

Closed
@KammererTob

Description

@KammererTob

I recently updated to 7.0.1 and noticed that my custom object mapper is no longer picked up. After investigating a bit i came to the conclusion that it seems to be impossible to set the objectMapperConfigurer inside the optionsBuilder Bean.

This is the builder:

    @Bean
    @ConditionalOnMissingBean
    @ConfigurationProperties("graphql.tools.schema-parser-options")
    public Builder optionsBuilder(PerFieldObjectMapperProvider perFieldObjectMapperProvider) {
        Builder optionsBuilder = SchemaParserOptions.newOptions();
        if (perFieldObjectMapperProvider != null) {
            optionsBuilder.objectMapperProvider(perFieldObjectMapperProvider);
        } else {
            optionsBuilder.objectMapperConfigurer(this.objectMapperConfigurer);
        }

        optionsBuilder.introspectionEnabled(this.props.isIntrospectionEnabled());
        if (this.genericWrappers != null) {
            optionsBuilder.genericWrappers(this.genericWrappers);
        }

        if (this.proxyHandlers != null) {
            this.proxyHandlers.forEach(optionsBuilder::addProxyHandler);
        }

        if (this.coroutineContextProvider != null) {
            optionsBuilder.coroutineContextProvider(this.coroutineContextProvider);
        }

        if (this.typeDefinitionFactories != null) {
            this.typeDefinitionFactories.forEach(optionsBuilder::typeDefinitionFactory);
        }

        return optionsBuilder;
    }

And this is the PerFieldObjectMapperProvider:

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnProperty(
        value = {"graphql.tools.use-default-objectmapper"},
        havingValue = "true",
        matchIfMissing = true
    )
    public PerFieldObjectMapperProvider perFieldObjectMapperProvider(ObjectMapper objectMapper) {
        objectMapper.registerModule(new Jdk8Module()).registerModule(new KotlinModule());
        return (fieldDefinition) -> {
            return objectMapper;
        };
    }

The builder Bean requires a PerFieldObjectMapperProvider Bean to be present, so it will never be null. Even if you provide your own @Bean which returns null Spring complains: "- User-defined bean method 'perFieldobjectMapperProvider' in 'GraphQLConfig' ignored as the bean value is null".

Is there a way to not use the PerFieldObjectMapperProvider inside the builder, without providing your own builder @Bean?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions