SpringBoot進階篇--表單、AOP、異常
一、表單驗證
1、在實體類中設定我們過濾的條件
@Min(value = 18,message = "未成年禁止註冊!")
private int userage;
2、在控制器中返回的我們過濾的結果
/**
* POST方式新增一個使用者
* @param user
* @return
*/
@PostMapping(value = "adduser")
public User addUser(@Valid User user, BindingResult bindingResult){
//當表單中有不符合我們設定的時候
if (bindingResult.hasErrors()){
//打印出我們設定的警告
System.out.println(bindingResult.getFieldError().getDefaultMessage());
return null;
}
userRespository.save(user);
return user;
}
二、AOP處理請求
AOP:面向切面程式設計
1、新增依賴
<dependency >
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2、寫一個攔截器
graph LR
Before-->控制器
控制器-->After
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
* 攔截器
*
* @author MiChong
* @Email [email protected]
* @create 2018/2/22 0022
* @Version:V1.0
*/
@Aspect
@Component
public class HttpAspect {
private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);
/**
* 下面的攔截器可以引用log()方法,為了以後配置修改起來麻煩,這裡統一規定了攔截包名
*/
@Pointcut("execution(public * cn.buildworld.girl.web..*(..))")
public void log(){
}
/**
* 訪問控制器方法之前走的方法,註解後面是我們要攔截的控制器
* @param joinPoint 為了獲取類方法和引數
*/
@Before("log()")
public void before(JoinPoint joinPoint){
logger.info("before攔截");
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//url地址攔截
logger.info("url={}",request.getRequestURL());
//method攔截
logger.info("method={}",request.getMethod());
//ip攔截
logger.info("ip={}",request.getRemoteAddr());
//類方法攔截
logger.info("class_method={}", joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
//引數攔截
logger.info("args={}",joinPoint.getArgs());
}
/**
* 訪問控制器方法之後走的方法,註解後面是我們要攔截的控制器
*/
@After("log()")
public void after(){
logger.info("after攔截");
}
/**
* 獲得返回的內容
* @param object 返回的內容
*/
@AfterReturning(returning = "object",pointcut = "log()")
public void doAfterReturning(Object object){
logger.info("response={}",object);
}
}
三、統一異常處理
1、自定義一個異常類
PersonException.java
/**
* 自定義異常類
*
* @author MiChong
* @Email [email protected]
* @create 2018/2/22 0022
* @Version:V1.0
*/
public class PersonException extends RuntimeException {
private Integer code;
/**
* @param message 錯誤資訊
* @param code 錯誤碼
*/
public PersonException(String message, Integer code) {
super(message);
this.code = code;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
2、建立異常攔截器
ExceptionHandle.java
import cn.buildworld.girl.pojo.Result;
import cn.buildworld.girl.pojo.ResultUtil;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* Create by MiChong on 2018/2/22 0022
*
* @Email [email protected]
*
* 捕獲異常
*/
@ControllerAdvice
public class ExceptionHandle {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result handle(Exception e){
//判斷異常是否是我們自定義的異常
if(e instanceof PersonException){
PersonException personException = (PersonException) e;
return ResultUtil.error(personException.getCode(),personException.getMessage());
}
return ResultUtil.error(-1,e.getMessage());
}
}
3、結果集封裝
Result.java
package cn.buildworld.girl.pojo;
/**
* json物件
*
* @author MiChong
* @Email 1564666023@qq.com
* @create 2018/2/22 0022
* @Version:V1.0
*/
public class Result<T> {
/**
* 錯誤碼
*/
private Integer code;
/**
* 提示資訊
*/
private String msg;
/**
* 具體的內容
*/
private T data;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
ResultUtil.java
package cn.buildworld.girl.pojo;
/**
* 返回的結果包裝類
*
* @author MiChong
* @Email [email protected]
* @create 2018/2/22 0022
* @Version:V1.0
*/
public class ResultUtil {
/**
* 獲取成功的情況
* @param object
* @return
*/
public static Result success(Integer code,Object object){
Result result = new Result();
result.setCode(code);
result.setMsg("成功");
result.setData(object);
return result;
}
/**
* 獲取失敗的情況
* @param object
* @return
*/
public static Result error(Integer code,Object object){
Result result = new Result();
result.setCode(code);
result.setMsg("失敗");
result.setData(object);
return result;
}
}
4、使用
在服務層測試
public void getAge(Long id) throws Exception{
User one = userRespository.findOne(id);
if(one.getUserage() < 10){
throw new PersonException("你還在上小學吧", 100);
}
}
四、單元測試
測試請求的url介面
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import javax.swing.*;
import static org.junit.Assert.*;
/**
* Create by MiChong on 2018/2/22 0022
*
* @Email [email protected]
*/
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class PersonControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void getInfo() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/demo/getInfo"))
.andExpect(MockMvcResultMatchers.status().isOk());
}
}
相關推薦
SpringBoot進階篇--表單、AOP、異常
一、表單驗證 1、在實體類中設定我們過濾的條件 @Min(value = 18,message = "未成年禁止註冊!") private int userage; 2、在控制
easyui 進階之tree easyui 進階之表單校驗、自定義校驗
前言 easyui是一種基於jQuery的使用者介面外掛集合,它為建立現代化,互動,JavaScript應用程式,提供必要的功能,完美支援HTML5網頁的完整框架,節省網頁開發的時間和規模。非常的簡單易學。 easyui中文網:http://www.jeasyui.net/ easyui官網:http:
easyui 進階之表單校驗、自定義校驗
前言 easyui是一種基於jQuery的使用者介面外掛集合,它為建立現代化,互動,JavaScript應用程式,提供必要的功能,完美支援HTML5網頁的完整框架,節省網頁開發的時間和規模。非常的簡單易學。 今天我們來學習表單校驗以及如何自定義表單校驗 正文 一、從標記建立驗證框(vali
SpringBoot進階篇4:Spring Boot EHCache應用
1、SpringBoot Cache Spring Boot 本身提供了一個基於ConcurrentHashMap 的快取機制,也集成了EhCache2.x、JCache CJSR-107、EhCache3.x、Infinispan ),還有Couchb
springboot-表單驗證|AOP|統一異常處理
@PostMapping(value = "/girls") public Object addGirl(Girl girl) {//此處不用使用多個@RequestParam("name") Result result = new Re
SpringBoot進階之JPA實現分頁、排序
---------------repository類程式碼------------ public interface GirlRepository extends JpaRepository<G
.NET進階篇04-Serialize序列化、加密解密
知識需要不斷積累、總結和沉澱,思考和寫作是成長的催化劑這篇很輕鬆,沒有什麼費腦子的,所以解析較少,程式碼較多,為數不多的拿來即用篇整個章節分佈請移步 .NET開篇總括 內容目錄 一、概述二、序列化1、二進位制檔案2、XML3、JSON三、加解密1、不可逆加密MD52、對稱可
(2)MySQL進階篇SQL優化(show status、explain分析)
1.概述 在應用系統開發過程中,由於初期資料量小,開發人員寫SQL語句時更重視功能上的實現,但是當應用系統正式上線後,隨著生產資料量的急劇增長,很多SQL語句開始逐漸顯露出效能問題,對生產環境的影響也越來越大,此時這些有問題的SQL語句就成為整個系統性能的瓶頸,因此我們必須要對它們進行優化,該章節將詳細介紹在
學習springBoot 進階表單驗證(四)
現在用一個新的springBoot專案來繼續學習,所有的配置都是和springBootdemo一樣只是名字換了一下 SpringBootUpgrade 新專案 現在修改一下新增的方法,不在直接傳數值,而是直接傳一個Girl物件到後臺新增 修改後 啟動專案去測
實現求解線性方程(矩陣、高斯消去法)------c++程序設計原理與實踐(進階篇)
ipy 類型 cat sys sca solution gaussian 拷貝 img 步驟: 其中A是一個n*n的系數方陣 向量x和b分別是未知數和常量向量: 這個系統可能有0個、1個或者無窮多個解,這取決於系數矩陣A和向量b。求解線性系統的方法有很多,這裏使用一種經典
13、Python之面向對象進階篇
color self. __new__ cls 賦值 @class 自動調用 類方法 系統 1、靜態方法 靜態方法是指可以被類直接調用的方法,其類似於靜態屬性,其既可以被類直接調用,也可以被對象調用。在python中使用裝飾器@staticmethod來申明某個方法
mysql 開發進階篇系列 34 工具篇 mysqlcheck(MyISAM表維護工具)
alt 1.4 width pwd table 方式 選項 ble 優化 一.概述 mysqlcheck客戶端工具可以檢查和修復MyISAM表,還可以優化和分析表。實際上,它集成了mysql工具中check,repair,analyze,optimize功
mysql 開發進階篇系列 51 許可權與安全(許可權表user,db詳細介紹 )
一.概述 mysql 的許可權系統主要用來對連線到資料庫的使用者進行許可權驗證,以此來判斷此使用者是否屬於合法使用者,以及合法使用者給予的相應資料庫許可權。下面將介紹許可權系統的工作原理,以及將要熟練掌握賬號的管理和使用方法(mysql版本 5.7)。 1.1 許可權系統的
SpringBoot:SpringData JPA:進階查詢—JPQL/原生SQL查詢、分頁處理、部分欄位對映查詢
上一篇介紹了入門基礎篇SpringDataJPA訪問資料庫。本篇介紹SpringDataJPA進一步的定製化查詢,使用JPQL或者SQL進行查詢、部分欄位對映、分頁等。本文儘量以簡單的建模與程式碼進行展示操作,文章比較長,包含查詢的方方面面。如果能耐心看完這篇文章,你應該能使用SpringDataJ
SpringBoot進階之web進階2~使用AOP處理請求(日誌)
作為Spring兩大核心原理AOP和IOC,什麼是AOP? eg:下雨了我打開了傘,java和c程式設計師程式設計的區別 AOP利用的是橫切的技術,將面向物件構建的龐大的類的體系進行水平的切割,並且會將影響到多個類的公共行為封
python入門與進階篇(四)之包、模組、函式與變數作用域
python專案的組織結構 包(資料夾)-->模組(檔案)-->類-->函式和變數 seven.c4、six.c4:(seven)包名.模組名(c4) 構成名稱空間 seven包的結構: seven --t(子包) --
mysql小白之旅——進階篇2——儲存過程、事件、觸發器、事務、分散式事務
14.儲存過程的寫法 1)定義條件和處理 --CONDITION --HANDLER 2)游標 CURSOR --DECLARE --OPEN --FETCH --CLOSE 3)流程控制 --IF語句 --CASE語句 --LOOP語句 --LEAVE語句 相當於br
mysql 開發進階篇系列 49 表的資料匯出
一.概述 在資料庫的日常維護中,表的匯入和匯出是很頻繁的操作,本篇講解如何使用匯入功能,並以案例為演示。某些情況下,需要將表裡的資料匯出為某些符號分割的純資料文字,而不是sql語句,比如:(1)用來作為excel顯示。 (2)節省備份空間。(3)為了快速的載入資料,load data的載入速度比普通的sq
mysql 開發進階篇系列 50 表的資料匯入(load data infile,mysqlimport )
一.概述 上篇講到的表的資料匯出(select .. into outfile 或者mysqldump),這篇繼續講表的資料匯入,匯入也同樣有二個方法,分別是load data infile... 和mysqlimport。本質是一樣的,區別在於前者是mysql內部執行, 後者是mysql 外部執行。 1
mysql 開發進階篇系列 52 許可權與安全(系統四個許可權表的粒度控制關係)
一.概述 接著上篇的許可權介紹,當用戶進行連線的時候,許可權表的存取過程有以下兩個階段: (1) 先從user表中的host,user, authentication_string 這3個欄位中判斷連線的ip,使用者名稱,密碼是否存在於表中,如果存在,則通過身份驗證。 (2) 通過驗證後,則按照以