Ratpack Rest API ExceptionHandler

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

Это возможно в ratpack? Весной мы делаем это с помощью аннотации @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();
    }
  }

}

Вы можете связать свой собственный обработчик ошибок, если вы используете spring, вы можете определить Bean типа Action<BindingsSpec>, связывайте свое весеннее приложение с основным и нужно только объявить ваш обработчик ошибок как bean-компонент, которого должен достичь ratpack

Другие вопросы по тегам