我如何在Spring boot / mvc中创建error handling程序(404,500 …)?
几个小时我试图在Spring Boot / MVC中创建一个CUSTOM全局error handling程序。 我读过很多文章而且没什么……:/请。 帮我。
那是我的错误类:
我尝试创建这样的类
@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
类,它处理从exception到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 handleNoResultException( NoResultException nre) { log.error("> handleNoResultException"); log.error("- NoResultException: ", nre); log.error("< handleNoResultException"); return new ResponseEntity (HttpStatus.NOT_FOUND); } @ExceptionHandler(Exception.class) public ResponseEntity handleException(Exception e) { log.error("> handleException"); log.error("- Exception: ", e); log.error("< handleException"); return new ResponseEntity (e, HttpStatus.INTERNAL_SERVER_ERROR); } @ExceptionHandler(NotFoundException.class) @ResponseStatus(value = HttpStatus.NOT_FOUND) @ResponseBody public ErrorResponse handleNotFoundError(HttpServletRequest req, NotFoundException exception) { List errors = Lists.newArrayList(); errors.add(new Error(String.valueOf(exception.getCode()), exception.getMessage())); return new ErrorResponse(errors); } }
春季启动更新
自定义错误页面
如果要显示给定状态代码的自定义HTML错误页面,请将文件添加到/ error文件夹。 错误页面可以是静态HTML(即添加到任何静态资源文件夹下),也可以使用模板构建。 文件名应该是确切的状态代码或系列掩码。
例如,要将404映射到静态HTML文件,您的文件夹结构将如下所示
src/ +- main/ +- java/ | + +- resources/ +- public/ +- error/ | +- 404.html +-
资源
希望这会有所帮助:创建一个类说:NoProductsFoundException,它扩展了runtimexception。
import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @ResponseStatus(value=HttpStatus.NOT_FOUND, reason="No products found under this category") public class NoProductsFoundException extends RuntimeException{ private static final long serialVersionUID =3935230281455340039L; }
然后在你的productcontroller中:
@RequestMapping("/{category}") public String getProductsByCategory(Model model,@PathVariable("category") String category) { List products = productService.getProductsByCategory(category); if (products == null || products.isEmpty()) { throw new NoProductsFoundException (); } model.addAttribute("products", products); return "products"; }
@ControllerAdvice public class ErrorHandler { public RestErrorHandler() { } @ExceptionHandler(YourException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public XXX processException(Exception ex){}
你需要这样的课程。 为每个exception添加一个方法,并根据需要对其进行注释 – @ResponseBody等。
- 为什么这个语句不适用于java x ^ = y ^ = x ^ = y;
- 是否可以在java 7中使用半透明窗口,包括标题栏?
- final static vs non-final静态变量?
- org.osgi.framework.BundleException:找不到bundle:org.eclipse.equinox.console
- 如何将GCM身份validation标记放在密码流的末尾,在解密期间需要内部缓冲?
- Java:调用hashCode()和equals()时自动抛出UnsupportedOperationException的干净方法?
- java.nio.charset.MalformedInputException:输入长度= 1
- 默认的Java库路径?
- 如何将HTML页眉和页脚添加到页面?