1. 程式人生 > >SpringBoot進階篇--表單、AOP、異常

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

SpringBoot4: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

.NET04-Serialize序列化加密解密

知識需要不斷積累、總結和沉澱,思考和寫作是成長的催化劑這篇很輕鬆,沒有什麼費腦子的,所以解析較少,程式碼較多,為數不多的拿來即用篇整個章節分佈請移步 .NET開篇總括 內容目錄 一、概述二、序列化1、二進位制檔案2、XML3、JSON三、加解密1、不可逆加密MD52、對稱可

(2)MySQLSQL優化(show statusexplain分析)

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。求解線性系統的方法有很多,這裏使用一種經典

13Python之面向對象

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之web2~使用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) 通過驗證後,則按照以