Ошибки Bean Validation 400 возвращают страницу ошибок по умолчанию (html) вместо сущности ответа (json)

У меня есть набор тестов JUnit: GrizzlyHttpServerFactory + Jersey + Bean Validation (jersey-container-grizzly2-servlet/jersey-bean-validation ver 2.12, grizzly-http-server ver 2.3.16, hibernate-validator ver 5.0.0.Final)

400 ошибок, сгенерированных ValidationException, возвращают страницу ошибок Grizzly по умолчанию (html) вместо сущности ответа Bean Validation (json). Я пробовал ClientResponseFilter, и его entityStream также содержит страницу ошибки html.

Когда я запускаю систему под Tomcat, исключения ValidationException возвращают ответ с сущностью в формате json.

Любые идеи о том, как настроить Grizzly/Jersey/Validator, чтобы НЕ возвращать страницу ошибки (html) и помещать ValidationExceptions в Response entityStream, как Tomcat?

Заранее спасибо,

Майк Норман


person mwnorman    schedule 10.09.2014    source источник
comment
Пожалуйста. поделитесь своим кодом, я могу посмотреть, когда будет время. Спасибо.   -  person alexey    schedule 25.09.2014
comment
Алексей: Я выложил тестовый проект на гитхаб: github.com/mwnorman/grizzly-error- страница   -  person mwnorman    schedule 30.09.2014
comment
Создан java.net/jira/browse/JERSEY-2673.   -  person mwnorman    schedule 01.10.2014
comment
@mwnorman Вы придумали какое-нибудь решение этой проблемы? Я столкнулся с той же проблемой. Решение, рекомендованное Томом, мне не подходит.   -  person kinkee    schedule 22.06.2015
comment
@kinkee, ты видишь проблему даже с тестовым проектом mwnorman? Думаю, я что-то упускаю, потому что этот проект отлично работает на моей машине.   -  person Michal Gajdos    schedule 03.07.2015


Ответы (2)


После изучив код, на который указал Алексей для Джерси 2.13, я обнаружил, что рассматриваемого пути кода можно избежать, установив для свойства jersey.config.server.response.setStatusOverSendError значение "true".

Итак, в качестве обходного пути, пока JERSEY-2673 не будет исправлено, я просто поместил property(ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR, "true"); в свой ResourceConfig и смог увидеть пользовательские ответы на ошибки в браузере.

person Tom    schedule 21.01.2015
comment
Большое спасибо Том - я попробую это немедленно1 - person mwnorman; 21.01.2015

Я пошел бросить код Джерси и похоже, что Джерси работает так, и ИМО, это просто совпадение, что он отлично работает на Tomcat. Джерси обрабатывает ошибки валидации (и, возможно, не только валидации) следующим образом:

  1. org.glassfish.jersey.message.internal.CommittingOutputStream#flushBuffer(boolean)

    записывает сообщение об ошибке JSON в OutputStream сервлета;

  2. #P4# #P5#
    #P6#
    #P7#

Я предлагаю зарегистрировать проблему в системе отслеживания проблем Джерси https://java.net/jira/browse/JERSEY

person alexey    schedule 01.10.2014
comment
Создан java.net/jira/browse/ДЖЕРСИ-2673 - person mwnorman; 01.10.2014