基于SpringBoot2的Swagger2配置(包括SpringMvc和CXF)

2,162 阅读1分钟

1、SpringMvc篇

用到的pom如下

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.2</version>
    </dependency>
    <dependency>
        <groupId>com.github.xiaoymin</groupId>
        <artifactId>swagger-bootstrap-ui</artifactId>
        <version>1.9.6</version
    </dependency>

说明:

1)、用swagger-bootstrap-ui替换springfox-swagger-ui,展示效果更友好。
   详情可参考swagger-bootstrap-ui官网(doc.xiaominfo.com/guide/)

A、新建配置类,主要是生成Docket对象。通过enable变量控制生产环境(值为false)和测试环境(值为true)切换。

@Configuratdion  
@EnableSwagger2  
public class Swagger2Config {  
    //application.properties中配置swagger启用或者关闭
    @Value("${swagger2.enable}")  
    private boolean enable;

    @Bean
    public Docket apis()
    {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.xxx.xxx"))
                .build()
                .enable(enable);

    }
    /**
     * Author: 
     * Date: 2019/9/4 16:27
     * Desc: api文档说明
     * @return
     */
    private ApiInfo apiInfo()
    {
        return new ApiInfoBuilder()
                   .title("xx系统接口文档")
                   .description("提供模块")
                   .contact(new Contact("自定义名称", "http://xxxx", "自定义邮箱"))
                   .version("1.0.0-SNAPSHOT")
                   .build();
    }

B、配置Controller类

swaggerui通过调用后台的Controller生成json文件进行展示。 一些基本的注解就不具体介绍了。例子如下:

@RestController
@RequestMapping("log")
@Api(tags = "日志管理", value = "日志管理")
public class LogController {

    @Resource
    private ILogService logServiceImpl;

    /**
     * Desc: 返回查询列表数据
     * @param
     * @return
     */
    @PostMapping("/showList")
    @ApiOperation(value="返回列表数据", notes="")
    public CommonRetVO<Page<LogVO>> list(@RequestBody LogQuery logQuery) {
        return logServiceImpl.query(logQuery);
    }

}

说明:
1、按照swagger的规范,特别是泛型,需要在Controller返回值中明确标出具体对象类型。 泛型对象在生成set方法的时候,参数是否是泛型,有些编辑器会默认Object,导致swaggerui展示不出来字段信息。
2、如果使用shiro,springsecurity等权限框架,需要放开/v2/**,/swagger-resources/**, /webjars/** 的swagger请求地址,否则被拦截后swaggerui依然显示不了。

基本按照以上配置就可以跑起来了,页面访问地址为http(s)://ip地址:端口/contextPath(或自定义servlet地址前缀)/doc.html

2、CXF篇

cxf采用3.3.3版本 ,提供RESTFul的Webservice接口。

用到的pom如下:

 <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-service-description-swagger</artifactId>
        <version>3.3.3</version>
  </dependency>
  <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.2</version>
    </dependency>
    <dependency>
        <groupId>com.github.xiaoymin</groupId>
        <artifactId>swagger-bootstrap-ui</artifactId>
        <version>1.9.6</version
    </dependency>

说明:
1)、后端主要是cxf-rt-rs-service-description-swagger来实现,前端仍然采用swagger-bootstrap-ui,由于ui是纯前端代码,需要依赖将后端生成的json文件处理后返回给ui ,所以需要引入pringfox-swagger2来实现。
2)、由于默认的swagger-ui的生成json的请求路径是/v2/api-docs,cxf生成的swagger的json路径依赖于{cxfservletpath}+{webservice的address}/swagger.json,只需要在springboot的applicatin.properties中配置swagger-ui的默认请求路径即可。比如:
springfox.documentation.swagger.v2.path=/cxfservletpath/webservice的address/swagger.json , 其中cxfservletpath和webservice的address根据具体项目更改下即可。

A、新建配置类

@Configuration
public class ChildCxfConfig extends CxfConfig
{
  //application.properties中配置Swagger2Feature启用或者关闭
  @Value("${swagger2cxf.enable}")
  private boolean enable;
  
  @Override
  protected List<Feature> getFeatureList() {
  if (enable)
  {
      List<Feature> list=new ArrayList<Feature>();
      Swagger2Feature swagger2Feature=new Swagger2Feature();
      swagger2Feature.setTitle("RESTful WebService");
      swagger2Feature.setPrettyPrint(true);
      swagger2Feature.setDescription("RESTful Webservice API");
      swagger2Feature.setVersion("1.0.0");
      swagger2Feature.setBasePath("/xxx/xxxservice");
      swagger2Feature.setResourcePackage("com.xxxx.service");

      list.add(swagger2Feature);
      return list;
  }else
  {
      return null;
  }

}

父类中

protected List<Feature> getFeatureList(){
    return null;
}

@Bean
public Server busRestWebserviceConfig(){
    JAXRSServerFactoryBean bean=new JAXRSServerFactoryBean();
    ...
    List<Feature> featureList=this.getFeatureList();
    if (null!=featureList && featureList.size()>0)
    {
       //设置Swagger2Feature
        bean.setFeatures(featureList);
    }

    return bean.create();
}

这样基本配置就结束了。 剩下的工作需要在扫描包范围内的的实现类加上Swagger的注解即可,这里不再累述。 需要注意的是实现类上必须有@Path("/")注解 ,否则swaggerui也不生成接口文档,Path里的路径根据自己需要定义即可,最少是/。