rest spring_Spring REST:异常处理卷。 3

rest spring

这是该系列中有关Spring REST异常处理的最后一篇文章。 最后,这次我将讨论在表单处理期间可能发生的REST异常的处理。 因此,在本教程中,您将看到与REST,表单和异常处理有关的所有内容。 客户端呢? JQuery将用于反映REST服务的所有响应。

与以前的教程一样,我将使用Smartphone应用程序 。 现在是宣布此帖子主要目的的好时机– 智能手机实体需要在创建和编辑之前进行验证。

让我们看一下更新的Smartphone类:

@Entity
@Table(name="smartphones")
public class Smartphone {@Id@GeneratedValueprivate Integer id;@Length(min=1, max=20)private String producer;@Length(min=1, max=20)private String model;@Range(min=1, max=1500)private double price;/*** Method updates already existed {@link Smartphone} object with values from the inputed argument.* @param sPhone - Object which contains new Smartphone values.* @return {@link Smartphone} object to which this method applied.*/public Smartphone update(Smartphone sPhone) {this.producer = sPhone.producer;this.model = sPhone.model;this.price = sPhone.price;return this;}@Overridepublic String toString() {return producer+": "+model+" with price "+price;}//getters and setters are omitted}

请注意@Length@Range批注。 这些注释是bean验证的标准方法。 通过添加以下依赖项来更新已存在的pom.xml文件后,可以使用这些注释:

org.hibernatehibernate-validator5.0.1.Finaljavax.validationvalidation-api1.1.0.Final

在此之后,我需要更新messages.properties文件:

Length.smartphone.producer = Length of a Smartphone producer should be from 1 to 20 characters.
Length.smartphone.model = Length of a Smartphone model should be from 1 to 20 characters.
Range.smartphone.price = Price of a Smartphone should be from 1 to 1 500.00 $

现在,让我们看一下SmartphoneController类中的createSmartphone方法:

...@RequestMapping(value="/create", method=RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE,consumes = MediaType.APPLICATION_JSON_VALUE)@ResponseBodypublic Smartphone createSmartphone(@RequestBody @Valid Smartphone smartphone) {return smartphoneService.create(smartphone);}
...

@Valid注释应用于方法参数。 要特别注意缺少BindingResult ,它不需要像传统的Spring MVC应用程序中那样进行验证。 如果Smartphone对象中的某些属性的值不合适,则@Value批注将引发MethodArgumentNotValidException

在实体创建/编辑期间处理异常需要使用不同的模型来表示信息。 我的意思是上一篇文章中的 ErrorInfo类。 我们需要传输其他信息,其中包含错误字段名称和该字段的某些错误消息。 为此,这里是一个新类:

public class ErrorFormInfo {private String url;private String message;private List< FieldErrorDTO > fieldErrors = new ArrayList< FieldErrorDTO >();public ErrorFormInfo() {}public ErrorFormInfo(String url, String message) {this.url = url;this.message = message;}public ErrorFormInfo(List< FieldErrorDTO > fieldErrors, String url, String message) {this.fieldErrors = fieldErrors;this.url = url;this.message = message;}//getters and setters are omitted}

第二个类是FieldErrorDTO它在上面的代码示例中使用:

public class FieldErrorDTO {private String fieldName;private String fieldError;public FieldErrorDTO(String fieldName, String fieldError) {this.fieldName = fieldName;this.fieldError = fieldError;}//getters and setters are omitted}

引入错误传输对象后,我可以继续@ControllerAdvice类中的错误处理。 这是RestExceptionProcessor类的代码片段:

...@ExceptionHandler(MethodArgumentNotValidException.class)@ResponseStatus(value=HttpStatus.BAD_REQUEST)@ResponseBodypublic ErrorFormInfo handleMethodArgumentNotValid(HttpServletRequest req, MethodArgumentNotValidException ex) {String errorMessage = localizeErrorMessage("error.bad.arguments");String errorURL = req.getRequestURL().toString();ErrorFormInfo errorInfo = new ErrorFormInfo(errorURL, errorMessage);BindingResult result = ex.getBindingResult();                List< FieldError > fieldErrors = result.getFieldErrors();errorInfo.getFieldErrors().addAll(populateFieldErrors(fieldErrors));return errorInfo;}/*** Method populates {@link List} of {@link FieldErrorDTO} objects. Each list item contains* localized error message and name of a form field which caused the exception.* Use the {@link #localizeErrorMessage(String) localizeErrorMessage} method.* * @param fieldErrorList - {@link List} of {@link FieldError} items* @return {@link List} of {@link FieldErrorDTO} items*/public List< FieldErrorDTO > populateFieldErrors(List< FieldError > fieldErrorList) {List< FieldErrorDTO > fieldErrors = new ArrayList< FieldErrorDTO >();StringBuilder errorMessage = new StringBuilder("");for (FieldError fieldError : fieldErrorList) {errorMessage.append(fieldError.getCode()).append(".");errorMessage.append(fieldError.getObjectName()).append(".");errorMessage.append(fieldError.getField());String localizedErrorMsg = localizeErrorMessage(errorMessage.toString());fieldErrors.add(new FieldErrorDTO(fieldError.getField(), localizedErrorMsg));errorMessage.delete(0, errorMessage.capacity());}return fieldErrors;}/*** Method retrieves appropriate localized error message from the {@link MessageSource}.* * @param errorCode - key of the error message* @return {@link String} localized error message */public String localizeErrorMessage(String errorCode) {Locale locale = LocaleContextHolder.getLocale();String errorMessage = messageSource.getMessage(errorCode, null, locale);return errorMessage;}
...

可以通过本文开头的链接找到RestExceptionProcessor类的完整版本。 我希望上面的代码片段能自我解释。 如果否,请随时在评论中提问。

我需要做的最后一件事是开发客户端代码端:

$(document).ready(function() {$('#newSmartphoneForm').submit(function(event) {var producer = $('#producer').val();var model = $('#model').val();var price = $('#price').val();var json = { "producer" : producer, "model" : model, "price": price};$.ajax({url: $("#newSmartphoneForm").attr( "action"),data: JSON.stringify(json),type: "POST",beforeSend: function(xhr) {xhr.setRequestHeader("Accept", "application/json");xhr.setRequestHeader("Content-Type", "application/json");$(".error").remove();},success: function(smartphone) {var respContent = "";respContent += "Smartphone was created: [";respContent += smartphone.producer + " : ";respContent += smartphone.model + " : " ;respContent += smartphone.price + "]";$("#sPhoneFromResponse").html(respContent);                   },error: function(jqXHR, textStatus, errorThrown) {var respBody = $.parseJSON(jqXHR.responseText);var respContent = "";respContent += "";respContent += respBody.message;respContent += "";$("#sPhoneFromResponse").html(respContent);$.each(respBody.fieldErrors, function(index, errEntity) {var tdEl = $("."+errEntity.fieldName+"-info");tdEl.html(""+errEntity.fieldError+"");});}});event.preventDefault();});});

客户端new-phone.jsp文件的完整版本可通过本文开头的链接找到。

到此为止,我必须对上面文章中开发的所有内容进行演示。 因此场景很简单,我将打开“新智能手机”页面并提交包含无效数据的表单。

sr1

摘要

我希望我关于Spring REST应用程序中的异常处理的三篇文章对您有所帮助,并且您学到了一些新知识。 这些文章仅重点介绍了异常处理的基本流程,以及您只能在实际项目的整个实践中获得的所有其他内容。 感谢您阅读我的博客。

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

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

rest spring

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

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

相关文章

1838公共政策概论 (2)

客观题 单选题&#xff08;共20题&#xff0c;共40分&#xff09; 1. 美国学者戴维伊斯顿认为&#xff08; &#xff09; A 公共政策是由政治家&#xff0c;即具有立法权者制定的&#xff0c;而由行政人员执行的法律和法规。 B 公共政策是一种具有目标、价值与策略的大型…

计算机季度函数,季度怎么分月份(根据月份函数生成季度)

小伙伴们好&#xff0c;咱们知道&#xff0c;Excel中的日期计算函数非常丰富&#xff0c;有用于计算年份的YEAR函数&#xff0c;有计算月份的MONTH函数&#xff0c;有计算星期的WEEKDAY函数等等。小伙伴们好&#xff0c;咱们知道&#xff0c;Excel中的日期计算函数非常丰富&…

1839行政领导学

客观题 判断题&#xff08;共5题&#xff0c;共10分&#xff09; 1. 领导活动是一种社会活动&#xff0c;因此领导素质只有后天性特征。&#xff08; &#xff09; T √ F 参考答案&#xff1a;F&#xff1b;考生答案&#xff1a;F&#xff1b;试题分数&#xff1a;…

泊松分布和指数分布

一、泊松分布 1.1 泊松分布的定义 日常生活中&#xff0c;大量事件是有固定频率的。 某医院平均每小时出生3个婴儿某公司平均每10分钟接到1个电话某超市平均每天销售4包xx牌奶粉某网站平均每分钟有2次访问 它们的特点就是&#xff0c;我们可以预估这些事件的总数&#xff0…

Gradle多项目构建–类似父pom的结构

当您来自Maven背景时&#xff0c;很可能已经习惯了父pom结构。 现在&#xff0c;在进行gradle时&#xff0c;情况有所不同。 想象一下有一个包含接口和各种其他实现的项目的场景。 这将是我们的项目结构。 multi-project-gradle -- specification -- core -- implementati…

移动办公计算机,最适合移动办公的三款掌上电脑点评

最适合移动办公的三款掌上电脑点评2020-03-31 16:35:554点赞22收藏25评论办公经常使用的是台式电脑或者常规的笔记本&#xff0c;笔记本因其体积较小且轻薄&#xff0c;更适合移动办公&#xff0c;但毕竟十几寸的体积&#xff0c;好几斤的重量&#xff0c;随身携带还是不便&…

正态分布的

正态分布&#xff08;台湾作常态分布&#xff0c;英语&#xff1a;normal distribution&#xff09;又名高斯分布&#xff08;英语&#xff1a;Gaussian distribution&#xff09;&#xff0c;是一个非常常见的连续概率分布。正态分布在统计学上十分重要&#xff0c;经常用在自…

rest spring_Spring REST:异常处理卷。 2

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

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

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

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

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

JEP 342:JVM和幽灵

JEP 342 &#xff08;“限制推测执行”&#xff09;已从“ 草稿 ”状态转换为“ 候选 ”状态&#xff0c;但尚未针对特定的JDK版本&#xff08;请参见图形以了解JEP流程中的步骤 &#xff09;。 Jesper Wilhelmsson 写道 &#xff0c; JEP 342 “涵盖了使用新的C 编译器选项来限…

网络演算(Networkcalculus)

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

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

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

【渝粤题库】国家开放大学2021春1001中国法制史题目

教育 教育 试卷代号&#xff1a; 1001 2021年春季学期期末统一考试 中国法制史 试题 2021年7月 一、单项选择题&#xff08;每小题2分&#xff0c;共20分&#xff09; 1.商朝法律制度的总称叫做( )。 A.禹刑 B.汤刑 C.汤诰 D.九刑 2.战国时期改“法”为“律”的人是( )。 A.韩…

【渝粤题库】国家开放大学2021春1009离散数学(本)题目

教育 教育 试卷代号&#xff1a;1009 2021年春季学期期末统一考试 离散数学&#xff08;本&#xff09; 试题 2021年7月 一、单项选择题&#xff08;每小题4分&#xff0c;本题共20分&#xff09; 1.若集合A{1&#xff0c;2&#xff0c;3&#xff0c;4}&#xff0c;则下列表述…

矩阵向量求导

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

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

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

【渝粤题库】国家开放大学2021春1020国际私法题目

教育 教育 试卷代号&#xff1a; 1020 2021年春季学期期末统一考试 国际私法 试题 2021年7月 一、单项选择题&#xff08;每题2分&#xff0c;共20分&#xff0c;每题只有一项答案正确&#xff0c;请将正确答案的序号填在括号内&#xff09; 1.下列哪个选项不属于国际私法的渊…

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

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

【渝粤题库】国家开放大学2021春1026西方经济学(本)题目

教育 教育 试卷代号&#xff1a; 1026 2021年春季学期期末统一考试 西方经济学&#xff08;本&#xff09; 试题 2021年7月 一、单项选择题&#xff08;在下列各题的备选答案中选择一个正确的&#xff0c;并将其序号字母填入题后的括号里。每题2分&#xff0c;共30分&#xf…