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文件的完整版本可通过本文开头的链接找到。

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

摘要

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

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

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

rest spring

rest spring_Spring REST:异常处理卷。 3相关推荐

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

    rest spring 目录 Spring REST:异常处理卷. 1个 Spring REST:异常处理卷. 2 Spring REST:异常处理卷. 3 大家好,是时候继续在我的博客中发布新文章了 ...

  2. rest spring_Spring REST:异常处理卷。 2

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

  3. Spring REST:异常处理卷。 2

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

  4. Spring REST:异常处理卷。 1个

    目录 Spring REST:异常处理卷. 1个 Spring REST:异常处理卷. 2 Spring REST:异常处理卷. 3 大家好,是时候继续在我的博客中发布新文章了. 因此,我很高兴地宣布 ...

  5. Spring REST:异常处理卷。 3

    这是该系列中有关Spring REST异常处理的最后一篇文章. 最后,这次我将讨论在表单处理期间可能发生的REST异常的处理. 因此,在本教程中,您将看到与REST,表单和异常处理有关的所有内容. 客 ...

  6. jsf集成spring_Spring和JSF集成:异常处理

    jsf集成spring 大多数JSF开发人员都会熟悉"发生错误"页面,当在他们的代码某处引发意外异常时,该页面就会显示. 该页面在开发时确实很有用,但对于生产应用程序通常不是您想要 ...

  7. Win32 结构化异常处理(SEH)探秘【下篇】

    图十三 UnHandledExceptionFilter 函数的伪代码 UnhandledExceptionFilter( STRUCT _EXCEPTION_POINTERS *pException ...

  8. Java异常处理总结

    Java异常处理总结           异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制 ...

  9. WCF技术剖析之二十一:WCF基本异常处理模式[中篇]

    通过WCF基本的异常处理模式[上篇], 我们知道了:在默认的情况下,服务端在执行某个服务操作时抛出的异常(在这里指非FaultException异常),其相关的错误信息仅仅限于服务端可见,并不会被WC ...

最新文章

  1. 涨见识了,在终端执行 Python 代码的 6 种方式
  2. 再创新高:DeepMind一年烧掉6.5亿美元,谷歌却挥手免除15亿债务
  3. 【Interfacenavigation】风格和主题(21)
  4. hbuilder热更新
  5. 【codeforce 219D】 Choosing Capital for Treeland (树形DP)
  6. 游戏策划笔记:工作感受感官引导
  7. 中古调式(调式音阶) 二
  8. tensorflow中常用的激活函数
  9. 北京科技大学计算机考研
  10. 如何设计一个小而美的秒杀系统(抢红包)?
  11. 如何把自己打造成为一名金领架构师-基础篇(一)
  12. c语言中矩形法求定积分
  13. linux中项目常用的start.sh和stop.sh
  14. alibaba-COLA框架module分析
  15. 自己动手打造html5星际迷航!
  16. 探索STM32F407ZET6,全套设计资料,包含原理图
  17. bp神经网络预测未来数据,bp神经网络数据预处理
  18. 【Paddle打比赛】全球人工智能技术创新大赛-商品标题实体识别竞赛_副本
  19. Oracle19c数据库如何冷备份,Oracle数据库的备份方法-冷备份(转)
  20. 什么是长尾关键词?如何找到长尾关键词?以及使用长尾词的九大理由

热门文章

  1. 【矩阵乘法】Matrix Power Series(poj 3233)
  2. P2414 NOI2011阿狸的打字机 [AC自动机,dfs序]
  3. P2604 ZJOI2010 网络扩容,费用流裸题
  4. 从NIO到Netty开发
  5. MySQL的表数据复制
  6. 漫画:什么是一致性哈希
  7. 好多人都说存储过程很难?认真看这篇文章就够了
  8. React中的各个目录文件功能
  9. 【GitLab】与idea的搭配
  10. php array分组,php数组分组简单例子