本文参考地址:http://blog.csdn.net/wuhenzhangxing/article/details/46459853
@ControllerAdvice是spring3.2提供的新注解,从名字上可以看出大体意思是控制器增强。让我们先看看 @ControllerAdvice的源码实现如下:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface ControllerAdvice { }
注解使用@Component注解,这样的话当我们使用<context:component-scan>扫描时也能扫描到,其 javadoc定义如下:
/** * Indicates the annotated class assists a "Controller". * * <p>Serves as a specialization of {@link Component @Component}, allowing for * implementation classes to be autodetected through classpath scanning. * * <p>It is typically used to define {@link ExceptionHandler @ExceptionHandler}, * {@link InitBinder @InitBinder}, and {@link ModelAttribute @ModelAttribute} * methods that apply to all {@link RequestMapping @RequestMapping} methods. * * @author Rossen Stoyanchev * @since 3.2 */
由javadoc可以看出在@ControllerAdvice注解内部我们可以使用@ExceptionHandler、@InitBinder、 @ModelAttribute共3个注解,使用方式如下:
@ControllerAdvice public class ControllerAdviceTest { @ModelAttribute public User newUser() { System.out.println("============应用到所有@RequestMapping注解方法,在其执行之前把返回值放入Model"); return new User(); } @InitBinder public void initBinder(WebDataBinder binder) { System.out.println("============应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器"); } @ExceptionHandler(UnauthenticatedException.class) @ResponseStatus(HttpStatus.UNAUTHORIZED) public String processUnauthenticatedException(NativeWebRequest request, UnauthenticatedException e) { System.out.println("===========应用到所有@RequestMapping注解的方法,在其抛出UnauthenticatedException异常时执行"); return "viewName"; //返回一个逻辑视图名 } }
以上代码可以看出@ModelAttribute、@initBinder和@ExceptionHandler对所有使用@RequestMapping的方法起作用,但@ModelAttribute和@initBinder在设置全局数据时比较有用,使用较少, @ExceptionHandler异常处理器,当注解的方法发生定义的异常时产生作用,使用较多。例如遇 到RuntimeException时做JSON的异常处理。
如果你的spring-mvc配置文件使用如下方式扫描bean
<context:component-scan base-package="com.jshi.es" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
需要把@ControllerAdvice包含进来,否则不起作用:
<context:component-scan base-package="com.jshi.es" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/> </context:component-scan>
项目中的场景应用:使用@ControllerAdvice注解做Json的异常处理,代码如下,FieldValidationError是自 定义的错误信息,RemoteResponse是自定义的返回数据结构,RespEnum是自定义的响应码
/** * 通用的exception的handler的定义 * @author jshi * @date 2016-6-5 */ @ControllerAdvice public class ExceptionAdvice { /** * 数据校验失败 * @param ex * @return */ @ExceptionHandler(MethodArgumentNotValidException.class) // @ResponseStatus(value = HttpStatus.BAD_REQUEST) @ResponseBody public RemoteResponse handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) { BindingResult bindingResult = ex.getBindingResult(); List<FieldValidationError> errorList=new LinkedList<FieldValidationError>(); for (FieldError fieldError : bindingResult.getFieldErrors()) { errorList.add(new FieldValidationError( fieldError.getField(),fieldError.getDefaultMessage())); } return new RemoteResponse(RespEnum.COM_ARGUMENT_NOT_VALID, errorList); } /** * 数据校验失败 * @param ex * @return */ @ExceptionHandler(BindException.class) @ResponseBody public RemoteResponse handleBindException(BindException ex) { BindingResult bindingResult = ex.getBindingResult(); List<FieldValidationError> errorList=new LinkedList<FieldValidationError>(); for (FieldError fieldError : bindingResult.getFieldErrors()) { errorList.add(new FieldValidationError( fieldError.getField(),fieldError.getDefaultMessage())); } return new RemoteResponse(RespEnum.COM_ARGUMENT_NOT_VALID, errorList); } /** * 400 - Bad Request */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(HttpMessageNotReadableException.class) @ResponseBody public RemoteResponse handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { Loggers.demoLogger.error("参数解析失败", e); return new RemoteResponse(RespEnum.COM_ARGUMENT_NOT_READARABLE); } /** * 400 - Bad Request */ // @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(JSONException.class) @ResponseBody public RemoteResponse handleJSONException(JSONException e) { Loggers.demoLogger.error("json读取失败", e); return new RemoteResponse(RespEnum.COM_ARGUMENT_NOT_READARABLE); } /** * 405 - Method Not Allowed */ @ExceptionHandler(HttpRequestMethodNotSupportedException.class) @ResponseBody public RemoteResponse handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) { Loggers.demoLogger.error("不支持当前请求方法", e); return new RemoteResponse(RespEnum.COM_METHOD_NOT_SUPPORT); } /** * 415 - Unsupported Media Type */ @ExceptionHandler(HttpMediaTypeNotSupportedException.class) @ResponseBody public RemoteResponse handleHttpMediaTypeNotSupportedException(Exception e) { Loggers.demoLogger.error("不支持当前媒体类型", e); return new RemoteResponse(RespEnum.COM_MEDIA_NOT_SUPPORT); } /** * 数据库操作失败 */ @ExceptionHandler(SQLException.class) @ResponseBody public RemoteResponse handleSQLException(SQLException e) { Loggers.demoLogger.error("数据库异常", e); return new RemoteResponse(RespEnum.COM_DB_OPERATION_FAILED); } /** * 数据库操作失败 */ @ExceptionHandler(MaxUploadSizeExceededException.class) @ResponseBody public RemoteResponse handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) { Loggers.demoLogger.error("上传文件过大,上传失败,最大只能上传2M", e); return new RemoteResponse(RespEnum.UPLOAD_FILE_EXCEEDED_MAXSIZE); } /** * 500 - Internal Server Error */ @ExceptionHandler(Exception.class) @ResponseBody public RemoteResponse handleException(Exception e) { Loggers.demoLogger.error("服务运行异常", e); return new RemoteResponse(RespEnum.COM_INTERNAL_ERROR); } }
/** * 定义在字段的数据校验不通过的情况,返回的错误信息的结构 * @author jshi * @date 2016-6-5 */ public class FieldValidationError { private String field; private String msg; public FieldValidationError(String field,String msg) { this.field=field; this.msg=msg; } public String getField() { return field; } public void setField(String field) { this.field = field; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
/** * rest接口,返回的json结构 * @author jshi */ public class RemoteResponse { private int code;//code =0表示成功; code !=0 表示失败 private String message; private Object data; public RemoteResponse(RespEnum resp) { this.code=resp.getValue(); this.message= I18nUtil.getMessage(resp.getName()); } public RemoteResponse(RespEnum resp,String...args) { this.code=resp.getValue(); this.message= I18nUtil.getMessage(resp.getName(),args); } public RemoteResponse(RespEnum resp,String msg) { this.code=resp.getValue(); this.message=msg; } public RemoteResponse(RespEnum resp,Object data) { this.code=resp.getValue(); this.message= I18nUtil.getMessage(resp.getName()); this.data=data; } public RemoteResponse(RespEnum resp,Object data,String...agrs) { this.code=resp.getValue(); this.message= I18nUtil.getMessage(resp.getName(),agrs); this.data=data; } public RemoteResponse(RespInfo resp) { this.code=resp.getCode(); this.message=resp.getMessage(); this.data=resp.getModel(); } protected void success() { code=0; } protected RemoteResponse success(String msg) { code=RespEnum.SUCCESS_RESULT.getValue(); this.message=msg; return this; } protected RemoteResponse failure(String msg) { code= RespEnum.COM_ERROR.getValue(); this.message=msg; return this; } public RemoteResponse failure(int code ,String msg) { this.code=code; this.message=msg; return this; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } }
相关推荐
本学习指南将深入探讨SpringMVC的核心概念、配置、以及如何与其他技术如JSTL(JavaServer Pages Standard Tag Library)结合使用。 首先,让我们理解SpringMVC的基本工作流程。当一个HTTP请求到达应用时,...
- 对于全局异常处理,可以创建一个`@ControllerAdvice`注解的类,其中包含`@ExceptionHandler`注解的方法来捕获和处理异常。 4. **视图层的渲染**: - 如果在显示表单时需要预先填充数据,可以将已存在的模型对象...
本项目“springmvc登陆示例项目”是针对初学者和开发者的一个实践教程,旨在帮助他们理解并掌握SpringMVC在处理用户登录场景中的应用。 该项目名为"goodDay",可能代表一个简单的日常登录系统,其核心功能是实现...
综上所述,"SpringMVC典型实例"涵盖了Web应用开发的多个核心部分,这些知识点对于理解和掌握SpringMVC框架以及构建实际项目都至关重要。通过实践这些实例,开发者能够更好地理解SpringMVC的工作原理,提升开发效率和...
通过深入理解其核心组件和注解机制,以及合理地配置和集成其他工具,我们可以充分利用 SpringMvc 的优势,打造出高质量的 Web 项目。对于初学者,可以从简单的 CRUD 操作入手,逐步掌握 SpringMvc 的精髓,并通过...
结合提供的标签"框架",我们可以深入探讨如何使用SpringMVC、Hibernate和Spring来实现一个简单的增删改查应用。 1. **SpringMVC工作原理**:SpringMVC基于Model-View-Controller设计模式,其中Controller处理HTTP...
标签是SpringMVC中启用注解驱动的配置方式,本教程会解释其作用和好处。 最后,教程中将给出springMVC.xml配置文件的示例,并解释各部分的作用。这将帮助学习者更好地理解和应用SpringMVC的配置。 综上所述,本...
1. 扫描@Controller注解的类:通过`<context:component-scan>`标签,你可以指定要扫描的包,SpringMVC会自动发现并管理这些类。 2. 视图解析器:例如`...
此外,还可以使用`@ControllerAdvice`注解和`@ExceptionHandler`注解来定义一个全局的异常处理类。 3. 错误页面配置:在SpringMVC的配置中,可以通过`<error-page>`标签定义不同类型的错误代码对应的错误页面,或者...
在IT行业中,SpringMVC和MyBatis是两个非常重要的框架,它们被广泛应用于Java Web开发。本示例聚焦于如何在SpringMVC 3.0和...通过深入理解这两个框架以及分页原理,开发者可以更好地构建大型、高性能的应用程序。
在本教程中,我们将深入探讨如何使用SpringMvc框架来实现CRUD(创建、读取、更新和删除)操作。SpringMvc是Spring框架的一部分,专为Web应用提供了模型-视图-控制器(MVC)架构模式的实现。SSM是Spring、SpringMVC和...
SpringMVC允许自定义异常处理器,通过@ControllerAdvice和@ExceptionHandler注解来统一处理全局异常。 4. **拦截器(Interceptor)**:SpringMVC的拦截器可以拦截请求并在实际处理之前或之后执行某些逻辑,如登录...
可以通过@ControllerAdvice和@ExceptionHandler注解全局处理异常。 10. **拦截器(Interceptor)**: 在请求处理前后执行的逻辑,可用于日志记录、权限验证等。 11. **MVC配置**: 通过XML配置或基于Java的配置...
2. **配置文件**:通常包括`spring-servlet.xml`,在这个文件中,你需要定义`<mvc:annotation-driven>`标签来启用SpringMVC对注解的支持,以及配置视图解析器如`InternalResourceViewResolver`,用于确定返回的视图...
2. **AOP**:理解切面、通知类型、目标对象、代理等概念,以及如何编写和应用切面。 3. **Spring MVC**:Spring的Web MVC框架,包括DispatcherServlet、Model-View-Controller模式的应用、视图解析器等。 4. **事务...
本文档将深入探讨SpringMVC的核心概念、配置以及如何进行简单的注解驱动编程。 1. **核心组件与作用** - **DispatcherServlet**:Spring MVC的前端控制器,负责接收HTTP请求并分发到相应的处理器。 - **...
SpringMVC提供了全局异常处理机制,通过@ControllerAdvice和@ExceptionHandler注解,可以集中处理应用程序中可能出现的异常,返回统一的错误信息,提升用户体验。 7. **拦截器(Interceptor)**: SpringMVC的...
在快速搭建Spring Web应用的过程中,首先需要理解的是Spring MVC的基本结构,包括DispatcherServlet、Controller、Model、View以及ViewResolver等关键组件。DispatcherServlet作为入口点,负责调度请求到合适的...
9. **异常处理**:可以使用@ControllerAdvice和@ExceptionHandler来全局处理特定类型的异常,提供统一的错误页面或JSON响应。 10. **MVC注解**:Spring MVC提供了丰富的注解,如@RequestMapping、@GetMapping、@...
6. **异常处理**:如何配置全局异常处理器和使用@ControllerAdvice注解。 接下来,`理解RESTful架构.mht`文件将深入REST(Representational State Transfer)架构风格。REST是一种网络应用程序的设计风格和开发方式...