我正在学习REST Web服务。我需要澄清有关在Jersey中处理自定义异常的信息。通过使用WebApplicationExceptionExceptionMapper,您可以throw自定义Exception。我的问题是在哪种情况下我们要使用WebApplicationExceptionExceptionMapper。它们之间有什么区别?

我看了一些教程,发现ExceptionMapper就像Generic。

@Provider
class MyWrapper implements ExceptionMapper<MyPojoClass>
{
}


另一个不同是

由于@Provider Jersey仅在默认情况下会捕获此异常,如果还发生任何其他异常。

还有其他区别吗?

MyExceptionMapper.java

package com.katte.galaxe.exception;

import javax.ws.rs.core.MediaType;
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;


public class MyExceptionMapper implements ExceptionMapper<MyCustomException>
{

@Override
public Response toResponse(MyCustomException errMsg) {
    ErrorMessage msg = new ErrorMessage(errMsg.getMessage(),1100);
    return Response.status(Status.NOT_FOUND)
            .type(MediaType.APPLICATION_XML)
            .entity(msg)
            .build();
}
}


MyWebApplicationException.java

package com.katte.galaxe.exception;

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

public class MyWebApplicationException extends WebApplicationException{

private static final long serialVersionUID = -5788907118191114665L;

public MyWebApplicationException(ErrorMessage msg) {
    super(Response.status(Status.NOT_FOUND)
            .entity(msg)
            .type(MediaType.APPLICATION_XML)
            .build());
}
}

最佳答案

WebApplicationException和ExceptionMapper不能用于比较,因为它们具有不同的用途。相反,它们应一起使用以制定更好的响应策略。

想象一下在处理请求时遇到异常的情况。假设您在访问数据库时遇到了SQLException。在这种情况下,可以使用ExceptionMapper来将SQLException映射为适当的5xx响应,而不用将原始异常传播给最终用户。


  WebApplicationException
  
  应用程序的运行时异常。
  
  如果需要产生特定的HTTP错误响应,则资源方法,提供程序或StreamingOutput实现可能会抛出此异常。仅在提交响应之前引发,才有效。
  
  异常映射器
  
  与将Java异常映射到Response的提供程序签订合同。

07-26 04:39