java - 无法在 Spring Boot 中注册 Gson TypeAdapter

标签 java spring spring-boot gson

我一直在尝试在 RestComponent 中添加 Version 类的自定义序列化:

public class Version {
    public int MAJOR;
    public int MINOR;
    public int REVISION;
    public Integer BUILD;
}

我期望的 Json 输出:

"1.2.2"

不是

{
  "MAJOR": 1,
  "MINOR": 2,
  "REVISION": 2,
  "BUILD": null
}

所以我决定使用 JsonSerializer 和 JsonDeserializer 接口(interface),也尝试了 TypeAdapter。 我在 MVC 配置类中创建了一个 Gson Bean,还尝试创建 GsonBuilder bean。在应用程序属性中,我选择 gson 作为序列化器,并删除了 Jackson 依赖项。

@Bean
public Gson gson() {
    var strategy = new ExclusionStrategy() {
        
        @Override
        public boolean shouldSkipField(FieldAttributes f) {
            return f.getAnnotation(GsonExclude.class) != null;
        }
            
        @Override
        public boolean shouldSkipClass(Class<?> clazz) {
            return false;
        }
    };
        
    return new GsonBuilder()
            .registerTypeHierarchyAdapter(Version.class, new VersionGsonAdapter())
            .addSerializationExclusionStrategy(strategy)
            .addDeserializationExclusionStrategy(strategy)
            .disableHtmlEscaping()
            .serializeNulls()
            .setPrettyPrinting()
            .create();
}

排除策略和 pretty-print 等所有其他设置都工作正常,但键入 adpapters - 不行。

我还尝试配置消息转换器(configureMessageConverters、extendMessageConverters):

@Configuration
public class WebMVCConfig implements WebMvcConfigurer  {
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.removeIf(c -> c instanceof GsonHttpMessageConverter);
        converters.add(new GsonHttpMessageConverter(gson()));
    }
}

最佳答案

As explained in the reference documentation ,您可以使用 GsonBuilderCustomizer 自定义 Gson 基础设施,如下所示:

@Configuration
public class GsonConfiguration {

    @Bean
    public GsonBuilderCustomizer typeAdapterRegistration() {
        return builder -> {
            builder.registerTypeAdapter(Version.class, new VersionTypeAdapter());
        };
    }
}

请确保您已将 Gson 设置为首选 JSON 库,因为 Jackson 通常由许多依赖项传递。在 application.properties 中,您可以添加以下内容:

spring.mvc.converters.preferred-json-mapper=gson

我已经使用以下 Controller 成功测试了这种方法:

@RestController
public class GsonController {

    @GetMapping("/version")
    public Version showVersion() {
        return Version.fromVersionString("1.2.3-42");
    }
}

Controller 返回:

➜  ~ http :8080/version
HTTP/1.1 200
Connection: keep-alive
Content-Type: application/json;charset=UTF-8
Keep-Alive: timeout=60
Transfer-Encoding: chunked

"1.2.3-42"

关于java - 无法在 Spring Boot 中注册 Gson TypeAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68612761/

相关文章:

spring-boot - 从 Gradle 启动传递动态端口 :run of an application

java - Android Studio 使用 , 而不是 .格式化字符串后

java - 更改 Java Android 中的 UI

spring - 如何在不同的 Spring 上下文之间共享 Spring bean?

java - 未从 AttributeConverter 内的属性获取值

spring-boot - 在 Spring Boot 嵌入式容器中部署第三方 war

Java文件释放资源

java - 同时向两个表插入数据。 h2数据库

java - 配置 View 未找到异常以显示 404

java - 如何在 spring 中使用 IN 子句执行查询?