Пользовательские сообщения об ошибках проверки правильности XML в Джерси / JAXB - PullRequest
3 голосов
/ 23 декабря 2011

Итак, у меня есть настройка службы REST с Джерси.

Мой POJO просто помечается как @ XmlRootElement

Я отправляю запрос POST в службу REST, и все работает нормально.

1 - Я отправляю в сервис некорректный XML-код. Я получаю страницу 400 Bad Request по умолчанию для контейнеров. Используя Glassfish 3, я точно не помню, но знаю, что могу изменить или сказать своему веб-приложению, чтобы он соответствовал моим собственным 400 ошибочным запросам, верно? Где я могу найти документы по этой конкретной теме.

2- Я отправляю действительный XML, но в одно из ожидаемых полей я помещаю пустое значение. Мой сервис пытается что-то сделать и выдает исключение постоянства. Я возвращаю страницу 500 Внутренних ошибок сервера по умолчанию для контейнеров и в ней выдается исключение. Я думаю, что я могу сопоставить и свою собственную страницу ошибок, но я не просто хочу показать сообщение об исключении. Это считается проблемой безопасности.

Я бы в основном хотел самостоятельно проверить поля на основе моей бизнес-логики и вернуть клиенту сообщение об ошибке, такое как «Поле1 недействительно». Ничего больше, ни меньше. И клиент должен иметь возможность анализировать код ошибки и также знать, какое поле было неправильным.

Кроме того, что я могу сделать, если в моей службе более одного типа ошибок неверного запроса? Например, поле может ожидать значение INT в диапазоне 1-3, но конкретный бизнес-запрос предполагает отправку значения 2 и 3.

Так что для проверки типа / значения я хочу просто сказать «Неверное имя поля здесь». Но для конкретной бизнес-логики скажем, например, «Неверная учетная запись» или «Срок действия учетной записи истек» или «Адрес не совпадает» и т. Д. *

Или как насчет того, когда у меня более 1 кода успеха?

В основном я беру старый сервис типа "xml" и перехожу на стиль REST для проверки концепции и приведения ее в соответствие со стандартами. Старый в значительной степени на 100% POST даже при «запросе результатов». То есть: GET. Таким образом, в основном вы отправляете в него XML, он читает XML, вызывает бизнес-логику, и логика возвращает соответствующий код в ответе XML. Так что все HTTP 200 OK и код бизнес-логики возвращается в ответе XML.Так, единственный раз, когда клиент получает ошибку 500, это когда происходит серьезный сбой, когда служба не может создать ответ XML. Даже неверный XML возвращается как 200 OK , но ответ XML указывает на это с моими собственными кодами ошибок.

Некоторое время назад мне предложили использовать SOAP для более ориентированных на сообщения сервисов, но я все еще думаю, что это слишком тяжело, и я могу достичь с помощью REST того, что делает мой сервис, даже если мне не нужна большая часть REST?

1 Ответ

3 голосов
/ 23 декабря 2011

Вы можете сопоставить исключения с ответами HTTP, используя ExceptionMappers - см .: http://jersey.java.net/nonav/documentation/1.11/jax-rs.html#d4e433 http://jsr311.java.net/nonav/releases/1.1/javax/ws/rs/ext/ExceptionMapper.html

Если вы хотите выполнить проверку еще до того, как запрос достигнет метода ресурса, вы можете попробовать написать для этого ContainerRequestFilter и выбросить WebApplicationException , который принимает Response в качестве параметра - джерси автоматически сопоставляет это исключение с ответ был инициализирован.

...