原文: https://howtodoinjava.com/resteasy/exception-handling-in-jax-rs-resteasy-with-exceptionmapper/

学习使用 resteasy ExceptionMapper接口实现创建和处理自定义异常ExceptionMapper是供应器的契约,该供应器将 Java 异常映射到Response对象。

必须使用@Provider注解ExceptionMapper接口的实现才能正常工作。

1. Resteasy ExceptionMapper - 自定义异常处理器

ExceptionMapper的示例实现供应器类如下所示:

  1. package com.howtodoinjava.exception;
  2. import javax.ws.rs.core.Response;
  3. import javax.ws.rs.core.Response.Status;
  4. import javax.ws.rs.ext.ExceptionMapper;
  5. import javax.ws.rs.ext.Provider;
  6. @Provider
  7. public class MyApplicationExceptionHandler implements ExceptionMapper<MyApplicationException>
  8. {
  9. @Override
  10. public Response toResponse(MyApplicationException exception)
  11. {
  12. return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build();
  13. }
  14. }

自定义异常类MyApplicationException.java的编写方式为:

  1. package com.howtodoinjava.exception;
  2. import java.io.Serializable;
  3. public class MyApplicationException extends Exception implements Serializable
  4. {
  5. private static final long serialVersionUID = 1L;
  6. public MyApplicationException() {
  7. super();
  8. }
  9. public MyApplicationException(String msg) {
  10. super(msg);
  11. }
  12. public MyApplicationException(String msg, Exception e) {
  13. super(msg, e);
  14. }
  15. }

2. Resteasy REST API

为了测试ExceptionMapper实现,我编写了以下 resteasy REST API。

  1. package com.howtodoinjava.rest;
  2. import javax.ws.rs.GET;
  3. import javax.ws.rs.Path;
  4. import javax.ws.rs.PathParam;
  5. import javax.ws.rs.core.Response;
  6. import org.jboss.resteasy.spi.validation.ValidateRequest;
  7. import com.howtodoinjava.exception.MyApplicationException;
  8. @Path("/rest")
  9. public class UserService
  10. {
  11. @Path("/users/{id}")
  12. @GET
  13. @ValidateRequest
  14. public Response getUserBId ( @PathParam("id") String id ) throws MyApplicationException
  15. {
  16. //validate mandatory field
  17. if(id == null)
  18. {
  19. throw new MyApplicationException("id is not present in request !!");
  20. }
  21. //Validate proper format
  22. try
  23. {
  24. Integer.parseInt(id);
  25. }
  26. catch(NumberFormatException e)
  27. {
  28. throw new MyApplicationException("id is not a number !!");
  29. }
  30. //Process the request
  31. return Response.ok().entity("User with ID " + id + " found !!").build();
  32. }
  33. }

3. RESTEasy ExceptionMapper演示

上面的 API 接受Integer格式的用户'id'参数。 如果我们以无法解析为Integer的其他格式传递 id,则会抛出MyApplicationException。 我们的异常映射器应该能够处理这个问题。

3.1 有效请求

在浏览器中访问http://localhost:8080/RESTEasyExceptionMapperDemo/rest/users/1

RESTEasy `ExceptionMapper` – 异常处理示例 - 图1

REST API 的有效请求

3.2 无效请求 - 引发异常

在浏览器中访问http://localhost:8080/RESTEasyExceptionMapperDemo/rest/users/abc

RESTEasy `ExceptionMapper` – 异常处理示例 - 图2

REST API 的无效请求

要使用ExceptionMapper接口下载此 Resteasy 客户端异常处理示例的源代码,请遵循以下给定的链接。

源码下载

学习愉快!