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

时间:2018-11-30 15:10:30

标签: graphql graphql-java graphql-spqr

我对实体使用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 个答案:

答案 0 :(得分:1)

在GraphQL-SPQR 0.9.9和更早版本中,完全不扫描私有成员,因此私有字段上的注释通常不执行任何操作。顺便说一句,使用Jackson(或Gson,如果已配置)来发现输入类型上的可反序列化字段,并且那些库 do 会查看私有字段,因此会出现 some 批注适用于输入类型。这就是您的情况。但是,在适用于私有字段的注释中,@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上)将无法正常工作。