1. 程式人生 > >SpringBoot2.0專案模組整合之Swagger2(自定UI,服務啟動載入,攔截器),靜態資源的訪問

SpringBoot2.0專案模組整合之Swagger2(自定UI,服務啟動載入,攔截器),靜態資源的訪問

swagger是一款高效易用的嵌入式文件外掛,同時支援線上測試介面,快速生成客戶端程式碼。spring-boot-starter-swagger通過spring-boot方式配置的swagger實現。完美並且完整的支援swagger-spring的所有配置項,配置及其簡單,容易上手。支援api分組配置,通過正則表示式方式分組。支援分環境配置,你可以很容易讓你的專案api文件在開發環境,測試環境。

依賴包

		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.7.0</version>
		</dependency>

model中常用的註解:@ApiModel 註解類名,@ApiModelProperty 註解方法或者引數名

UserModel

package com.swagger.model;

import java.io.Serializable;

import io.swagger.annotations.ApiModelProperty;

/**
 * <p>
 * 角色
 * </p>
 * 
 * @author lixin([email protected])
 * @since 2018-08-03
 */
public class UserModel implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@ApiModelProperty(value = "id", required = false, position = 1, example = "10001")
	private Long userId;
	
	@ApiModelProperty(value = "編號", required = false, position = 1, example = "10001")
	private String userCode;
	
	@ApiModelProperty(value = "名稱", required = false, position = 1, example = "張三")
	private String userName;
	
	public UserModel() {
		
	}
	
	public UserModel(long userId, String userCode,String userName) {
		this.setUserId(userId);
		this.setUserCode(userCode);
		this.setUserName(userName);
	}

	public Long getUserId() {
		return userId;
	}

	public void setUserId(Long userId) {
		this.userId = userId;
	}

	public String getUserCode() {
		return userCode;
	}

	public void setUserCode(String userCode) {
		this.userCode = userCode;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	@Override
	public String toString() {
		return "UserModel [userId=" + userId + ", userCode=" + userCode + ", userName=" + userName + "]";
	}

}

控制器中常用的註解: @Api 註解控制器顯示的標識,有tags和description可以配置控制器顯示的標識;@ApiOperation 用來註解控制器方法顯示的標識; @ApiParam 用來註解控制器方法引數的名字,控制器方法在文件中需要顯示的預設值

UserController

package com.swagger.web.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.swagger.api.IUserService;
import com.swagger.model.UserModel;
import com.swagger.util.ApiConst;
import com.swagger.util.ResultEntity;

import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;

/**
 * <p>
 * 角色前端控制器
 * </p>
 *
 * @author lixin(
[email protected]
) * @since 2018-08-03 */ @Controller @RequestMapping("/user") public class UserController { private @Autowired IUserService userService; @ApiOperation(value = "新增") @RequestMapping(value = "/addUser", method = RequestMethod.POST, produces = { MediaType.APPLICATION_JSON_UTF8_VALUE }) public @ResponseBody ResultEntity<String> addUser( @ApiParam(value = "id", required = true) @RequestParam(value = "userId", required = true) Long userId, @ApiParam(value = "角色編號", required = true) @RequestParam(value = "userCode", required = true) String userCode, @ApiParam(value = "角色名稱", required = true) @RequestParam(value = "userName", required = true) String userName) { try { UserModel user = new UserModel(); user.setUserId(userId); user.setUserCode(userCode); user.setUserName(userName); userService.addUser(user); return new ResultEntity<String>(ApiConst.CODE_SUCC, ApiConst.DESC_SUCC); } catch (Exception e) { e.getStackTrace(); } return new ResultEntity<String>(ApiConst.CODE_FAIL, ApiConst.DESC_FAIL); } @ApiOperation(value = "查詢") @RequestMapping(value = "/getUser", method = RequestMethod.POST, produces = { MediaType.APPLICATION_JSON_UTF8_VALUE }) public @ResponseBody ResultEntity<List<UserModel>> getUser() { try { List<UserModel> list = userService.getUser(); return new ResultEntity<List<UserModel>>(ApiConst.CODE_SUCC, ApiConst.DESC_SUCC,list); } catch (Exception e) { e.getStackTrace(); } return new ResultEntity<List<UserModel>>(ApiConst.CODE_FAIL, ApiConst.DESC_FAIL); } }

