springboot 之web进阶

16fc85dea727248d414a19834fa72898d4a.jpg

@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);
}

11cf03c383b574e42f618b24c9238036b72.jpg

e5660a63d78ae5e8bf8bd8ae083105c9c5c.jpg

79713c11cd7999d042f54bbb82d0b06751d.jpg

<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(数据字典),统一管理

转载于:https://my.oschina.net/popfei/blog/1845028

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值