rest spring

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

介绍

在开始本文的技术部分之前,我需要考虑一种情况,那就是我们最好在@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批注中,就可以在一个地方收集所有类似的异常。 这种方法使整个应用程序中的代码维护更加容易。

示例说明:

注意:我以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

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

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

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

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

    rest spring 这是该系列中有关Spring REST异常处理的最后一篇文章. 最后,这次我将讨论在表单处理期间可能发生的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. 数学建模 概率空间与统计结构
  2. windows系统下安装JDK8的教程图解
  3. android circleimageview 导入到eclipse,android项目从Eclipse迁移到Android studio中常见问题解决方法.pdf...
  4. 【cocos2d-x从c++到js】06:Google的继承写法解析
  5. Java中“/”,“.”所代表的文件路径
  6. Java 8 HashMap键与Comparable接口
  7. Django+xadmin 打造线上教育平台(二)-1(旧)
  8. 修改eclipse配置文件properties编码格式
  9. 生成jni的android.mk,Android Studio 3.5版本JNI生成SO文件详解
  10. oracle取时间最近的一条数据_当数据库最近一直卡顿时,第一时间应该用这条sql来分析...
  11. (原創) 如何Real Time產生灰階影像? (SOC) (DE2-70) (TRDB-D5M)
  12. MIPI DSI CLK计算
  13. javascript使用小技巧
  14. 2019 ICPC 南京 F题 Paper Grading
  15. 005. C++智能指针
  16. vue 获取动态域名_vue项目接口域名动态获取操作
  17. 分水岭算法--语义分割
  18. 单、双精度浮点型转换为十六进制方法
  19. Sequence to Sequence – Video to Text 论文翻译
  20. 荣耀折叠旗舰Magic Vs系列;卡西欧搭配可拆卸表圈的G-SHOCK新品;联发科天玑8200 5G移动芯片 | 科技新品...

热门文章

  1. [集训队作业2018] 复读机(生成函数,单位根反演)
  2. Redis PK Memcached,哪个更牛叉
  3. JVM内存管理------垃圾搜集器精解
  4. 百度三轮面试回来,想和Java程序员分享一下。
  5. 班级日常分享:一天一瞬间!
  6. 《四世同堂》金句摘抄(十二)
  7. 优秀学生专栏——王浩
  8. mybatis简单案例源码详细【注释全面】——Utils层(MybatisUtils.java)
  9. Servlet使用适配器模式进行增删改查案例(EmpDaoImpl.java)
  10. 以管理员身份运行IJ