Spring RESTful Web服务中的异常处理

1.简介

我们可能已经在Spring中遇到了几种处理RESTful Web服务应用程序中异常的方法。 在本文中,我们将尝试探索可以采取的最佳方法来实现有效的异常处理。

2.问题陈述

让我们创建一个简单的应用程序,该应用程序将在REST URI中标识员工姓名。 如果请求中提供的员工名称是数字,则让我们的应用程序引发一个自定义异常,该异常将通过Exception Handlers处理 ,并相应地将JSON响应返回给客户端。 成功响应将是带有员工详细信息的JSON,而失败响应将是带有errorCode和正确的错误消息的错误JSON。

3.实施

首先让我们检查一下pom文件条目web.xml的样子–

pom.xml

<!-- Spring dependencies -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.2.1.RELEASE</version>
</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.2.1.RELEASE</version>
</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.2.1.RELEASE</version>
</dependency><!-- Jackson JSON Processor -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.4.1</version>
</dependency>

web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID" version="2.5"><display-name>RESTWithSpringMVCException</display-name><servlet><servlet-name>mvc-dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>mvc-dispatcher</servlet-name><url-pattern>/*</url-pattern></servlet-mapping></web-app>

现在让我们检查一下Web应用程序上下文

mvc-dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"><mvc:annotation-driven /><context:component-scan base-package="com.jcombat.controller" /></beans>

现在是时候创建实体类了,一个用于Employee ,另一个用于ErrorResponse ,在我们应用程序中任何层出现任何异常的情况下,都将以JSON的形式返回。

Employee.java

