@Entity //jsr303验证 public class Girl { @Id//主键 @GeneratedValue //自增 private Integer id; private String cupSize; @Min(value = 18,message = "未成年少女进制入内") private Integer age; //必须要有一个无参构造方法 public Girl() { } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getCupSize() { return cupSize; } public void setCupSize(String cupSize) { this.cupSize = cupSize; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
@PostMapping(value="/girls") public Girl girlAdd(@Valid Girl girl, BindingResult bindingResult){ if (bindingResult.hasErrors()){ System.out.println(bindingResult.getFieldError().getDefaultMessage()); return null; } girl.setCupSize(girl.getCupSize()); girl.setAge(girl.getAge()); return girlRepository.save(girl); }
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
方式一:
@Aspect @Component public class HttpAspect { @Before("execution(public * com.imooc.girl.controller.GirlController.*(..))") public void log(){ System.out.println("1111111111"); } @After("execution(public * com.imooc.girl.controller.GirlController.*(..))") public void doAfter(){ System.out.println("222222222"); } }
优化后:
@Aspect @Component public class HttpAspect { @Pointcut("execution(public * com.imooc.girl.controller.GirlController.*(..))") public void log(){ } @Before("log()") public void doBefore(){ System.out.println("1111111111"); } @After("log()") public void doAfter(){ System.out.println("222222222"); } }
在优化:
@Aspect @Component public class HttpAspect { private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class); @Pointcut("execution(public * com.imooc.girl.controller.GirlController.*(..))") public void log(){ } @Before("log()") public void doBefore(JoinPoint joinPoint){ logger.info("1111111111"); ServletRequestAttributes attributes=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); HttpServletRequest request=attributes.getRequest(); //url logger.info("url={}",request.getRequestURL()); //method logger.info("method={}",request.getMethod()); //ip logger.info("method={}",request.getRemoteAddr()); //类方法 logger.info("class_method={}",joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName()); //参数 logger.info("args={}",joinPoint.getArgs()); } @After("log()") public void doAfter(){ logger.info("222222222"); } }
如果需要获取返回的值:
@AfterReturning(returning = "object",pointcut = "log()") public void doAfterReturning(Object object){ logger.info("response={}",object); }
==========异常处理
package com.imooc.girl.domain; public class Result<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; } }
package com.imooc.girl.utils; import com.imooc.girl.domain.Result; public class ResultUtil { public static Result success(Object object){ Result result=new Result(); result.setCode(0); result.setMsg("成功"); result.setData(object); return result; } public static Result success(){ return success(null); } public static Result error(Integer code,String msg){ Result result=new Result(); result.setCode(code); result.setMsg(msg); return result; } }
/** * 添加一个女生 */ @PostMapping(value="/girls") public Object girlAdd(@Valid Girl girl, BindingResult bindingResult){ if (bindingResult.hasErrors()){ return ResultUtil.error(1,bindingResult.getFieldError().getDefaultMessage()); } girl.setCupSize(girl.getCupSize()); girl.setAge(girl.getAge()); return ResultUtil.success(girlRepository.save(girl)); }
public class GirlException extends RuntimeException { private Integer code; public GirlException(ResultEnum resultEnum){ super(resultEnum.getMsg()); this.code=resultEnum.getCode(); } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } }
@ControllerAdvice public class ExceptionHandle { @ExceptionHandler(value=Exception.class) @ResponseBody public Result handle(Exception e){ if (e instanceof GirlException){ GirlException girlException=(GirlException) e; return ResultUtil.error(girlException.getCode(),girlException.getMessage()); }else { return ResultUtil.error(-1,"未知错误"); } } }
public enum ResultEnum { UNKONW_ERROR(-1,"未知错误"), SUCCESS(0,"成功"), PRIMARY_SCHOOL(100,"你可能还在上小学"), MIDDLE_SCHOOL(101,"你可能在上初中"); private Integer code; private String msg; ResultEnum(Integer code, String msg) { this.code = code; this.msg = msg; } 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; } }
@Service public class GirlService { @Autowired private GirlRepository girlRepository; @Transactional public void insertTwo(){ try{ Girl girlA=new Girl(); girlA.setCupSize("A"); girlA.setAge(18); girlRepository.save(girlA); Girl girlB=new Girl(); girlB.setCupSize("BBB"); girlB.setAge(19); girlRepository.save(girlB); }catch (Exception e){ e.printStackTrace(); } } public void getAge(Integer id){ Girl girl=girlRepository.getOne(id); Integer age=girl.getAge(); if (age<10){ //返回“你还在上小学吧” throw new GirlException(ResultEnum.PRIMARY_SCHOOL); }else if(age>10 && age<16){ //返回“你可能在上初中“ throw new GirlException(ResultEnum.MIDDLE_SCHOOL); } } }
1.由于需要统一的返回格式,所以,封装了 返回对象Result
2.由于代码封装成功、失败等。高重复动作,封装工具类ResultUtil。
3.由于在逻辑处理时,牵扯很多种非法状态。service进行判断,获取逻辑--》返回controller,判断状态继续处理。
改良:service逻辑判断非法,抛出异常-->controller继续抛出-->统一异常类进行处理,调用工具类。
4.由于Exception只能有描述,没有状态值。难以返回。自定义GrilException(id+msg)。
5.由于每次都要输入状态值,状态描述。为了统一管理,将其封装到enum(数据字典),统一管理