Spring GraphQL中如何将@oneOf输入映射为多态Java类型?
Spring GraphQL中如何将@oneOf输入映射为多态Java类型?
嘿,刚好我之前在项目里处理过一模一样的场景!Spring GraphQL(搭配graphql-java)对GraphQL 2022引入的@oneOf指令支持,是通过多态Java类型映射来实现的,用抽象基类+注解就能完美搞定,下面一步步给你讲清楚:
第一步:定义多态Java类
首先我们要对应GraphQL的AnimalInput定义一个抽象基类,然后让DogInput和CatInput继承它——这样刚好对应@oneOf的互斥输入特性:
// 抽象基类,对应@oneOf的AnimalInput public abstract class AnimalInput { } // 狗的输入类,继承基类 public class DogInput extends AnimalInput { private String name; private String breed; // 记得加无参构造器、全参构造器,以及getter/setter // (或者用Lombok的@Data+@NoArgsConstructor+@AllArgsConstructor简化) } // 猫的输入类,同样继承基类 public class CatInput extends AnimalInput { private String name; private String color; // 同样需要构造器和getter/setter }
第二步:给类加上GraphQL注解
要让Spring GraphQL识别这些多态输入类型,我们需要给每个类加上@GraphQLInputType注解,同时确保你的Spring GraphQL版本是1.2.0及以上(这个版本才开始支持@oneOf的映射):
import org.springframework.graphql.data.method.annotation.GraphQLInputType; @GraphQLInputType public abstract class AnimalInput { } @GraphQLInputType public class DogInput extends AnimalInput { // ...字段和构造器 } @GraphQLInputType public class CatInput extends AnimalInput { // ...字段和构造器 }
如果用Maven,记得在pom.xml里指定正确的依赖版本:
<dependency> <groupId>org.springframework.graphql</groupId> <artifactId>spring-boot-starter-graphql</artifactId> <version>1.2.0</version> <!-- 推荐用最新稳定版 --> </dependency>
第三步:编写Mutation Resolver
在你的Mutation控制器里,直接把AnimalInput作为方法参数接收就好,然后通过instanceof判断具体的子类类型:
import org.springframework.graphql.data.method.annotation.Argument; import org.springframework.graphql.data.method.annotation.MutationMapping; import org.springframework.stereotype.Controller; @Controller public class AnimalMutationController { @MutationMapping public String createAnimal(@Argument AnimalInput input) { if (input instanceof DogInput dog) { return String.format("成功创建狗狗:%s,品种:%s", dog.getName(), dog.getBreed()); } else if (input instanceof CatInput cat) { return String.format("成功创建猫咪:%s,毛色:%s", cat.getName(), cat.getColor()); } throw new IllegalArgumentException("未知的动物类型!"); } }
第四步:测试请求
现在你可以发送符合@oneOf规则的GraphQL请求了,注意不能同时传dog和cat字段(GraphQL会自动校验互斥性):
创建狗狗的请求:
mutation { createAnimal(input: { dog: { name: "Buddy" breed: "金毛寻回犬" } }) }
创建猫咪的请求:
mutation { createAnimal(input: { cat: { name: "Whiskers" color: "灰色" } }) }
这样就能完美实现@oneOf输入到多态Java类型的映射啦,亲测有效!
备注:内容来源于stack exchange,提问作者imsilversurfer
相关产品推荐
相关产品推荐

