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