springboot中通过控制器通知统一的来实现异常处理
自定义异常
package com.example.springboot.exception;
public class NotFoundException extends RuntimeException{
private static final long serialVersionUID = 1L;
private Long code;
private String customMsg;
public NotFoundException(){
}
public NotFoundException(Long code,String customMsg){
super();
this.code = code;
this.customMsg = customMsg;
}
public Long getCode() {
return code;
}
public String getCustomMsg() {
return customMsg;
}
public void setCode(Long code) {
this.code = code;
}
public void setCustomMsg(String customMsg) {
this.customMsg = customMsg;
}
}
创建统一异常处理器
package com.example.springboot.handler;
import com.example.springboot.exception.NotFoundException;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
@ControllerAdvice(
//指定拦截包的控制器
basePackages = {"com.example.springboot.controller.*"},
//限定被标注为@Controller或者@RestController的类才被拦截
annotations = {Controller.class, RestController.class}
)
public class ControllerExHandler {
//异常处理,可以定义异常类型进行拦截处理
@ExceptionHandler(value = NotFoundException.class)
@ResponseBody
//定义为服务器错误状态码
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public Map<String,Object> exception(HttpServletRequest request, NotFoundException ex){
Map<String,Object> msgMap = new HashMap<>();
msgMap.put("code",ex.getCode());
msgMap.put("message",ex.getCustomMsg());
return msgMap;
}
}
创建测试控制器
package com.example.springboot.controller;
import com.example.springboot.exception.NotFoundException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.HashMap;
import java.util.Map;
@org.springframework.web.bind.annotation.RestController
@RequestMapping("/rest")
public class RestController {
@GetMapping("/ex")
public Map rest(){
Map map = new HashMap();
map.put("success","ok");
if(true)
throw new NotFoundException(404L,"not found source");
return map;
}
}
浏览器输入 http://localhost:8082/rest/ex
返回 {"code":404,"message":"not found source"}