ExceptionMapper не вызывается при получении недействительного JSon

Я использую Джерси 2.5.1 с Джексоном 2.2. для построения веб-сервисов JSON Rest. Я вроде как установил и запустил также 2 ExceptionMappers, но для запроса "не-json" приложение не выдает никаких исключений!

  1. ExceptionMapper Будет вызываться, если, например, выброшено исключение NullPointerException

  2. ExceptionMapper Будет вызываться, если есть проблема с отображением JSon

Моя проблема: 1. Тело запроса: {} работает 2. Тело запроса: {} со стороны приложения NullPointer вызвал первый преобразователь исключений 3. Тело запроса: "jibberish" ничего не вызывает (не перехватывается никаким ExceptionMapper), не вызывает исключений брошен К сожалению, тело ответа выглядит как: Нераспознанное поле "xxx" (класс com.sample.MyDto), не помечено как игнорируемое (9 известных свойств... ....>, но я хочу настроить сообщение об ошибке, поскольку я всегда возвращая объект JSon.

2 ответа

Решение

Хорошо, я решил это. В конце концов, я подумал, что правильный путь состоял в том, что иногда это работало, поэтому это должна была быть проблема с перезаписью классов.

В моем ApplicationClass я зарегистрировал провайдеров на основе таких пакетов

    @ApplicationPath("resources")
    public class JerseyApplication extends ResourceConfig {
    public JerseyRestApplication() {            
        packages("com.sample", "com.fasterxml.jackson.jaxrs.json");
    }
}

Если вы смотрите остро, вы можете увидеть ошибку! Я помещаю "com.fasterxml.jackson.jaxrs.json" в путь поиска, потому что я хочу использовать класс JacksonJsonProvider.class. Чего я не знал, так это того, что в этом пакете также есть несколько JSonMappers для JSonParseException и т. Д., Которые не регистрируются:)

Так что иногда приложение сначала загружало мое, а иногда - приложение от Джексона. Итак, я собираюсь придерживаться следующего:

@ApplicationPath("resources")
public class JerseyRestApplication extends ResourceConfig {
    public JerseyApplication() {
        register(JacksonJsonProvider.class); // Do it manually

        packages("com.sample");
    }
}

Надеюсь, что помогает сб:D

Я также обнаружил, что когда-нибудь coustom ExceptionMapper не работает, и это не всегда работает или не работает.

поэтому я отлаживаю исходный код джерси.

класс: org.glassfish.jersey.server.ServerRuntime, methed:mapException

 ...
 final long timestamp = tracingLogger.timestamp(ServerTraceEvent.EXCEPTION_MAPPING);
 **ExceptionMapper mapper = runtime.exceptionMappers.findMapping(throwable);**
 if (mapper != null) {
      request.getRequestEventBuilder().setExceptionMapper(mapper);
 ...

если маппер имеет значение null, ExceptionMapper coustom не будет работать.

класс: org.glassfish.jersey.internal.ExceptionMapperFactory methed: ExceptionMapperFactory

Exception Mapper:(есть два Exception, отображающие одно и то же Exception: java.lang.Exception)

org.glassfish.jersey.server.mvc.internal.ErrorTemplateExceptionMapper @ 6473fc2, класс java.lang.Exception

...

com.baidu.ssp.web.ws.exception.BaseExceptionMapper @ 7a84639c, класс java.lang.Exception

это потому что в MvcFeature:

 @Override
public boolean configure(final FeatureContext context) {
    final Configuration config = context.getConfiguration();

    if (!config.isRegistered(ErrorTemplateExceptionMapper.class)) {
        context.register(ErrorTemplateExceptionMapper.class);
        context.register(new MvcBinder());

        return true;
    }

    return false;
}

ErrorTemplateExceptionMapper также добавляется в ExceptionMapper.

поэтому я изменил тип универсальности моего пользовательского MapperException: ExceptionMapper на ExceptionMapper

Может быть, мое разрешение вам не подходит, главная проблема - это ExceptionMapper.

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