從.Net到Java學習第五篇——Spring Boot &&Profile &&Swagger2

從.Net到Java學習系列目錄html

剛學java不久,我有個疑問,爲什麼用到的各類java開源jar包許多都是阿里巴巴的開源項目,爲什麼幾乎不多見百度和騰訊?不是說好的BAT嗎?前端

Spring Boot 的配置文件及多環境配置

  Spring Boot 使用一個全局的配置文件 application.properties 或 application.yml,放置在 src/main/resources 目錄或者類路徑的 /config 下。
  Spring Boot 的全局配置文件的做用是對一些默認配置的配置值進行修改。
  例如將 Tomcat 的默認端口號 8080 修改成 8082,並將默認的訪問路徑 「/」 修改成 「/boot」。能夠在 application.yml 中添加:java

server:
  port: 8082
  context-path: /boot

  若是咱們須要在不一樣的環境下面有不一樣的配置怎麼辦?好比生產、開發、測試三個不一樣的環境,咱們的配置確定不同。這時,咱們須要用到Profile。web

  Profile 是 Spring 用來針對不一樣的環境對不一樣的配置提供支持的,全局 Profile 配置使用 application-{profile}. yml(如 application-prod.yml)。經過在 application.yml 中設置 spring.profiles.active = prod 來指定活動的 Profile。spring

依次再目錄下面新建三個配置文件,application-dev.yml、application-test.yml、application-prod.yml。它們分別表明開發環境、測試環境、生產環境的配置文件。json

application-dev.yml:api

server:
  port: 8083
  context-path: /boot

application-test.yml:springboot

server:
  port: 8085
  context-path: /boot

application-prod.yml:app

server:
  port: 8084
  context-path: /boot

接下來修改application.yml:表示,將採用application-dev.yml這個配置文件。asp.net

spring:
  profiles:
    active: dev

咱們在IDEA中運行項目,而後看下運行結果:

咱們看到啓用了8083端口,而咱們的配置文件application-dev.yml中正是配置的8083端口。

假設咱們在application.yml中已經配置了端口8082,看下會怎麼樣

運行結果:

Tomcat started on port(s): 8083 (http)

仍是使用的dev中8083端口,那麼咱們再來換下位置,把

server:
  port: 8082
  context-path: /boot

放到配置文件的最後面,再看下結果,結果仍是啓用的8083端口。

那麼說明,配置文件會優先獲取Profile中的配置,若是Profile中沒有的配置項, 那麼會直接取application.yml中的配置。

 Spring Boot實現RestFul

回到以前AreaController類的代碼:

    @Autowired
    private AreaService areaService;
    @RequestMapping(value = "/get", produces = {"application/json;charset=UTF-8"})
    public Map<String,Object> getArea(@PathParam("areaId") Integer areaId){
        Map<String,Object> modelMap= new HashMap<String,Object>() ;
        modelMap.put("area",areaService.getArea(areaId));
        return modelMap;
    }

咱們的經過URL訪問的方式是這樣的:經過?號傳遞參數,並且要求問號後面的參數名稱必須和@PathParam("areaId")中的參數名稱保持一致,顯然這樣是不符合RestFul風格的。

@PathParam註解接收的是傳統的URL界面傳參的方式

接下來,咱們稍微修改一下:

    @RequestMapping(value = "/get/{areaId}", produces = {"application/json;charset=UTF-8"})
    public Map<String,Object> getAreaApi(@PathVariable Integer areaId){
        Map<String,Object> modelMap= new HashMap<String,Object>() ;
        modelMap.put("area",areaService.getArea(areaId));
        return modelMap;
    }

再看下容許結果:

咱們再來修改一下代碼看下:

    @RequestMapping(value = "/get/{Id}", produces = {"application/json;charset=UTF-8"})
    public Map<String,Object> getAreaApi(@PathVariable("Id") Integer areaId){
        Map<String,Object> modelMap= new HashMap<String,Object>() ;
        modelMap.put("area",areaService.getArea(areaId));
        return modelMap;
    }

運行結果仍是同樣的。那麼這說明,當@PathVariable中不指定參數名稱的時候,默認就是把後面的areaId當成是接收參數了,若是@PathVariable中指定了接收參數的名稱(這個名稱必須和{Id}一致),那麼後面的Integer areaId能夠隨意命名。

@PathVariable註解接收的就是符合RestFull風格的參數。此外還有一個@RequestParam註解。

@RequestParam 和 @PathVariable 註解是用於從request中接收請求的,兩個均可以接收參數,關鍵點不一樣的是@RequestParam 是從request裏面拿取值,而 @PathVariable 是從一個URI模板裏面來填充。

SpringBoot整合Swagger2自動生成API文檔

手寫Api文檔的幾個痛點:

    文檔須要更新的時候,須要再次發送一份給前端,也就是文檔更新交流不及時。
    接口返回結果不明確
    不能直接在線測試接口,一般須要使用工具,好比postman
    接口文檔太多,很差管理

Swagger也就是爲了解決這個問題,固然也不能說Swagger就必定是完美的,固然也有缺點,最明顯的就是代碼移入性比較強。asp.net web api也有api文檔自動生成功能,最終效果和這個差很少。

(1)添加Swagger依賴

修改咱們的pom.xml文件,添加變量 <springfox.version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <springfox.version>2.7.0</springfox.version>
    </properties>

引入依賴

  <!--swagger2-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>${springfox.version}</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>${springfox.version}</version>
        </dependency>

(2)添加Swagger2的配置文件Swagger2Config

在config包下面新建類Swagger2Config

