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