RESTEasy中的通用异常处理ExceptionMapper

简介: RESTEasy是JBoss提供的一个Restful基础框架,使用它我们可以很方便的构建我们的Restful服务,而且它也完全符合Java的JAX-RS2.0标准,很多第三方Restful框架也都是基于RESTEasy开发的。在任何框架中都不可避免的涉及到异常处理,Restful框架也是如此。按照我们一般传统异常处理方式,在Restful的最外层,我们一般会对所有的业务调

RESTEasy是JBoss提供的一个Restful基础框架,使用它我们可以很方便的构建我们的Restful服务,而且它也完全符合Java的JAX-RS2.0标准,很多第三方Restful框架也都是基于RESTEasy开发的。

在任何框架中都不可避免的涉及到异常处理,Restful框架也是如此。按照我们一般传统异常处理方式,在Restful的最外层,我们一般会对所有的业务调用都加上try catch,以免异常被用户接收到,比如我们有这么一个Restful服务:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;
import org.jboss.resteasy.spi.validation.ValidateRequest;


@Path("/rest")
public class UserApi
{
    @Autowire
    UserService userService;
    @Path("/users/{id}")
    @GET
    @ValidateRequest
    public Response getUserBId  ( @PathParam("id") String id ) throws RuntimeException
    {
        try{
            User user=userService.getUser(id);
        } catch(IllegalArgumentException e) {
            //if exception occured
            return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build(); 
        } catch(Exception e) {
            //if exception occured
            return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build(); 
        }
        //if success
        return Response.ok().entity("User with ID " + id + " found !!").build();
    }
}

上面UserApi接口中的getUserBId()方法调用了userService.getUser()服务,这个服务会抛出一些异常,UserApi需要捕获异常并返回客户的一个错误的响应。还有一点我们一般会在API层catch一个Exception异常,也就是捕获所有可能发生的异常情况,以免前端出现不友好的错误提示。

这么做也没什么问题,但是我们的接口不只是一个,每个接口需要进行try catch来处理异常,这么做显然不符合我们的编程思想,我们希望把所有异常集中到一个地方处理。

如果我们的Restful框架是基于RESTEasy的,那么我们就可以使用ExceptionMapper来实现一个通用异常处理类。

使用ExceptionMapper进行通用异常处理

ExceptionMapper是provider的一个协议,它会将Java的异常映射到Response对象。所以要进行通用异常处理,我们只需要写一个类来实现ExceptionMapper接口,并把它声明为一个provider即可:

import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class MyApplicationExceptionHandler implements ExceptionMapper<MyApplicationException>
{
    @Override
    public Response toResponse(Exception exception)
    {
        return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build(); 
    }
}

上面的ExceptionMapper的实现已经写好了,下面我们写个Restful API来测试下:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;
import org.jboss.resteasy.spi.validation.ValidateRequest;

@Path("/rest")
public class UserApi
{
    @Autowire
    UserService userService;
    @Path("/users/{id}")
    @GET
    @ValidateRequest
    public Response getUserBId  ( @PathParam("id") String id ) throws RuntimeException
    {
        try{
            User user=userService.getUser(id);
        } catch(IllegalArgumentException e) {
           throw new RuntimeException("id is not a number !!");
        } 
        return Response.ok().entity("User with ID " + id + " found !!").build();
    }
}

在这个接口中,我们并没有对异常做特殊处理,也没有catch一个Exception异常,仅仅是把异常抛出,而所有的异常处理都集中在了MyApplicationExceptionHandler中。

我们测一下这个接口,首先我们写一个合法的请求:

http://localhost:8080/RESTEasyExceptionMapperDemo/rest/users/1

这里写图片描述

我们再写一个不合法的请求,请求的参数是个字符串而不是数值:

http://localhost:8080/RESTEasyExceptionMapperDemo/rest/users/abc

这里写图片描述

目录
相关文章
|
JSON 前端开发 Java
springmvc-JSR303进行服务端校验&分组验证&SpringMVC定义Restfull接口&异常处理流程&RestController异常处理
springmvc-JSR303进行服务端校验&分组验证&SpringMVC定义Restfull接口&异常处理流程&RestController异常处理
|
3月前
|
前端开发 小程序 Java
【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
本文详细介绍了如何在SpringBoot项目中统一处理接口返回结果及全局异常。首先,通过封装`ResponseResult`类,实现了接口返回结果的规范化,包括状态码、状态信息、返回信息和数据等字段,提供了多种成功和失败的返回方法。其次,利用`@RestControllerAdvice`和`@ExceptionHandler`注解配置全局异常处理,捕获并友好地处理各种异常信息。
1235 0
【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
|
5月前
|
XML 前端开发 Java
SpringMVC的架构有什么优势?——异常处理与文件上传(五)
SpringMVC的架构有什么优势?——异常处理与文件上传(五)
|
Java
SpringBoot通用异常处理
通用异常返回一般用在该异常服务器无法处理的时候,进行消息的返回。所以返回代码只有 500。
95 0
|
存储 运维 Java
SpringBoot 统一异常处理(附核心工具类-ErrorInfoBuilder) 1
SpringBoot 统一异常处理(附核心工具类-ErrorInfoBuilder)
|
监控 前端开发 Java
SpringMVC 的三种异常处理方式详解
SpringMVC 的三种异常处理方式详解
187 0
|
前端开发 新制造 UED
SpringBoot-23-全局异常机制+RESTful统一规范
SpringBoot-23-全局异常机制+RESTful统一规范
127 0
|
JSON Java API
基于SpringCloud封装统一的异常处理
在 Spring Cloud 中,可以通过自定义异常处理器来封装统一的异常处理逻辑。异常处理器能够捕获并处理应用程序中的异常,然后返回适当的错误响应。以下是一个基于 Spring Cloud 的统一异常处理的示例
|
监控 前端开发 安全
Spring Boot 统一RESTful接口响应和统一异常处理
基于Spring Boot 框架开发的应用程序,大部分都是以提供RESTful接口为主要的目的。前端或者移动端开发人员通过调用后端提供的RESTful接口完成数据的交换。 统一的RESTful接口响应数据结构是基本的开发规范。能够减少团队内部不必要的沟通;减轻接口消费者校验数据的负担;降低其他同事接手代码的难度;提高接口的健壮性和可扩展性。 统一的异常处理,是系统完备性的基本象征。通过对全局异常信息的捕获,能够避免将异常信息和系统敏感信息直接抛给客户端;针对特定类型异常捕获之后可以重新对输出数据做编排,提高交互友好度,同时可以记录异常信息以便监控和分析。
396 0
Spring Boot 统一RESTful接口响应和统一异常处理
|
消息中间件 JSON JavaScript
SpringMVC 统一异常处理实战
SpringMVC 统一异常处理实战