From 0b449d89e1d9e8754d42ad5e5af7f780c705ce32 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Thu, 3 Feb 2022 10:16:31 +0000 Subject: [PATCH] Callbacks for ConversionService customization Closes gh-271 --- .../data/GraphQlArgumentInitializer.java | 3 +- .../AnnotatedControllerConfigurer.java | 30 ++++++++++++++----- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/spring-graphql/src/main/java/org/springframework/graphql/data/GraphQlArgumentInitializer.java b/spring-graphql/src/main/java/org/springframework/graphql/data/GraphQlArgumentInitializer.java index 8775a06b..75e46e0b 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/data/GraphQlArgumentInitializer.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/data/GraphQlArgumentInitializer.java @@ -1,5 +1,5 @@ /* - * Copyright 2020-2021 the original author or authors. + * Copyright 2020-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -166,6 +166,7 @@ public class GraphQlArgumentInitializer { MutablePropertyValues propertyValues = extractPropertyValues(arguments); target = BeanUtils.instantiateClass(ctor); DataBinder dataBinder = new DataBinder(target); + dataBinder.setConversionService(this.typeConverter.getConversionService()); dataBinder.bind(propertyValues); return target; } diff --git a/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/AnnotatedControllerConfigurer.java b/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/AnnotatedControllerConfigurer.java index 1fc23f17..9724c9bb 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/AnnotatedControllerConfigurer.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/AnnotatedControllerConfigurer.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -48,6 +48,9 @@ import org.springframework.core.MethodIntrospector; import org.springframework.core.MethodParameter; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.convert.ConversionService; +import org.springframework.format.FormatterRegistrar; +import org.springframework.format.support.DefaultFormattingConversionService; +import org.springframework.format.support.FormattingConversionService; import org.springframework.graphql.data.GraphQlArgumentInitializer; import org.springframework.graphql.data.method.HandlerMethod; import org.springframework.graphql.data.method.HandlerMethodArgumentResolver; @@ -109,20 +112,33 @@ public class AnnotatedControllerConfigurer @Nullable private HandlerMethodInputValidator validator; - @Nullable - private ConversionService conversionService; + private FormattingConversionService conversionService = new DefaultFormattingConversionService(); - @Override - public void setApplicationContext(ApplicationContext applicationContext) { - this.applicationContext = applicationContext; + /** + * Add a {@code FormatterRegistrar} to customize the {@link ConversionService} + * that assists in binding GraphQL arguments onto + * {@link org.springframework.graphql.data.method.annotation.Argument @Argument} + * annotated method parameters. + */ + public void addFormatterRegistrar(FormatterRegistrar registrar) { + registrar.registerFormatters(this.conversionService); } /** * Configure the {@link ConversionService} used for binding handler arguments. + * @deprecated in favor of using {@link #addFormatterRegistrar(FormatterRegistrar)} + * to customize the built-in ConversionService instance. */ + @Deprecated public void setConversionService(ConversionService conversionService) { - this.conversionService = conversionService; + Assert.isInstanceOf(FormattingConversionService.class, "FormattingConversionService is required"); + this.conversionService = (FormattingConversionService) conversionService; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; } protected final ApplicationContext obtainApplicationContext() {