rest spring_Spring REST:异常处理卷。 2

rest spring

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

介绍

在开始本文的技术部分之前,我需要考虑一种情况,那就是我们最好在@ControllerAdvice级别上使用异常处理。
通常,一个控制器负责与一种类型的实体相关的整个逻辑。 这就是说,如果我有一些EntityController类,它将包含该实体的所有CRUD(创建,读取,更新,删除)操作,并且如果需要的话可能包含一些额外的逻辑。 让我们检查三个操作:读取,更新,删除。

读取操作会根据我们作为参数传递给它的ID返回一些特定的实体。 如果实体不存在,则读取操作将返回null。 更新/删除操作分别更新/删除特定实体。 这两个操作中的每一个都包含读取操作,因为在更新/删除实体之前,我们需要确保它存在于系统中。

在更新/删除操作过程中未找到实体时,应用程序将抛出EntityNotFoundException异常。 在这种情况下,异常处理将非常简单。 该应用程序必须将信息返回给客户端:

  • 响应标题:404
  • 导致异常的链接
  • 错误消息:没有ID为N的实体

对于此类异常,这是最简单的响应结构。 因此,无论您在应用程序中拥有多少个不同的实体类,因为您都可以用相同的方式处理类似类型的异常(例如,没有此类实体)。 @ControllerAdvice批注使这成为可能。

@ControllerAdvice级别的异常处理

本文的实际部分将基于上一教程的申请表。

首先,我需要在message.properties文件中添加一条错误消息:

error.no.smartphone.id = There is no Smartphone with id:

在此之后,让我们看一下本文主题中对我们来说有趣的控制器方法。

...@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);}
...

这些方法包括SmartphoneService的调用。 而且SmartphoneService的实现包含可以抛出SmartphoneNotFoundException的方法

@Service
@Transactional(rollbackFor = { SmartphoneNotFoundException.class })
public class SmartphoneServiceImpl implements SmartphoneService {@Autowiredprivate SmartphoneRepository smartphoneRepository;@Overridepublic Smartphone create(Smartphone sp) {return smartphoneRepository.save(sp);}@Overridepublic Smartphone get(Integer id) {Smartphone sp = null;if (id instanceof Integer)sp = smartphoneRepository.findOne(id);if (sp != null)return sp;throw new SmartphoneNotFoundException(id);}@Overridepublic List getAll() {return smartphoneRepository.findAll();}@Overridepublic Smartphone update(Smartphone sp) {Smartphone sPhoneToUpdate = get(sp.getId());sPhoneToUpdate.update(sp);return sPhoneToUpdate;}@Overridepublic Smartphone delete(Integer id) {Smartphone sPhone = get(id);smartphoneRepository.delete(id);return sPhone;}}

这是SmartphoneNotFoundException的代码:

public class SmartphoneNotFoundException extends RuntimeException {private static final long serialVersionUID = -2859292084648724403L;private final int smartphoneId;public SmartphoneNotFoundException(int id) {smartphoneId = id;}public int getSmartphoneId() {return smartphoneId;}}

最后,我可以移至@ControllerAdvice

@ControllerAdvice
public class RestExceptionProcessor {@Autowiredprivate MessageSource messageSource;@ExceptionHandler(SmartphoneNotFoundException.class)@ResponseStatus(value=HttpStatus.NOT_FOUND)@ResponseBodypublic ErrorInfo smartphoneNotFound(HttpServletRequest req, SmartphoneNotFoundException ex) {Locale locale = LocaleContextHolder.getLocale();String errorMessage = messageSource.getMessage("error.no.smartphone.id", null, locale);errorMessage += ex.getSmartphoneId();String errorURL = req.getRequestURL().toString();return new ErrorInfo(errorURL, errorMessage);}}

异常处理程序方法返回ErrorInfo对象。 您可以在上一则有关@Controller级别的异常处理的文章中了解有关它的更多信息。

这样,我们只需将额外的异常类添加到@ExceptionHandler批注中,就可以在一个地方收集所有类似的异常。 这种方法使整个应用程序中的代码维护更加容易。

示例说明:

Spring异常处理ControllerAdvice-1

注意:我以id值= 356发出了请求,但是数据库中没有任何记录与此ID值相对应。 这种情况导致异常。

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

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

rest spring

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

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

相关文章

计算机屏幕抖动怎么办,win7屏幕抖动怎么办_win7显示器屏幕抖动的解决方法

电脑使用久了之后难免会出现一些问题,近日就有网友反映说自己的win7旗舰版电脑出现了显示器屏幕抖动的情况,不知道怎么处理这一问题,没关系,下面小编就来为大家分享关于win7显示器屏幕抖动的解决方法。解决方法如下:方…

伯努利分布、二项分布、多项分布、贝塔分布、狄利克雷分布(似然与概率)

瑞士数学家雅克伯努利(Jacques Bernoulli,1654~1705)首次研究独立重复试验(每次成功率为p)。在他去世后的第8年(1713年),他侄子尼克拉斯出版了伯努利的著作《推测术》。在书中,伯努利指出了如果这样的试验次数足够大,那么成功次数…

网络演算(Networkcalculus)

中文释义 网络演算(Networkcalculus)是一种基于非线性代数的确定性排队理论,目前已广泛应用于计算机网络建模与性能分析,特别是为计算延迟和积压等端到端性能参数的确界提供了有效工具。 网络演算的研究工作可分为理论研究与应用研究。理论研究的研究对…

