0

我是graphql-spqr 的新手,所以我希望这是一个简单的问题,但是即使经过长时间的搜索,我也找不到解决方案。

提示:在我的应用程序中,我使用 code-first/schema-last 方法,我喜欢graphql-spqr,因此没有从文件加载 schema.graphqls。

我的 User.java 以此开头

@Table(name = "users")
@Entity
@Setter
@Getter
@EntityListeners(AuditingEntityListener.class)
public class User {
  @Id
  @GraphQLQuery(name = "id", description = "A user's id")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id", nullable = false, updatable = false)
  public Long id;

  @GraphQLQuery(name = "firstName", description = "User's first name")
  @Column(name = "first_name")
  public String firstName;

  @GraphQLQuery(name = "lastName", description = "User's last name")
  @Column(name = "last_name")
  public String lastName;

  @GraphQLQuery(name = "email", description = "User's email")
  public String email;

  @GraphQLQuery(name = "uuid", description = "User's uuid")
  //@Type(type = "char")
  public String uuid;

  //@Type(type = "char")
  @Transient
  public Company company;

  @Column(name = "company")
  public Long companyId;

  @Transient
  public Role role;

  @Column(name = "role")
  public Long roleId;

  @Column(name = "pw")
  public String password;

  @GraphQLQuery(name = "terms", description = "User accepted terms")
  public Boolean terms;

  @Transient
  public String token;

  @CreatedDate
  public Instant created;


  public String getUuid() {
    return this.uuid;
  }

  public String getFirstName() {
    return this.firstName;
  }

  public String getLastName() {
    return this.lastName;
  }

  public String getEmail() {
    return this.email;
  }

  public String getPassword() {
    return this.password;
  }
}

一个用户是由一个突变创建的:

@GraphQLMutation(name = "createUser")
  public User 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 {

    ... some business logic

    ... and finally I use the JpaRepository<User, String> to save the user

    return userRepository.save(user);
 }

This is the query I am sending to the server

{"operationName":"CreateUser","variables":{"firstName":"Chris","lastName":"Rowing","email":"foo54@bar.com","password":"dada","company":"Test 5","terms":true,"source":"start","invitationId":null},"query":"mutation CreateUser($firstName: String!, $lastName: String!, $email: String!, $password: String!, $terms: Boolean!, $company: String) {\n  createUser(\n    firstName: $firstName\n    lastName: $lastName\n    email: $email\n    password: $password\n    terms: $terms\n    company: $company\n  ) {\n    id\n    __typename\n  }\n}\n"}

新用户保存在数据库中,一切正常,在我的 Angular 客户端中,我监听了成功事件,在检查器中有以下输出

{"data":{"createUser":{"id":4,"__typename":"User"}}}

我的问题 如何自定义响应?例如,我还需要响应一个 JWT 令牌,并且可能隐藏 id。到目前为止,我还没有找到一种方法来做到这一点,任何帮助将不胜感激!谢谢!

4

1 回答 1

0

对于遇到同样新手问题的任何人:这就是我解决它的方法:

我将token属性添加到 GraphQL 查询,删除了id属性,并将其添加到 UserService

// Attach a new field called token to the User GraphQL type
@GraphQLQuery
public String token(@GraphQLContext User user) {
  return authService.createToken(user.email, user.uuid);
}

可以在不更改原始 User.class 的情况下向响应中添加外部字段,方法是使用@GraphQLContext

于 2021-10-12T12:50:20.227 回答