我有一个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。
如果在应用程序启动期间发生任何异常,谁能告诉我我在哪里做错了,哪种方法适合显示自定义错误页面。
答案 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)