springmvc-resteasy и отображение исключений - PullRequest
0 голосов
/ 18 февраля 2011

Я использую интеграцию RESTEAsy Spring MVC (springmvc-resteasy с использованием RestEasy 2.0, Spring 3.0) Я хотел бы сопоставить исключения моего приложения с ответами HTTP, объявив поставщиков сопоставления исключений RESTEasy.В настоящее время мое приложение явно не расширяет javax.ws.rs.core.Application, и в идеале я хотел бы полагаться на автоматическое сканирование каркасов поставщиков сопоставлений исключений.

Вот как выглядит один из моих картографов исключений.

@Provider public class MyAppExceptionMapper implements ExceptionMapper<MyAppException> {
    public Response toResponse(MyAppException exception) {
            return Response.status(Response.Status.BAD_REQUEST).build();
    } 
}

И мой класс исключений выглядит следующим образом

public class MyAppException extends RuntimeException {
    public MyAppException(String s, Throwable t) {
     super(s,t);
    }
}

Когда мое приложение выдает MyAppException, оно не сопоставляется с ответом HTTP-400 (я получаю обычныйHTTP-500 из фреймворка)

Что-то мне не хватает?Если проблема заключается в том, что я не «регистрирую» провайдера в платформе, как я могу зарегистрировать свои средства отображения исключений, когда использую springmvc-resteasy?

Спасибо.

1 Ответ

2 голосов
/ 23 февраля 2011

Я получил ответ от Соломона Дускиса, который я публикую здесь, чтобы другие люди, столкнувшиеся с этой проблемой, могли быстро ее решить.Как я и подозревал, мне пришлось каким-то образом настроить Spring для настройки RESTEasy для сканирования моего поставщика сопоставления исключений.Я добавил @Component к своему преобразователю исключений, и он работает для сопоставления MyAppException с правильным кодом ответа HTTP (в данном случае 400 вместо 500).Однако здесь есть оговорка: исключение MyAppException не сериализуется RESTEasy, потому что « java.lang.StackTraceElement не имеет конструктора по умолчанию без аргументов ».Я ищу решение для этой вторичной проблемы.

Вы можете либо настроить компонентное сканирование на @Providers, либо добавить @Component к вашему преобразователю исключений, чтобы добавить его в свой контекст.Вот как вы можете сканировать с @Providers:

<context:component-scan base-package="bean">
    <context:include-filter type="annotation" expression="javax.ws.rs.ext.Provider"/>
</context:component-scan>
...