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 ...
随机推荐
- 第13课:HTML基础之DOM操作2
1. 1)d.innerHTML:标签中的所有内容 删除某个标签 a)可以直接修改innerHTML的值: b) 2)d.innerText:标签中的文本内容 3)input.value='aaa' ...
- 一个自动化测试工具 UI Recorder
链接 教程 UI Recorder 是一款零成本UI自动化录制工具,类似于Selenium IDE. UI Recorder 要比Selenium IDE更加强大! UI Recorder 非常简单易 ...
- Linux C 数据结构 ->单向链表<-(~千金散尽还复来~)
之前看到一篇单向链表的博文,代码也看着很舒服,于是乎记录下来,留给自己~,循序渐进,慢慢 延伸到真正的内核链表~(敢问路在何方?路在脚下~) 1. 简介 链表是Linux 内核中最简单,最普通的数据结 ...
- 使用Junit进行Java单元测试
1.新建一个Number类,该类中包含两个函数,求和.求差 2.在eclipse上安装Junit 右键test工程,选择“Properties”→“Java Build Path”→“Librarie ...
- Centos7环境下安装python3.6.4 并与python2共存
最近安装了新系统centos7,本身自带python2.7,但是由于需要使用python3 来运行一些应用,所以想到在centos环境下安装python3,并保证其和python2 可以共存. 步骤如 ...
- Linux升级nodejs及多版本管理
最近要用到开发要用到nodejs,于是跑到开发机运行了下node,已经安装了,深感欣慰,是啥版本呢?再次运行了下node -v,原来是0.6.x的.估计是早先什么时候谁弄的.那么来升级下node吧. ...
- BZOJ1095: [ZJOI2007]Hide 捉迷藏【动态点分治】
Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条 ...
- Laravel学习之旅(一)
路由 1.简介:简单的说就是将用户的请求转发给相应的程序进行处理: 2.作用:就是建立url和程序之间的映射. 3.请求类型:get.post.put.patch.delete 相比于thinkphp ...
- java面试题11
第九次面试题 1. GC是什么?为什么要有GC? GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩 ...
- DCI改进,发布后作业乱码不能打开
1.发布后作业不能打开问题,找到com.comsys.net.cn.dci.ui.dialog.PublishesDialog 的960行,改为这样: //以前没有指定文件编码前,采用系统默认编码 / ...