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 ...
随机推荐
- keras_基本网络层结构(1)_常用层
参考文献: https://blog.csdn.net/sinat_26917383/article/details/72857454 http://keras-cn.readthedocs.io/e ...
- 移动端rem布局雪碧图解决方案 以及分享腾讯团队的在线雪碧图工具
先分享一下地址:http://alloyteam.github.io/gopng/ 使用的方法也很简单,将需要的小图标拖进去,全部拖进去后再调位置(每拖一个进去都会帮你排列好,但是没有间隔,所以全部拖 ...
- C++ wait捕捉的信号处理WIFEXITED/WEXITSTATUS/WIFSIGNALED
当一个进程正常或异常终止的时候,内核就像其父进程发送SIGCHLD信号,因为子进程是个异步事件,所以这种信号也是内核给那个父进程发的异步通知.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用 ...
- self-taught learning setting && semi-supervised learning
参考文献: 摘于上文献: The more general and powerful setting is the self-taught learning setting, which does n ...
- fusionjs uber开源的通用web插件化开发框架
fusionjs uber开源的web 插件化开发框架 核心特性: 基于插件的开发,依赖注入开发 开箱即用的服务器端渲染,构建结果拆分,模块热加载 Tree-shaking 支持 集成的插件 redu ...
- eclipse 3.7 中英文自由切换
最近在学习Java的开发,然后又很多的资料是对于的英文环境讲解,有的资料是对应的中文环境讲解,所以很都对不上号,郁闷啊....... 而且开发的时候,每个人都使用习惯也不相同:有的人喜欢英文界面,有的 ...
- DevExpress GridControl 单元格添加进度条(ProgressBar)
首先可以使用DevExpress GridControl 自带的进度条控件. 但是我要用一个方法来设置所以的单元格进度,而不是每个单元格都要设置一遍,同时我想要根据进度值不同,进度条显示不同的颜色. ...
- 【android】SDK环境变量配置
Android SDK: Android SDK提供了你的API库和开发工具构建,测试和调试应用程序,Android.简单来讲,Android SDK 可以看做用于开发和运行Android应用的一个软 ...
- Ninject Lazy Load问题
参考: http://stackoverflow.com/questions/2538132/lazy-loading-with-ninject 方案一: public class Module : ...
- gmake与make的区别
gnu make在linux下一般是叫make但是如果是在其他的unix系统下,因为有一个原生的makegnu make就改个名字叫gmake了.就这们简单 当port一个老的unix程序,如老的Su ...