При использовании регулярного выражения для фрагментов @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
suman j 26 Мар 2014 в 18:27

2 ответа

Лучший ответ

Вы можете использовать ContainerRequestFilter, чтобы перехватывать запросы до того, как они попадут в API, и использовать внедренный UriInfo, чтобы определить, существует ли элемент пути пользователя. Если есть, проверьте действительность имени пользователя.

Однако я хотел бы отметить, что я не думаю, что 400 - это разумный ответ. В синтаксисе запроса нет ничего плохого.

3
Eric Stein 26 Мар 2014 в 18:40
Я согласен. А 404 не имеет смысла. Запрос не выполняется, потому что это неверный запрос. Настройка сообщения имеет смысл, но не изменение кода состояния.
 – 
Edwin Dalorzo
26 Мар 2014 в 19:08
Спасибо Эрик. Я только что отредактировал вопрос. Использую Джерси 1.17. Будет искать использование ContainerRequestFilter в Jersey 1.x и попробовать.
 – 
suman j
26 Мар 2014 в 20:00
Документация невелика, но интерфейс ContainerRequestFilter существует в javadoc API. Возможно, вам придется немного поискать/поиграться, чтобы заставить его работать.
 – 
Eric Stein
26 Мар 2014 в 20:09
@Eric, ContainerRequestFilter - это функция нового JAX-RS 2.0, а Джерси 1.0 реализует JAX-RS 1.1. Во всяком случае, полезный ответ для некоторых людей.
 – 
V G
26 Мар 2014 в 20:16
Ну, признаюсь, я смотрю на Джерси, а не на JAX-RS, но очевидно, что интерфейс там: jersey.java.net/apidocs/1.17/jersey/com/sun/jersey/spi/…
 – 
Eric Stein
26 Мар 2014 в 20:21

Чтобы добавить к ответу @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 {

    }


1
suman j 26 Мар 2014 в 22:10
Узнавайте что-то новое каждый день. :-)
 – 
Eric Stein
26 Мар 2014 в 23:13