go语言服务器运行,Go语言实现Web服务器

使用Go语言的库非常容易实现一个Web服务器,用来响应像fetch那样的客户端请求。本节将展示一个迷你服务器,返回访问服务器的URL的路径部分。例如,如果请求的URL是http://localhost:8000/hello,响应将是URL.Path"/hello"。…

矩阵向量求导

本系列主要参考文献为维基百科的Matrix Caculas和张贤达的《矩阵分析与应用》。 一、求导定义与求导布局 1. 矩阵向量求导引入 2. 矩阵向量求导定义 3. 矩阵向量求导布局 具体总结如下: 4. 矩阵向量求导基础总结 有了矩阵向量求导的定义和默认布局,…

多媒体计算机属于哪种教学,多媒体计算机属于哪种教学媒体(???)。

摘要:高处触电发生,多媒行抢护理救与应就地进,及时抢救为使。算机属于我国率为电网的额定频。教学火电一般量表流量厂中采用差压测量式流。...高处触电发生,多媒行抢护理救与应就地进,及时抢救为使。械的固定在擦近转部…

导数的四则运算和复合函数的求导

1. 常用初等函数的求导公式 2. 函数的四则运算求导简单可记为 3. 反函数求导法则 https://www.sohu.com/a/233597731_507476

rest spring_Spring REST:异常处理卷。 1个

rest spring目录 Spring REST:异常处理卷。 1个 Spring REST:异常处理卷。 2 Spring REST:异常处理卷。 3 大家好,是时候继续在我的博客中发布新文章了。 因此,我很高兴地宣布,我计划撰写一些技术性的系…

英特尔服务器主板型号参数对照表,Intel主板芯片组参数速查表(201805版)

2018年5月6日更新注:以上主板频率是intel的规范,而实际工厂在制造的时候,可以让主板支持到更高的频率,这称为内存频率的OC支持。2016年底,intel200系列芯片组发布了,主要有:Z270、H270、B250三款…

schur补(schur complement)

1. schur补的定义及性质 2. schur补的应用 2.1 在矩阵方程求解中的应用 2. 概率论和统计学中的应用 https://blog.csdn.net/itnerd/article/details/83385817

oppo r17听筒测试软件,【OPPOR17评测】ColorOS变智能 OPPO R17堪称生活小秘书(全文)_OPPO R17(6GB RAM/全网通)_手机评测-中关村在线...

近两年来,手机的全面屏设计不是美人尖就是刘海屏,这两种设计虽然可以扩大屏占比,但是缺少设计的美感。这时候,OPPO R17终于为我们带来了即有较高的屏占比又优雅的全面屏设计——水滴屏,让摄像头向水滴一样“垂涎欲滴”…

别克gl8服务器返回数据为空,老司机教学:别克GL8商务车总线控制系统故障解决...

别克GL8(参数|图片)商务车原自动变速箱出现严重故障更换自动变速箱后,不能启动车辆。检查原因,接通电源后档位灯不亮,发动机故障灯亮,防盗指示灯亮,不能启动车辆。用别克车型诊断仪TECH2检查,发现访问不了通过串行数据总线连接传输的各个模块。 检测故障与解决:1、CLASS-2串行数…

导数与函数极值

http://wuli.wiki//online/DerMax.html

驻点、极值点、拐点间的区别和联系

一、极值点与驻点的“纠缠” 我们可以从以下三点去理解它们的区别与联系: 二、拐点和另两者的“牵扯” https://zhuanlan.zhihu.com/p/95782395

御龙在天手游怎么不显示服务器了,御龙在天手游进不去怎么办 闪退原因及解决办法...

御龙在天手游进不去怎么办?闪退原因及解决办法。御龙在天手游今天迎来了安卓平台的不删档不限号测试(游戏出现打不开的问题,下面就让小编为大家介绍一下出现这类问题的原因及解决办法吧!1.服务器问题游戏早上10点左右公布了下载的地址&#x…

矩阵乘法和向量乘法

1. 矩阵乘法 2.向量乘法 https://zhuanlan.zhihu.com/p/79760117

怪物猎人服务器维护时间,怪物猎人云服务器

怪物猎人云服务器 内容精选换一换云耀云服务器适用于对CPU、内存、硬盘空间和带宽无特殊要求,服务一般只需要部署在一台或少量的服务器上,一次投入成本少,后期维护成本低的场景。例如网站开发,Web应用。推荐使用云耀云服务器&…

Vaadin Flow –奇妙的鹿

您可能知道,Vaadin是Java上最受欢迎的Web框架之一: https://zeroturnaround.com/rebellabs/java-web-frameworks-index-by-rebellabs/ https://javapipe.com/hosting/blog/best-java-web-frameworks/ 最近发布了该Web UI开发框架的新版本– Vaadin 10…

转置与变换(Transposes and Permutation)

1. 转置(Transposes) 2. Inner Product 3. 对称(symmetric) 4. RTRR^TRRTR 5. Permutation 6.PALU 7. Conclusion 总结一下就是转置和对称的相互关系,以及其一些特性,矩阵中元素的位置变换成为了本文重点。 https://face2ai.com/math-linear-algebra-c…

排名前20位的在线编程课程,可促进您的职业发展

您是否想知道用时间和金钱可以进行的最佳投资是什么? 知识 作为软件开发人员,您应该不断学习新技能。 这是发展您的职业并享受奖励(金钱,情感等)的最佳方法。 朝着这个方向前进,您应该阅读书籍&#xff…