我试图在Spring Boot / MVC中创建CUSTOM全局错误处理程序。我读了很多文章,什么都没有…:/请帮我。
我尝试创建这样
@Controller public class ErrorPagesController { @RequestMapping("/404") @ResponseStatus(HttpStatus.NOT_FOUND) public String notFound() { return "/error/404"; } @RequestMapping("/403") @ResponseStatus(HttpStatus.FORBIDDEN) public String forbidden() { return "/error/403"; } @RequestMapping("/500") @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public String internalServerError() { return "/error/500"; } }
我用这种方式:
`
@Configuration public class ErrorConfig implements EmbeddedServletContainerCustomizer { @Override public void customize(ConfigurableEmbeddedServletContainer container) { container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404")); } }
你可以尝试以下代码:
@ControllerAdvice public class ExceptionController { @ExceptionHandler(Exception.class) public ModelAndView handleError(HttpServletRequest request, Exception e) { Logger.getLogger(getClass().getName()).log(Level.SEVERE, "Request: " + request.getRequestURL() + " raised " + e); return new ModelAndView("error"); } @ExceptionHandler(NoHandlerFoundException.class) public ModelAndView handleError404(HttpServletRequest request, Exception e) { Logger.getLogger(getClass().getName()).log(Level.SEVERE, "Request: " + request.getRequestURL() + " raised " + e); return new ModelAndView("404"); } }
@Arash的附加功能 你可以添加一个BaseController可以扩展的新类,该类处理从异常到的转换http response。
@Arash
BaseController
http response
import com.alexfrndz.pojo.ErrorResponse; import com.alexfrndz.pojo.Error; import com.alexfrndz.pojo.exceptions.NotFoundException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import javax.persistence.NoResultException; import javax.servlet.http.HttpServletRequest; import java.util.List; @Slf4j public class BaseController { @ExceptionHandler(NoResultException.class) public ResponseEntity<Exception> handleNoResultException( NoResultException nre) { log.error("> handleNoResultException"); log.error("- NoResultException: ", nre); log.error("< handleNoResultException"); return new ResponseEntity<Exception>(HttpStatus.NOT_FOUND); } @ExceptionHandler(Exception.class) public ResponseEntity<Exception> handleException(Exception e) { log.error("> handleException"); log.error("- Exception: ", e); log.error("< handleException"); return new ResponseEntity<Exception>(e, HttpStatus.INTERNAL_SERVER_ERROR); } @ExceptionHandler(NotFoundException.class) @ResponseStatus(value = HttpStatus.NOT_FOUND) @ResponseBody public ErrorResponse handleNotFoundError(HttpServletRequest req, NotFoundException exception) { List<Error> errors = Lists.newArrayList(); errors.add(new Error(String.valueOf(exception.getCode()), exception.getMessage())); return new ErrorResponse(errors); } }