package com.hundsun.jresplus.web.exception; import java.io.Serializable; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.MessageSource; import org.springframework.http.MediaType; import org.springframework.util.Assert; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver; import org.springframework.web.servlet.support.RequestContext; import com.hundsun.jresplus.beans.ObjectFactory; import com.hundsun.jresplus.exception.BaseException; import com.hundsun.jresplus.web.servlet.MediaTypesHandler; /** * <p> * 拦截BaseException和其他非jresplus异常 * </p> * * @author: hanyin * @since: 12 Feb 2014 13:32:23 * @history: ************************************************ * @file: HandlerExceptionResolver.java * @Copyright: 2013 恒生电子股份有限公司. All right reserved. ************************************************/ public class HandlerExceptionResolver extends SimpleMappingExceptionResolver implements InitializingBean { private final static Logger logger = LoggerFactory .getLogger(HandlerExceptionResolver.class); /** 错误处理页面的路径 */ private String errorPath = "/500"; /** json、xml等处理模板的路径 */ @Deprecated private String exceptionProcPath = "contain/exception"; /** json、xml等处理模板的路径 */ private String defaultAjaxErrorView = "contain/exception"; private ExceptionFormater formatHelper; @Value("${system.dev.mode}") private boolean flag = false; @Autowired private MediaTypesHandler mediaTypesHandler; @Autowired private ObjectFactory objectFactory; private MessageSource messageSource; private ExceptionConverter exceptionConverter; public HandlerExceptionResolver() { super(); super.setDefaultErrorView(errorPath); } public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { RequestContext requestContext = new RequestContext(request); String format = formatHelper.format(ex, requestContext.getLocale()); if (ex instanceof BaseException) { ((BaseException) ex).setErrorMessage(format); } else { logger.error("未知业务异常[" + format + "]", ex); } if (flag) { /** 如果是开发模式,直接在页面上返回 */ return null; } else { if (mediaTypesHandler.getMediaTypes(request).get(0) .equals(MediaType.TEXT_HTML)) { return super.doResolveException(request, response, handler, ex); } if (mediaTypesHandler.getMediaTypes(request).get(0) .equals(MediaType.APPLICATION_JSON)) { request.setAttribute("mediaType", "JSON"); } else if (mediaTypesHandler.getMediaTypes(request).get(0) .equals(MediaType.APPLICATION_XML)) { request.setAttribute("mediaType", "XML"); } return getModelAndView(defaultAjaxErrorView, ex, request); } } protected ModelAndView getModelAndView(String viewName, Exception ex, HttpServletRequest request) { request.setAttribute("layout", ""); if (exceptionConverter == null) { return super.getModelAndView(viewName, ex, request); } Serializable obj = exceptionConverter.convert(request, ex); ModelAndView mv = new ModelAndView(viewName); if (obj != null) { mv.addObject(DEFAULT_EXCEPTION_ATTRIBUTE, obj); } return mv; } public String getErrorPath() { return errorPath; } public void setErrorPath(String errorPath) { this.errorPath = errorPath; } @Deprecated public String getExceptionProcPath() { return exceptionProcPath; } @Deprecated public void setExceptionProcPath(String exceptionProcPath) { this.exceptionProcPath = exceptionProcPath; this.defaultAjaxErrorView = exceptionProcPath; } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } public ExceptionFormater getFormatHelper() { return formatHelper; } public void setFormatHelper(ExceptionFormater formatHelper) { this.formatHelper = formatHelper; } public MessageSource getMessageSource() { return messageSource; } public void setMessageSource(MessageSource messageSource) { this.messageSource = messageSource; } public void setExceptionConverter(ExceptionConverter exceptionConverter) { this.exceptionConverter = exceptionConverter; } public String getDefaultAjaxErrorView() { return defaultAjaxErrorView; } public void setDefaultAjaxErrorView(String defaultAjaxErrorView) { this.defaultAjaxErrorView = defaultAjaxErrorView; } public void afterPropertiesSet() throws Exception { logger.info("Use Exception resolver."); if (formatHelper != null) { return; } if (messageSource == null) { messageSource = objectFactory.getBean(MessageSource.class); } Assert.notNull(messageSource, "MessageSource 不能为空"); ExceptionMessageFormatHelper format = new ExceptionMessageFormatHelper(); format.setMessageSource(messageSource); formatHelper = format; } }