graphql-spqr 在响应 json 中发送空值

问题描述 投票:0回答:1

我们已将 Spring Boot 应用程序配置为不以 json 形式发送回 null 值,但我们仍然会返回 null 值。使用 Jackson ObjectMapper 不发送空值的设置在 BootstrapConfig 中如下所示:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
..
...

    @Bean
    public ObjectMapper objectMapper() {
        final SimpleDateFormat zuluDateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.US);
        zuluDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
        final ObjectMapper jsonMapper = new ObjectMapper();
        jsonMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
        jsonMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        jsonMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        jsonMapper.registerModule(new JavaTimeModule());
        jsonMapper.setDateFormat(zuluDateFormat);
        jsonMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

        return jsonMapper;
    } 

我们之前使用: 实施

io.leangen.graphql:spqr:0.12.1
但升级到 0.12.3 后我们得到了相同的结果。

当我们打印 gradle 依赖项时,我们确实有 com.google.code.gson:gson 作为另一个库的依赖项。

spqr 是否可能使用 gson 而不是 jackson 进行对象映射。情况似乎如此,当我在 EntityMutation 类中将实体转换为 json 时,我没有看到任何空值。如果我将该 json 转换回实体并返回该实体,那么前端不会获得空值。

有什么方法可以确保使用 jackson 对象映射器而不是 gson 或者我在设置中遗漏了其他内容?

spring-boot jackson graphql-spqr
1个回答
0
投票

GraphQL 响应的形状由 GraphQL 规范定义,并且将始终与请求的形状匹配。例如。如果用户要求:

{
 book {
   title
   isbn
 }
}

成功的响应将始终具有以下形式:

{
 data: {
   book: {
     title: ...
     isbn: ...
   }
 }
}

无论任何配置或空叶子值(如果

book
本身为空,则其下不会有节点)。 Jackson 的配置对 output 值(输入则不同)重要的唯一情况是当您使用
ObjectScalar
(又名
JsonScalar
,通过 SPQR 中的
@GraphQLScalar
注释实现)时,即实际上是一个无类型的 JSON blob,而不是您通常想要使用的东西。

© www.soinside.com 2019 - 2024. All rights reserved.