Spring REST:异常处理卷。 1个

目录

  • Spring REST:异常处理卷。 1个
  • Spring REST:异常处理卷。 2
  • Spring REST:异常处理卷。 3

大家好,是时候继续在我的博客中发布新文章了。 因此,我很高兴地宣布,我计划编写一系列技术文章。 在当前文章中,我将开始讨论Spring REST Exception处理。 Spring向我们建议了REST异常处理的几种方法,但我想将您的注意力集中在其中两种方法上: Spring异常处理

  • @Controller级别的@ExceptionHandler
  • @ControllerAdvice级别上的@ExceptionHandler

所有代码示例都将使用我在之前有关REST服务的文章中使用的应用程序开发。 JQuery将在客户端提供与REST服务的交互。

因此,在简要介绍之后,我要进行总结。 我们将考虑REST异常处理程序的三个示例。 这三种情况中的每一种都将描述在任何项目中可能发生的某些实际情况的解决方案。 所有开发将在已经存在的应用程序之上进行。

制备

我想做的第一件事–是将 MessageSource 添加到应用程序中。 这不是很难,我不想在此停止详细介绍,因为我已经在另一篇文章中解释了如何执行此操作。 MessageSource的目的是存储错误消息,如果抛出异常,我想返回给客户端。

因此,这是一个messages.properties文件:

error.bad.smartphone.id = Smartphone can't have id:

成功添加MessageSource之后,我们可以在@Controller级别继续进行异常处理。

异常处理

在这一段中,我想重点介绍可能发生异常的代码段。 让我们检查来自SmartphoneController的一些方法。

...@RequestMapping(value="/edit/{id}", method=RequestMethod.GET)public ModelAndView editSmartphonePage(@PathVariable int id) {ModelAndView mav = new ModelAndView("phones/edit-phone");Smartphone smartphone = smartphoneService.get(id);mav.addObject("sPhone", smartphone);return mav;}
...@RequestMapping(value="/edit/{id}", method=RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE,consumes = MediaType.APPLICATION_JSON_VALUE)@ResponseBodypublic Smartphone editSmartphone(@PathVariable int id, @Valid @RequestBody Smartphone smartphone) {smartphone.setId(id);return smartphoneService.update(smartphone);}
...@RequestMapping(value="/delete/{id}", method=RequestMethod.DELETE, produces = MediaType.APPLICATION_JSON_VALUE,consumes = MediaType.APPLICATION_JSON_VALUE)@ResponseBodypublic Smartphone deleteSmartphone(@PathVariable int id) {return smartphoneService.delete(id);}
...

这三种方法具有一个共同的功能– @PathVariable int id 。 这种情况很重要,因为Spring文档说,如果不能将使用@PathVariable注释的方法参数强制转换为指定的类型(在我们的示例中为int),则它将作为String公开。 因此,它可能导致TypeMismatchException

为了解决这个问题,我将在@Controller级别使用@ExceptionHandler批注。 这种方法最适合这种情况。 我只需要在SmartphoneController中进行2处更改:

  • 添加MessageSource字段
  • 添加异常处理程序方法
...@Autowiredprivate MessageSource messageSource;
...@ExceptionHandler(TypeMismatchException.class)@ResponseStatus(value=HttpStatus.NOT_FOUND)@ResponseBodypublic ErrorInfo handleTypeMismatchException(HttpServletRequest req, TypeMismatchException ex) {Locale locale = LocaleContextHolder.getLocale();String errorMessage = messageSource.getMessage("error.bad.smartphone.id", null, locale);errorMessage += ex.getValue();String errorURL = req.getRequestURL().toString();return new ErrorInfo(errorURL, errorMessage);}
...

让我们考虑一下方法。 @ExceptionHandler批注具有参数– TypeMismatchException ,这意味着在发生异常时将触发该方法。 @ResponseStatus批注用于指定特定的响应状态代码。

您可能已经注意到该方法返回ErrorInfo。 这很容易,因为它是任何类型的错误的类,需要通知客户有关错误原因的信息。 因此,该类如下所示:

