在应用程序启动时如何处理Spring Bean初始化异常以及如何显示/重定向自定义500 error.jsp

时间:2018-06-22 12:37:00

标签: spring servlets

我有一个Spring Bean类(测试),它已在applicationContext.xml文件中注册为bean。该bean在应用程序启动期间进行加载,其中包含应用程序初始化的内容。但是在加载应用程序时,提供异常的bean类方法之一。我需要处理此错误/异常情况,并需要显示为500个自定义error.jsp页面。

示例代码段:

class TestBean {
    public TestBean(){
        doStuff() ;
    }

    public void doStuff() {
    try {
        //some business logic
    } catch(Exception e) {
        logger.error("error message"); //here i am just logging the error message
    }
    }
 }

我曾尝试过不同的情况,如下所示:

1)抛出自定义异常,错误代码为500。

 class TestBean {
    public TestBean() throws CustomCheckedException{
        doStuff() ;
    }

    public void doStuff() throws CustomCheckedException{
    try {
        some logic
    } catch(Exception e) {
        throw new CustomCheckedException(500,"errorMessage");
    }
    }
 }


public class CustomCheckedException extends Exception {

    public static final Logger logger = Logger.getLogger(CustomCheckedException.class.getName());

    String errorMessage;

    int errorCode;

    public CustomCheckedException(int errorCode, String errorMessage) {
        super();
        this.errorMessage = errorMessage;
        this.errorCode = errorCode;

    }

    public CustomCheckedException() {

    }

    public String getErrorMessage() {
        return errorMessage;
    }

    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }

    public int getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(int errorCode) {
        this.errorCode = errorCode;
    }

web.xml代码:

<error-page>
    <error-code>500</error-code>
    <location>/error.jsp</location>
</error-page>

error.jsp页面位于webapp文件夹中

2)不会抛出任何自定义异常,而只是在web.xml中给出特定的异常,如下所示。

    <error-page>
 <exception-type>java.util.concurrent.ExecutionException</exception-type>
        <location>/error.jsp</location>
    </error-page>

但是,在应用程序初始化期间发生异常时,我无法显示定制的error.jsp页面。 我也看过其他方式: res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,“错误消息”); 但是在我的bean类中,我没有响应对象。如果我尝试将HttpServletResponse自动连接到我的bean类中,我仍然只能将响应对象设置为null。

如果在应用程序启动期间发生任何异常,谁能告诉我我在哪里做错了,哪种方法适合显示自定义错误页面。

2 个答案:

答案 0 :(得分:0)

使用@ExceptionHandler定义一个使用Spring AOP的全局异常处理程序 您可以从中发送ModelView,其中包含由解析程序呈现的Error JSP页面的名称。

@ControllerAdvice
@Controller
public class GlobalExceptionHandler {


@ExceptionHandler(value = { CustomCheckedException.class })
public ModelView
 handleCustomCheckedException(CustomCheckedException customCheckedException, 
 HttpServletRequest request) {

 return //your model view ;
} 

答案 1 :(得分:0)

自从我在Google中搜索时,我了解到,如果在bean初始化期间发生任何异常,我们将无法重定向error.jsp文件。 我这样做的目的不是抛出自定义异常(抛出新的CustomCheckedException(500,“ errorMessage”)),而是在catch中处理该异常并使bean正确初始化(通过在异常发生时提供必需的参数值和一些假值)发生),并使应用程序运行。

对于error.jsp,我正在过滤器中进行处理: 通过扩展GenericFilterBean类并使用WebApplicationContext获取bean类对象并检查bean类的变量值来创建一个过滤器。 如果变量值为假值,那么我将重定向到错误页面(response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR)。

public class CustomBeanFilter  extends GenericFilterBean implements Filter{
    SampleBean bean;
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
   throws IOException, ServletException {
  HttpServletResponse res = (HttpServletResponse) response;
  if (bean.falseValue) {
        res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
  }
    chain.doFilter(request, response);
 }

 public void destroy() {
 }

 @Override
 public void initFilterBean() throws ServletException {
     WebApplicationContext webApplicationContext =
             WebApplicationContextUtils.getWebApplicationContext(getServletContext());
         //reference to bean from app context
         this.bean = webApplicationContext.getBean(SampleBean.class);
 }
}

在web.xml中将错误代码配置为500

<error-page> 
     <error-code>500</error-code>
     <location>/error.jsp</location>
 </error-page>

因此,当我的bean类中有任何异常时,它将重定向到错误页面(error.jsp)