GraphQL, как вернуть тип байта [] - PullRequest
0 голосов
/ 12 октября 2018

У меня есть эскизы, сохраненные в моей базе данных в виде байтового массива.Кажется, я не могу понять, как вернуть их клиенту веб-интерфейса через GraphQL.

При стандартном подходе REST я просто отправляю POJO обратно с байтами, и я могу легко сделать это.

Однако при попытке вернуть byte[] выбрасывается

Невозможно сопоставить определение типа (ListType {type = NonNullType {type = TypeName {name = 'Byte'}}})с типом java (класс java.lang.Byte): класс Java не является списком или потеряна информация общего типа: класс java.lang.Byte

Ошибка носит описательный характер и говорит мне, что не так,но я не знаю, как это решить.

Мой thumbnail.graphqls выглядит так:

type Thumbnail {
    id: ID!
    resource: [Byte!]
}

И миниатюра POJO

public class Thumbnail extends BaseEntity {
    byte[] resource;
}

Я использую graphql-spring-boot-starter на стороне Java для обработки вещей,и я думаю, что он поддерживает Byte из коробки, так где я ошибся?

Очень свежо для GraphQL, так что это может быть очевидной ошибкой.

Ура,

1 Ответ

0 голосов
/ 13 октября 2018

Вы должны сериализовать его в один из стандартных типов.Если вы хотите, чтобы ваш байтовый массив выглядел как строка, такая как «F3269AB2», или как массив целых чисел, такой как [1,2,3,4,5], это полностью зависит от вас.

Вы можетедобиться сериализации, написав резольвер для вашей сущности, например:

public class ThumbnailResolver extends GraphQLResolver<Thumbnail> {
        public String resource(Thumbnail th) { ... }
        //or List<Integer> resource(Thumbnail th) { ... }
        //or whatever
    }

Резолвер всегда имеет приоритет над вашей сущностью.Это означает, что если в классе распознавателя найден метод распознавателя с правильным именем, параметрами и типом возврата, он будет вызван вместо метода сущности.Таким образом, мы можем «переопределить» методы объекта, чтобы вернуть другой результат, даже другой тип, чем поле фактического объекта.Используя средства распознавания, мы также можем получить доступ к службам области приложения и т. Д., Которых у организации обычно нет.

После написания средства распознавания не забудьте обновить файл схемы до:

resource: String
#or resource:[Int]
#or whatever

Ваша схема должна ссылаться на тип распознавателя, поскольку это то, что получает GraphQL.Фактический тип сущности станет тогда неуместным для graphQL.

В качестве плана B вы можете реализовать новый скаляр.Это все равно что изобретать новый базовый тип.Это тоже не так сложно.Вы можете увидеть уже существующие скалярные типы здесь и сделать что-то подобное.

Затем вы можете назвать свой новый тип ByteArray или что-то подобное, объявив его в своей схеме:

scalar ByteArray

и затем используйте его.

Я бы выбрал первое решение, поскольку его проще и быстрее реализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...