代码之家  ›  专栏  ›  技术社区  ›  Chris

GraphQL,如何返回byte[]的类型

  •  2
  • Chris  · 技术社区  · 7 年前

    我有缩略图保存在我的数据库作为字节数组。我似乎不知道如何通过GraphQL将这些返回到前端客户机。

    在标准REST方法中,我只发送一个带有字节的POJO,我可以很容易地将其呈现出来。

    然而,我试图返回一个 byte[]

    无法将类型定义(ListType{type=NonNullType{type=TypeName{name='Byte'}}})与java类型(class java.lang.Byte)匹配:java类不是列表或泛型类型信息丢失:class java.lang.Byte

    这个错误是描述性的,它告诉我出了什么问题,但我不知道如何解决这个问题。

    我的 thumbnail.graphqls 看起来像:

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

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

    graphql-spring-boot-starter 在Java方面,我认为它支持 Byte 那我哪里出错了?

    对GraphQL来说非常新鲜,所以这可能是一个明显的错误。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Alkis Mavridis    7 年前

    如果你想让你的字节数组看起来像一个字符串,比如“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无关。

    here

    然后可以将新类型命名为ByteArray或类似的名称,并在模式中声明它:

    scalar ByteArray
    

    然后使用它。

    不过,我会选择第一种解决方案,因为它更容易、更快地实现。