spring 2.2 改进_Spring 4中@ControllerAdvice的改进

spring 2.2 改进

在Spring 4的许多新功能中,我发现了@ControllerAdvice的改进。 @ControllerAdvice是@Component的特殊化,用于定义适用于所有@RequestMapping方法的@ ExceptionHandler,@ InitBinder和@ModelAttribute方法。 在Spring 4之前,@ ControllerAdvice在同一Dispatcher Servlet中协助了所有控制器。 在Spring 4中,它已经发生了变化。 从Spring 4开始,可以将@ControllerAdvice配置为支持定义的控制器子集,而仍可以使用默认行为。

@ControllerAdvice协助所有控制器

假设我们要创建一个错误处理程序,该错误处理程序将向用户显示应用程序错误。 我们假设这是一个基本的Spring MVC应用程序,其中Thymeleaf作为视图引擎,并且我们有一个ArticleController具有以下@RequestMapping方法:

package pl.codeleak.t.articles;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping("article")
class ArticleController {@RequestMapping("{articleId}")String getArticle(@PathVariable Long articleId) {throw new IllegalArgumentException("Getting article problem.");}
}

如我们所见,我们的方法抛出了一个假想异常。 现在,使用@ControllerAdvice创建一个异常处理程序。 (这不仅是Spring中处理异常的可能方法)。

package pl.codeleak.t.support.web.error;import com.google.common.base.Throwables;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.ModelAndView;@ControllerAdvice
class ExceptionHandlerAdvice {@ExceptionHandler(value = Exception.class)public ModelAndView exception(Exception exception, WebRequest request) {ModelAndView modelAndView = new ModelAndView("error/general");modelAndView.addObject("errorMessage", Throwables.getRootCause(exception));return modelAndView;}
}

该课程不是公开的,因为它不是公开的。 我们添加了@ExceptionHandler方法,该方法将处理所有类型的Exception,它将返回“错误/常规”视图:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head><title>Error page</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><link href="../../../resources/css/bootstrap.min.css" rel="stylesheet" media="screen" th:href="@{/resources/css/bootstrap.min.css}"/><link href="../../../resources/css/core.css" rel="stylesheet" media="screen" th:href="@{/resources/css/core.css}"/>
</head>
<body>
<div class="container" th:fragment="content"><div th:replace="fragments/alert :: alert (type='danger', message=${errorMessage})"> </div>
</div>
</body>
</html>

为了测试该解决方案,我们可以运行服务器,或者(最好)使用Spring MVC Test模块创建一个测试。 由于我们使用Thymeleaf,因此可以验证渲染的视图:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = {RootConfig.class, WebMvcConfig.class})
@ActiveProfiles("test")
public class ErrorHandlingIntegrationTest {@Autowiredprivate WebApplicationContext wac;private MockMvc mockMvc;@Beforepublic void before() {this.mockMvc = webAppContextSetup(this.wac).build();}@Testpublic void shouldReturnErrorView() throws Exception {mockMvc.perform(get("/article/1")).andDo(print()).andExpect(content().contentType("text/html;charset=ISO-8859-1")).andExpect(content().string(containsString("java.lang.IllegalArgumentException: Getting article problem.")));}
}

我们期望内容类型为text / html,并且视图包含带有错误消息HTML片段。 但是,它并不是真正的用户友好型。 但是测试是绿色的。

使用上述解决方案,我们提供了一种处理所有控制器错误的通用机制。 如前所述,我们可以使用@ControllerAdvice:做更多的事情。 例如:

@ControllerAdvice
class Advice {@ModelAttributepublic void addAttributes(Model model) {model.addAttribute("attr1", "value1");model.addAttribute("attr2", "value2");}@InitBinderpublic void initBinder(WebDataBinder webDataBinder) {webDataBinder.setBindEmptyMultipartFiles(false);}
}

@ControllerAdvice协助选定的控制器子集

