При использовании регулярного выражения для фрагментов @Path среда выполнения Jersey возвращает 404 для ресурсов, которые не соответствуют шаблону регулярного выражения. Есть ли способ настроить это поведение и вернуть 400 (BAD_REQUEST) или добавить содержательное сообщение в ответ?
@Path("users/{username: [a-zA-Z][a-zA-Z_0-9]}")
Если ресурс вызывается с помощью users / 1243, это приводит к 404. Я хотел бы добавить ответное сообщение о допустимых шаблонах имени пользователя. Я мог бы переместить валидацию в метод Restful и выполнить валидацию. Но это утомительно. У меня есть десятки методов, и мне нужно было бы вызвать валидацию из всех этих методов.
РЕДАКТИРОВАТЬ: Я использую Джерси 1.17 и не могу использовать Джерси 2.0 из-за воздействия приложения.
2 ответа
Вы можете использовать ContainerRequestFilter
, чтобы перехватывать запросы до того, как они попадут в API, и использовать внедренный UriInfo
, чтобы определить, существует ли элемент пути пользователя. Если есть, проверьте действительность имени пользователя.
Однако я хотел бы отметить, что я не думаю, что 400 - это разумный ответ. В синтаксисе запроса нет ничего плохого.
Чтобы добавить к ответу @Eric Stein, наличие регулярного выражения в @Path приведет к 404 без выполнения методов фильтрации. Таким образом, проверка должна выполняться внутри метода фильтрации. Чтобы прервать вызов и вернуть настроенный ответ из фильтра, используемого ниже, код.
//groovy code
class MyCustomFilter implements ContainerRequestFilter
{
@Override
public ContainerRequest filter(ContainerRequest request) {
//do the validation for the resource URI and abort flow for errors
throw new WebApplicationException(Response.status(Response.Status.NOT_FOUND).entity("Not valid input").build())
...
..
//for success scenarios, return the request with optional customization
return request;
}
}
@ResourceFilters(MyCustomFilter)
@Path('/users/{userId}/scripts')
class MyJaxRsResource {
}
Похожие вопросы
Новые вопросы
rest
REST (Transfer State Transfer) - это стиль архитектуры программного обеспечения для распределенных гипермедиа систем, таких как World Wide Web. Его популярность возросла по сравнению с архитектурами RPC, такими как SOAP, из-за внутренней разобщенности клиента с сервером, возникающей из-за наличия единого интерфейса между гетерогенными системами.
ContainerRequestFilter
- это функция нового JAX-RS 2.0, а Джерси 1.0 реализует JAX-RS 1.1. Во всяком случае, полезный ответ для некоторых людей.