From b95bb54e8c9c0942b5410aab886ea95588ad09e8 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Thu, 24 Sep 2015 10:45:00 -0700 Subject: [PATCH] Make BasicErrorController easier to subclass Extract a new AbstractErrorController base class for users to extend if they don't like the default BasicErrorController. Fixes gh-3998 --- .../web/AbstractErrorController.java | 79 +++++++++++++++++++ .../web/BasicErrorController.java | 43 +--------- 2 files changed, 81 insertions(+), 41 deletions(-) create mode 100644 spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/AbstractErrorController.java diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/AbstractErrorController.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/AbstractErrorController.java new file mode 100644 index 00000000000..df421390898 --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/AbstractErrorController.java @@ -0,0 +1,79 @@ +/* + * Copyright 2012-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.web; + +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.ServletRequestAttributes; + +/** + * Abstract base class for error {@link Controller} implementations. + * + * @author Dave Syer + * @author Phillip Webb + * @see ErrorAttributes + * @since 1.3.0 + */ +public abstract class AbstractErrorController implements ErrorController { + + private final ErrorAttributes errorAttributes; + + public AbstractErrorController(ErrorAttributes errorAttributes) { + Assert.notNull(errorAttributes, "ErrorAttributes must not be null"); + this.errorAttributes = errorAttributes; + } + + protected boolean getTraceParameter(HttpServletRequest request) { + String parameter = request.getParameter("trace"); + if (parameter == null) { + return false; + } + return !"false".equals(parameter.toLowerCase()); + } + + protected Map getErrorAttributes(HttpServletRequest request) { + return getErrorAttributes(request, getTraceParameter(request)); + } + + protected Map getErrorAttributes(HttpServletRequest request, + boolean includeStackTrace) { + RequestAttributes requestAttributes = new ServletRequestAttributes(request); + return this.errorAttributes.getErrorAttributes(requestAttributes, + includeStackTrace); + } + + protected HttpStatus getStatus(HttpServletRequest request) { + Integer statusCode = (Integer) request + .getAttribute("javax.servlet.error.status_code"); + if (statusCode == null) { + return HttpStatus.INTERNAL_SERVER_ERROR; + } + try { + return HttpStatus.valueOf(statusCode); + } + catch (Exception ex) { + return HttpStatus.INTERNAL_SERVER_ERROR; + } + } + +} diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/BasicErrorController.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/BasicErrorController.java index 348297f3424..6fa3278fbb4 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/BasicErrorController.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/BasicErrorController.java @@ -25,11 +25,8 @@ import org.springframework.boot.context.embedded.AbstractEmbeddedServletContaine import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; -import org.springframework.util.Assert; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.servlet.ModelAndView; /** @@ -44,16 +41,13 @@ import org.springframework.web.servlet.ModelAndView; */ @Controller @RequestMapping("${error.path:/error}") -public class BasicErrorController implements ErrorController { +public class BasicErrorController extends AbstractErrorController { @Value("${error.path:/error}") private String errorPath; - private final ErrorAttributes errorAttributes; - public BasicErrorController(ErrorAttributes errorAttributes) { - Assert.notNull(errorAttributes, "ErrorAttributes must not be null"); - this.errorAttributes = errorAttributes; + super(errorAttributes); } @Override @@ -74,37 +68,4 @@ public class BasicErrorController implements ErrorController { return new ResponseEntity>(body, status); } - private boolean getTraceParameter(HttpServletRequest request) { - String parameter = request.getParameter("trace"); - if (parameter == null) { - return false; - } - return !"false".equals(parameter.toLowerCase()); - } - - protected Map getErrorAttributes(HttpServletRequest request) { - return getErrorAttributes(request, getTraceParameter(request)); - } - - protected Map getErrorAttributes(HttpServletRequest request, - boolean includeStackTrace) { - RequestAttributes requestAttributes = new ServletRequestAttributes(request); - return this.errorAttributes.getErrorAttributes(requestAttributes, - includeStackTrace); - } - - protected HttpStatus getStatus(HttpServletRequest request) { - Integer statusCode = (Integer) request - .getAttribute("javax.servlet.error.status_code"); - if (statusCode == null) { - return HttpStatus.INTERNAL_SERVER_ERROR; - } - try { - return HttpStatus.valueOf(statusCode); - } - catch (Exception ex) { - return HttpStatus.INTERNAL_SERVER_ERROR; - } - } - }