JAX-RS支持处理自定义异常(以EJB或CID Bean形式抛出)以处理自定义HTTP响应。
假设我们有一个“异常” EJB:
@Stateless
public class Hello {public String greeting() {if (new Random().nextBoolean())throw new GreetingException("Could not greet");return "hello";}}@ApplicationException
public 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-RS ExceptionMapper 。 
@Provider
public 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 HTTP 409 Conflict 。 
 如果使用CDI托管bean而不是EJB,则不需要@ApplicationException批注。 
翻译自: https://www.javacodegeeks.com/2017/12/handle-custom-exception-types-jax-rs.html