swaggerConfig配置

@Configuration
@EnableSwagger2
public class SwaggerConfig {

	@Bean
	public Docket customDocket() {
		return new Docket(DocumentationType.SWAGGER_2)
				.apiInfo(apiInfo())
				.select()
				.apis(RequestHandlerSelectors.basePackage("com.swagger.web.controller"))
				.paths(PathSelectors.any())
				.build();
	}

	private ApiInfo apiInfo() {
		 return new ApiInfoBuilder()
//	                .title("")
	                .description("測試介面Api")
	                .termsOfServiceUrl("127.0.0.1")
	                .version("1.0")
	                .build();
	}

然後我們在看看我們自己的Ui,雖然和v2版的差不多,但是裡面有些不同

這是我們Ui的靜態資源

實際應用中,我們會有在專案服務啟動的時候就去載入一些資料或做一些事情這樣的需求。 
為了解決這樣的問題,Spring Boot 為我們提供了一個方法,通過實現介面 CommandLineRunner 來實現。

SwaggerCommandLineRunner

package com.swagger.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/** 
* @ClassName: SwaggerCommandLineRunner 
* @Description: TODO(啟動載入swagger) 
* @author lixin
* @date 2018年8月17日 下午4:17:32 
*  
*/
@Component
@Order(value = 1)
public class SwaggerCommandLineRunner implements CommandLineRunner {

	private static Logger logger = LoggerFactory.getLogger(SwaggerCommandLineRunner.class);

	@Override
	public void run(String... args) throws Exception {
		logger.debug(">>>>>>>>>>>>>>服務啟動載入:swagger初始化<<<<<<<<<<<<<");
	}

}


OK,下面來說一說SpringBoot 的攔截器配置,這裡的攔截器配置分為  SpringBoot 1.X版本和 SpringBoot 2.X版本:

SpringBoot 1.X用的是 繼承 WebMvcConfigurerAdapter類;

在SpringBoot 2.X中,WebMvcConfigurerAdapter這個類已經過時了,可以用繼承WebMvcConfigurationSupport,也可以實現 WebMvcConfigurer這個介面;在使用這個SpringBoot 2.X配置攔截器後,發現靜態資源居然也被攔截了,這裡就需要我們在過濾條件時,放開靜態資源路徑,我使用的是實現 WebMvcConfigurer這個介面。下面是攔截器的配置:

WebInterceptor

package com.swagger.config;

import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import net.sf.json.JSONObject;

/**  
* @ClassName: WebInterceptor  
* @Description: TODO()  
* @author lixin([email protected])  
* @date 2018年8月18日 下午2:58:42  
* @version V1.0  
*/ 
public class WebInterceptor implements HandlerInterceptor {
	
	 @Override
	    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
		 System.out.println("==============  request before  ==============");
	        httpServletResponse.addHeader("Access-Control-Allow-Origin", "*");
	        httpServletResponse.addHeader("Access-Control-Allow-Methods", "*");
	        httpServletResponse.addHeader("Access-Control-Max-Age", "1800");
	        httpServletResponse.addHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, token");
	        httpServletResponse.addHeader("Access-Control-Allow-Credentials", "true");
	        httpServletResponse.setContentType("application/json;charset=UTF-8");
	        httpServletResponse.setHeader("Cache-Control", "no-cache");
	        String token = httpServletRequest.getHeader("token");
			if(null != token){
				return true;
			}
			PrintWriter out = httpServletResponse.getWriter();
			JSONObject res = new JSONObject();
		    res.put("success","false");
		    res.put("msg","登入資訊失效,請重新登入!");
		    out.append(res.toString());
			out.flush();  
			return false;
	    }

	    @Override
	    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
	        System.out.println("==============  request  ==============");
	    }

	    @Override
	    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
	        System.out.println("==============  request completion  ==============");
	    }
}

WebMvcConfig

package com.swagger.config;

import java.util.Arrays;

