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