从Spring 4开始,可以通过批注(),basePackageClasses(),basePackages()方法来自定义@ControllerAdvice,以选择控制器的一个子集来提供帮助。 我将演示一个简单的案例,说明如何利用此新功能。

假设我们要添加一个API以通过JSON公开文章。 因此,我们可以定义一个新的控制器,如下所示:

@Controller
@RequestMapping("/api/article")
class ArticleApiController {@RequestMapping(value = "{articleId}", produces = "application/json")@ResponseStatus(value = HttpStatus.OK)@ResponseBodyArticle getArticle(@PathVariable Long articleId) {throw new IllegalArgumentException("[API] Getting article problem.");}
}

我们的控制器不是很复杂。 如@ResponseBody批注所示,它将返回Article作为响应正文。 当然,我们要处理异常。 而且我们不希望以text / html的形式返回错误,而是以application / json的形式返回错误。 然后创建一个测试:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = {RootConfig.class, WebMvcConfig.class})
@ActiveProfiles("test")
public class ErrorHandlingIntegrationTest {@Autowiredprivate WebApplicationContext wac;private MockMvc mockMvc;@Beforepublic void before() {this.mockMvc = webAppContextSetup(this.wac).build();}@Testpublic void shouldReturnErrorJson() throws Exception {mockMvc.perform(get("/api/article/1")).andDo(print()).andExpect(status().isInternalServerError()).andExpect(content().contentType("application/json")).andExpect(content().string(containsString("{\"errorMessage\":\"[API] Getting article problem.\"}")));}
}

测试是红色的。 我们能做些什么使其绿色? 我们需要提出另一条建议,这次仅针对我们的Api控制器。 为此,我们将使用@ControllerAdvice注解()选择器。 为此,我们需要创建一个客户或使用现有注释。 我们将使用@RestController预定义注释。 带有@RestController注释的控制器默认情况下采用@ResponseBody语义。 我们可以通过将@Controller替换为@RestController并从处理程序的方法中删除@ResponseBody来修改我们的控制器:

@RestController
@RequestMapping("/api/article")
class ArticleApiController {@RequestMapping(value = "{articleId}", produces = "application/json")@ResponseStatus(value = HttpStatus.OK)Article getArticle(@PathVariable Long articleId) {throw new IllegalArgumentException("[API] Getting article problem.");}
}

我们还需要创建另一个将返回ApiError(简单POJO)的建议:

@ControllerAdvice(annotations = RestController.class)
class ApiExceptionHandlerAdvice {/*** Handle exceptions thrown by handlers.*/@ExceptionHandler(value = Exception.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)@ResponseBodypublic ApiError exception(Exception exception, WebRequest request) {return new ApiError(Throwables.getRootCause(exception).getMessage());}
}

这次运行测试套件时,两个测试均为绿色,这意味着ExceptionHandlerAdvice辅助了“标准” ArticleController,而ApiExceptionHandlerAdvice辅助了ArticleApiController。

摘要

在以上场景中,我演示了如何轻松利用@ControllerAdvice批注的新配置功能,希望您像我一样喜欢所做的更改。

参考资料

  • SPR-10222
  • @RequestAdvice注释文档

参考: @ControllerAdvice在我们的JCG合作伙伴 Rafal Borowiec的Spring 4中的改进,来自Codeleak.pl博客。

翻译自: https://www.javacodegeeks.com/2013/11/controlleradvice-improvements-in-spring-4.html

spring 2.2 改进

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

向量范数与矩阵范数

一、向量的范数 1.1 定义 1.2 举例 首先定义一个向量为&#xff1a;a[-5&#xff0c;6&#xff0c;8, -10] 1.2.1 向量的1范数 向量的1范数即&#xff1a;向量的各个元素的绝对值之和&#xff0c;上述向量a的1范数结果就是&#xff1a;29&#xff0c;MATLAB代码实现为&…

不同磁盘目录共享linux,linux下实现磁盘共享(mount)

