Springboot使用FastJsonHttpMessageConverter导致Swagger2失效

本文描述了在Spring Boot环境下使用FastJson与Swagger API文档工具时遇到的兼容性问题,即API文档返回空对象。通过对比同事的正常运行环境,发现了问题所在并提供了三种解决方案:重写Swagger控制器、使用Jackson序列化以及升级FastJson版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

依赖版本

  • springboot:1.4.3.RELEASE
  • fastjson:1.2.7。

问题

加入进行api管理,访问 http://localhost:8080/v2/api-docs ,返回结果为{}。

查看相关代码。

controller代码

Swagger2Controller相关代码

返回的Json类

Json相关代码

AbstractMessageConverterMethodProcessor

AbstractMessageConverterMethodProcessor相关代码

FastJsonHttpMessageConverter

FastJsonHttpMessageConverter相关代码

一路debug下来,发现原因在FastJsonHttpMessageConverter.writeInternal方法序列化obj时候返回为{},而obj对象的class为Json。Json只声明了jackson序列化的方式,而fastjson不兼容。

中间出现的其他问题

另一位同事使用的demo没有出现这个问题,而只有我这边出现了问题,排查发现。

我的AbstractMessageConverterMethodProcessor

我的代码debug下来如上图,Converter有9个,使用的是FastJsonHttpMessageConverter

同事的AbstractMessageConverterMethodProcessor

同事的代码debug如上图,Converter有10个,使用的是MappingJackson2HttpMessageConverter

springboot比较坑的地方,可能由于某个配置不同,导致我两使用的json序列化包依赖不同,但是实在找不到这个配置不同在哪,特此记录一下。

##解决方案

  1. 重写Swagger2Controller
  2. 使用jackson序列
  3. 升级fastjson到1.2.15+版本。

3方法是发现问题后,突然在大神的博客中发现早已经解决该bug....

大神博客解决方案:http://blog.didispace.com/fastjson-swagger-solution/

另附笔者当前更新的fastjson1.2.24中代码

   protected void writeInternal(Object obj, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        HttpHeaders headers = outputMessage.getHeaders();
        ByteArrayOutputStream outnew = new ByteArrayOutputStream();
        int len = JSON.writeJSONString(outnew, this.fastJsonConfig.getCharset(), obj, this.fastJsonConfig.getSerializeConfig(), this.fastJsonConfig.getSerializeFilters(), this.fastJsonConfig.getDateFormat(), JSON.DEFAULT_GENERATE_FEATURE, this.fastJsonConfig.getSerializerFeatures());
        headers.setContentLength((long)len);
        OutputStream out = outputMessage.getBody();
        outnew.writeTo(out);
        outnew.close();
    }

转载于:https://my.oschina.net/superwen/blog/852794

<think>好的,我现在需要帮用户解决在Spring Boot中如何自定义WebMvc配置的问题。根据用户提供的引用内容,特别是引用[1]和[2],我需要先理解Spring Boot中WebMvc自动配置的基本机制,然后给出具体的配置步骤和示例。 首先,用户提到了WebMvcAutoConfiguration和WebMvcAutoConfigurationAdapter。根据引用[1],这些是Spring MVC的自动配置类。通常,Spring Boot的自动配置会通过条件注解来启用或禁用某些配置。当用户想要自定义MVC配置时,通常的做法是继承WebMvcConfigurationSupport或者实现WebMvcConfigurer接口。过,直接使用@EnableWebMvc可能会覆盖默认的自动配置,所以需要谨慎。 接下来,引用[2]详细说明了如何通过WebMvcConfig类进行配置,比如静态资源映射、消息转换器等。因此,正确的做法应该是创建一个配置类,并实现WebMvcConfigurer接口,这样可以保留Spring Boot的默认配置,同时添加自定义设置。比如,添加资源处理器、拦截器或者配置视图控制器。 用户需要示例,所以我应该提供一个具体的配置类代码。比如,添加静态资源目录,设置拦截器,配置跨域等。同时,要提到使用@Configuration注解,并重写相应的方法,如addResourceHandlers、addInterceptors等。 还需要注意,如果用户希望完全控制配置,可能需要继承WebMvcConfigurationSupport,但这会禁用自动配置,所以通常推荐使用实现WebMvcConfigurer的方式。 另外,用户可能遇到的问题,比如配置生效,这时候需要检查是否错误地使用了@EnableWebMvc,或者配置类没有被正确扫描到。这部分可以作为注意事项提醒用户。 最后,生成的相关问题需要考虑用户可能的后续疑问,比如如何配置视图控制器、处理跨域或者自定义消息转换器等,这些都是常见的WebMvc配置需求。</think>在Spring Boot中,自定义WebMVC配置主要通过实现`WebMvcConfigurer`接口或继承`WebMvcConfigurationSupport`类来完成。以下是具体实现步骤和示例: ### 一、基础配置方式 1. **创建配置类** 新建`WebMvcConfig`类并添加`@Configuration`注解: ```java @Configuration public class WebMvcConfig implements WebMvcConfigurer { // 配置内容 } ``` 2. **常用配置方法** - **静态资源映射** ```java @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/custom/**") .addResourceLocations("classpath:/custom-static/"); } ``` - **拦截器配置** ```java @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()) .addPathPatterns("/api/**"); } ``` - **跨域配置** ```java @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("GET", "POST"); } ``` ### 二、高级配置示例 #### 1. 自定义消息转换器 ```java @Bean public HttpMessageConverters customConverters() { FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); // 配置FastJson参数 return new HttpMessageConverters(converter); } ``` #### 2. 视图控制器配置 ```java @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/login").setViewName("login"); registry.setOrder(Ordered.HIGHEST_PRECEDENCE); } ``` #### 3. 路径匹配配置 ```java @Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.setUseTrailingSlashMatch(false) .setUseSuffixPatternMatch(false); } ``` ### 三、注意事项 1. **避免使用@EnableWebMvc** 该注解会完全接管MVC配置,导致自动配置失效[^1] 2. **配置优先级** 通过`@Order`注解控制配置类的加载顺序 3. **配置文件扩展** 可在`application.properties`中配置部分参数: ```properties spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp ``` ### 四、完整配置示例 ```java @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/swagger/**") .addResourceLocations("classpath:/META-INF/resources/"); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LogInterceptor()) .addPathPatterns("/**"); } @Bean public LocaleResolver localeResolver() { return new CookieLocaleResolver(); } } ``` : WebMvcAutoConfigurationAdapter是Spring Boot自动配置的核心实现类 [^2]: 通过实现WebMvcConfigurer接口可以保留自动配置的基础上进行扩展
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值