JAX-RS异常处理:自定义ExceptionMapper实践
在构建RESTful API时,异常处理是一个重要的环节。JAX-RS提供了一种灵活的方式来处理异常,即通过ExceptionMapper
接口。本文将详细介绍如何实现和使用ExceptionMapper
,并通过一个具体实例来展示其在实际项目中的应用。
什么是ExceptionMapper?
在JAX-RS中,ExceptionMapper
接口用于将检查型异常或运行时异常映射到Response
实例。要提供异常映射,我们需要编写一个实现ExceptionMapper<E extends Throwable>
接口的类。这个类可以被@Provider
注解标注,以便自动发现和注册。
实现ExceptionMapper
以下是一个ExceptionMapper
的实现示例,它处理自定义异常InvalidIdException
:
@Provider
public class InvalidIdExceptionMapper implements ExceptionMapper<InvalidIdException> {
@Override
public Response toResponse(InvalidIdException exception) {
return Response.status(Response.Status.NOT_FOUND)
.entity(prepareMessage(exception))
.type("text/plain")
.build();
}
private String prepareMessage(InvalidIdException exception) {
String m = exception.getMessage();
String r = "Invalid request.\n";
r += String.format("Error Message: %s.%nError Type: %s.%n"
+ "You may contact admin@example.com for more questions.",
m, exception.getClass());
return r;
}
}
public class InvalidIdException extends RuntimeException {
public InvalidIdException(String message) {
super(message);
}
}
在这个例子中,当InvalidIdException
被抛出时,InvalidIdExceptionMapper
会被JAX-RS运行时调用,将异常信息转换为HTTP 404响应,并返回一个包含错误信息的文本实体。
编写JAX-RS资源
接下来,我们来看一个JAX-RS资源的实现,它可能会抛出InvalidIdException
:
@Path("/employees")
public class EmployeeResource {
@GET
@Path("{id}")
public String getEmployeeId(@PathParam("id") String employeeId) {
return EmployeeService.Instance.getEmployeeById(employeeId);
}
}
public enum EmployeeService {
Instance;
public String getEmployeeById(String id) {
try {
long l = Long.parseLong(id);
//just a dummy response
return "employee" + l;
} catch (NumberFormatException e) {
throw new InvalidIdException("Employee id is not valid, " + id);
}
}
}
在这个资源中,如果传入的员工ID不能被解析为长整型数字,就会抛出InvalidIdException
。
运行示例
要运行上述示例,你需要在项目的pom.xml
中配置嵌入式Tomcat,并使用以下命令启动项目:
mvn tomcat7:run-war
然后,你可以使用HTTPie工具来访问资源,并观察异常处理的效果。
项目依赖和技术栈
以下是本示例项目使用的一些关键依赖和技术:
- jersey-server 2.25.1:Jersey核心服务器实现。
- jersey-container-servlet 2.25.1:Jersey核心Servlet 3.x实现。
- JDK 1.8
- Maven 3.3.9
通过这篇文章,你应该能够理解如何在JAX-RS中实现和使用ExceptionMapper
来优雅地处理异常。这不仅有助于提高API的健壮性,还能提升用户体验。