1. 程式人生 > >從.Net到Java學習第五篇——Spring Boot &&Profile &&Swagger2

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

剛學java不久,我有個疑問,為何用到的各種java開源jar包許多都是阿里巴巴的開源專案,為何幾乎很少見百度和騰訊?不是說好的BAT嗎?

Spring Boot 的配置檔案及多環境配置

  Spring Boot 使用一個全域性的配置檔案 application.properties 或 application.yml,放置在 src/main/resources 目錄或者類路徑的 /config 下。
  Spring Boot 的全域性配置檔案的作用是對一些預設配置的配置值進行修改。
  例如將 Tomcat 的預設埠號 8080 修改為 8082,並將預設的訪問路徑 “/” 修改為 “/boot”。可以在 application.yml 中新增:

server:
  port: 8082
  context-path: /boot

  如果我們需要在不同的環境下面有不同的配置怎麼辦?比如生產、開發、測試三個不同的環境,我們的配置肯定不一樣。這時,我們需要用到Profile。

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

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

application-dev.yml:

server:
  port: 8083
  context-path: /boot

application-test.yml:

server:
  port: 8085
  context-path: /boot

application-prod.yml:

server:
  port: 8084
  context-path: /boot

接下來修改application.yml:表示,將採用application-dev.yml這個配置檔案。

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,最終執行效果如下:

相關推薦

.Net到Java學習——Spring Boot &&Profile &&Swagger2

剛學java不久,我有個疑問,為何用到的各種java開源jar包許多都是阿里巴巴的開源專案,為何幾乎很少見百度和騰訊?不是說好的BAT嗎? Spring Boot 的配置檔案及多環境配置   Spring Boot 使用一個全域性的配置檔案 application.properties 或 appli

.Net到Java學習——spring boot+mybatis+mysql

jar fig targe list pro ble TE png tween 環境:mysql5.7 新建mysql數據庫demo,然後執行如下sql腳本進行數據表創建和數據初始化: -- ---------------------------- -- Tabl

.Net到Java學習——Spring Boot檔案上傳和下載

圖片上傳 Spring Boot中的檔案上傳就是Spring MVC中的檔案上傳,將其整合進來了。 在模板目錄建立一個新的頁面 profile/uploadPage.html <!DOCTYPE html> <html xmlns:th="http://www.thymel

.Net到Java學習——spring boot+redis

“學習java已經十天,有時也懷念當初.net的經典,讓這語言將你我相連,懷念你......”接上一篇,本篇使用到的框架redis、FastJSON。 環境準備 安裝redis,下圖是我本機的redis綠色版,你可以網上自行下載安裝,如果不知道如何怎麼操作,可以移步到我的另一篇文章:ASP.NET R

Java學習 -- Java開發環境

jet 編輯器 協議 dea $path shell pat 工具 cpu Java開發環境 Java SE 開發環境 Java的開發環境支持Windows、MacOS、Linux,故下面以操作系統作為分類去配置開發環境。 Windows Java Platform, St

MyBatis學習——(手動分頁和pagehelper分頁實現)

1:專案場景介紹 在專案中分頁是十分常見的功能,一般使用外掛實現分頁功能,但是在使用外掛之前我們首先手動寫出分頁程式碼,發然對比外掛實現的分頁,利於我們理解分頁底層實現和更好的實現外掛分頁實用技術,本次使用的外掛是PageHelper(採用都是物理分頁) 在開始之前我們建立兩個表,分別是t_

springCloud 學習——構建zuul路由

建立一個簡單的spring-boot專案; 專案目錄: 一:pom.xml; <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.

【springboot 入門0 spring-boot是什麼

作為一個java程式設計師,如果你還不知道springboot,那你一定是落後了。 1. 什麼是springboot Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架

spring boot實戰()Spring boot Bean載入原始碼分析

public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostPro

SpringBoot入門系列: Spring Boot的測試

Spring Boot的測試,和普通專案的測試類同,可以繼續使用我們熟悉的測試工具。當然,這裡的測試,主要還是後臺程式碼的測試。 主要需要注意的地方僅有三點: 1、依賴包的引入:pom.xml中僅依賴spring-boot-starter-test,它把相關的依賴全部引入。 2、在測試類上的註解,常

SpringBoot學習---:動態資料來源(多資料來源自動切換)

目錄 五、測試 參考文獻 一、應用場景 專案需要從自己的資料庫上讀取和管理資料外,還有一部分業務涉及到其他多個數據庫。 為了能夠靈活地指定具體的資料庫,本文基於註解和AOP的方法實現多資料來源自動切換。在使用過

思維導圖學習 | :java學習特別,java小白到3年工作經驗成長曆程

配套Ximnd學習導圖下載地址 寫在最後 歡迎關注、喜歡、和點贊後續將推出更多的思維導圖學習文章,敬請期待。 歡迎關注我的微信公眾號獲取更多更全的學習資源,視訊資料,技術乾貨! 公眾號回覆

SpringBoot 2.X課程學習 | :yml語法讓配置檔案更加簡潔易讀

簡介       YAML 是一種簡潔的非標記語言(YAML Ain’t Markup Lang

Spring Cloud十三 | Spring Boot Admin服務監控

本文是Spring Cloud專欄的第十三篇文章,瞭解前十二篇文章內容有助於更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用元件介紹概覽 Spring Cloud第二篇 | 使用並認識Eureka註冊中心 Spring Cloud第三篇 | 搭建高可用E

輕輕鬆鬆學習SpringBoot2:Spring Boot獲取properties檔案中的漢字亂碼解決

上篇文章,我們雖然獲取到了配置檔案中的值,但是我們發現中文是亂碼這可不是我們想要的,那麼該如何解決呢1)通過工具進行設定:在IntelliJ IDEA中依次點選File -> Settings -> Editor -> File Encodings 其他工具

Spring Cloud學習系列【API網關服務】

proxy pack -c boolean 定制 能力 部分 線程 問題:   這篇隨筆接著學習微服務中一個比較重要的組件API網關服務。當我們微服務架構完成後最終是要提供給外部訪問的,於是我們需要一個統一的訪問入口,能隱藏我們內部服務URL細節,這就有點像局域網裏那個網關

Spring Boot整合Redis

Redis 是一個高效能的key-value資料庫,它支援儲存的value型別相對更多,包括string(字串)、list(連結串列)、set(集合)、zset(sorted set --有序集合)和hash(雜湊型別)。使用redis作為快取技術方案,主要是因為Redis快取技

spring boot 開發—SpringDataJPA整合 Redis 實現快取

對druid專案進行改造,增加redis快取支援。 1、redis簡介 Redis 是完全開源免費的,遵守BSD協議,是一個高效能的key-value資料庫。 Redis 與其他 key - value 快取產品有以下三個特點: Redis支援資料

Spring框架Spring與AOP

lease nco 列表 odi 動態 www implement .get org 一、AOP概述 AOP(Aspect Orient Programming),面向切面編程,是面向對象編程OOP的一種補充。面向對象編程是從靜態角度考慮程序的結構,而面向切面編程是從動態角

Django學習筆記--實戰練習一--查詢數據庫並操作cookie

settings sin -h update out backend uitable -s ror 一、啟動項目: 1 django-admin start mysite1 2 cd mysite1 3 python manage.py startapp loginapp