后端开发新知识点-2

学习目标:开发中常见注意事项-2

学习内容:

  • 条件查询:一般将条件封装到一个对象中,然后将对象传入接口中,该对象一般叫做vo/dto
@Data
public class TeacherQuery {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "教师名称,模糊查询")
    private String name;

    @ApiModelProperty(value = "头衔 1高级讲师 2首席讲师")
    private Integer level;

    @ApiModelProperty(value = "查询开始时间", example = "2019-01-01 10:10:10")
    private String begin;//注意,这里使用的是String类型,前端传过来的数据无需进行类型转换

    @ApiModelProperty(value = "查询结束时间", example = "2019-12-01 10:10:10")
    private String end;
}

  • 编写Controller,根据条件查询拼接
    //4.条件查询带分页
    @ApiOperation(value = "条件查询带分页")
    @GetMapping("pageTeacherCondition/{current}/{limit}")
    public R pageTeacherCondition(@PathVariable long current, @PathVariable long limit, @PathVariable TeacherQuery teacherQuery){

        Page page = new Page(current,limit);
        QueryWrapper<EduTeacher> wrapper = new QueryWrapper<>();
        String name = teacherQuery.getName();
        Integer level = teacherQuery.getLevel();
        String begin = teacherQuery.getBegin();
        String end = teacherQuery.getEnd();
        if (StringUtils.isEmpty(name)){
            wrapper.like("name",name);
        }
        if (StringUtils.isEmpty(level)){
            wrapper.eq("level",level);
        }
        if (StringUtils.isEmpty(begin)){
            wrapper.ge("gmt_create",begin);
        }
        if (StringUtils.isEmpty(end)){
            wrapper.le("gmt_create",end);
        }

        eduTeacherService.page(page, wrapper);
        long total = page.getTotal();//总记录数
        List<EduTeacher> records = page.getRecords();//数据list集合
        return R.ok().data("total",total).data("records",records);

    }

  • RequestBody:使用Json传递数据,把json数据封装到对应的对象中,当对象通过RequestBody方式传递时,需要使用post方式提交
    在这里插入图片描述

  • ResponseBody:返回数据时,返回json格式

统一异常处理器

  • 创建统一异常处理类
  • 类上加@ControllerAdvice注解
  • 方法上加@ExceptionHandler(Exception.class)注解,表示在出现何种异常时,会调用本方法
  • 方法加@ResponseBody注解,表示改方法可返回给前端信息
@ControllerAdvice
public class GlobalExceptionHandler {

    //指定了在出现何种异常时,会执行这个方法
    @ExceptionHandler(Exception.class)
        @ResponseBody
    public R error(Exception e){
        e.printStackTrace();
        return R.error().message("执行了全局异常");
    }

}
统一异常处理分为如下几类
  • 全局异常处理
  • 特定异常处理
    • 全局异常和特定异常的实现,由@ExceptionHandler(Exception.class)注解,括号中的“类名.class”和形参类型决定
    • 当执行了异常,范围从小到大开始匹配,直到全局异常为止
  • 自定义异常处理:
    • 创建自定义异常类,继承RuntimeException
    • 定义状态码,报错信息等属性
    • 在统一异常处理中添加引用规则
//1.
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GuliException extends RuntimeException {

    private Integer code;//状态码

    private String msg;

}

//2.
//自定义异常
    @ExceptionHandler(GuliException.class)
    @ResponseBody
    public R error(GuliException e){
        e.printStackTrace();
        return R.error().code(e.getCode()).message(e.getMsg());
    }
//3.抛出时需手动抛出
try {
    int a = 10/0;
}catch (Exception e){
    throw new GuliException(20001,"执行了自定义异常。。。");
}

统一日志处理:LogBack
日志级别::OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL
  • 日志级别:默认情况下,spring boot从控制台打印出来的日志级别只有INFO及以上级别,可以配置日志级别
# 设置日志级别,后面的包含前面的
logging.level.root=WARN
  • 将日志输出到文件中:LogBack
    • 将之前配置文件中所有的日志信息删除
    • 在resources中创建LogBack配置文件: logback-spring.xml,配置文件只需要修改日志文件输出路径即可。
    • 在统一异常类上加注解:@Slf4j,在需要的异常方法内加一句获取信息代码
    • 使用工具类可将所有详细异常信息输出到文件
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler { 
    @ExceptionHandler(GuliException.class)
    @ResponseBody
    public R error(GuliException e){
        log.error(e.getMessage());
        e.printStackTrace();
        return R.error().code(e.getCode()).message(e.getMsg());
    }
}

//工具类
public class ExceptionUtil {
    public static String getMessage(Exception e) {
        StringWriter sw = null;
        PrintWriter pw = null;
        try {
            sw = new StringWriter();
            pw = new PrintWriter(sw);
            // 将出错的栈信息输出到printWriter中
            e.printStackTrace(pw);
            pw.flush();
            sw.flush();
        } finally {
            if (sw != null) {
                try {
                    sw.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
            if (pw != null) {
                pw.close();
            }
        }
        return sw.toString();
    }
}
//调用工具类
log.error(ExceptionUtil.getMessage(e));

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值