服务端验证:

// 1、修改实体
@Min(value = 18,message = "必须大于18岁")
private int age; // 2、修改add方法
@PostMapping(value = "/girls")
public Girl2 Add(@Valid Girl2 g , BindingResult bindingResult){
if (bindingResult.hasErrors()){
System.out.println(bindingResult.getFieldError().getDefaultMessage());
return null;
}
return girlRepository.save(g);
}

AOP

1、添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2、创建类
@Aspect
@Component
public class HttpAspect {
//拦截Girl2Controller.getList方法 ..表示这个方法任何参数都会被拦截
@Before("execution(public * com.milan.controller.Girl2Controller.getList(..))")
public void log(){
System.out.println("11111111111");
}
}
3、
// Girl2Controller所有的方法都会被拦截
@Before("execution(public * com.milan.controller.Girl2Controller.*(..))")
    @Before("execution(public * com.milan.controller.Girl2Controller.*(..))")
public void log(){
System.out.println("11111111111");
}
@After("execution(public * com.milan.controller.Girl2Controller.*(..))")
public void afterLog(){
System.out.println("22222222");
}
package com.milan.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.*;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@Aspect
@Component
public class HttpAspect {
private final static Logger logger= (Logger) LoggerFactory.getLogger(HttpAspect.class);
// 定义一个公用 的方法
@Pointcut("execution(public * com.milan.controller.Girl2Controller.*(..))")
public void log(){
}
@Before("log()")
public void beforLog(JoinPoint joinPoint){
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("iargs={}",joinPoint.getArgs());
}
@After("log()")
public void afterLog(){
logger.info("2222222222");
}
@AfterReturning(returning = "object",pointcut = "log()")
public void afterReturnLog(Object object){
logger.info("response={}",object);
}
}

捕获异常,统一处理:

// 1、创建ResultEnt
package com.milan.entity;
public class ResultEnt<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;
}
@Override
public String toString() {
return "ResultEnt{" +
"code=" + code +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}
//2、创建返回码管理枚举
package com.milan.enums;
public enum ResultEnum {
unknow_error(-1,"未知错误"),
success(0,"成功"),
error_小学(100,"你可能还在上小学"),
error_初中(101,"你可能还在上初中");
private Integer code;
private String msg;
ResultEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
} //3、创建工具类
package com.milan.utils;
import com.milan.entity.ResultEnt;
import com.milan.enums.ResultEnum;
public class ResultUtil {
public static ResultEnt success(Object object){
ResultEnt resultEnt = new ResultEnt();
resultEnt.setCode(ResultEnum.success.getCode());
resultEnt.setMsg(ResultEnum.success.getMsg());
resultEnt.setData(object);
return resultEnt;
}
public static ResultEnt success(){
return success(null);
}
public static ResultEnt error(Integer code,String message){
ResultEnt resultEnt = new ResultEnt();
resultEnt.setCode(code);
resultEnt.setMsg(message);
return resultEnt;
}
} //4、创建自定义异常类
package com.milan.handle;
import com.milan.entity.ResultEnt;
import com.milan.entity.exception.MyException;
import com.milan.enums.ResultEnum;
import com.milan.utils.ResultUtil;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
public class ExceptionHandle {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public ResultEnt handle(Exception e){
if( e instanceof MyException){
MyException myException = (MyException)e;
return ResultUtil.error(myException.getCode(),myException.getMessage());
}
return ResultUtil.error(ResultEnum.unknow_error.getCode(),ResultEnum.unknow_error.getMsg());
}
} //5、使用
package com.milan.service;
import com.milan.entity.Girl2;
import com.milan.entity.exception.MyException;
import com.milan.enums.ResultEnum;
import com.milan.repository.GirlRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
@Service
public class GirlService {
@Autowired
private GirlRepository girlRepository;
@Transactional
public void insertTwo(){
Girl2 g = new Girl2();
g.setName("a");
g.setAge(1);
girlRepository.save(g);
Girl2 a = new Girl2();
a.setName("ba");
a.setAge(2);
girlRepository.save(a);
}
public Girl2 getAge(Integer id)throws Exception{
Girl2 g = girlRepository.findOne(id);
Integer age = g.getAge();
if (age < 10){
throw new MyException(ResultEnum.error_小学);
}else if (age >= 10 && age <16 ){
throw new MyException(ResultEnum.error_初中);
}
return g;
}
}
// ---------Controller使用 @GetMapping(value = "getage/{id}")
public ResultEnt getAge(@PathVariable("id") Integer id) throws Exception{
return ResultUtil.success(girlService.getAge(id)) ;
} @PostMapping(value = "/girls")
public ResultEnt Add(@Valid Girl2 g , BindingResult bindingResult){
ResultEnt resultEnt = new ResultEnt(); if (bindingResult.hasErrors()){
return ResultUtil.error(202,bindingResult.getFieldError().getDefaultMessage());
}
return ResultUtil.success(girlRepository.save(g));
} //

