2013-11-20 8 views
3

У меня есть веб-приложение 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(); 
    } 

} 
+0

У вас есть контроль над исключениями, которые приходят из бизнес-логики? Вы можете напрямую отображать эти исключения и избегать catch Throwable, который может скрыть код (например, исключения нулевого указателя) и производительность (например, ошибки из памяти) от вас. Также запрещено ли Forbidden соответствующее описание состояния для кода ответа, а не «услуга недоступна»? Ваши требования будут диктовать такие, но что-то думать. :) – Charlie

+0

По умолчанию, исключаемые исключения, которые, как я полагаю, должны приводить к ошибке внутреннего сервера, которая может быть в порядке, в зависимости от ваших потребностей/контракта, которые вы хотите определить с помощью ваших спокойных клиентов. – Charlie

+0

Вы также можете бросить исключение WebApplicationException, если test = null, тем самым позволяя вам просто вернуть значение теста в случае OK. – Charlie

ответ

2

Просто сделайте свой класс исключения WebApplicationException и выбросьте его, где захотите. Вы можете увидеть в приведенном ниже примере, что вы можете настроить ответ любым способом. Счастливое кодирование!

Примечание: этот пример обрабатывает 403 ошибки, но вы можете легко создать исключения для обработки 500, 503 и т.д.

package my.package.name; 

import javax.ws.rs.WebApplicationException; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 
import java.io.Serializable; 

public class Http401NotAuthorizedException extends WebApplicationException implements Serializable { 
    private static final long serialVersionUID = 1L; 
    public Http401NotAuthorizedException(String msg){ 
    super(
     Response 
     .status(Response.Status.FORBIDDEN) 
     .header("Pragma", "no-cache, no-store") 
     .header("Cache-Control", "no-cache, no-store") 
     .header("Expires", "0") 
     .entity(msg) 
     .build() 
    ); 
    } 
} 
Смежные вопросы