GraphQL SPQR:id 不应在创建时显示

Posted

技术标签:

【中文标题】GraphQL SPQR:id 不应在创建时显示【英文标题】:GraphQL SPQR: id shall not be shown at creation 【发布时间】:2019-05-02 18:14:52 【问题描述】:

我在实体中使用GraphQL SPQR

@Entity
public class MyEntity 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private UUID id;

    @GraphQLNonNull
    @GraphQLQuery(name = "a", description = "Any field")
    private String a;

    // Getters and Setters

和服务

@Service
@Transactional
public class MyService 

    @Autowired
    private MyRepository myRepository;

    @GraphQLMutation(name = "createEntity")
    public MyEntity createEntity(@GraphQLArgument(name = "entity") MyEntity entity) 
        myRepository.save(entity);
        return entity;
    

在 GraphiQL 中,我可以设置 id:

mutation 
  createEntity(entity: 
    id: "11111111-2222-3333-4444-555555555555"
    a: "any value"
  ) 
    id
  

id 不得对用户进行编辑,因为它将被数据库覆盖。它只应在查询时显示。我尝试并添加了@GraphQLIgnore,但id 显示的都是一样的。

如何在创建时隐藏id

【问题讨论】:

【参考方案1】:

在 GraphQL-SPQR 0.9.9 及更早版本中,根本不扫描私有成员,因此私有字段上的注释通常不会做任何事情。顺便说一句,Jackson(或 Gson,如果这样配置)用于发现输入类型上的可反序列化字段,并且这些库确实查看私有字段,因此会出现 一些注释为输入类型工作。这就是您的情况。但是,@GraphQLIgnore属于适用于私有字段的注释。

您需要做的是将注释移动到 getter 和 setter。

@Entity
public class MyEntity 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private UUID id; 

    @GraphQLIgnore //This will prevent ID from being mapped on the input type
    //@JsonIgnore would likely work too
    public void setId(UUID id) ...

还有其他方法可以实现这一点,但这是最直接的。

注意:在 SPQR 的未来版本(0.9.9 后)中,也可以将注释放在私有字段上,但会混合(将一些注释放在一个字段上,一些放在相关的 getter/setter 上)不会工作。

【讨论】:

以上是关于GraphQL SPQR:id 不应在创建时显示的主要内容,如果未能解决你的问题,请参考以下文章

仅在 graphql 查询中的初始加载时显示加载指示器

带有 Spring Boot 和事务边界的 graphql-spqr

ID不应在指定日期之间显示?

如何查询 GraphQL SPQR

当 Apollo GraphQL 失败并出现错误时显示 MatSnackBar 消息

具有弹簧安全性的 JWT 身份验证 graphql-spqr