You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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字段的场景:

  1. 新建专属的创建用户响应类,按需定义返回字段并添加注解:
@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;
    // 其他业务需要的自定义字段都可在此添加
}
  1. 修改createUser mutation的返回类型为自定义的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:45:04