@Configuration
@EnableSwagger2
public class Swagger2Config {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.yujie.controller")) //須要注意的是這裏要寫入控制器所在的包
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("springboot利用swagger構建api文檔")
                .description("簡單優雅的restfun風格,https://www.cnblogs.com/jiekzou/")
                .termsOfServiceUrl("https://www.cnblogs.com/jiekzou/")
                .version("1.0")
                .build();
    }
}

注意:用@Configuration註解該類,等價於XML中配置beans;用@Bean標註方法等價於XML中配置bean。

如上代碼所示,經過@Configuration註解,讓Spring來加載該類配置。再經過@EnableSwagger2註解來啓用Swagger2。

createRestApi函數建立Docket的Bean以後,apiInfo()用來建立該Api的基本信息(這些基本信息會展示在文檔頁面中)。select()函數返回一個ApiSelectorBuilder實例用來控制哪些接口暴露給Swagger來展示,本例採用指定掃描的包路徑來定義,Swagger會掃描該包下全部Controller定義的API,併產生文檔內容(除了被@ApiIgnore指定的請求)。

添加文檔內容

在完成了上述配置後,其實已經能夠生產文檔內容,可是這樣的文檔主要針對請求自己,而描述主要來源於函數等命名產生,對用戶並不友好,咱們一般須要本身增長一些說明來豐富文檔內容。以下所示,咱們經過@ApiOperation註解來給API增長說明、經過@ApiImplicitParams、@ApiImplicitParam註解來給參數增長說明。

查看咱們AreaController類的代碼以下:

@Api(value = "區域操做controller", description = "區域相關的操做", tags = {"區域模塊校驗接口"})
@RestController
//@RequestMapping("/area")
public class AreaController {
    @Autowired
    private AreaService areaService;
/*    @RequestMapping(value = "/get", produces = {"application/json;charset=UTF-8"})
    public Map<String,Object> getArea(@PathParam("areaId") Integer areaId){
        Map<String,Object> modelMap= new HashMap<String,Object>() ;
        modelMap.put("area",areaService.getArea(areaId));
        return modelMap;
    }*/
    @ApiOperation(value="獲取區域詳細信息", notes="根據url的id來獲取區域詳細信息")
    @ApiImplicitParam(name = "Id", value = "區域ID", required = true, dataType = "Integer", paramType = "path")
    @RequestMapping(value = "/get/{Id}",method = RequestMethod.GET,produces = {"application/json;charset=UTF-8"})
    public Map<String,Object> getAreaApi(@PathVariable("Id") Integer areaId){
        Map<String,Object> modelMap= new HashMap<String,Object>() ;
        modelMap.put("area",areaService.getArea(areaId));
        return modelMap;
    }
    @ApiOperation(value="建立區域", notes="根據Area對象建立區域")
    @ApiImplicitParam(name = "area", value = "區域詳細實體area", required = true, dataType = "Area")
    @RequestMapping(value = "/add",method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
    public Map<String,Object> addArea(Area area){
        Map<String,Object> modelMap= new HashMap<String,Object>() ;
        modelMap.put("success",areaService.addArea(area));
        return modelMap;
    }
    @ApiOperation(value="修改區域", notes="根據Area對象修改區域")
    @ApiImplicitParam(name = "area", value = "區域詳細實體area", required = true, dataType = "Area")
    @RequestMapping(value = "/edit",method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
    public Map<String,Object> editArea(Area area){
        Map<String,Object> modelMap= new HashMap<String,Object>() ;
        modelMap.put("success",areaService.addArea(area));
        return modelMap;
    }
    @ApiOperation(value="獲取區域列表", notes="獲取區域列表")
    @ApiImplicitParams ({
            @ApiImplicitParam(name = "pageNum", value = "第多少頁", required = true, dataType = "Integer", paramType = "path"),
            @ApiImplicitParam(name = "pageSize", value = "每頁取多少條記錄", required = true, dataType = "Integer", paramType = "path")
    })
    @RequestMapping(value = "/all/{pageNum}/{pageSize}",method = RequestMethod.GET,produces = {"application/json;charset=UTF-8"})
    public Object findAllArea(@PathVariable("pageNum") int pageNum, @PathVariable("pageSize") int pageSize){
        return areaService.findAllArea(pageNum,pageSize);
    }
    @GetMapping(value="/del/{areaId}")
    public Map<String,Object> deleteArea(@PathVariable Integer areaId){
        Map<String,Object> modelMap= new HashMap<String,Object>() ;
        modelMap.put("success",areaService.deleteArea(areaId));
        return modelMap;
    }
    @GetMapping("/test")
    @ApiIgnore//使用該註解忽略這個API
    public String Test(){
        return "test";
    }
}

swagger的相關注解

swagger經過註解代表該接口會生成文檔,包括接口名、請求方法、參數、返回信息的等等。

  •     @Api:修飾整個類,描述Controller的做用
  •     @ApiOperation:描述一個類的一個方法,或者說一個接口
  •     @ApiParam:單個參數描述
  •     @ApiModel:用對象來接收參數
  •     @ApiProperty:用對象接收參數時,描述對象的一個字段
  •     @ApiResponse:HTTP響應其中1個描述
  •     @ApiResponses:HTTP響應總體描述
  •     @ApiIgnore:使用該註解忽略這個API
  •     @ApiError :發生錯誤返回的信息
  •     @ApiImplicitParam:一個請求參數
  •     @ApiImplicitParams:多個請求參數

啓動Spring Boot程序,訪問:http://localhost:8083/boot/swagger-ui.html,最終運行效果以下:

相關文章
相關標籤/搜索