Всем привет, в этой главе мы добавим глобальную обработку исключений. Если у вас есть какие-либо вопросы, пожалуйста, свяжитесь со мной по адресу mr_beany@163.com. Также попросите руководства великих богов, спасибо
Первый: зачем вам определять глобальное исключение
В эпоху Интернета большинство приложений, которые мы развиваем лицом лицами напрямую. Любая незначительная халатность в программе может привести к потере пользователей, а исключения программы часто неизбежны, поэтому нам нужно снимать исключения, а затем дать соответствующую обработку для уменьшения Влияние программных исключений на пользовательский опыт
Второе: добавить исключения для бизнес-класса
Создайте ServiceException в папке ret, упомянутой ранее.
package com.example.demo.core.ret;
import java.io.Serializable;
/**
* @Description: 业务类异常
* @author 张瑶
* @date 2018/4/20 14:30
*
*/
public class ServiceException extends RuntimeException implements Serializable{
private static final long serialVersionUID = 1213855733833039552L;
public ServiceException() {
}
public ServiceException(String message) {
super(message);
}
public ServiceException(String message, Throwable cause) {
super(message, cause);
}
}
Третий: добавить конфигурацию обработки исключений
ОткрытымПредыдущая статьяСоздан WebConfigurer, добавьте следующий метод
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
exceptionResolvers.add(getHandlerExceptionResolver());
}
/**
* 创建异常处理
* @return
*/
private HandlerExceptionResolver getHandlerExceptionResolver(){
HandlerExceptionResolver handlerExceptionResolver = new HandlerExceptionResolver(){
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception e) {
RetResult<Object> result = getResuleByHeandleException(request, handler, e);
responseResult(response, result);
return new ModelAndView();
}
};
return handlerExceptionResolver;
}
/**
* 根据异常类型确定返回数据
* @param request
* @param handler
* @param e
* @return
*/
private RetResult<Object> getResuleByHeandleException(HttpServletRequest request, Object handler, Exception e){
RetResult<Object> result = new RetResult<>();
if (e instanceof ServiceException) {
result.setCode(RetCode.FAIL).setMsg(e.getMessage()).setData(null);
return result;
}
if (e instanceof NoHandlerFoundException) {
result.setCode(RetCode.NOT_FOUND).setMsg("接口 [" + request.getRequestURI() + "] 不存在");
return result;
}
result.setCode(RetCode.INTERNAL_SERVER_ERROR).setMsg("接口 [" + request.getRequestURI() + "] 内部错误,请联系管理员");
String message;
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
message = String.format("接口 [%s] 出现异常,方法:%s.%s,异常摘要:%s", request.getRequestURI(),
handlerMethod.getBean().getClass().getName(), handlerMethod.getMethod() .getName(), e.getMessage());
} else {
message = e.getMessage();
}
LOGGER.error(message, e);
return result;
}
/**
* @Title: responseResult
* @Description: 响应结果
* @param response
* @param result
* @Reutrn void
*/
private void responseResult(HttpServletResponse response, RetResult<Object> result) {
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-type", "application/json;charset=UTF-8");
response.setStatus(200);
try {
response.getWriter().write(JSON.toJSONString(result,SerializerFeature.WriteMapNullValue));
} catch (IOException ex) {
LOGGER.error(ex.getMessage());
}
}
Четыре: добавить профиль
В Spring Boot, когда пользователь переходит по несуществующей ссылке, Spring по умолчанию перенаправляет страницу на **/error** без создания исключения.
В этом случае мы говорим Spring Boot генерировать исключение при возникновении ошибки 404.
существуетapplication.properties
Добавьте две конфигурации в:
spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false
В приведенной выше конфигурации первыйspring.mvc.throw-exception-if-no-handler-found
Скажите SpringBoot, чтобы он выдавал исключение непосредственно при возникновении ошибки 404. Второйspring.resources.add-mappings
Скажите SpringBoot не сопоставлять файлы ресурсов в нашем проекте.
Пятое: создайте тестовый интерфейс
package com.example.demo.service.impl;
import com.example.demo.core.ret.ServiceException;
import com.example.demo.dao.UserInfoMapper;
import com.example.demo.model.UserInfo;
import com.example.demo.service.UserInfoService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @author 张瑶
* @Description:
* @time 2018/4/18 11:56
*/
@Service
public class UserInfoServiceImpl implements UserInfoService{
@Resource
private UserInfoMapper userInfoMapper;
@Override
public UserInfo selectById(Integer id){
UserInfo userInfo = userInfoMapper.selectById(id);
if(userInfo == null){
throw new ServiceException("暂无该用户");
}
return userInfo;
}
}
UserInfoController.java
package com.example.demo.controller;
import com.example.demo.core.ret.RetResponse;
import com.example.demo.core.ret.RetResult;
import com.example.demo.core.ret.ServiceException;
import com.example.demo.model.UserInfo;
import com.example.demo.service.UserInfoService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* @author 张瑶
* @Description:
* @time 2018/4/18 11:39
*/
@RestController
@RequestMapping("userInfo")
public class UserInfoController {
@Resource
private UserInfoService userInfoService;
@PostMapping("/hello")
public String hello(){
return "hello SpringBoot";
}
@PostMapping("/selectById")
public RetResult<UserInfo> selectById(Integer id){
UserInfo userInfo = userInfoService.selectById(id);
return RetResponse.makeOKRsp(userInfo);
}
@PostMapping("/testException")
public RetResult<UserInfo> testException(Integer id){
List a = null;
a.size();
UserInfo userInfo = userInfoService.selectById(id);
return RetResponse.makeOKRsp(userInfo);
}
}
Шесть: тест интерфейса
доступ192.168.1.104:8080/userInfo/selectById
параметрid:3
{
"code": 400,
"data": null,
"msg": "暂无该用户"
}
доступ192.168.1.104:8080/userInfo/testException
{
"code": 500,
"data": null,
"msg": "接口 [/userInfo/testException] 内部错误,请联系管理员"
}
адрес проекта
Адрес облака кода:git ee.com/bean также/no SPR…
Адрес гитхаба:GitHub.com/my bean also/no s…
Писать статьи непросто, если это вам поможет, нажмите звездочку
конец
springboot добавление глобального обработчика исключений завершено, следующая функция последующая после другого обновления, есть вопросы, вы можете связаться со мной mr_beany@163.com. Также попросите руководства у всех великих богов, спасибо всем.