2017-02-15 3 views
1

Я хочу иметь единственный ExceptionHandler для обработки каждого исключения при реализации REST API с использованием ratpack. Этот ExceptionHandler обрабатывает каждое исключение во время выполнения и соответственно отправляет ответ json.Ratpack Rest API ExceptionHandler

Возможно ли это в крысиной пачке? Весной мы делаем это с помощью аннотации @ControllerAdvice. Я хочу реализовать подобное поведение с помощью ratpack.

Спасибо за помощь.

ответ

2

Ну, самый простой способ определить свой класс, который реализует ratpack.error.ServerErrorHandler и привязать его к ServerErrorHandler.class в реестре.

Вот пример для ratpack приложения с Guice реестра:

public class Api { 
    public static void main(String... args) throws Exception { 
    RatpackServer.start(serverSpec -> serverSpec 
     .serverConfig(serverConfigBuilder -> serverConfigBuilder 
     .env() 
     .build() 
    ) 
     .registry(
     Guice.registry(bindingsSpec -> bindingsSpec 
      .bind(ServerErrorHandler.class, ErrorHandler.class) 
     ) 
    ) 
     .handlers(chain -> chain 
     .all(ratpack.handling.RequestLogger.ncsa()) 
     .all(Context::notFound) 
    ) 
    ); 
    } 
} 

И ErrorHandler как:

class ErrorHandler implements ServerErrorHandler { 

    @Override public void error(Context context, Throwable throwable) throws Exception { 
    try { 
     Map<String, String> errors = new HashMap<>(); 

     errors.put("error", throwable.getClass().getCanonicalName()); 
     errors.put("message", throwable.getMessage()); 

     Gson gson = new GsonBuilder().serializeNulls().create(); 

     context.getResponse().status(HttpResponseStatus.INTERNAL_SERVER_ERROR.code()).send(gson.toJson(errors)); 
     throw throwable; 
    } catch (Throwable throwable1) { 
     throwable1.printStackTrace(); 
    } 
    } 

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