JAX-RS支持处理自定义异常(以EJB或CID Bean形式抛出)以处理自定义HTTP响应。
假设我们有一个“异常” EJB:
@Statelesspublic class Hello {public String greeting() {if (new Random().nextBoolean())throw new GreetingException("Could not greet");return "hello";}}
@ApplicationExceptionpublic class GreetingException extends RuntimeException {public GreetingException(String message) {super(message);}}
EJB在我们的JAX-RS资源中使用:
@Path("hello")public class HelloResource {@InjectHello hello;@GETpublic String hello() {return hello.greeting();}}
现在,将发生的异常映射到自定义HTTP响应,我们可以定义JAX-RSExceptionMapper
。
@Providerpublic class GreetingExceptionMapper implements ExceptionMapper<GreetingException> {@Overridepublic Response toResponse(GreetingException exception) {return Response.status(Response.Status.CONFLICT).header("Conflict-Reason", exception.getMessage()).build();}}
异常映射器注册为JAX-RS扩展名(@Provider
),它将处理资源方法引发的任何GreetingException
。
该示例偶尔会输出带有标头Conflict-Reason: Could not greet
HTTP409 Conflict
。
如果使用CDI托管bean而不是EJB,则不需要@ApplicationException
批注。
翻译自: //12/handle-custom-exception-types-jax-rs.html
如果觉得《处理JAX-RS中的自定义异常类型》对你有帮助,请点赞、收藏,并留下你的观点哦!