Spring GraphQL中自定义ConditionalGenericConverter注解无法转换参数
问题原因及解决方法
问题原因
Spring MVC(REST控制器)与Spring GraphQL的参数处理机制完全独立:
- REST中
@PathVariable参数会经过Spring核心的ConversionService处理,你实现的ConditionalGenericConverter属于该流程的一部分,因此能触发大写转换逻辑。 - Spring GraphQL处理
@Argument参数时,使用自身的ArgumentValueResolver机制解析参数,不会复用Spring MVC的ConversionService,所以自定义转换器不会被调用。
解决方法
方案一:实现Spring GraphQL的ArgumentValueResolver
这是针对注解的最直接解决方案:
@Component class UppercaseArgumentResolver : ArgumentValueResolver { // 判断当前参数是否带有@Uppercase注解 override fun supportsParameter(parameter: MethodParameter): Boolean { return parameter.hasParameterAnnotation(Uppercase::class.java) } // 执行参数大写转换逻辑 override fun resolveArgument(parameter: MethodParameter, context: ArgumentValueResolverContext): Any? { val rawInput = context.argument.value return if (rawInput is String) { rawInput.uppercase() } else { rawInput // 非String类型直接返回原参数 } } }
实现后,Spring GraphQL会自动识别这个Bean,在处理带有@Uppercase的@Argument参数时自动触发转换。
方案二:全局字符串参数处理(可选)
如果需要对所有GraphQL字符串参数做统一大写处理,可以自定义GraphQL的Scalar类型:
@Component class UppercaseStringScalar : GraphQLScalarType( "UppercaseString", "自动转换为大写的字符串类型", object : Coercing<String, String> { override fun parseValue(input: Any): String { return (input as String).uppercase() } override fun serialize(dataFetcherResult: Any): String { return (dataFetcherResult as String).uppercase() } override fun parseLiteral(input: Any): String { return (input as StringValue).value.uppercase() } } )
之后在GraphQL Schema中使用UppercaseString类型替代默认的String即可。
内容的提问来源于stack exchange,提问作者vegidio
相关产品推荐
相关产品推荐

