基於SpringMVC下的Rest服務框架搭建【1、集成Swagger】


基於SpringMVC下的Rest服務框架搭建【1、集成Swagger】

1、需求背景

SpringMVC本身就可以開發出基於rest風格的服務,通過簡單的配置,即可快速開發出一個可供客戶端調用的rest服務,通常這些服務要不就是用於手機app的開發,要不就是提供給第三方開發者使用,不管哪種情況,你都需要提供詳細的說明給別人,而Swagger就是為這種情況而生的,通過在接口上的注解,生成可供第三方模擬測試和閱讀的接口列表,既美觀又使用,真是行走江湖之必備良葯。
【XmPlatform原創,轉載的話請注明】
下面先上美圖:

img

好了,下面言歸正傳,該如何將Swagger集成到springMVC中呢?

2、依賴包以及Swagger-ui版本

  • 如果你用的是maven,依賴包如下:
    <groupId>com.mangofactory</groupId>
    <artifactId>swagger-springmvc</artifactId>
    <version>1.0.2</version>
</dependency>
<dependency>
    <groupId>com.mangofactory</groupId>
    <artifactId>swagger-models</artifactId>
    <version>1.0.2</version>
</dependency>
<dependency>
    <groupId>com.wordnik</groupId>
    <artifactId>swagger-annotations</artifactId>
    <version>1.3.11</version>
</dependency>
<!-- swagger-springmvc dependencies -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>15.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.4.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.4.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml</groupId>
    <artifactId>classmate</artifactId>
    <version>1.1.0</version>
</dependency>
  • 如果你用的是jeesite框架的話,你只需引入下面三個lib即可:
swagger-annotations-1.3.11.jar
swagger-models-1.0.2.jar
swagger-springmvc-1.0.2.jar

  • Swagger-ui版本

大家可以到https://github.com/swagger-api/swagger-ui/releases下載最新的版本,目前最新版本為2.1.4

3、新建配置Java文件

在你的JavaWeb工程中新建一個名為SwaggerConfig的java文件,代碼如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.mangofactory.swagger.configuration.SpringSwaggerConfig;
import com.mangofactory.swagger.models.dto.ApiInfo;
import com.mangofactory.swagger.plugin.EnableSwagger;
import com.mangofactory.swagger.plugin.SwaggerSpringMvcPlugin;

/**
 * @author xiegx
 * @version 創建時間:2016-8-16 下午2:01:10
 * SwaggerUI配置
 */
@Configuration
@EnableSwagger
@EnableWebMvc
@ComponentScan(basePackages ={"com.xxx.soa"})  
public class SwaggerConfig extends WebMvcConfigurerAdapter {  

    private SpringSwaggerConfig springSwaggerConfig;

    /**
     * Required to autowire SpringSwaggerConfig
     */
    @Autowired
    public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig)
    {
        this.springSwaggerConfig = springSwaggerConfig;
    }

    /**
     * Every SwaggerSpringMvcPlugin bean is picked up by the swagger-mvc
     * framework - allowing for multiple swagger groups i.e. same code base
     * multiple swagger resource listings.
     */
    @Bean
    public SwaggerSpringMvcPlugin customImplementation()
    {
        return new SwaggerSpringMvcPlugin(this.springSwaggerConfig)
                .apiInfo(apiInfo())
                .includePatterns(".*")
                .swaggerGroup("XmPlatform")
                .apiVersion("1.0.0");
    }

    @Override  
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {  
      configurer.enable();  
    }  
    /*
	 * "標題 title",
	 * "描述 description", 
	 * "termsOfServiceUrl", 
	 * "聯系郵箱 contact email",
	 * "許可證的類型 license type", 
	 * "許可證的鏈接 license url"
	 */
    private ApiInfo apiInfo()
    {
        ApiInfo apiInfo = new ApiInfo(
                "xxx平台API文檔",
                "后台RESTful API",
                "",//
                "admin@xmplatform.com",
                "",
                "");
        return apiInfo;
    }
}

注意:basePackages為掃描的包路徑(你的controller所在的包路徑),其他的東西大家看看應該就懂的了,就不多說了。

4、新建測試Controller

例如新建一個TestController.java,代碼如下:

@Controller
@RequestMapping(value = "/soa/test")
@Api(value="TestController",description="測試接口描述")
public class TestController {
	/*
	 * @ApiOperation(value = "接口說明", httpMethod ="接口請求方式", response ="接口返回參數類型", notes ="接口發布說明"
	 * 
	 * @ApiParam(required = "是否必須參數", name ="參數名稱", value ="參數具體描述"
	 */
	@RequestMapping(value = {""})
	@ApiOperation(value="接口說明(測試)",httpMethod="GET",notes="在沒有會話、沒有簽名的情況下,進入方法體")
	public void test(HttpServletRequest request, HttpServletResponse response, Model model) {
		try {
			response.getWriter().write("ignoreAll");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

上述代碼中的幾個注解需要說明一下:

  • Api 表明可供Swagger展示的接口類,value表示接口類的描述(Controller類的這個注解可加可不加,加這個注解更多的是為了顯示接口類的描述)
  • ApiOperation 表明這個方法供Swagger展示的接口方法,value等含義詳細可看上述代碼中的注釋
  • ApiParam 方法中的參數只有加了這個注解,才能顯示中文描述,否則只顯示英文

5、靜態資源文件的配置

將步驟2、中提到的最新版本的Swagger-ui拷貝到你的JavaWeb工程中

假如你用的是jeesite框架,你可以拷貝到static目錄下,例如static\swagger;你也可以拷貝到WEB-INF目錄下,例如WEB-INF\swagger,不過此時你需要在springMVC配置文件中進行靜態文件過濾的處理,例如<mvc:resources mapping="/swagger/**" location="/WEB-INF/swagger/"/>

6、收工,啟動應用服務器

打開瀏覽器,訪問swagger目錄中的index.html,即可看到美觀的接口文檔呈現在你面前。

img

















You Want More ?Ok,That is it

1、如何漢化/顯示中文

swagger-ui本身是支持多語言的,在index.html中有這么一段代碼:

<!-- Some basic translations -->
  <!-- <script src='lang/translator.js' type='text/javascript'></script> -->
  <!-- <script src='lang/ru.js' type='text/javascript'></script> -->
  <!-- <script src='lang/en.js' type='text/javascript'></script> -->

大家只需要把注釋打開,同時加入對應的中文js即可,最終修改如下:

<!-- Some basic translations -->
  <script src='lang/translator.js' type='text/javascript'></script>
  <script src='lang/zh-cn.js' type='text/javascript'></script>
  <!-- <script src='lang/en.js' type='text/javascript'></script> -->

2、在swagger-ui中默認的參數的Content Type是application/json,測試時發現后台參數沒有接收到值,怎么辦?

img

大家可能會問,Content Type是application/json有什么影響,為什么要修改為其他呢?這里就要涉及到springMVC中將請求傳遞過來的參數注入到Controller方法對應對象的原理了,具體知識大家可以搜索一下,這個不是本文重點我就不多講了,其實我們通常寫的Controller方法,默認的Content Type其實是application/x-www-form-urlencoded,而swagger中參數的默認Content Type是application/json,這樣就會導致使用swagger測試時,提交到Controller方法的對應參數無法正確注入。


  • 那么,該如何處理呢,能改成其他嗎?

其實在swagger-ui的Issues中有人提到過,https://github.com/swagger-api/swagger-ui/issues/658,解決的辦法就是要設置consumes這個東東。

  • 解決辦法找到了,那consumes在哪里設置呢?

答案就是在@ApiOperation這個注解里面進行設置,將consumes修改為“application/x-www-form-urlencoded”即可,例如:

@ApiOperation(value="接口說明(測試)",httpMethod="GET",consumes="application/x-www-form-urlencoded",notes="在沒有會話、沒有簽名的情況下,進入方法體")

img

  • 那在什么情況下,參數的Content Type才是application/json呢?

當你的參數加了@RequestBody注解的時候,表示此參數接收的是json數據,這個時候你就可以將consumes寫為application/json了

3、想要知道ApiOperation注解中httpMethod等參數都能寫哪些值?

這個看api文檔吧,提供一個地址給大家:http://docs.swagger.io/swagger-core/apidocs/com/wordnik/swagger/annotations/ApiOperation.html


還有更多問題?歡迎留言討論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM