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…

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抓取文件中邮箱号码的具体…

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

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

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;所以几乎你…

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 比网上流行的方法简单很多由…

带有JSF,Servlet和CDI的DynamicReports和JasperReports

在此示例中&#xff0c;我将展示如何将DynamicReport和JasperReports与Servlet和CDI集成。 工具&#xff1a; TIBCO Jaspersoft Studio-6.0.4。最终版 Eclipse Luna服务版本2&#xff08;4.4.2&#xff09;。 WildFly 8.x应用程序服务器。 这是Eclipse上项目层次结构的屏幕…

swing 聊天气泡背景_Java Swing中的聊天气泡

swing 聊天气泡背景本文将向您解释“如何在Java swing应用程序中绘制聊天气泡&#xff1f;” 聊天气泡与呼出或提示气泡相同。 今天&#xff0c;大多数聊天应用程序都以这种格式显示转换&#xff0c;因此本文将帮助您在用Java swing创建的桌面应用程序中执行相同的操作。 以下课…

jdk7与jdk8环境共存与切换

1&#xff0c;先安装jdk7,配置环境变量JAVA_HOME,然后安装jdk8。 2&#xff0c;安装jdk8后&#xff0c;JAVA_HOME指向未做修改&#xff0c;执行java -version显示还是以前的jdk7版本信息&#xff0c; 3&#xff0c;接下来我们配置环境变量JAVA_HOME,发现配置jdk7的路径,或者配置…

PHP培训选云和数据,送给云和数据郑州分中心PHP培训班全体学员的祝福

在云和数据数百个日日夜夜&#xff0c;郑州PHP培训班的学员们一起成长&#xff0c;从青春懵懂到成熟稳重&#xff0c;从羞涩内敛到侃侃而谈&#xff0c;他们用奋斗和拼搏共同刻画了人生中一段难忘的回忆。12月12日&#xff0c;云和数据郑州分中心PHP培训班毕业典礼&#xff0c;…

cyclicbarrier_Java并发– CyclicBarrier示例

cyclicbarrierJava中的CyclicBarrier是JDK 5中在java.util.Concurrent包上引入的同步器&#xff0c;以及其他并发实用程序&#xff0c;例如Counting Semaphore &#xff0c; BlockingQueue &#xff0c; ConcurrentHashMap等。CyclicBarrier与CountDownLatch类似&#xff0c;我…

php队列失败是指什么,队列是什么意思

队列是一种特殊的线性表。它只允许在表的前端(front)进行删除操作&#xff0c;而在表的后端(rear)进行插入操作&#xff0c;和栈一样&#xff0c;队列是一种操作受限制的线性表&#xff1b;进行插入操作的端称为队尾&#xff0c;进行删除操作的端称为队头&#xff1b;队列中没有…

从In Memory Data Grid,Apache Ignite快速入门

IMDG或内存数据网格不是内存中关系数据库&#xff0c;NOSQL数据库或关系数据库。 它是另一种软件数据存储库。 数据模型分布在单个位置或多个位置的许多服务器上。 这种分布称为数据结构。 这种分布式模型被称为“无共享”架构。 IMDG具有以下特征&#xff1a; 所有服务器可以…