package com.jcombat.bean;public class Employee {private String empId;private String name;public String getEmpId() {return empId;}public void setEmpId(String empId) {this.empId = empId;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

ErrorResponse.java

package com.jcombat.bean;public class ErrorResponse {private int errorCode;private String message;public int getErrorCode() {return errorCode;}public void setErrorCode(int errorCode) {this.errorCode = errorCode;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}

我们还需要拥有自己的自定义异常类。 我希望我们所有人都已经知道自定义异常。 让我们快速为我们的应用程序创建一个。

EmployeeException.java

package com.jcombat.exception;public class EmployeeException extends Exception {private static final long serialVersionUID = 1L;private String errorMessage;public String getErrorMessage() {return errorMessage;}public EmployeeException(String errorMessage) {super(errorMessage);this.errorMessage = errorMessage;}public EmployeeException() {super();}
}

Spring为我们提供了@ExceptionHandler批注,以专门处理控制器中特定或常见类型的异常。

这里最重要的部分是为我们的应用程序编写rest控制器。

DemoController.java

package com.jcombat.controller;import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import com.jcombat.bean.Employee;
import com.jcombat.bean.ErrorResponse;
import com.jcombat.exception.EmployeeException;@RestController
public class EmployeeController {@RequestMapping(value = "/{firstName}", method = RequestMethod.GET)public ResponseEntity<Employee> showMessage(@PathVariable("firstName") String firstName,@RequestParam(value = "empId", required = false, defaultValue = "00000") final String empId) throws EmployeeException {Employee employee = new Employee();employee.setEmpId(empId);employee.setFirstName(firstName);if (StringUtils.isNumeric(firstName)) {throw new EmployeeException("Invalid employee name requested");}return new ResponseEntity<Employee>(employee, HttpStatus.OK);}@ExceptionHandler(EmployeeException.class)public ResponseEntity<ErrorResponse> exceptionHandler(Exception ex) {ErrorResponse error = new ErrorResponse();error.setErrorCode(HttpStatus.PRECONDITION_FAILED.value());error.setMessage(ex.getMessage());return new ResponseEntity<ErrorResponse>(error, HttpStatus.OK);}
}

注意控制器中的@ExceptionHandler方法,该方法仅应处理在应用程序的任何层中引发的EmployeeException

但是,如果从任何地方抛出NullPointerException怎么办。 为了安全起见,我们必须在应用程序中具有通用的异常处理程序,该处理程序可以处理所有其他异常类型,例如IOExceptionNullPointerException等。 为此,Spring在版本3.2中引入了@ControllerAdvice ,可以在我们的应用程序中创建Controller Advice类,该类将能够处理所有全局异常情况。

@ControllerAdvice注释的类将被注册为全局异常处理程序

让我们为我们的应用程序创建一个。

ExceptionControllerAdvice.java

package com.jcombat.controller;import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;import com.jcombat.bean.ErrorResponse;@ControllerAdvice
public class ExceptionControllerAdvice {@ExceptionHandler(Exception.class)public ResponseEntity<ErrorResponse> exceptionHandler(Exception ex) {ErrorResponse error = new ErrorResponse();error.setErrorCode(HttpStatus.INTERNAL_SERVER_ERROR.value());error.setMessage("Please contact your administrator");return new ResponseEntity<ErrorResponse>(error, HttpStatus.OK);}
}

这意味着,如果我们在应用程序中遇到了除自定义异常之外的意外异常,则将准备一个通用错误对象,其中包含通用错误代码和错误消息,并将它们作为错误JSON响应返回。

在早于3.2的Spring版本中,使用单个基本控制器创建,扩展所有单个控制器而不是@ControllerAdvice会是更好的选择。

这里有一些注意事项。 由于缺少Spring 3.0.x提供的支持,在Spring 3.0.x中无法通过ResponseEntity返回错误的JSON响应。 替代方法是将BeanNameViewResolverModelAndView一起用作返回类型。 我们将很快为此提供一个示例应用程序。

4.运行应用程序

是时候运行我们创建的应用程序了。

确保我们已将应用程序发布到服务器并启动了它。

现在,在浏览器中点击下面的URI – http:// localhost:8080 / RESTWithSpringMVCException / Ramesh?empId = 1234

成功2

让我们看看错误响应的样子。 请注意,我们在EmployeeController中添加了一个IF块,该块检查雇员名字的路径变量是否为数字。 如果是数字,则我们的应用程序将抛出EmployeeException 。 让我们点击下面的URI –

失败

如果需要将电子邮件添加为路径变量之一,那么更好的方法是遍历在上一教程中创建的RESTful服务应用程序 。

5.下载源代码

  • 下载源代码

翻译自: https://www.javacodegeeks.com/2016/01/exception-handling-spring-restful-web-service.html

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

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

相关文章

java调python画图_Python Matplotlib plot 绘图

1、绘制x和y点plot()函数用于在图中绘制点(标记)。默认情况下&#xff0c;plot()函数在点到点之间画一条线。该函数具有用于在图中指定点的参数。参数1是一个数组&#xff0c;其中包含x轴上的点。参数2是一个包含y轴上的点的数组。如果需要绘制从(1&#xff0c;3)到(8&#xff…

区块链以信用为基础,所以目前在中国不可行.

还是先整一套规范的含金量高的信用体系再说吧.转载于:https://www.cnblogs.com/diggingdeeply/p/impossible_success_in_china_right_now_bcoz_of_lack_credit.html

java cunstructor_参加JavaScript面试,必须搞懂的问题(推荐)

一. JavaScript中的对象.JavaScript中的Object是一组数据的key-value的集合, 有点类似于Java中的HashMap, 所有这些数据都是Object里的property. 通常情况下, JavaScript中建立一个对象用"new"加上constructor function来实现. 如new Date(), new Object()等.var boo…

jms activemq_带有ActiveMQ的JMS

jms activemq带有ActiveMQ的JMS JMS是Java消息服务的缩写&#xff0c;它提供了一种以松散耦合&#xff0c;灵活的方式集成应用程序的机制。 JMS以存储和转发的方式跨应用程序异步传递数据。 应用程序通过充当中介的MOM&#xff08;面向消息的中间件&#xff09;进行通信&#x…

【EMV L2】SDA静态数据认证处理流程

【静态数据认证】 静态数据认证处理过程中&#xff0c;卡片没有执行任何处理&#xff0c;终端执行的处理流程&#xff1a;1、认证中心公钥的获取终端使用卡片上的认证中心公钥索引&#xff08;PKI&#xff09;【TAG&#xff1a;8F&#xff0c;Certification Authority Public K…

java取邮箱前缀_java抓取网页或文件中的邮箱号码

java抓取网页或文件中的邮箱号码发布时间&#xff1a;2020-10-18 08:58:32来源&#xff1a;脚本之家阅读&#xff1a;69作者&#xff1a;java大渣渣本文实例为大家分享了java抓取邮箱号码的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下java抓取文件中邮箱号码的具体…

为Twitter4j创建自定义SpringBoot Starter

SpringBoot提供了许多启动器模块来快速启动和运行。 SpringBoot的自动配置机制负责根据各种标准代表我们配置SpringBean。 除了Core Spring Team提供的现成的springboot启动器之外&#xff0c;我们还可以创建自己的启动器模块。 在本文中&#xff0c;我们将研究如何创建自定义…

mac php gd库,mac下安装GD库FreeType

MacBook Pro安装的新系统10.10.3&#xff0c;PHP环境也是默认就有的&#xff0c;GD库在默认情况下也安装过了&#xff0c;但在使用验证码的时候&#xff0c;提示GD库不支持FreeType&#xff0c;这里我们手动安装一下。法一&#xff1a;安装 FreeType前往苹果官方开源支持&#…

php异步查询数据库,php中mysql数据库异步查询实现

问题通常一个web应用的性能瓶颈在数据库。因为&#xff0c;通常情况下php中mysql查询是串行的。也就是说&#xff0c;如果指定两条sql语句时&#xff0c;第二条sql语句会等到第一条sql语句执行完毕再去执行。这个时候&#xff0c;如果执行2条sql语句&#xff0c;每条执行时间为…

java btrace_BTrace:Java开发人员工具箱中的隐藏宝石

java btrace这篇文章是关于BTrace的 &#xff0c;我正在考虑将其作为Java开发人员的隐藏宝藏。 BTrace是用于Java平台的安全&#xff0c;动态跟踪工具。 BTrace可用于动态跟踪正在运行的Java程序&#xff08;类似于DTrace&#xff0c;适用于OpenSolaris应用程序和OS&#xff09…

共享文件夹不能访问的问题解决

打开控制面板--管理工具--服务--webclinet&#xff0c;设为自动&#xff0c;启动。重启电脑&#xff0c;搞定&#xff01;转载于:https://www.cnblogs.com/atlj/p/8481257.html

xampp浏览php出现乱码,dvwa+xampp搭建显示乱码的问题及解决方案

如图&#xff0c;dvwa显示乱码&#xff0c;解决办法有两个&#xff1a;1、方法一是&#xff0c;临时解决办法&#xff0c;也就是每次都得手动修改&#xff1a;利用浏览器的编码修改2、方法二是&#xff1a;永久方案&#xff0c;那就是修改dvwa的配置文件&#xff0c;修改默认编…

HotSpot的-XshowSettings标志的简单性和价值

一个方便的HotSpot JVM标志 &#xff08; 选项为Java启动 java &#xff09;是-XshowSettings选项。 Oracle Java启动器描述页面中对此选项进行了如下描述 &#xff1a; -XshowSettings &#xff1a; category显示设置并继续。 该选项的可能类别参数包括&#xff1a; all显示所…

Python验证码简单实现(数字和大写字母组成的4位验证码)

#数字和英文大写字母的4位随机数 def checkcode(): #def 定义方法 checkcode() 方法名()import random # 导入包checkcode ""string range(0,4)for i in string:current random.randrange(0,3) #randrange随机数 参数1<随机数<参数2if current ! i:temp …

php haystack,haystack(示例代码)

1、haystack简介Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询&#xff0c;使用全文检索的效率更高 )&#xff0c;该框架支持Solr,Elasticsearch,Whoosh, Xapian&#xff0c;搜索引擎它是一个可插拔的后端(很像Django的数据库层)&#xff0c;所以几乎你…

猫眼电影面试经历

面试是昨天上午进行的&#xff0c;因为昨天家里断网了&#xff0c;所以未能及时记录。 昨天的面试进行到了第三面&#xff0c;由于第三面的面试官当天未上班&#xff0c;所以成了回家等通知了。 感觉总体面试过程回答了百分之七十的样子吧&#xff01;一面、二面面试官都不错&a…

fopen php 乱码,如何解决php fgets读取文件乱码的问题

如何解决php fgets读取文件乱码的问题,文件,乱码,简体中文,记事本,页面如何解决php fgets读取文件乱码的问题易采站长站&#xff0c;站长之家为您整理了如何解决php fgets读取文件乱码的问题的相关内容。php fgets乱码的解决办法&#xff1a;首先依次点击“菜单修改->页面属…

一致性哈希算法原理分析及实现

一致性哈希算法常用于负载均衡中要求资源被均匀的分布到所有节点上&#xff0c;并且对资源的请求能快速路由到对应的节点上。具体的举两个场景的例子&#xff1a; 1、MemCache集群&#xff0c;要求存储各种数据均匀的存到集群中的各个节点上&#xff0c;访问这些数据时能快速的…

jsf集成spring_JSF – PrimeFaces和Hibernate集成项目

jsf集成spring本文介绍了如何使用JSF&#xff0c;PrimeFaces和Hibernate开发项目。 下面是一个示例应用程序&#xff1a; 二手技术&#xff1a; JDK 1.6.0_21 Maven的3.0.2 JSF 2.0.3 PrimeFaces 2.2.1 Hibernate3.6.7 MySQL Java连接器5.1.17 MySQL 5.5.8 Apache Tomcat 7.…

帝国 loginjs.php,帝国cms 6.6 后台拿shell

时间:2013-02-27来源:源码库 作者:源码库 文章热度:℃漏洞作者&#xff1a; 付弘雪提交时间&#xff1a; 2013-01-21公开时间&#xff1a; 2013-01-21漏洞类型&#xff1a; 文件上传导致任意代码执行简要描述&#xff1a;帝国cms 6.6版本后台拿shell 比网上流行的方法简单很多由…