Я изучаю JAX-RS (он же JSR-311), используя Джерси. Я успешно создал корневой ресурс и играю с параметрами:
@Path("/hello")
public class HelloWorldResource {
@GET
@Produces("text/html")
public String get(
@QueryParam("name") String name,
@QueryParam("birthDate") Date birthDate) {
// Return a greeting with the name and age
}
}
Это прекрасно работает и обрабатывает любой формат в текущей локали, который понимается конструктором Date (String) (например, YYYY / mm / dd и mm / dd / YYYY). Но если я предоставлю недопустимое или непонятное значение, я получу ответ 404.
Например:
GET /hello?name=Mark&birthDate=X
404 Not Found
Как я могу настроить это поведение? Может быть, другой код ответа (вероятно, «400 Bad Request»)? Как насчет регистрации ошибки? Может быть, добавить описание проблемы («неверный формат даты») в пользовательский заголовок, чтобы помочь в устранении неполадок? Или вернуть полный ответ об ошибке с деталями вместе с кодом статуса 5xx?
ExceptionMapper
интерфейса (который лучше, чем расширение). Подробнее здесь vvirlan.wordpress.com/2015/10/19/…Создать выше класс. Это будет обрабатывать 404 (NotFoundException), и здесь в методе toResponse вы можете дать свой собственный ответ. Точно так же есть ParamException и т. Д., Которые вам необходимо сопоставить, чтобы предоставить настраиваемые ответы.
источник
Джерси генерирует исключение com.sun.jersey.api.ParamException, когда ему не удается разобрать параметры, поэтому одним из решений является создание ExceptionMapper, который обрабатывает следующие типы исключений:
источник
Вы также можете написать повторно используемый класс для аннотированных переменных QueryParam
затем используйте это так:
Хотя обработка ошибок в этом случае тривиальна (генерируется ответ 400), использование этого класса позволяет вообще исключить обработку параметров, которая может включать ведение журнала и т. Д.
источник
DateParam
выше, который оборачиваетorg.joda.time.DateTime
вместоjava.util.Calendar
. Вы используете это с собой,@QueryParam
а не сDateTime
собой.JodaModule
ObjectMapper
registerModules
метод, который можно зарегистрировать методом. Он может обрабатывать все преобразования типа Joda.com.fasterxml.jackson.datatype.joda.JodaModule
Одно очевидное решение: взять строку, преобразовать в дату самостоятельно. Таким образом, вы можете определить желаемый формат, перехватывать исключения и либо перебрасывать, либо настраивать отправляемую ошибку. Для анализа SimpleDateFormat должен работать нормально.
Я уверен, что есть способы подключить обработчики для типов данных, но, возможно, в этом случае вам понадобится немного простого кода.
источник
Мне тоже нравится StaxMan , вероятно, реализовал бы этот QueryParam в виде строки, а затем обработал бы преобразование, перебрасывая при необходимости.
Если специфичным для локали является желаемое и ожидаемое поведение, вы должны использовать следующее для возврата ошибки 400 BAD REQUEST:
throw new WebApplicationException(Response.Status.BAD_REQUEST);
Посмотрите JavaDoc для javax.ws.rs.core.Response.Status для большего количества вариантов.
источник
Документация @QueryParam гласит
Если вы хотите контролировать, какой ответ отправляется пользователю, когда параметр запроса в строковой форме не может быть преобразован в тип T, вы можете вызвать исключение WebApplicationException. Dropwizard поставляется со следующими * классами Param, которые вы можете использовать для своих нужд.
BooleanParam, DateTimeParam, IntParam, LongParam, LocalDateParam, NonEmptyStringParam, UUIDParam. См. Https://github.com/dropwizard/dropwizard/tree/master/dropwizard-jersey/src/main/java/io/dropwizard/jersey/params
Если вам нужен Joda DateTime, просто используйте Dropwizard DateTimeParam .
Если приведенный выше список не соответствует вашим потребностям, определите свой собственный, расширив AbstractParam. Переопределить метод разбора. Если вам нужно контролировать тело ответа об ошибке, переопределите метод ошибки.
Хорошая статья от Coda Hale об этом на http://codahale.com/what-makes-jersey-интереing-parameter-classes/
Конструктор Date (String arg) устарел. Я бы использовал классы дат Java 8, если вы используете Java 8. В противном случае рекомендуется использовать дату и время joda.
источник
Это правильное поведение на самом деле. Джерси попытается найти обработчик для вашего ввода и попытается построить объект из предоставленного ввода. В этом случае он попытается создать новый объект Date со значением X, предоставленным конструктору. Поскольку это недопустимая дата, по соглашению Джерси вернет 404.
Что вы можете сделать, это переписать и поставить дату рождения в виде строки, затем попытаться проанализировать, и если вы не получите то, что вы хотите, вы можете свободно генерировать любое исключение, которое вы хотите, с помощью любого из механизмов отображения исключений (есть несколько ).
источник
Я столкнулся с той же проблемой.
Я хотел поймать все ошибки в одном месте и преобразовать их.
Ниже приведен код того, как я справился с этим.
Создайте следующий класс, который реализует
ExceptionMapper
и добавьте@Provider
аннотацию для этого класса. Это обработает все исключения.Переопределите
toResponse
метод и верните объект Response, заполненный настроенными данными.источник
Подход 1: Расширяя класс WebApplicationException
Создайте новое исключение, расширив WebApplicationException
Теперь выбрасывайте RestException, когда это необходимо.
Вы можете увидеть полное заявление по этой ссылке .
Подход 2: реализовать ExceptionMapper
Следующий маппер обрабатывает исключение типа «DataNotFoundException»
Вы можете увидеть полное заявление по этой ссылке .
источник
Так же, как расширение ответа @Steven Lavine, если вы хотите открыть окно входа в браузер. Мне было трудно правильно вернуть Response ( MDN HTTP Authentication ) из фильтра, если пользователь еще не прошел аутентификацию
Это помогло мне построить Response для принудительного входа в браузер, обратите внимание на дополнительную модификацию заголовков. Это установит код состояния на 401 и установит заголовок, который заставляет браузер открывать диалог имени пользователя / пароля.
источник