准备两台centos6.6 A(192.168.199.2)、B(192.168.199.3)&#xff0c;A做服务端、B做客户端。一台ubuntu14.04 C(192.168.199.4)C做客户端。A、B安装nfs对应服务yum -y install nfs-utils rpcbind####C安装nfs-kernel-serverapt-get install nfs-kernel-server####A设置nfs、por…

苹果linux桌面文件夹,Ubuntu 10.04下一键安装Mac OS X主题桌面

不久前的《Ubuntu 10.04下Mac OS X风格桌面美化安装》遭到网友的砖头&#xff0c;认为和Mac OS X风格桌面美化安装根本没有关系。本来是要跟这篇一起发布的&#xff0c;一等就等了这么长&#xff0c;下面我们来看下在Ubuntu 10.04下一键安装Mac OS X主题桌面的工具Epidermis th…

示性函数、共轭函数、对偶范数、共轭

示性函数(Indicator function) 共轭函数 对偶范数 几个常用公式 共轭&#xff08;conjugate&#xff09; 所谓“轭”&#xff0c;指的是古代牛车上放在并行的牛脖颈上的曲木。共轭关系&#xff0c;通俗来说一般用以描述两件事物以一定规律相互配对或孪生&#xff08;一般共轭对…

Redis-实践知识

转自极客时间Redis 亚风 原文视频&#xff1a;https://u.geekbang.org/lesson/535?article681062 Redis最佳实践 普通KEY Redis 的key虽然可以自定义&#xff0c;但是最好遵循下面几个实践的约定&#xff1a; 格式&#xff1a;[业务名称]:[数据名]:[id] 长度不超过44字节 不…

MicroProfile OpenAPI上的Swagger UI

MicroProfile OpenApi为我们提供了一种使用OpenApi 3描述我们JAX-RS API的标准化方法。如果您以前使用过swagger-jaxrs和swagger-annotations &#xff0c;由于OpenApi是基于Swagger构建的&#xff0c;因此您会感到非常熟悉。 2015年11月5日&#xff0c;SmartBear与3Scale&…

linux 跟踪内存,用strace跟踪malloc内存分配

strace介绍strace是一个非常有用的命令&#xff0c;它用于记录和跟踪程序运行期间收到的信号和调用的系统调用。strace的简单使用ubuntu64:~$ strace cat /dev/nullexecve("/bin/cat", ["cat", "/dev/null"], [/* 32 vars */]) 0brk(NULL) 0x1…

归一化、标准化和正则化

归一化 Normalization 归一化一般是将数据映射到指定的范围&#xff0c;用于去除不同维度数据的量纲以及量纲单位。 常见的映射范围有 [0, 1] 和 [-1, 1] &#xff0c;最常见的归一化方法就是 Min-Max 归一化&#xff1a; 举个例子&#xff0c;我们判断一个人的身体状况是否健…

slf4j绑定器_用于ADFLogger的SLF4J绑定–缺少的部分

slf4j绑定器由于最好的原因&#xff0c;在我的日常工作中&#xff0c;我希望为ADF Logger Oracle ADF提供一个SLF4J适配器。 毫不奇怪&#xff0c;slf4j没有用于ADFLogger的适配器&#xff0c;但是由于ADFLogger只是Java Util Logging的轻巧包装&#xff0c;因此花了一个多小时…

核心网

在我们正式讲解之前&#xff0c;我想通过这张网络简图帮助大家认识一下全网的网络架构&#xff0c;通过对全网架构的了解&#xff0c;将方便您对后面每一块网络细节的理解。 这张图分为左右两部分&#xff0c;右边为无线侧网络架构&#xff0c;左边为固定侧网络架构。 无线侧…

linux服务器防端口扫描,linux下防止syn***,端口扫描和死亡之ping

http://downloads.sourceforge.net ... les-v0.0.3-3.tar.gz下载以后安装&#xff1a;tar zxvf arptables-v0.0.3-3.tar.gzcd arptables-v0.0.3-3/makemake install生成的命令是/usr/local/sbin/arptables、/usr/local/sbin/arptables-save、/usr/local /sbin/arptables-restor…

