GraphQL, la forma de devolver el tipo de byte []

Chris Turner:

Tengo imágenes en miniatura guardadas en mi base de datos como una matriz de bytes. Me parece que no puede entrenar la forma de devolver estos a los clientes a través de frontend GraphQL.

En un enfoque REST estándar acabo de mandar una copia de POJO con los bytes y puedo rendir fácilmente que fuera.

Sin embargo tratando de devolver una byte[]es tirar

Incapaz de igualar definición de tipo (ListType {type = NonNullType {type = TypeName {name = 'Byte'}}}) con el tipo de Java (java.lang.Byte clase): clase Java no es una lista o información de tipo genérico se perdió: clase java.lang.Byte

El error es descriptivo y me dice lo que está mal, pero no sabe cómo resolver eso.

Mi thumbnail.graphqlsapariencia:

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

Y el POJO miniatura

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

Estoy usando graphql-spring-boot-starteren el lado de Java para manejar las cosas, y creo que es compatible con Bytela caja, así que cuando he ido mal?

Muy fresco a GraphQL así que esto podría ser simplemente un error evidente.

Salud,

Alkis Mavridis:

Tienes que serializarlo a uno de los tipos estándar. Si desea que su matriz de bytes para que parezca una cadena como "F3269AB2", o como una matriz de enteros tales como [1,2,3,4,5] es totalmente hasta usted.

Se puede lograr la serialización escribiendo un dispositivo de resolución para su entidad, así:

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

El sistema de resolución tiene siempre prioridad sobre su entidad. Esto significa que si un método de resolución con el nombre, parámetros y correcto retorno de características se encuentra en la clase de resolución, este será llamado en lugar del método entidad. De esta manera podemos "anular" los métodos de la entidad, con el fin de devolver un otro resultado, incluso un tipo diferente que el campo de entidad real. Mediante el uso de reductores, también podríamos tener acceso a los servicios de aplicaciones de ámbito etc que una entidad no tiene típicamente.

Después de escribir el subsistema de resolución, no se olvide de actualizar el archivo de esquema a:

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

Su esquema debe informenos al tipo de resolución ya que esto es lo que recieves graphQL. El tipo de entidad real se convertirá entonces irrelevante para graphQL.

Como un plan B, se podría implementar un nuevo escalar. Esto sería como inventar un nuevo tipo básico. Esto también no es tan difícil. Se puede ver los tipos escalares ya existentes aquí y hacer algo similar.

A continuación, puede nombrar a su nuevo tipo ByteArray o algo así, os lo anunciará en su esquema:

scalar ByteArray

y luego usarlo.

Me voy por la primera solución, aunque ya que es más fácil y rápido de implementar.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=221005&siteId=1
Recomendado
Clasificación