一、表单验证
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 1564666023@qq.com
* @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 1564666023@qq.com
* @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 1564666023@qq.com
*
* 捕获异常
*/
@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 1564666023@qq.com
* @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 1564666023@qq.com
*/
@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());
}
}