学习目标:开发中常见注意事项-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));