我一直在尝试在 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/