引入Swagger后ResourceSupport返回JSON的links字段变为_links问题
问题原因分析
这是因为Springfox Swagger 2.4.0默认启用了HAL(Hypertext Application Language)序列化规范,而HAL标准中规定链接字段的名称就是_links;在没有引入Springfox时,Spring Hateoas使用自身默认的序列化逻辑,输出的链接字段是links。
当你添加Springfox依赖并启用Swagger后,它会自动配置HAL对应的消息转换器(MappingJackson2HttpMessageConverter的HAL变体),这个转换器会覆盖Spring Hateoas原本的序列化行为,导致字段名从links变成_links。
解决办法(保持
links字段不变) 下面提供几种可行的方案,你可以根据自己的场景选择:
1. 全局禁用Springfox的HAL序列化支持
通过自定义配置类,优先使用Spring Hateoas默认的消息转换器,或者直接排除Springfox的HAL自动配置:
@Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public WebMvcConfigurer webMvcConfigurer() { return new WebMvcConfigurer() { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 添加Spring Hateoas默认的Jackson转换器到最前面,优先使用 converters.add(0, new MappingJackson2HttpMessageConverter()); } }; } }
2. 用Jackson Mixin强制指定字段名
如果不想全局修改序列化规则,可以通过Jackson的Mixin机制,给ResourceSupport类指定links字段的名称:
首先创建Mixin类:
abstract class ResourceSupportMixin { @JsonProperty("links") abstract List<Link> getLinks(); }
然后在配置类中注册这个Mixin:
@Configuration public class JacksonConfig { @Bean public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() { return builder -> builder.mixIn(ResourceSupport.class, ResourceSupportMixin.class); } }
这样所有继承ResourceSupport的类都会输出links字段,不受HAL序列化的影响。
3. 升级Springfox版本
Springfox的后续版本(比如2.9.x及以上)对Spring Hateoas的兼容性更好,部分版本提供了配置开关来控制是否启用HAL序列化。你可以尝试升级Springfox依赖到较新的稳定版本,然后通过配置关闭HAL支持:
@Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) // 其他配置... .useDefaultResponseMessages(false) .directModelSubstitute(ResourceSupport.class, Object.class); } }
内容的提问来源于stack exchange,提问作者Héctor Valls
相关产品推荐
相关产品推荐

