mvc view有没有一个异常 统一 的出口view

全栈式学徒长成记--工欲善其事必先利其器,不积小流无以成江海,不积跬步无以至千里!...
spring mvc异常统一处理(使用ControllerAdvice注解)
spring 版本:
4.1.9.RELEASE
&org.springframework-version&4.1.9.RELEASE&/org.springframework-version&spring-servlet.xml,注意必须开启注解,即xml要有&annotation-driven /&
&annotation-driven /&
version="1.0" encoding="UTF-8"
xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
&!-- DispatcherServlet Context: defines this servlet's request-processing
infrastructure --
&!-- Handles HTTP GET requests for /resources/** by efficiently serving
up static resources in the ${webappRoot}/resources directory --
mapping="/resources/**" location="/resources/"
&!-- Resolves views selected for rendering by @Controllers to .jsp resources
in the /WEB-INF/views directory --
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
name="prefix" value="/WEB-INF/views/"
name="suffix" value=".jsp"
base-package="org.as.asjee" use-default-filters="false"
type="annotation" expression="org.springframework.stereotype.Controller"
&?xml version="1.0" encoding="UTF-8"?&
&beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"&
&!-- DispatcherServlet Context: defines this servlet's request-processing
infrastructure --&
&!-- Enables the Spring MVC @Controller programming model --&
&annotation-driven /&
&!-- Handles HTTP GET requests for /resources/** by efficiently serving
up static resources in the ${webappRoot}/resources directory --&
&resources mapping="/resources/**" location="/resources/" /&
&!-- Resolves views selected for rendering by @Controllers to .jsp resources
in the /WEB-INF/views directory --&
&beans:bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver"&
&beans:property name="prefix" value="/WEB-INF/views/" /&
&beans:property name="suffix" value=".jsp" /&
&/beans:bean&
&context:component-scan base-package="org.as.asjee" use-default-filters="false"&
&context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/&
&/context:component-scan&
&/beans:beans&
2、异常统一处理类
package org.as.asjee.core.
import java.sql.SQLE
import javax.servlet.http.HttpServletR
import org.as.asjee.core.log.AsJEEL
import org.as.asjee.core.log.AsJEELoggerF
import org.springframework.web.bind.annotation.ControllerA
import org.springframework.web.bind.annotation.ExceptionH
import org.springframework.web.bind.annotation.ResponseB
import org.springframework.web.servlet.ModelAndV
@ControllerAdvice
public class GlobalExceptionHandler {
private final static AsJEELogger LOG = AsJEELoggerFactory.getLogger(GlobalExceptionHandler.class);
private final static String EXPTION_MSG_KEY = "message";
@ExceptionHandler(BusinessException.class)
@ResponseBody
public void handleBizExp(HttpServletRequest request, Exception ex){
LOG.info("Business exception handler
" + ex.getMessage() );
request.getSession(true).setAttribute(EXPTION_MSG_KEY, ex.getMessage());
@ExceptionHandler(SQLException.class)
public ModelAndView handSql(Exception ex){
LOG.info("SQL Exception " + ex.getMessage());
ModelAndView mv = new ModelAndView();
mv.addObject("message", ex.getMessage());
mv.setViewName("sql_error");
package org.as.asjee.core.
import java.sql.SQLE
import javax.servlet.http.HttpServletR
import org.as.asjee.core.log.AsJEEL
import org.as.asjee.core.log.AsJEELoggerF
import org.springframework.web.bind.annotation.ControllerA
import org.springframework.web.bind.annotation.ExceptionH
import org.springframework.web.bind.annotation.ResponseB
import org.springframework.web.servlet.ModelAndV
* 捕获异常统一处理
* @description TODO
* @author chen.gs
* @create date 日
* @modified by
* @modify date
* @version v1.0
@ControllerAdvice
public class GlobalExceptionHandler {
private final static AsJEELogger LOG = AsJEELoggerFactory.getLogger(GlobalExceptionHandler.class);
private final static String EXPTION_MSG_KEY = "message";
@ExceptionHandler(BusinessException.class)
@ResponseBody
public void handleBizExp(HttpServletRequest request, Exception ex){
LOG.info("Business exception handler
" + ex.getMessage() );
request.getSession(true).setAttribute(EXPTION_MSG_KEY, ex.getMessage());
@ExceptionHandler(SQLException.class)
public ModelAndView handSql(Exception ex){
LOG.info("SQL Exception " + ex.getMessage());
ModelAndView mv = new ModelAndView();
mv.addObject("message", ex.getMessage());
mv.setViewName("sql_error");
自定义异常类BussinessException.java
package org.as.asjee.core.
public class BusinessException extends Exception{
private static final long serialVersionUID = 1L;
private String bizT
private int bizC
public BusinessException(String bizType, int bizCode, String message){
super(message);
this.bizType = bizT
this.bizCode = bizC
this.message =
public BusinessException(String message){
super(message);
this.bizType = "";
this.bizCode = -1;
this.message =
public BusinessException(String bizType, String message){
super(message);
this.bizType = bizT
this.bizCode = -1;
this.message =
public BusinessException(int bizCode, String message){
super(message);
this.bizType = "";
this.bizCode = bizC
this.message =
public String getBizType() {
return bizT
public void setBizType(String bizType) {
this.bizType = bizT
public int getBizCode() {
return bizC
public void setBizCode(int bizCode) {
this.bizCode = bizC
public String getMessage() {
public void setMessage(String message) {
this.message =
package org.as.asjee.core.
* 业务异常
* @description TODO
* @author chen.gs
* @create date 日
* @modified by
* @modify date
* @version v1.0
public class BusinessException extends Exception{
private static final long serialVersionUID = 1L;
//业务类型
private String bizT
//业务代码
private int bizC
//错误信息
public BusinessException(String bizType, int bizCode, String message){
super(message);
this.bizType = bizT
this.bizCode = bizC
this.message =
public BusinessException(String message){
super(message);
this.bizType = "";
this.bizCode = -1;
this.message =
public BusinessException(String bizType, String message){
super(message);
this.bizType = bizT
this.bizCode = -1;
this.message =
public BusinessException(int bizCode, String message){
super(message);
this.bizType = "";
this.bizCode = bizC
this.message =
public String getBizType() {
return bizT
public void setBizType(String bizType) {
this.bizType = bizT
public int getBizCode() {
return bizC
public void setBizCode(int bizCode) {
this.bizCode = bizC
public String getMessage() {
public void setMessage(String message) {
this.message =
3、controller
package org.as.asjee.core.security.
import java.sql.SQLE
import javax.annotation.R
import org.as.asjee.core.exception.BusinessE
import org.as.asjee.core.security.model.U
import org.as.asjee.core.security.service.UserS
import org.as.asjee.core.service.ServiceF
import org.as.asjee.core.web.AbstractC
import org.springframework.stereotype.C
import org.springframework.web.bind.annotation.RequestM
@Controller
@RequestMapping("/security/user")
public class UserController
extends AbstractController&User&{
private UserService userS
private ServiceFacade serviceF
@RequestMapping("login")
public String login() {
return "login";
@RequestMapping("login2")
public String login2() throws Exception {
throw new SQLException("出错鸟。。。。。。。。。");
@RequestMapping("login3")
public String login3() throws Exception {
throw new BusinessException("业务执行异常");
@RequestMapping("login4")
public String login4() {
throw new BusinessException("业务执行异常");
} catch (BusinessException e) {
e.printStackTrace();
return "login";
package org.as.asjee.core.security.
import java.sql.SQLE
import javax.annotation.R
import org.as.asjee.core.exception.BusinessE
import org.as.asjee.core.security.model.U
import org.as.asjee.core.security.service.UserS
import org.as.asjee.core.service.ServiceF
import org.as.asjee.core.web.AbstractC
import org.springframework.stereotype.C
import org.springframework.web.bind.annotation.RequestM
@Controller
@RequestMapping("/security/user")
public class UserController
extends AbstractController&User&{
private UserService userS
private ServiceFacade serviceF
@RequestMapping("login")
public String login() {
return "login";
@RequestMapping("login2")
public String login2() throws Exception {
throw new SQLException("出错鸟。。。。。。。。。");
@RequestMapping("login3")
public String login3() throws Exception {
throw new BusinessException("业务执行异常");
//此方法抛出的异常不是由GlobalExceptionHandler处理
//而是在catch块处理
@RequestMapping("login4")
public String login4() {
throw new BusinessException("业务执行异常");
} catch (BusinessException e) {
e.printStackTrace();
return "login";
4、JSP页面
sql_error.jsp
%@ page language="java" contentType="text/ charset=UTF-8" %
&!DOCTYPE html"
http-equiv="Content-Type" content="text/ charset=UTF-8"
Insert title here
ERROR MESSAGE
${message}
&%@ page language="java" contentType="text/ charset=UTF-8" %&
&!DOCTYPE html"&
&meta http-equiv="Content-Type" content="text/ charset=UTF-8"&
&title&Insert title here&/title&
&h1&ERROR MESSAGE&/h1&
&p&${message}&/p&
5、简要说明
在Controller中抛出的异常,当没有被catch处理时,GlobalExceptionHandler中定义的处理方法可以起作用,在方法写明注解@ExceptionHandler,并注明其异常类即可。此种方法不仅可以作用于Controller,同样的在DAO层、service层也可,都可以由GlobalExceptionHandler进行处理。此种写法减少代码的入侵,值得推荐。
异常的统一处理只是注解ControllerAdvice用处之一,有兴趣了解更多的,请到spring官网查阅。
没有更多推荐了,博客分类:
转载请标明出处:http://fuliang.iteye.com/blog/947191
Spring MVC的确很强大,在每一个你想的到和想不到的地方都会留下钩子,来插入自定义的实现,透明替换默认实现,
拦截器堆栈结构设计的非常强大,多种试图的解析,url mapping的多种实现,Locale resolver、Theme resolver
、multipart file resolver,Excepiton hanlder Resolver等等,能让Spring MVC从1.0到3.0经历巨大变化,
仍能向后兼容,并支持很酷的RESTful风格和强大的简化xml配置的注解。
这些功能我们在项目中经常用到,但是Excepiton hanlder Resolver可能是个生僻一点的东东,因为我们通常对错误
的处理通常不是非常的复杂,很多情况下只是根据异常或者http error code跳转到错误页面,这个是JSP/servlet就可
以搞定,在web.xml配置一下即可。
今天遇到一个事情,让我想用到HandlerExceptionResolver这个东东来处理异常。今天准备把自助系统进入上线状态,
所以把log的级别从DEBUG调到INFO,结果没有catch的Runtime异常在log记录,后来跟踪了一下原来Spring把异常处理的log,
直接使用的是debug,而不是error,所以log级别设置为INFO导致异常没有记录,看了一下spring的源代码:
// Check registerer HandlerExceptionResolvers...
ModelAndView exMv =
for (Iterator it = this.handlerExceptionResolvers.iterator(); exMv == null && it.hasNext();) {
HandlerExceptionResolver resolver = (HandlerExceptionResolver) it.next();
exMv = resolver.resolveException(request, response, handler, ex);
if (exMv != null) {
if (logger.isDebugEnabled()) {
logger.debug("Handler execution resulted in exception - forwarding to resolved error view: " + exMv, ex);
WebUtils.exposeErrorRequestAttributes(request, ex, getServletName());
return exMv;
可以看到可以插入自己的HandlerExceptionResover来搞定这个问题,我们可以在resolveException方法任意处理异常和log。也可以
把错误信息个性化后传到view层显示。
我们只有简单的需求,就是把没有catch的异常记入log,将异常的完整信息放在错误页面的一个隐藏的区域,方便查找出现错误的原因。
首先我们实现HandlerExceptionResolver
package com.qunar.advertisement.
import java.util.HashM
import java.util.M
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import org.apache.log4j.L
import org.springframework.web.servlet.HandlerExceptionR
import org.springframework.web.servlet.ModelAndV
import com.qunar.advertisement.utils.StringPrintW
public class QADHandlerExceptionResolver implements HandlerExceptionResolver{
private static Logger logger = Logger.getLogger(QADHandlerExceptionResolver.class);
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
logger.error("Catch Exception: ",ex);//把漏网的异常信息记入日志
Map&String,Object& map = new HashMap&String,Object&();
StringPrintWriter strintPrintWriter = new StringPrintWriter();
ex.printStackTrace(strintPrintWriter);
map.put("errorMsg", strintPrintWriter.getString());//将错误信息传递给view
return new ModelAndView("error",map);
我们还需要一个辅助的类StringPrintWriter,因为ex.printStackTrace参数只有个PrintWriter类型的,java自带的StringWriter
不可用,所以我们需要自己实现一个装饰器的StringPrintWriter。
package com.qunar.advertisement.
import java.io.PrintW
import java.io.StringW
public class StringPrintWriter extends PrintWriter{
public StringPrintWriter(){
super(new StringWriter());
public StringPrintWriter(int initialSize) {
super(new StringWriter(initialSize));
public String getString() {
return ((StringWriter) this.out).toString();
public String toString() {
return getString();
我们只需要在xml中配置一下就可以了:
&bean class="com.qunar.advertisement.exception.QADHandlerExceptionResolver"&
我们在错误页面隐藏区域显示错误信息:
&div style="display:"&
&c:out value="${errorMsg}"&&/c:out&
浏览 65424
可以,出错可以QADHandlerExceptionResolver 中返回json的view 而不是页面謝謝!
浏览: 1346174 次
来自: 北京
请问下,这本书是基于Hadoop1还是Hadoop2?
不懂呀。。
按照上面的执行,文件确实是更新了,但是还是找不到kernel, ...
楼主spring 什么版本,我的3.1 ,xml中配置 &am ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Spring-MVC开发之全局异常捕获全面解读(转)
时间: 00:50:48
&&&& 阅读:29128
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&异常,异常。我们一定要捕获一切该死的异常,宁可错杀一千也不能放过一个!产品上线后的异常更要命,一定要屏蔽错误内容,以免暴露敏感信息!在用Spring MVC开发WEB应用时捕获全局异常的方法基本有两种:
WEB.XML,就是指定error-code和page到指定地址,这也是最传统和常见的做法
用Spring的全局异常捕获功能,这种相对可操作性更强一些,可根据自己的需要做一后善后处理,比如日志记录等。
SO,本文列出Spring-MVC做WEB开发时常用全局异常捕获的几种解决方案抛砖引玉,互相没有依赖,每个都可单独使用!
1、定义服务器错误WEB.XML整合Spring MVC
1 &error-page&
&error-code&404&/error-code&
&location&/404&/location&
4 &/error-page&
5 &error-page&
&error-code&500&/error-code&
&location&/500&/location&
8 &/error-page&
10 &!-- 未捕获的错误,同样可指定其它异常类,或自定义异常类 --&
11 &error-page&
&exception-type&java.lang.Exception&/exception-type&
&location&/uncaughtException&/location&
14 &/error-page&
applicationContext.xml:
1 &!-- 错误路径和错误页面,注意指定viewResolver --&
2 &mvc:view-controller path="/404" view-name="404"/&
3 &mvc:view-controller path="/500" view-name="500"/&
4 &mvc:view-controller path="/uncaughtException" view-name="uncaughtException"/&
&2、Spring全局异常,Controller增强方式( Advising Controllers)
异常抛出:
1 @Controller
2 public class MainController {
@ResponseBody
@RequestMapping("/")
public String main(){
throw new NullPointerException("NullPointerException Test!");
异常捕获:
1 //注意使用注解@ControllerAdvice作用域是全局Controller范围
2 //可应用到所有@RequestMapping类或方法上的@ExceptionHandler、@InitBinder、@ModelAttribute,在这里是@ExceptionHandler
3 @ControllerAdvice
4 public class AControllerAdvice {
@ExceptionHandler(NullPointerException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public String handleIOException(NullPointerException ex) {
return ClassUtils.getShortName(ex.getClass()) + ex.getMessage();
为了防止@ResponseStatus标注的异常被Spring框架处理,可以这样编写全局异常处理类:
1 @ControllerAdvice
2 class GlobalDefaultExceptionHandler {
public static final String DEFAULT_ERROR_VIEW = "error";
@ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
// If the exception is annotated with @ResponseStatus rethrow it and let
// the framework handle it - like the OrderNotFoundException example
// at the start of this post.
// AnnotationUtils is a Spring Framework utility class.
if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null)
// Otherwise setup and send the user to a default error-view.
ModelAndView mav = new ModelAndView();
mav.addObject("exception", e);
mav.addObject("url", req.getRequestURL());
mav.setViewName(DEFAULT_ERROR_VIEW);
3、Spirng全局异常,配置方式
异常抛出,同上!
异常捕获:
1 &!-- 全局异常配置 --&
&bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"&
&property name="exceptionMappings"&
&prop key="java.lang.Exception"&errors/500&/prop&
&prop key="java.lang.Throwable"&errors/500&/prop&
&/property&
&property name="statusCodes"&
&prop key="errors/500"&500&/prop&
&/property&
&!-- 设置日志输出级别,不定义则默认不输出警告等错误日志信息 --&
&property name="warnLogCategory" value="WARN"&&/property&
&!-- 默认错误页面,当找不到上面mappings中指定的异常对应视图时,使用本默认配置 --&
&property name="defaultErrorView" value="errors/500"&&/property&
&!-- 默认HTTP状态码 --&
&property name="defaultStatusCode" value="500"&&/property&
对应500错误的view jsp页面:
1 &%@ page language="java" contentType="text/ charset=UTF-8" pageEncoding="UTF-8"%&
2 &%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%&
3 &!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&
6 &meta http-equiv="Content-Type" content="text/ charset=UTF-8"&
7 &title&500 Error&/title&
&% Exception ex = (Exception)request.getAttribute("exception"); %&
&H2&Exception: &%= ex.getMessage()%&&/H2&
&% ex.printStackTrace(new java.io.PrintWriter(out)); %&
14 &/body&
15 &/html&
4、Sping全局异常,自定义异常类和异常解析自定义异常类:
1 public class CustomException extends RuntimeException {
public CustomException(){
public CustomException(String msg, Throwable cause){
super(msg, cause);
//Do something...
抛出异常:
1 @ResponseBody
2 @RequestMapping("/ce")
3 public String ce(CustomException e){
throw new CustomException("msg",e);
实现异常捕获接口HandlerExceptionResolver:
1 public class CustomHandlerExceptionResolver implements HandlerExceptionResolver{
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
Map&String, Object& model = new HashMap&String, Object&();
model.put("e", e);
//这里可根据不同异常引起类做不同处理方式,本例做不同返回页面。
String viewName = ClassUtils.getShortName(e.getClass());
return new ModelAndView(viewName, model);
新的的HandlerExceptionResolver实现类只需在配置文件中定义即可,可以配置优先级。DispatcherServlet初始化HandlerExceptionResolver的时候会自动寻找容器中实现了HandlerExceptionResolver接口的类,然后添加进来。配置Spring支持异常捕获:
1 &bean class="cn.bg.controller.CustomHandlerExceptionResolver"/&
5、Errors and REST
使用Restful的Controller可以使用@ResponseBody处理错误,首先定义一个错误:
1 public class ErrorInfo {
public final S
public final S
public ErrorInfo(String url, Exception ex) {
this.url =
this.ex = ex.getLocalizedMessage();
通过一个@ResponseBody返回一个错误实例:
1 @ResponseStatus(HttpStatus.BAD_REQUEST)
2 @ExceptionHandler(MyBadDataException.class)
3 @ResponseBody ErrorInfo handleBadRequest(HttpServletRequest req, Exception ex) {
return new ErrorInfo(req.getRequestURL(), ex);
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:http://www.cnblogs.com/afeng7882999/p/4318397.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!

我要回帖

更多关于 mvc viewbag 的文章

 

随机推荐