RESTful(Jersey)Web服务中的WebApplicationException v/s ExceptionMapper
问题描述:
我正在学习REST Web服务。我需要在处理Jersey
中的自定义异常方面做一些澄清。通过使用WebApplicationException
和ExceptionMapper
您可以throw
定制Exception
。我的问题是在哪种情况下,我们已经为WebApplicationException
和ExceptionMapper
。他们之间有什么不同?RESTful(Jersey)Web服务中的WebApplicationException v/s ExceptionMapper
我已经通过一些教程,我发现ExceptionMapper
就像通用。
@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实现引发。只有在响应发生之前抛出才有效。
ExceptionMapper
合同为Java异常映射到响应的供应商。