如何在graphql-spqr的mutation成功响应中自定义返回属性
解决方案
方案1:复用现有User类(改动最小)
适合需要保留原有User类结构、改动成本低的场景:
- 隐藏id字段:删除User类中id字段上的
@GraphQLQuery(name = "id", description = "A user's id")注解即可,graphql-spqr会自动将该字段从schema中移除,客户端无法查询该字段。 - 新增JWT token返回:给User类中已有的
transient String token字段添加@GraphQLQuery(name = "token", description = "登录态JWT凭证")注解,在createUser方法中调用userRepository.save(user)之后,将生成好的JWT字符串赋值给user.token属性再返回即可。
修改后客户端调整mutation的请求字段列表,即可查询到token字段,无法再查询到id字段。
方案2:自定义独立响应类(最灵活)
适合不想污染原有User类、需要返回更多自定义业务字段、或不同接口需要返回不同User字段的场景:
- 新建专属的创建用户响应类,按需定义返回字段并添加注解:
@Getter @Setter public class CreateUserResponse { // 按需添加需要返回的用户字段,不需要的字段直接省略即可自然隐藏 @GraphQLQuery(name = "firstName", description = "用户名字") private String firstName; @GraphQLQuery(name = "lastName", description = "用户姓氏") private String lastName; @GraphQLQuery(name = "email", description = "用户邮箱") private String email; // 新增需要返回的JWT字段 @GraphQLQuery(name = "token", description = "登录态JWT凭证") private String token; // 其他业务需要的自定义字段都可在此添加 }
- 修改
createUsermutation的返回类型为自定义的CreateUserResponse,保存用户后组装响应返回:
@GraphQLMutation(name = "createUser") public CreateUserResponse createUser ( @GraphQLArgument(name = "firstName") String firstName, @GraphQLArgument(name = "lastName") String lastName, @GraphQLArgument(name = "email") String email, @GraphQLArgument(name = "password") String password, @GraphQLArgument(name = "company") String company, @GraphQLArgument(name = "terms") Boolean terms) throws UserExistsException { // 原有业务逻辑不变 User savedUser = userRepository.save(user); // 生成JWT凭证 String jwtToken = 你的JWT工具类生成逻辑(savedUser); // 组装响应对象 CreateUserResponse response = new CreateUserResponse(); response.setFirstName(savedUser.getFirstName()); response.setLastName(savedUser.getLastName()); response.setEmail(savedUser.getEmail()); response.setToken(jwtToken); return response; }
该方案可以完全控制当前mutation的返回字段,不会影响其他接口对User类字段的暴露逻辑。
内容的提问来源于stack exchange,提问作者chriszichrisz
相关产品推荐
相关产品推荐