public class ErrorInfo {private String url;private String message;public ErrorInfo(String url, String message) {this.url = url;this.message = message;}//Getters and setters are omitted}

此类的使用为我们提供了两个主要优点:我们可以提供引起异常的URL,并且可以提供适当的错误消息。

现在,让我们尝试看看当我尝试访问某些ID不可接受的URL时遇到的情况。

Spring异常处理控制器

您可以在屏幕截图上看到,我在@Controller级别上指定的ID错误的URL已得到处理。 在下一篇文章中,我将讨论一些可以放在@ControllerAdvice级别的异常。

参考: Spring REST:异常处理卷。 Fruzenshtein的笔记博客中来自JCG合作伙伴 Alexey Zvolinskiy的1 。

翻译自: https://www.javacodegeeks.com/2013/12/spring-rest-exception-handling-vol-1.html

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

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

相关文章

vue/cli3 配置vux

安装各插件 试过 安装“必须安装”的部分亦可 1、安装vuex npm install vuex --save-dev 2、在项目里面安装vux【必须安装】 npm install vux --save 3、安装vux-loader【必须安装】 npm install vux-loader --save-dev 4、安装less-loader(这个是用以正确编译less源…

鼠标右键 移动选定的文件夹到指定位置_怎么把电脑桌面上的文件移动到更加安全的地方...

我们在使用电脑的时候习惯于把各种文档以及其他文件资料随手保存到电脑桌面上,这样操作可以方便以后对这些文档和文件资料的使用、管理,但是由于默认状态下桌面文件位于C盘中,这些文件资料不仅会占用掉C盘的很大的存储空间,并且日…

非常精简的Linux线程池实现(一)——使用互斥锁和条件变量

线程池的含义跟它的名字一样,就是一个由许多线程组成的池子。 有了线程池,在程序中使用多线程变得简单。我们不用再自己去操心线程的创建、撤销、管理问题,有什么要消耗大量CPU时间的任务通通直接扔到线程池里就好了,然后我们的主…

linux vim 执行shell命令行,Linux中vim和shell

在Linux系统中一切皆文件,配置服务其实就是在修改其配置文件的参数,而在日常文件中肯定少不了的就是编辑文档,这就离不开vim,而vim之所以能够得到广大厂商的青睐与用户的认可,原因在于vim编辑器中有三种模式&#xff1…

JS之setTimeOut与clearTimeOut

小练习1:针对HTML,分别使用 setTimeout 和 setInterval 实现以下功能: 点击按钮时,开始改变 fade-obj 的透明度,开始一个淡出(逐渐消失)动画,直到透明度为0在动画过程中&#xff0c…

运行时的Java 8参数名称

Java 8将引入一种更容易的方法来发现方法和构造函数的参数名称。 在Java 8之前,找到参数名称的方法是在编译阶段打开调试符号,这会在生成的类文件中添加有关参数名称的元信息,然后提取复杂的信息,需要处理字节码。获取参数名称。…

python 可执行文件_如何通过Python函数运行的可执行文件的终端...

我想抑制运行可执行文件的函数产生的所有终端输出. 我试图通过使用每次调用函数时临时重新定义stdout和stderr的上下文管理器来抑制Python函数的输出.这会抑制函数中的print调用产生的终端输出,但是当函数调用产生终端输出的可执行文件时,它似乎不起作用. 那么,如何抑制Python函…

嵌入式linux系统文件,嵌入式Linux文件系统知多少

Nand/Nor Flash在嵌入式Linux产品中,通常使用的存储介质为Nand Flash和Nor Flash,而手机、相机等产品通常使用eMMC、SD Card作为存储介质,导致这种差异的原因主要是成本考量。Nand Flash和Nor Flash具有低成本、高密度存储的优势。但是&#…

三分钟上手Highcharts简易甘特图

根据业务需求,找到了这个很少使用的图形,话不多说,看看该如何使用。首先要引入支持文件:可根据链接下载。 exporting.js:https://img.hcharts.cn/highcharts/modules/exporting.js xrange.js:https://img.h…

WEB语义化

WEB语义化让机器读懂内容,HTML就带有一定「语义」的标签,比如段落,标题,表格和图片等。让机器读懂内容,那么两种方案:第一种让机器变得更人工智能化,也就是现在大火的AI。第二种是人们去发布认可…

Jetty 9.1上的Java WebSockets(JSR-356)

最终发布了Jetty 9.1 ,将Java WebSockets(JSR-356)引入了非EE环境。 这真是个好消息,今天的帖子将介绍如何将这个出色的新API与Spring Framework一起使用。 JSR-356定义了基于注释的简洁模型,以允许现代Java Web应用程…

如何用python画组合图形_python结合G2绘制精美图形

$.getJSON(top10.json, function (data) { var Frame G2.Frame; var frame new Frame(data); var chart new G2.Chart({ id: c1, width: 500, height: 400 }); chart.source(frame, { pct: {alias: 年化相对收益率(%)}, }); // 去除 X 轴标题 chart.axis(name, { title: nul…

edup无线网卡驱动安装linux,UBUNTU_15.0.4 usb无线网卡驱动安装方法

前言:为了摆脱网线的束缚,我买了个无线网卡; widnows 上好用,易安装。linux 上,按照自带教程上去做,没有成功。后来在搜索了多篇 解决问题的文章。 再加上自己的方法,终于完成了。貌似信号还可以…

LeetCode Golang 9.回文数

9. 回文数 第一种办法 :itoa 转换为字符串进行处理: package mainimport ("strconv""fmt" )//判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。…

关于使用JQ scrollTop方法进行滚动定位

没图我说个锤子,先来个自拍镇楼。 又到了每周周五总结时间。我广州刘德华又来讲故事了。这一周没啥任务,就一个任务,产品口头交代了两句,也没有psd没有设计图没有样式。自由发挥,你自己敲代码做个作品出来。 what&…

ssh密钥登录

方法一:使用下例中ssky-keygen和ssh-copy-id,仅需通过3个步骤的简单设置而无需输入密码就能登录远程Linux主机。 ssh-keygen 创建公钥和密钥。 ssh-copy-id 把本地主机的公钥复制到远程主机的authorized_keys文件上。ssh-copy-id 也会给远程主机的用户主目录&#x…

Spring REST:异常处理卷。 2

这是有关使用Spring进行REST异常处理的系列的第二篇文章。 在我以前的文章中,我描述了如何在REST服务中组织最简单的异常处理。 这次,我将更进一步,我将向您展示何时最好在ControllerAdvice级别上使用异常处理 。 介绍 在开始本文的技术部分…

python 装饰器有哪些_python装饰器有什么用

简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。 一般而言,我们要想拓展原来函数代码&…

jQuery数据转换与提交

json2.js序列化,即JSON对象转换成String字符串: JSON.stringify({ id: 1, name: jsons });反序列化,即String转JSON对象: JSON.parse("{ id: 1, name: jsons }");jquery.json2xml.jsJSON对象转换为XML字符串: $.json2xml({ id: 1, …

linux中查看相关日志记录,linux重启查看日志及历史记录 查询原因

linux系统文件通常在/var/log中下面是对下面常出现的文件进行解释/var/log/message ---------------------------------------系统启动后的信息和错误日志/var/log/secure ------------------------------------------与安全相关的日志信息/var/log/maillog ------------------…