您的位置:首页 > 编程语言 > Java开发

SpringBoot使用进阶

2017-12-16 22:56 260 查看
一、表单验证

在实体内注解验证信息

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"));//判断返回的内容是不是我们想要的
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: