2015-11-26 3 views
1

Допустит, у нас есть служба остального определяется как:отдых Исключения: Упаковщики против объекта Error

@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 
     ... 

    } 
} 

И обработчик исключений Применения:

@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.

Является ли один из этих способов предпочтительным? Есть ли недостаток в использовании одного из этих методов для обработки ошибок?

ответ

1

В этом случае я должен использовать ExceptionMapper. Чистое позволяет исключать исключения за пределами вашей реализации. Также ваша реализация должна быть менее осведомленной о HTTP. Чем меньше ваша реализация знает о других частях вашей структуры, тем более гибкой она станет.

Чтобы привести пример. Допустим, что в будущем существует поддержка протокола, отличного от HTTP, и сообщения об ошибках будут отличаться от кода HTTP. Вы можете выполнить реализацию на уровне ExceptionMapper без изменения вашей реализации. В противном случае вам необходимо реорганизовать ваше приложение, чтобы он знал о протоколе, отличном от HTTP.

Просто, чтобы быть ясным, я не говорю, что is другая реализация доступна сейчас. Это просто теория.

Смежные вопросы