赞
踩
- /**
- * 不必在Controller中对异常进行处理,抛出即可,由此异常解析器统一控制。<br>
- * ajax请求(有@ResponseBody的Controller)发生错误,输出JSON。<br>
- * 页面请求(无@ResponseBody的Controller)发生错误,输出错误页面。<br>
- * 需要与AnnotationMethodHandlerAdapter使用同一个messageConverters<br>
- * Controller中需要有专门处理异常的方法。
- *
- * @author dongjian
- *
- * */
- public class AnnotationHandlerMethodExceptionResolver extends ExceptionHandlerExceptionResolver {
-
- private String defaultErrorView;
-
- public String getDefaultErrorView() {
- return defaultErrorView;
- }
-
- public void setDefaultErrorView(String defaultErrorView) {
- this.defaultErrorView = defaultErrorView;
- }
-
- protected ModelAndView doResolveHandlerMethodException(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, Exception exception) {
-
- if (handlerMethod == null) {
- return null;
- }
-
- Method method = handlerMethod.getMethod();
-
- if (method == null) {
- return null;
- }
-
- ModelAndView returnValue = super.doResolveHandlerMethodException(request, response, handlerMethod, exception);
-
- ResponseBody responseBodyAnn = AnnotationUtils.findAnnotation(method, ResponseBody.class);
- if (responseBodyAnn != null) {
- try {
- ResponseStatus responseStatusAnn = AnnotationUtils.findAnnotation(method, ResponseStatus.class);
- if (responseStatusAnn != null) {
- HttpStatus responseStatus = responseStatusAnn.value();
- String reason = responseStatusAnn.reason();
- if (!StringUtils.hasText(reason)) {
- response.setStatus(responseStatus.value());
- } else {
- try {
- response.sendError(responseStatus.value(), reason);
- } catch (IOException e) { }
- }
- }
-
- return handleResponseBody(returnValue, request, response);
- } catch (Exception e) {
- return null;
- }
- }
-
- if(returnValue.getViewName() == null){
- returnValue.setViewName(defaultErrorView);
- }
-
- return returnValue;
-
- }
-
-
- @SuppressWarnings({ "unchecked", "rawtypes" })
- private ModelAndView handleResponseBody(ModelAndView returnValue, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- Map value = returnValue.getModelMap();
- HttpInputMessage inputMessage = new ServletServerHttpRequest(request);
- List<MediaType> acceptedMediaTypes = inputMessage.getHeaders().getAccept();
- if (acceptedMediaTypes.isEmpty()) {
- acceptedMediaTypes = Collections.singletonList(MediaType.ALL);
- }
- MediaType.sortByQualityValue(acceptedMediaTypes);
- HttpOutputMessage outputMessage = new ServletServerHttpResponse(response);
- Class<?> returnValueType = value.getClass();
- List<HttpMessageConverter<?>> messageConverters = super.getMessageConverters();
- if (messageConverters != null) {
- for (MediaType acceptedMediaType : acceptedMediaTypes) {
- for (HttpMessageConverter messageConverter : messageConverters) {
- if (messageConverter.canWrite(returnValueType, acceptedMediaType)) {
- messageConverter.write(value, acceptedMediaType, outputMessage);
- return new ModelAndView();
- }
- }
- }
- }
- if (logger.isWarnEnabled()) {
- logger.warn("Could not find HttpMessageConverter that supports return type [" + returnValueType + "] and " + acceptedMediaTypes);
- }
- return null;
- }
-
- }

<servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:dispatcher-servlet.xml</param-value></init-param><init-param><param-name>detectAllHandlerExceptionResolvers</param-name><!-- 取消其自动注册的异常解析器 --><param-value>false</param-value></init-param><load-on-startup>1</load-on-startup>
<property name="defaultErrorView" value="error.vm"/><!-- 错误页面 --><property name="messageConverters" ref="messageConverters"/> <!--见上一篇,有定义过,标有@ResponseBody被此messageConverters输出-->
public ModelAndView handleException(Exception ex, HttpServletRequest request) {return new ModelAndView().addObject("error", "错误信息");
async : true,
error : function(jqXHR, textStatus, errorThrown){var msg = $.parseJSON(jqXHR.responseText).error;alert(msg);},traditional : true,dataType : "json",type : "POST"
url: "demoAjax.action",
url: "demoAjax.action",
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。