RESTful(Jersey)Web服务中的WebApplicationException v/s ExceptionMapper

问题描述:

我正在学习REST Web服务。我需要在处理Jersey中的自定义异常方面做一些澄清。通过使用WebApplicationExceptionExceptionMapper您可以throw定制Exception。我的问题是在哪种情况下,我们已经为WebApplicationExceptionExceptionMapper。他们之间有什么不同?RESTful(Jersey)Web服务中的WebApplicationException v/s ExceptionMapper

我已经通过一些教程,我发现ExceptionMapper就像通用。

@Provider 
class MyWrapper implements ExceptionMapper<MyPojoClass> 
{ 
} 

还有一个不同之处在于,

由于@ProviderJersey将默认情况下只捕获这个例外,如果也发生任何其他异常。

还有其他区别吗?

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实现引发。只有在响应发生之前抛出才有效。

ExceptionMapper

合同为Java异常映射到响应的供应商。