spring - Graphql工具:将实体类型映射到graphql类型

标签 spring kotlin graphql graphql-java

我在我的spring应用程序中使用graphql java工具。我有一个这样的实体:

@Entity
data class Image(
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE)
        @Column(nullable = false)
        val id: Long = 0
) {
    @Lob
    @Column(nullable = false)
    var image: Blob? = null
}

在GraphQL模式中,我想使用其他类型:
type Image {
    id: ID!
    image: String!
}   

当然,由于架构解析异常,启动此操作将无效。
因此,我认为在架构解析之间放置一些内容以实现从BlobString的映射是必须的。

这在某种程度上可能吗?
@Bean
fun schemaParserDictionary(): SchemaParserDictionary {
    return SchemaParserDictionary()
}

编辑

抱歉,它不会提供架构解析异常。它将简单地将字节放入字符串中。但是我不能使用该字符串来创建图像。

澄清度

对不起,我想我的问题还不够清楚。我不需要知道如何将Blob转换为字符串。有很简单的解决方案。例如,我可以使用一个简单的API函数将字节码转换为base64:
val base64 = Base64.getEncoder().encodeToString(byteCode)

我想问的是如何“告诉” graphql模式解析器以对特定字段使用该“自定义”转换。因此,当我的实体对象具有数据类型为imageblob字段时graphql会自动将其转换为string。但是字符串不包含我需要的内容。因此,我想针对该特定字段使用自定义解析/映射/转换/任何方法。当然,通过引入另一个我不存储在数据库中的字段,我也可以轻松解决此问题:
@Entity
data class Image(
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE)
        @Column(nullable = false)
        val id: Long = 0
) {
    @Lob
    @Column(nullable = false)
    var image: Blob? = null

    @Transient
    var base64: String = ""
}

但是我可以通过graphql api进行查询:
type Image {
    id: ID!
    image: String!
    base64: String!
}

type Images {
    images: [Image!]!
    totalCount: Int!
}

type Query {
    getImages: Images!
}

并将其设置在我的 Controller 中:
private fun getImages(): Images {
    var images: List<Image> = repository.findTop1000()

    images.forEach {
        it.base64 = Base64.getEncoder().encodeToString(it.image)

        queue.offer(it)
    }
}


但是,如果我可以告诉graphql模式解析器这样做,将会更加干净。

最佳答案

Kushal的答案提供了将Blob转换为String的代码片段。要使用此转换,最好使用DTO。

为此,请将您的graphql模式转换为:

type ImageDTO {
    id: ID!
    image: String!
} 

并创建一个DTO类ImageDTO:
public class ImageDTO {
    private Image entity;

    //Constructor
    public ImageDTO(Image image) {
         this.entity=image;
    }

    //Getters
    public Long getId() {
        return entity.getId();
    }

    public String getImage() {
        //convert the entity image and return it as String
        return Base64.getEncoder().encodeToString(entity.getImage());
    }
}

将DTO与实体分开可以使您更好地控制所传输的数据。

关于spring - Graphql工具:将实体类型映射到graphql类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58801227/

相关文章:

java - Spring 应用程序不考虑 spring.schemas

java - Spring bean 堆栈溢出错误

java - 使用 JPA2/Hibernate 并发写入和读取

file - Kotlin 文件与类。有什么不同?

kotlin - kotlin MPP 与 Kotlin Native 不同吗?

node.js - GraphQL Apollo 无法为不可为空返回 Null

java - 使用 H2 数据库进行 JUNIT 测试时出现错误 "expected identifier"

java - 我如何获取android中其他应用程序的屏幕时间?

angular - Apollo - Angular : Error: Uncaught (in promise): Error: Client has not been defined yet

javascript - graphql 中突变后的查询