感觉有用,先记录下来。
Jackson最主要的原因是Jackson在处理对象之前的循环嵌套关系时不便。什么是对象间的循环嵌套? 比如A有一个List,B对象里又有一个A对象,当然返回A对象的Json字符串时,如果是Jackson就会发生异常,因为Jackson天生不具备处理这种关系的能力,而Fastjson正好具备了这种能力。
1.引入依赖
<dependency> <groupId> com.alibaba </groupId> <artifactId> fastjson </artifactId> <version> 1.2.29 </version> </dependency>三种实现方式
import java.util.ArrayList; import java.util.List; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import com.alibaba.fastjson.serializer.SerializerFeature; import com.alibaba.fastjson.support.config.FastJsonConfig; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; /** * Spring MVC全局一场解析器 * * @author xujin * */ @Configuration @EnableWebMvc public class ApplicationExceptionAdapter extends WebMvcConfigurerAdapter { /** * 配置fastJson 用于替代jackson */ @Override public void configureMessageConverters( List<HttpMessageConverter<?>> converters) { super.configureMessageConverters(converters); // 1.定义一个convert 转换消息的对象 FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); // 2 添加fastjson 的配置信息 比如 是否要格式化 返回的json数据 FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat); fastConverter.setFastJsonConfig(fastJsonConfig); // 解决乱码的问题 List<MediaType> fastMediaTypes = new ArrayList<>(); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); fastConverter.setSupportedMediaTypes(fastMediaTypes); converters.add(fastConverter); } /** 用自己的全局异常解析器替换Spring MVC本身的异常解析器 **/ @Override public void configureHandlerExceptionResolvers( List<HandlerExceptionResolver> exceptionResolvers) { exceptionResolvers.add(new ApplicationExceptionResolver()); super.configureHandlerExceptionResolvers(exceptionResolvers); } } 或者@EnableWebMvc public class JanusAdminApplication extends WebMvcConfigurerAdapter { /** * 配置fastJson 用于替代jackson */ @Override public void configureMessageConverters( List<HttpMessageConverter<?>> converters) { super.configureMessageConverters(converters); // 1.定义一个convert 转换消息的对象 FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); // 2 添加fastjson 的配置信息 比如 是否要格式化 返回的json数据 FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat); fastConverter.setFastJsonConfig(fastJsonConfig); // 解决乱码的问题 List<MediaType> fastMediaTypes = new ArrayList<>(); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); fastConverter.setSupportedMediaTypes(fastMediaTypes); converters.add(fastConverter); } public static void main(String[] args) { SpringApplication.run(JanusAdminApplication.class, args); } }
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.5.0</version>
</dependency>
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; /** * Swagger2 配置 * * @author xujin * */ @Configuration @EnableSwagger2 // 在生产环境不开启 @Profile({ "dev", "local" }) public class Swagger2Config { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors .basePackage("org.xujin.janus.admin.controller")) .paths(PathSelectors.any()).build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder().title("Janus网关管控平台") .description("Janus网关管控平台").contact("Software_King@qq.com") .version("1.0").build(); } }访问http://localhost:8080/swagger-ui.html,控制台出现错误
1.页面显示默认报错页面。后台报错:
No handler found for GET /swagger-ui.html
2.显示Swagger空白页面
原因分析: 在访问http://localhost:8080/swagger-ui.html 时,这个swagger-ui.html相关的所有前端静态文件都在springfox-swagger-ui-2.6.1.jar里面。Spring Boot自动配置本身不会自动把/swagger-ui.html这个路径映射到对应的目录META-INF/resources/下面。我们加上这个映射即可。
@Configuration @EnableWebMvc public class ApplicationExceptionAdapter extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("swagger-ui.html").addResourceLocations( "classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations( "classpath:/META-INF/resources/webjars/"); } }
原文地址:http://mp.weixin.qq.com/s/3A7KJEvzIYfJL795HifK7w