SpringBoot使用进阶
2017-12-16 22:56
260 查看
一、表单验证
在实体内注解验证信息
输出表单验证是否通过(Controller)
二、AOP统一处理
添加依赖
Http请求拦截
三、统一异常处理
1、定义统一的返回模型
packagecom.lei.domain;
/**
*返回前台对象
*/
publicclassResult<T>{
/**0为成功,1为失败*/
privateIntegercode;
privateStringmsg;
privateTdata;
publicIntegergetCode(){
returncode;
}
publicvoidsetCode(Integercode){
this.code=code;
}
publicStringgetMsg(){
returnmsg;
}
publicvoidsetMsg(Stringmsg){
this.msg=msg;
}
publicTgetData(){
returndata;
}
publicvoidsetData(Tdata){
this.data=data;
}
}
返回对象模型的工具类
packagecom.lei.utils;
importcom.lei.domain.Result;
/**
*返回结果的工具类
*/
publicclassResultUtil{
publicstaticResultsuccess(Objectobject){
Resultresult=newResult();
result.setCode(0);
result.setMsg("成功");
result.setData(object);
returnresult;
}
publicstaticResultsuccess(){
returnsuccess(null);
}
publicstaticResulterror(Integercode,Stringmsg){
Resultresult=newResult();
result.setCode(code);
result.setMsg(msg);
returnresult;
}
}
2、定义自己的异常并统一捕获
1)定义异常枚举
packagecom.lei.enums;
publicenumExceptionEnum{
UNKNOW_ERROR(-1,"未知错误"),
SUCCESS(0,"成功"),
XIAO_SCHOOL(100,"你还在上小学吧"),
MIDDLE_SCHOOL(101,"你在上初中吧");
privateIntegercode;
privateStringmsg;
ExceptionEnum(Integercode,Stringmsg){
this.code=code;
this.msg=msg;
}
publicIntegergetCode(){
returncode;
}
publicStringgetMsg(){
returnmsg;
}
}
2)定义自己的异常类
packagecom.lei.exception;
importcom.lei.enums.ExceptionEnum;
/**
*Girl的异常类
*/
publicclassGirlExceptionextendsRuntimeException{
privateIntegercode;
publicGirlException(ExceptionEnumexceptionEnum){
super(exceptionEnum.getMsg());
this.code=exceptionEnum.getCode();
}
publicIntegergetCode(){
returncode;
}
publicvoidsetCode(Integercode){
this.code=code;
}
}
3)捕获异常的Handler
packagecom.lei.handler;
importcom.lei.domain.Result;
importcom.lei.enums.ExceptionEnum;
importcom.lei.exception.GirlException;
importcom.lei.utils.ResultUtil;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.web.bind.annotation.ControllerAdvice;
importorg.springframework.web.bind.annotation.ExceptionHandler;
importorg.springframework.web.bind.annotation.ResponseBody;
/**
*异常类的Handler
*/
@ControllerAdvice
publicclassExceptionHandle{
privatestaticfinalLoggerlogger=LoggerFactory.getLogger(ExceptionHandle.class);
@ExceptionHandler(value=Exception.class)
@ResponseBody
publicResultgetAgeHandle(Exceptione){
if(einstanceofGirlException){
GirlExceptiongirlException=(GirlException)e;
returnResultUtil.error(girlException.getCode(),girlException.getMessage());
}else{
logger.info("系统异常:{}",e);
thrownewGirlException(ExceptionEnum.UNKNOW_ERROR);
}
}
}
4)service层使用异常类
四、单元测试
测试Service层的用例
packagecom.lei.service;
importorg.junit.Assert;
importorg.junit.Test;
importorg.junit.runner.RunWith;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.test.context.SpringBootTest;
importorg.springframework.test.context.junit4.SpringRunner;
importstaticorg.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest
publicclassGirlServiceTest{
@Autowired
privateGirlServicegirlService;
@Test
publicvoidfindOneAge()throwsException{
Assert.assertEquals(newInteger(12),girlService.findOneAge(1));
}
}
测试Controller层的用例
packagecom.lei.controller;
importorg.junit.Test;
importorg.junit.runner.RunWith;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
importorg.springframework.boot.test.context.SpringBootTest;
importorg.springframework.test.context.junit4.SpringRunner;
importorg.springframework.test.web.servlet.MockMvc;
importorg.springframework.test.web.servlet.request.MockMvcRequestBuilders;
importorg.springframework.test.web.servlet.result.MockMvcResultMatchers;
importstaticorg.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
publicclassGirlControllerTest{
@Autowired
privateMockMvcmvc;
@Test
publicvoidgetAll()throwsException{
mvc.perform(MockMvcRequestBuilders.get("/girl/getAll"))
.andExpect(MockMvcResultMatchers.status().isOk())//判断链接是否可以访问
.andExpect(MockMvcResultMatchers.content().string("123456"));//判断返回的内容是不是我们想要的
}
}
在实体内注解验证信息
packagecom.lei.domain; importjavax.persistence.Entity; importjavax.persistence.GeneratedValue; importjavax.persistence.Id; importjavax.validation.constraints.Min; @Entity publicclassGirl{ //@GeneratedValue自增 @Id @GeneratedValue privateIntegerid; privateStringname; //年龄最小为18,如果低于18提示信息为:不允许未成年入内 @Min(value=18,message="不允许未成年入内") privateIntegerage; privateStringcupSize; //一定要有个无参的构造方法 publicGirl(){ } publicIntegergetAge(){ returnage; } publicvoidsetAge(Integerage){ this.age=age; } publicIntegergetId(){ returnid; } publicvoidsetId(Integerid){ this.id=id; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicStringgetCupSize(){ returncupSize; } publicvoidsetCupSize(StringcupSize){ this.cupSize=cupSize; } }
输出表单验证是否通过(Controller)
/**
*添加一个女生
*BindingResult存放验证不通过的对象
*/
@PostMapping(value="/addGirl")
publicResult<Girl>addGirl(@ValidGirlgirl,BindingResultbindingResult){
if(bindingResult.hasErrors()){
returnResultUtil.error(1,bindingResult.getFieldError().getDefaultMessage());
}
returnResultUtil.success(girlRepository.save(girl));
}
二、AOP统一处理
添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
Http请求拦截
packagecom.lei.aspect;
importorg.aspectj.lang.JoinPoint;
importorg.aspectj.lang.annotation.*;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.stereotype.Component;
importorg.springframework.web.context.request.RequestContextHolder;
importorg.springframework.web.context.request.ServletRequestAttributes;
importjavax.servlet.http.HttpServletRequest;
/**
*Http请求拦截
*/
@Aspect
@Component
publicclassHttpAsPect{
privatefinalstaticLoggerlogger=LoggerFactory.getLogger(HttpAsPect.class);
//定义一个切面方法,拦截GirlController下面的所有方法,(..)..代表所有参数
@Pointcut("execution(public*com.lei.controller.GirlController.*(..))")
publicvoidlog(){
}
@Before("log()")
publicvoiddoBefore(JoinPointjoinPoint){
logger.info("调用方法前。。。。。");
ServletRequestAttributesattributes=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequestrequest=attributes.getRequest();
//url
logger.info("url={}",request.getRequestURL());
//ip
logger.info("ip={}",request.getRemoteAddr());
//method
logger.info("method={}",request.getMethod());
//类方法
logger.info("class_method={}",joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
//参数
logger.info("args={}",joinPoint.getArgs());
}
@After("log()")
publicvoiddoAfter(){
logger.info("调用方法后。。。。。。");
}
//return后
@AfterReturning(returning="object",pointcut="log()")
publicvoiddoAfterReturning(Objectobject){
logger.info("response={}",object.toString());
}
}
三、统一异常处理
1、定义统一的返回模型
packagecom.lei.domain;
/**
*返回前台对象
*/
publicclassResult<T>{
/**0为成功,1为失败*/
privateIntegercode;
privateStringmsg;
privateTdata;
publicIntegergetCode(){
returncode;
}
publicvoidsetCode(Integercode){
this.code=code;
}
publicStringgetMsg(){
returnmsg;
}
publicvoidsetMsg(Stringmsg){
this.msg=msg;
}
publicTgetData(){
returndata;
}
publicvoidsetData(Tdata){
this.data=data;
}
}
返回对象模型的工具类
packagecom.lei.utils;
importcom.lei.domain.Result;
/**
*返回结果的工具类
*/
publicclassResultUtil{
publicstaticResultsuccess(Objectobject){
Resultresult=newResult();
result.setCode(0);
result.setMsg("成功");
result.setData(object);
returnresult;
}
publicstaticResultsuccess(){
returnsuccess(null);
}
publicstaticResulterror(Integercode,Stringmsg){
Resultresult=newResult();
result.setCode(code);
result.setMsg(msg);
returnresult;
}
}
2、定义自己的异常并统一捕获
1)定义异常枚举
packagecom.lei.enums;
publicenumExceptionEnum{
UNKNOW_ERROR(-1,"未知错误"),
SUCCESS(0,"成功"),
XIAO_SCHOOL(100,"你还在上小学吧"),
MIDDLE_SCHOOL(101,"你在上初中吧");
privateIntegercode;
privateStringmsg;
ExceptionEnum(Integercode,Stringmsg){
this.code=code;
this.msg=msg;
}
publicIntegergetCode(){
returncode;
}
publicStringgetMsg(){
returnmsg;
}
}
2)定义自己的异常类
packagecom.lei.exception;
importcom.lei.enums.ExceptionEnum;
/**
*Girl的异常类
*/
publicclassGirlExceptionextendsRuntimeException{
privateIntegercode;
publicGirlException(ExceptionEnumexceptionEnum){
super(exceptionEnum.getMsg());
this.code=exceptionEnum.getCode();
}
publicIntegergetCode(){
returncode;
}
publicvoidsetCode(Integercode){
this.code=code;
}
}
3)捕获异常的Handler
packagecom.lei.handler;
importcom.lei.domain.Result;
importcom.lei.enums.ExceptionEnum;
importcom.lei.exception.GirlException;
importcom.lei.utils.ResultUtil;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.web.bind.annotation.ControllerAdvice;
importorg.springframework.web.bind.annotation.ExceptionHandler;
importorg.springframework.web.bind.annotation.ResponseBody;
/**
*异常类的Handler
*/
@ControllerAdvice
publicclassExceptionHandle{
privatestaticfinalLoggerlogger=LoggerFactory.getLogger(ExceptionHandle.class);
@ExceptionHandler(value=Exception.class)
@ResponseBody
publicResultgetAgeHandle(Exceptione){
if(einstanceofGirlException){
GirlExceptiongirlException=(GirlException)e;
returnResultUtil.error(girlException.getCode(),girlException.getMessage());
}else{
logger.info("系统异常:{}",e);
thrownewGirlException(ExceptionEnum.UNKNOW_ERROR);
}
}
}
4)service层使用异常类
publicvoidgetAge(Integerid)throwsException{
Girlgirl=girlRepository.findOne(id);
Integerage=girl.getAge();
//验证,如果年龄太小就给前端返回信息
if(age<10){
thrownewGirlException(Excep
bf25
tionEnum.XIAO_SCHOOL);
}elseif(age>10&&age<16){
thrownewGirlException(ExceptionEnum.MIDDLE_SCHOOL);
}
//验证通过之后,做下面的逻辑....
}
四、单元测试
测试Service层的用例
packagecom.lei.service;
importorg.junit.Assert;
importorg.junit.Test;
importorg.junit.runner.RunWith;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.test.context.SpringBootTest;
importorg.springframework.test.context.junit4.SpringRunner;
importstaticorg.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest
publicclassGirlServiceTest{
@Autowired
privateGirlServicegirlService;
@Test
publicvoidfindOneAge()throwsException{
Assert.assertEquals(newInteger(12),girlService.findOneAge(1));
}
}
测试Controller层的用例
packagecom.lei.controller;
importorg.junit.Test;
importorg.junit.runner.RunWith;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
importorg.springframework.boot.test.context.SpringBootTest;
importorg.springframework.test.context.junit4.SpringRunner;
importorg.springframework.test.web.servlet.MockMvc;
importorg.springframework.test.web.servlet.request.MockMvcRequestBuilders;
importorg.springframework.test.web.servlet.result.MockMvcResultMatchers;
importstaticorg.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
publicclassGirlControllerTest{
@Autowired
privateMockMvcmvc;
@Test
publicvoidgetAll()throwsException{
mvc.perform(MockMvcRequestBuilders.get("/girl/getAll"))
.andExpect(MockMvcResultMatchers.status().isOk())//判断链接是否可以访问
.andExpect(MockMvcResultMatchers.content().string("123456"));//判断返回的内容是不是我们想要的
}
}
相关文章推荐
- 【SpringBoot】Spring Boot进阶之Web进阶( 第2章 Web进阶-使用AOP处理请求 )
- SpringCloud从入门到进阶(四)——使用SpringBoot搭建微服务
- • Spring Boot - 进阶 数 据 访 问 -使用jdbcTemplate访问数据库
- SpringBoot进阶之使用异常替代返回错误码(拦截异常并统一处理)
- SpringBoot使用WEB进阶
- Springboot中AOP的使用
- springboot:使用JPA-Hibernate
- springboot war放入tomcat启动怎么指定使用外部application.properties
- Spring Boot(8)— Spring Boot多数据源配置与使用
- Spring Boot中MyBatis的使用
- 记录在Spring-Boot中使用Fegin调用RESTfull的PATCH方法设置
- springboot(六):如何优雅的使用mybatis
- Spring Boot使用@Scheduled定时器任务
- Spring Boot中Redis的使用
- 非spring boot (即spring) 使用/集成 Spring cloud Config 分布式配置中心
- SpringBoot开发详解(六)-- 异常统一管理以及AOP的使用
- spring boot 入门 使用spring.profiles.active来分区配置-java编程
- Spring Boot 属性配置和使用
- 企业分布式微服务云SpringCloud SpringBoot mybatis (八)Spring Boot中使用Spring-data-jpa让数据访问更简单
- 爬虫框架webmagic与spring boot的结合使用