我正在学习REST Web服务。我需要澄清一下Jersey
中处理自定义异常的问题。使用WebApplicationException
和ExceptionMapper
,您可throw
自定义Exception
。我的问题是我们选择WebApplicationException
和ExceptionMapper
的情况。它们之间有什么区别?
我已经完成了一些教程,我发现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());
}
}
答案 0 :(得分:1)
WebApplicationException和ExceptionMapper并不打算进行比较,因为它们用于不同的目的。相反,它们旨在一起用于更好的响应策略。
想象一下在提供请求时遇到异常的情况。假设您在访问数据库时遇到了SQLException。在这种情况下,可以使用ExceptionMapper将SQLException映射到适当的5xx响应,而不是将原始异常传播给最终用户。
<强> WebApplicationException 强>
应用程序的运行时异常。
如果需要生成特定的HTTP错误响应,则资源方法,提供程序或StreamingOutput实现可能会抛出此异常。只有在提交响应之前抛出才有效。
<强> ExceptionMapper 强>
将Java异常映射到Response的提供程序的合同。