AOP實現(xiàn)全局優(yōu)雅校驗


1. 之前寫過一篇關(guān)于如何實現(xiàn)web端優(yōu)雅校驗的文章(http://m.itdecent.cn/p/23e5768a34cd)今天接著補充一下如何實現(xiàn)service端的校驗,與君共勉.


2. 源代碼

maven依賴:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

實體對象:

package com.example.demo.model;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.Future;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import java.time.LocalDateTime;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class NewStudent {

    @Range(min = 15, max = 65, message = "年齡必須在15歲到65歲")
    private int age;

    @Size(min = 2, max = 30)
    private String name;

    @NotEmpty(message = "自定義錯誤信息,score不能為空!")
    private String score;

    @Future(message = "生效時間必須大于當(dāng)前時間")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

}

interface:

package com.example.demo.service;

import com.example.demo.model.NewStudent;

import javax.validation.Valid;

/**
 * @Author: Robin
 * @Date: 2020/4/11 7:01 PM
 * @aphorism: "Stay hungry, Stay foolish"
 */

public interface Test1Service {
    /**
     * insertStudent
     * @param student
     * @return
     */
    int insertStudent(@Valid NewStudent student);
}

service實現(xiàn)類:

package com.example.demo.service;

import com.example.demo.model.NewStudent;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

/**
 * @Author: Robin
 * @Date: 2020/4/11 7:03 PM
 * @aphorism: "Stay hungry, Stay foolish"
 */
@Service
@Validated
public class Test01ImplService implements Test1Service {
    @Override
    public int insertStudent(NewStudent student) {
        System.out.println("niu");
        return 0;
    }
}

AOP全局異常攔截器(非web)

package com.example.demo.base;

import com.example.demo.model.Result;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import javax.validation.ConstraintViolationException;

/**
 * @Author: Robin
 * @Date: 2020/4/11 7:49 PM
 * @aphorism: "Stay hungry, Stay foolish"
 */
@Component
@Aspect
public class ExceptionHandler {
    @Pointcut("execution(* com.example.demo.controller.*.*(..))")
    public void constraintViolationException() {

    }

    @Around("constraintViolationException()")
    public Object catchException(ProceedingJoinPoint point) throws Throwable {
        try {
            System.out.println("david");
            return point.proceed();
        } catch (ConstraintViolationException e) {
            System.out.println(e.getConstraintViolations());
            return new Result(101, e.getMessage(), "funny");
        } catch (Exception e) {
            System.out.println("muddy");
            return new Result(111, e.getMessage(), null);
        }
    }


}


準(zhǔn)備模擬測試數(shù)據(jù)

package com.example.demo.controller;

import com.example.demo.model.NewStudent;
import com.example.demo.model.Result;
import com.example.demo.service.Test1Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.time.LocalDateTime;

/**
 * @Author: Robin
 * @Date: 2020/4/11 8:07 PM
 * @aphorism: "Stay hungry, Stay foolish"
 */
@RestController
public class ExceptionTest {

    @Resource
    private Test1Service test1Service;

    @GetMapping(value = "/test002")
    public Result testException() {
        NewStudent ss = new NewStudent();
        ss.setAge(25);
        ss.setScore("100");
        ss.setName("robin");
        LocalDateTime t =LocalDateTime.now().minusHours(1);
        ss.setCreateTime(t);
        test1Service.insertStudent(ss);
        return new Result(200, "", ss);
    }
}

測試效果:

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容