ExceptionMapper не вызывается при получении недействительного JSon
Я использую Джерси 2.5.1 с Джексоном 2.2. для построения веб-сервисов JSON Rest. Я вроде как установил и запустил также 2 ExceptionMappers, но для запроса "не-json" приложение не выдает никаких исключений!
ExceptionMapper Будет вызываться, если, например, выброшено исключение NullPointerException
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.