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 при создании?

0 ответов

В GraphQL-SPQR версии 0.9.9 и более ранних версий закрытые члены вообще не сканируются, поэтому аннотации в закрытых полях обычно ничего не делают. Кстати, Джексон (или Gson, если так настроен) используется для обнаружения десериализуемых полей в типах ввода, и эти библиотеки обращают внимание на частные поля, поэтому некоторые аннотации будут работать для типов ввода. Это то, что происходит в вашем случае. Но, @GraphQLIgnore не входит в число аннотаций, которые будут работать на частном поле.

Что вам нужно сделать, это переместить аннотации к получателям и установщикам.

@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) будет возможно размещать аннотации и в приватных полях, но смешивание (размещение некоторых аннотаций в поле, а некоторых - в связанном получателе / ​​установщике) не будет работать.,

Другие вопросы по тегам