import javax.servlet.MultipartConfigElement;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**  
* @ClassName: WebMvcConfig  
* @Description: TODO()  
* @author lixin([email protected])  
* @date 2018年8月18日 下午2:58:52  
* @version V1.0  
*/ 
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
	
	private static Logger logger = LoggerFactory.getLogger(SwaggerCommandLineRunner.class);

	/* (非 Javadoc)
	* <p>Title: addCorsMappings</p>
	* <p>Description: 跨域</p>
	* @param registry
	* @see org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter#addCorsMappings(org.springframework.web.servlet.config.annotation.CorsRegistry)
	*/
	@Override
	public void addCorsMappings(CorsRegistry registry) {
		registry.addMapping("/**")
			.allowedOrigins("*")
			.allowCredentials(true)
			.allowedMethods("GET", "POST", "DELETE", "PUT")
			.maxAge(3600);
	}
	
	 public void addInterceptors(InterceptorRegistry registry) {
//		 	registry.addInterceptor(new WebInterceptor());
	        registry.addInterceptor(new WebInterceptor()).excludePathPatterns(Arrays.asList("/static/**","/api/**")); //放開靜態資源攔截
	        logger.debug(">>>>>>>>>>>>>> 攔截器註冊完畢<<<<<<<<<<<<<");
	    }
	 /** 上傳附件容量限制 */
		@Bean
		public MultipartConfigElement multipartConfigElement() {
			MultipartConfigFactory factory = new MultipartConfigFactory();
			factory.setMaxFileSize("102400KB");
			factory.setMaxRequestSize("112400KB");
			return factory.createMultipartConfig();
		}
}

OK到這裡,我們的配置也就結束了。

不填token

填入token

相關推薦

SpringBoot2.0專案模組整合Swagger2UI服務啟動載入攔截靜態資源訪問

swagger是一款高效易用的嵌入式文件外掛,同時支援線上測試介面,快速生成客戶端程式碼。spring-boot-starter-swagger通過spring-boot方式配置的swagger實現。完美並且完整的支援swagger-spring的所有配置項,配置及其簡單,容

SpringBoot2.0專案模組整合RabbitMQ

springboot整合RabbitMQ非常簡單,如果只是簡單的使用配置非常少,springboot提供了spring-boot-starter-amqp專案對訊息各種支援。 新增依賴包 <!-- rabbitmq依賴 --> <dependency

使用SpringBoot2.0搭建企業級應用開發框架整合Shiro

準備 首先建立使用者許可權表 //使用者表 CREATE TABLE `sys_user` ( `id` varchar(32) NOT NULL COMMENT 'id', `username` varchar(64) DEFAULT NULL COMMENT '

Springboot2.x+shiro+redis整合填坑 redis只做快取的情況 Springboot2.0 整合shiro許可權管理

主要記錄關鍵和有坑的地方 前提: 1、SpringBoot+shiro已經整合完畢,如果沒有整合,先查閱之前的Springboot2.0 整合shiro許可權管理 2、redis已經安裝完成 3、redis客戶端使用Lettuce,這也是sprinboot2.0後預設的,與jedis的區別,自行百度

服務架構實戰篇:使用start.spring.io 構建SpringBoot2.0專案

簡介 該專案主要利用Spring 官方提供的線上專案腳手架來搭建SpringBoot 2.0的專案。 原始碼地址 GitHub:https://github.com/yundianzixun/spring-boot-starter 聯盟公眾號:IT實戰

springboot2.0.6實現整合swagger2.9.2良心版最新版看了複製就能用。

1、pom依賴: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-s

Springboot2.0 專案中TKmybatis和Activiti整合的問題

版本資訊:springboot 2.0,mybatis 3.4.6 , tkmybatis 2.0 ,activiti 6.0今天在整合專案的時候,發現mybatis和activiti整合時不會報錯,但是mapper和activiti整合到一起時啟動就會報錯,錯誤資訊如下:P

Spring-boot Swagger2打造不一樣的api

plugin itl pid 研究 ssa any cati plugins ast 一、Swagger2是什麽? Swagger 是一款RESTFUL接口的文檔在線自動生成+功能測試功能軟件。 Swagger 是一個規範和完整的框架,用於生成、描述、調用和可視化 RE

使用SpringBoot2.0搭建企業級應用開發框架使用Lombok

適用人 猿群 你還在為寫Getter/Setter而煩惱嗎?當你寫完一個有參建構函式後發現還需要再寫一個無參建構函式的時候是否有負面情緒產生?每個類中都要寫很長一段的Slf4j日誌物件使你感到憂傷嗎?那就一起來快樂地使用Lombok吧 基於註解提供多種在編譯時生產重複程式碼

