javascript
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怎么辦。 為了安全起見,我們必須在應用程序中具有通用的異常處理程序,該處理程序可以處理所有其他異常類型,例如IOException , NullPointerException等。 為此,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響應。 替代方法是將BeanNameViewResolver與ModelAndView一起用作返回類型。 我們將很快為此提供一個示例應用程序。
4.運行應用程序
是時候運行我們創建的應用程序了。
確保我們已將應用程序發布到服務器并啟動了它。
現在,在瀏覽器中點擊下面的URI – http:// localhost:8080 / RESTWithSpringMVCException / Ramesh?empId = 1234
讓我們看看錯誤響應的樣子。 請注意,我們在EmployeeController中添加了一個IF塊,該塊檢查雇員名字的路徑變量是否為數字。 如果是數字,則我們的應用程序將拋出EmployeeException 。 讓我們點擊下面的URI –
如果需要將電子郵件添加為路徑變量之一,那么更好的方法是遍歷在上一教程中創建的RESTful服務應用程序 。
5.下載源代碼
- 下載源代碼
翻譯自: https://www.javacodegeeks.com/2016/01/exception-handling-spring-restful-web-service.html
總結
以上是生活随笔為你收集整理的Spring RESTful Web服务中的异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oppo手机通话挂机设置(oppo挂机模
- 下一篇: jms activemq_带有Activ