文章出自视频:https://www.imooc.com/learn/810
跟着廖师兄的视频学习的哈,例子有点儿那个啥,内容还是不错的,我也就不换了。学完后记点儿笔记,方便以后忘记了过来查看。
功能: 获取某女生的年龄并判断,小于10,返回“应该在上小学”;大于10且小于16,返回“可能在上初中”,并且还有对应的code值。
步骤:
1.新建一个Result对象。确定好返回前端的格式。
Result.java:
package com.haiyu.demo.domain;
import static javafx.scene.input.KeyCode.T;
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;
}
}
2.放代码之前有个知识点需要记录一下:一般前后端的开发是分开的,所以后端传递给前端的数据需要有个固定的格式,无论是传递异常数据还是正常数据。
文中为了解决逻辑在一个地方处理,引入了异常处理办法,由于默认的Exception只接收msg一个字段,所以我们自己定义了一个GirlException,因为我们不仅需要返回msg ,还需要返回code。自己定义了异常,我们还需要捕获这个异常,所以定义了ExceptionHandle类来捕获,过程如下:
GirlException.java:该类需要继承RuntimeException ,RuntimeException 继承Exception ,Spring框架只对抛出的异常是RuntimeException 进行事物回滚。
package com.haiyu.demo.exception;
import com.haiyu.demo.enums.ResultEnum;
public class GirlException extends RuntimeException {
private Integer code;
public GirlException(ResultEnum resultEnum) {
super(resultEnum.getMsg());
this.code = resultEnum.getCode();
System.out.println("code:"+code+"message:"+resultEnum.getMsg());
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
新建一个异常捕获类ExceptionHandle.java:
package com.haiyu.demo.handle;
import com.haiyu.demo.domain.Result;
import com.haiyu.demo.exception.GirlException;
import com.haiyu.demo.utils.ResultUtil;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
public class ExceptionHandle {
@ExceptionHandler(value = Exception.class)//此处声明需要捕获Exception类
@ResponseBody
public Result handle(Exception e){
if (e instanceof GirlException){//判断异常是否为自己定义的GirlException
GirlException girlException=(GirlException) e;
System.out.println(girlException.getCode()+girlException.getMessage());
return ResultUtil.failure(girlException.getCode(),girlException.getMessage());
}else{
return ResultUtil.failure(-1,"未知错误");
}
}
}
package com.haiyu.demo.utils;
import com.haiyu.demo.domain.Result;
public class ResultUtil {
public static Result success(Object object){
Result result=new Result();
result.setCode(0);
result.setMsg("success");
result.setData(object);
return result;
}
public static Result failure(Integer code,String msg){
Result result=new Result();
result.setCode(code);
result.setMsg(msg);
return result;
}
}
3.在controller和service里面编写方法:
GirlController.java: 只放了相关的方法
@GetMapping(value = "/girls/getAge/{id}")
public void getAge(@PathVariable("id") Integer id) throws Exception{
girlService.getAge(id);
}
GirlService.java:
package com.haiyu.demo.service;
import com.haiyu.demo.domain.Girl;
import com.haiyu.demo.enums.ResultEnum;
import com.haiyu.demo.exception.GirlException;
import com.haiyu.demo.repository.GirlRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
@Service
public class GirlService {
@Autowired
private GirlRepository girlRepository;
@Transactional //这里是个事物管理的注解,例如B如果导入数据库失败,A也会回滚操作,保持跟B 一样的状态
public void insertTwo(){
Girl girlA=new Girl ();
girlA.setAge(18);
girlA.setCupSize("A");
girlRepository.save(girlA);
Girl girlB=new Girl ();
girlB.setAge(19);
girlB.setCupSize("B");
girlRepository.save(girlB);
}
public void getAge(Integer id) throws Exception {
Girl girl=girlRepository.findById(id).get();
Integer age=girl.getAge();
System.out.println(age);
if(age<10){
throw new GirlException(ResultEnum.PRIMARY_SCHOOL);//为了方便管理错误提示,建议采用枚举,枚举代码如下。为了传递给前端的格式固定,所以可以自己定义异常
}else if (age >10 &&age<16){
throw new GirlException(ResultEnum.MIDDLE_SCHOOL);
}
}
public Girl findOne(Integer id){
return girlRepository.findById(id).get();
}
}
package com.haiyu.demo.enums;
public enum ResultEnum {//方便统一管理code 和 msg
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 String getMsg() {
return msg;
}
}
转载请注明出处,谢谢:
https://blog.youkuaiyun.com/blue___ocean/article/details/80393812