使用SpringBoot2.0搭建企業級應用開發框架多環境配置

血淚背景 在將甲方粑粑的想法實踐於世人之前,我們的專案至少要經歷 開發→測試→執行 3個環境,對於不同的環境我們可能需要連線不同的資料庫、設定不同的上傳路徑、呼叫不同地址的遠端服務等等,這就要求必須有不同的配置來滿足多環境需求 如果我們是通過打包前手動修改檔案內容的話,會由

使用SpringBoot2.0搭建企業級應用開發框架配置LogBack日誌

前言 SpringBoot預設配置提供了對常用日誌的支援,如:Java Util Logging、Log4J、Log4J2和Logback,每種Logger都可以通過配置使用控制檯或者檔案輸出日誌內容 Logback是log4j框架的作者開發的新一代日誌框架,它效率更高、能夠適

Spring Boot 2.0官方文件 Actuator

執行器(Actuator)的定義 執行器是一個製造業術語,指的是用於移動或控制東西的一個機械裝置,一個很小的改變就能讓執行器產生大量的運動。 An actuator is a manufacturing term that refers to a mechanical device for

SpringBoot2.0專案配置https訪問

要使用https首先我們需要有證書,由於我們自己生成的證書會被多數瀏覽器不信任,所以我們採用申請的免費證書來演示。 一、先來說一說如何申請證書吧 1.登入騰訊雲,選擇雲產品——>SSL證書管理 2.點選申請證書,選擇亞洲誠信,按要求填寫完資訊,提交後大約十分鐘,證書會發到你的

模組cocoPod VS framework

模組化之路(實驗) 一直以來,我們都在嘗試讓程式碼儘可能高內聚、低耦合。比如我們將MVP框架改成MVVM框架,以解決Controller層程式碼臃腫不堪,讓model和view儘可能不要耦合。再比如,我們之前嘗試的路由,是為了讓Controller與Controller之間不要有太多的程式碼交集。而模組化

SpringCloud外網部署整合4------ZUUL服務閘道

有了註冊中心,配置中心,業務服務,那麼我們要用一個統一入口來訪問他 首先建立一個子模組並加入依賴 <dependency> <groupId>org.springframework.cloud</groupId> <a

Springboot2.x+shiro+redis整合填坑 redis只做快取的情況

主要記錄關鍵和有坑的地方 前提: 1、SpringBoot+shiro已經整合完畢,如果沒有整合,先查閱之前的Springboot2.0 整合shiro許可權管理 2、redis已經安裝完成 3、redis客戶端使用Lettuce,這也是sprinboot2.0後預設的,與jedis的區別,自行百度 4、js

ESP8266 WIFI模組學習1——模組的USB串列埠連線

ESP8266 WIFI模組是我一直想學習的模組,現在物聯網發展如此之快。 我們先看看ESP8266 WIFI模組長什麼樣子吧,如下圖: 然後,我們還需要一個TTL-USB串列埠線,如圖: 還需要一個串列埠除錯助手,為了接發資料。我使用的除錯助手如下圖:

ESP8266 WIFI模組學習2——模組與微控制器連線進行遠端操作

上一個部落格:ESP8266 WIFI模組學習之路(1)是關於對串列埠連線的,簡單驗證ESP8266是怎麼樣連線及其功能驗證,下面將通過微控制器連線,和手機進行遠端操作。 ESP8266和微控制器的連線,我這裡的微控制器型號為:STC12C5A60S2 ESP8266

springboot2.0專案axios跨域options請求攜帶定義header後臺接收不到

前臺發起請求後報錯 Failed to load http://192.168.1.107:8066/talk/queryList: Response to preflight request doesn't pass access control check: No 'Access-Cont

OpenCV contrib 3.2.0擴充套件模組新增與編譯VS2017+OpenCV3.2.0詳解與排坑

一Cmake配置與生成 安裝cmake下載地址:https://cmake.org/download/ 獲取最新版本:cmake-3.8.1-win64-x64.msi(可執行程式,不是壓縮包) 下載完畢直接執行安裝,只有一個步驟要注意, 選擇‘addCmake t