单元测试

mvn clean package  //打包执行单元测试
mvn clean package -Dmaven.test.skip=true //打包跳过单元测试

右键,goto,test创建单元测试

//测试service
package com.milan.quick;
import com.milan.entity.Girl2;
import com.milan.service.GirlService;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class GirlServiceTest {
@Autowired
private GirlService girlService;
@Test
public void test01() throws Exception {
Girl2 girl2 = girlService.getAge(18);
Assert.assertEquals(17,girl2.getAge());
}
} // 测试controller
package com.milan.controller;
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 static org.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class Girl2ControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void getList() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/g2/girls"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string("abc"));
}
}

spring boot 2的更多相关文章

  1. 玩转spring boot——快速开始

    开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...

  2. 【微框架】之一:从零开始,轻松搞定SpringCloud微框架系列--开山篇(spring boot 小demo)

    Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...

  3. 玩转spring boot——开篇

    很久没写博客了,而这一转眼就是7年.这段时间并不是我没学习东西,而是园友们的技术提高的非常快,这反而让我不知道该写些什么.我做程序已经有十几年之久了,可以说是彻彻底底的“程序老炮”,至于技术怎么样?我 ...

  4. 玩转spring boot——结合redis

    一.准备工作 下载redis的windows版zip包:https://github.com/MSOpenTech/redis/releases 运行redis-server.exe程序 出现黑色窗口 ...

  5. 玩转spring boot——AOP与表单验证

    AOP在大多数的情况下的应用场景是:日志和验证.至于AOP的理论知识我就不做赘述.而AOP的通知类型有好几种,今天的例子我只选一个有代表意义的“环绕通知”来演示. 一.AOP入门 修改“pom.xml ...

  6. 玩转spring boot——结合JPA入门

    参考官方例子:https://spring.io/guides/gs/accessing-data-jpa/ 接着上篇内容 一.小试牛刀 创建maven项目后,修改pom.xml文件 <proj ...

  7. 玩转spring boot——结合JPA事务

    接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  8. 玩转spring boot——结合AngularJs和JDBC

    参考官方例子:http://spring.io/guides/gs/relational-data-access/ 一.项目准备 在建立mysql数据库后新建表“t_order” ; -- ----- ...

  9. 玩转spring boot——结合jQuery和AngularJs

    在上篇的基础上 准备工作: 修改pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  10. 玩转spring boot——MVC应用

    如何快速搭建一个MCV程序? 参照spring官方例子:https://spring.io/guides/gs/serving-web-content/ 一.spring mvc结合thymeleaf ...

随机推荐

  1. Portability Flaw Locale Dependent Comparison

    Portability Flaw Locale Dependent Comparison [问题描述] 该问题涉及String的toUpperCase()方法.具体通过例子演示相关现象. public ...

  2. redux-thunk中间件源码

    浅析redux-thunk中间件源码 大多redux的初学者都会使用redux-thunk中间件来处理异步请求,其理解简单使用方便(具体使用可参考官方文档).我自己其实也一直在用,最近偶然发现其源码只 ...

  3. HDU 1535

    http://acm.hdu.edu.cn/showproblem.php?pid=1535 水题 单向图,从1到P所有点,再从所有点回到1,问最小花费 先求一遍1的最短路,然后反向建图,再求一遍1的 ...

  4. 手动整合实现SSH项目开发02

    在bean包下建立User类和User.hbm.xml文件,实现User类和数据库表User的映射关系,具体User类不多说,User.hbm.xml如下: <?xml version=&quo ...

  5. AS中几个较好的插件

    Android ButterKnife Zelezny   自动生成依赖注入代码 Android Parcelable code generator  自动生成Parcelable代码 Selecto ...

  6. test20181018 B君的第一题

    题意 分析 考场爆零做法 考虑dp,用\(f(i,j,0/1)\)表示i及其子树中形成j个边连通块的方案数,其中i是否向外连边. \(O(n^3)\),转移方程太复杂就打挂了. #include< ...

  7. apache伪静态设置

    在网站根目录下新建一个.htaccess文件即可,编辑如下 RewriteEngine On #游戏列表详细介绍 RewriteRule ^g-([0-9]+).html$ game.php?acti ...

  8. 用Keras 和 DDPG play TORCS(1)

    用Keras 和 DDPG play TORCS(环境配置篇) 原作者Using Keras and Deep Deterministic Policy Gradient to play TORCS ...

  9. 【linux】linux文件属性权限的介绍

    众所周知,root的信息存在/etc/passwd下,个人密码存在/etc/shadow下,所有组名存在/etc/group下,因此这三个文件十分重要. 在linux系统下,我们可以通过"l ...

  10. laravel Hash密码 校对

    laravel加密 是使用hash不可逆的,但是可以对加密后的密码进行校对 $data = $r->all();$id = $data['id'];$user_password = bcrypt ...