spring boot 2
服务端验证:
// 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的更多相关文章
- 玩转spring boot——快速开始
开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...
- 【微框架】之一:从零开始,轻松搞定SpringCloud微框架系列--开山篇(spring boot 小demo)
Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...
- 玩转spring boot——开篇
很久没写博客了,而这一转眼就是7年.这段时间并不是我没学习东西,而是园友们的技术提高的非常快,这反而让我不知道该写些什么.我做程序已经有十几年之久了,可以说是彻彻底底的“程序老炮”,至于技术怎么样?我 ...
- 玩转spring boot——结合redis
一.准备工作 下载redis的windows版zip包:https://github.com/MSOpenTech/redis/releases 运行redis-server.exe程序 出现黑色窗口 ...
- 玩转spring boot——AOP与表单验证
AOP在大多数的情况下的应用场景是:日志和验证.至于AOP的理论知识我就不做赘述.而AOP的通知类型有好几种,今天的例子我只选一个有代表意义的“环绕通知”来演示. 一.AOP入门 修改“pom.xml ...
- 玩转spring boot——结合JPA入门
参考官方例子:https://spring.io/guides/gs/accessing-data-jpa/ 接着上篇内容 一.小试牛刀 创建maven项目后,修改pom.xml文件 <proj ...
- 玩转spring boot——结合JPA事务
接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...
- 玩转spring boot——结合AngularJs和JDBC
参考官方例子:http://spring.io/guides/gs/relational-data-access/ 一.项目准备 在建立mysql数据库后新建表“t_order” ; -- ----- ...
- 玩转spring boot——结合jQuery和AngularJs
在上篇的基础上 准备工作: 修改pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...
- 玩转spring boot——MVC应用
如何快速搭建一个MCV程序? 参照spring官方例子:https://spring.io/guides/gs/serving-web-content/ 一.spring mvc结合thymeleaf ...
随机推荐
- composer update 提示 username
解决办法 暂时修改composer.json "repositories": { "packagist": { "type": " ...
- CentOS7进程管理systemd详解
概述: 系统启动过程中,当内核启动完成,后加载根文件系统,后就绪的一些用户空间的服务的管理工作,就交由init进行启动和管理,在CentOS6之前的init的管理方式都类似,相关的内容我们在之前的 ...
- Codeforces 1009C: Annoying Present
C. Annoying Present time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 51Nod 1089:最长回文子串 V2(Manacher算法)
1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 回文串是指aba.abba.cccbccc.aaa ...
- oracle计算两个日期的时间差时分秒
Oracle函数可以实现诸多的功能,下面就介绍使用oracle函数计算时间差的实现方法. 两个Date类型字段:START_DATE,END_DATE,计算这两个日期的时间差(分别以天,小时,分钟,秒 ...
- IEEE 754 浮点数在计算机中的表示方法
IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用.这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denorma ...
- centos 安装tomcat 7为服务
3:安装Tomcat 下载apache-tomcat-7.0.33.tar.gz.解压缩: tar -xzvf apache-tomcat-7.0.33.tar.gz 将解压缩后的文件夹拷贝到/usr ...
- 【BZOJ4445】[SCOI2015]小凸想跑步(半平面交)
[BZOJ4445][SCOI2015]小凸想跑步(半平面交) 题面 BZOJ 洛谷 题解 首先把点给设出来,\(A(x_a,y_a),B(x_b,y_b),C(x_c,y_c),D(x_d,y_d) ...
- hBuilder培训资源视频教程汇总
DCloud对开发者的学习支持分3个层面:官方文档.三方专业培训.网友经验分享 DCloud的精力主要在做产品,配套的文档也会一直完善好.但专业的培训还不是DCloud能做好的,在HTML5中国产业联 ...
- 一个单元测试 学习 aysnc await
using System; using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; name ...