JDK 11:轻松取出单文件Java源代码程序

JDK 11 Early Access Builds包含与JEP 330相关的预览功能&#xff08;“启动单个文件源代码程序”&#xff09;。 我之前在“ Shebang即将来到Java&#xff1f; ”和“ 为JDK 11提议的JEP 329和JEP 330 ”&#xff0c;由于JDK 11 Early Access Builds&#xff0c;在这篇文章中…

多普勒效应、多普勒效应、网关、路由器

多普勒效应 &#xff08;Doppler effect&#xff09; 多普勒效应是波源和观察者有相对运动时&#xff0c;观察者接受到波的频率与波源发出的频率并不相同的现象。远方急驶过来的火车鸣笛声变得尖细&#xff08;即频率变高&#xff0c;波长变短&#xff09;&#xff0c;而离我们…

瑞利、莱斯与Nakagami-m信道衰落模型

一、信道的定义与调制信道的数学模型 1.信道的定义与分类 信道&#xff08;Channel&#xff09;是指以传输媒质为基础的信号通道。根据新到的定义&#xff0c;如果信道仅是指信号的传输媒质&#xff0c;这种信道称为狭义信道&#xff1b;如果这种信道不仅是传输媒质&#xff…

linux用if语句编程序,Shell 脚本基础 - 使用 if 语句进行条件检测

Bourne Shell 的 if 语句和大部分编程语言一样 - 检测条件是否真实&#xff0c;如果条件为真&#xff0c;shell 会执行这个 if 语句指定的代码块&#xff0c;如果条件为假&#xff0c;shell 就会跳过 if 代码块&#xff0c;继续执行之后的代码。if 语句的语法&#xff1a;if[判…

java运行时间间隔_Java:安排作业按时间间隔运行

java运行时间间隔最近&#xff0c;我花了一些时间围绕Neo4j版本之间的滚动升级构建了一组测试&#xff0c;作为其中的一部分&#xff0c;我想记录升级过程中集群的状态。 测试的主线程会等待升级完成&#xff0c;因此我想每隔几秒钟登录另一个线程。 Alistair将我指向Schedule…

卫星导航定位 -- 坐标系统与时间系统

原文https://blog.csdn.net/f2157120/article/details/81210843 1 协议天球坐标系 以地球质心为坐标原点&#xff0c;以地球自转的轴为z轴 2 协议地球坐标系 3 WGS-84坐标系 4 CGS2000坐标系统 5 直角坐标系与大地坐标系转换 6 大地坐标系转换 7 时间系统 8 GNSS时间系统 …

linux 命令行 解密,解密Linux终端命令 学好Linux

如果你要学习Linux操作系统&#xff0c;你一定知道Linux系统越来越受到电脑用户的欢迎&#xff0c;学习linux&#xff0c;你可能想了解Linux终端命令&#xff0c;这里将介绍Linux终端命令的知识&#xff0c;在这里拿出来和大家分享一下。一、文件目录类1.建立目录&#xff1a;m…

用Jackson编写大型JSON文件

有时您需要将大量数据导出到JSON到文件中。 可能是“将所有数据导出到JSON”&#xff0c;或者是GDPR“可移植性权利”&#xff0c;您实际上需要这样做。 与任何大型数据集一样&#xff0c;您不能只将其全部容纳在内存中并将其写入文件。 它需要一段时间&#xff0c;它会从数据…

博弈论学科整体概览

一、博弈论的概念 博弈论又被称为对策论&#xff08;Game Theory&#xff09;既是现代数学的一个新分支&#xff0c;也是运筹学的一个重要学科。博弈论主要研究公式化了的激励结构间的相互作用。是研究具有斗争或竞争性质现象的数学理论和方法。博弈论考虑游戏中的个体的预测行…