无法在 Spring Boot 中注册 Gson TypeAdapter

我一直在尝试在 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 接口,也尝试了 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();
}

排除策略和漂亮打印等所有其他设置都可以正常工作,但键入 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()));
    }
}
kevin1985108 回答:无法在 Spring Boot 中注册 Gson TypeAdapter

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

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

@RestController
public class GsonController {

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

控制器返回:

➜  ~ 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"
本文链接:https://www.f2er.com/1156.html

大家都在问