我正在学习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());
}
}
最佳答案
WebApplicationException和ExceptionMapper不能用于比较,因为它们具有不同的用途。相反,它们应一起使用以制定更好的响应策略。
想象一下在处理请求时遇到异常的情况。假设您在访问数据库时遇到了SQLException。在这种情况下,可以使用ExceptionMapper来将SQLException映射为适当的5xx响应,而不用将原始异常传播给最终用户。
WebApplicationException
应用程序的运行时异常。
如果需要产生特定的HTTP错误响应,则资源方法,提供程序或StreamingOutput实现可能会抛出此异常。仅在提交响应之前引发,才有效。
异常映射器
与将Java异常映射到Response的提供程序签订合同。