假设我们将休息服务定义为:
@GET
@Produces("application/json")
public Response getAllCategories(@QueryParam(value="startIndex") int startIndex, @QueryParam(value="size") int size)
{
logger.info("[SampleCategoryController][getAllCategories]");
List<YpCategory> categoryList = sampleCategoryService.getAllCategories(startIndex, size);
return Response.ok(categoryList).build();
}
,服务定义为:
public class SampleCategoriesServiceImpl {
public List<YpCategory> getAllCategories(int startIndex, int size) {
...
//call some method that throws a runtime exception
...
}
}
一个Application Exception处理程序:
@Provider
@Component
public class ApplicationExceptionHandler implements ExceptionMapper<Throwable> {
@Override
public Response toResponse(Throwable ex) {
String internalError = "There was a problem processing your request.";
return Response.serverError().entity(new ExceptionResponse(500, internalError)).build();
}
}
}
异常响应对象:让异常冒泡到ApplicationExceptionHandler并返回ExceptionResponse对象。这种方式似乎更清晰,因为服务不必尝试处理它无法真正做任何事情的异常,客户端仍会收到json响应。
响应包装器:类别对象会使用有关错误代码的信息扩展某种类型的通用响应包装器对象,然后我总是必须包装可以在try / catch中引发运行时异常的方法阻止并在catch块中设置错误代码和消息信息。
这些方式之一是首选吗?是否有使用这些方法中的任何一种来处理错误?
答案 0 :(得分:1)
我认为在这种情况下你应该使用doReturn(slaveSalesOrganization).when(currentSite).getSlaveSalesOrganization()
。让异常在您的实现之外处理更清晰。
您的实现也应该尽可能少地了解HTTP。您的实现对框架其他部分的了解越少,它就越灵活。
举个例子。让我们说,将来会支持非HTTP协议,错误消息将与使用HTTP状态代码不同。您可以在ExceptionMapper
级别执行此实施,而无需更改您的实施。否则,您必须重构您的应用程序以了解非HTTP协议。
为了清楚起见,我现在还没有说 其他实现。这只是一种理论。