У меня есть веб-приложение RESTful, которое подключается к базе данных и имеет обычные службы REST, бизнес-логику и уровни сохранения. Каков стандарт JAX-RS для обработки ошибок Runtime, например, подключение к базе данных недоступно, на уровне RESTful? Я считаю, что подход, который у меня есть ниже, где я переношу любой вызов на мои уровни обслуживания/персистентности с помощью try/catch для Throwable и бросать мое обычное исключение MyAppRuntimeException немного неудобно. Какие-либо предложения?Обработка исключений Runtime в REST ресурсе для ответа JAX-RS
RESTful Услуги:
@Path("service")
@Consumes({"application/json"})
@Produces({"application/json"})
public class MyResource {
@GET
@Path("/{id}")
public Response getPage(@PathParam("id") long id){
Object test=null;
try {
test = ...
//call business logic service method here which makes a call to database and populates test instance
} catch (Throwable e) {
throw new MyAppRuntimeException("custom error message string");
}
if(test != null){
return Response.ok(test).build();
}else{
return Response.status(Status.NOT_FOUND).build();
}
}
}
Пользовательские Исключение:
public class MyAppRuntimeException extends RuntimeException {
private static final long serialVersionUID = 1L;
public MyAppRuntimeException(String message) {
super(message);
}
public MyAppRuntimeException(String message, Throwable cause) {
super(message, cause);
}
}
Исключение JAX-RS Ответ Mapper:
@Provider
public class MyAppRuntimeExceptionMapper implements ExceptionMapper<MyAppRuntimeException> {
private static final String ERROR_KEY = "DATA_ERROR";
@Override
public Response toResponse(MyAppRuntimeException exception) {
ErrorMessage errorMessage = new ErrorMessage(ERROR_KEY, exception.getMessage(), null);
return Response.status(Status.INTERNAL_SERVER_ERROR).entity(errorMessageDTO).build();
}
}
У вас есть контроль над исключениями, которые приходят из бизнес-логики? Вы можете напрямую отображать эти исключения и избегать catch Throwable, который может скрыть код (например, исключения нулевого указателя) и производительность (например, ошибки из памяти) от вас. Также запрещено ли Forbidden соответствующее описание состояния для кода ответа, а не «услуга недоступна»? Ваши требования будут диктовать такие, но что-то думать. :) – Charlie
По умолчанию, исключаемые исключения, которые, как я полагаю, должны приводить к ошибке внутреннего сервера, которая может быть в порядке, в зависимости от ваших потребностей/контракта, которые вы хотите определить с помощью ваших спокойных клиентов. – Charlie
Вы также можете бросить исключение WebApplicationException, если test = null, тем самым позволяя вам просто вернуть значение теста в случае OK. – Charlie