JAX-RS - могут ли два класса иметь одинаковый идентификатор @Path? - PullRequest
9 голосов
/ 19 апреля 2011

У меня есть веб-приложение, которое перенаправляет на определенный URI: скажем, / service / library . В другом пакете у меня есть сервер jaxrs, который прослушивает / service в URI и определяет некоторые bean-компоненты для обработки запроса. Там уже немало компонентов, и один из классов уже реализован для обработки запросов на / service / library . Я пытаюсь создать новый класс, который также обрабатывает запросы для / service / library , но с другим абсолютным путем URI, например: / service / library / mynewlibrary . У меня вопрос: возможно ли определить один и тот же идентификатор @Path в двух классах или они должны быть уникальными, другими словами, нужно ли мне использовать URI, например / service / mylibrary , для моего нового класса? реализация вместо реализации второго класса, который также использует тот же идентификатор @Path? Я довольно новичок в JAX-RS, поэтому я надеюсь, что мой вопрос имеет смысл!

Спасибо!

Ответы [ 3 ]

4 голосов
/ 19 апреля 2011

Возможно иметь две аннотации @Path, которые соответствуют URI.В вашем случае, если сервлет-отображение service, вы можете иметь @Path("/library") и @Path("library/mynewlibrary").При поступлении запроса соответствующие пути сортируются в порядке убывания, поэтому при поступлении запроса с /service/library/mynewlibrary должен вызываться второй класс.

1 голос
/ 25 апреля 2011

Скорее всего, возможно иметь два метода с одинаковой аннотацией @Path, например, если они различаются другими способами (например, методом HTTP или @Consumes аннотацией). @Path в классе действует как значение по умолчанию / root для @Path s в методах класса. Более того, это совсем не проблема, если у вас есть один путь, который находится «внутри» другого; JAX-RS указывает, что используется максимально возможное совпадение. (Я предпочитаю не делать этого таким образом, вместо этого «внешний» класс возвращает ссылку на «внутренний» класс в подходящем частичном сопоставлении, так что каждый путь имеет прослеживаемый путь к ответственности, который определенно ведет к одному классу. Это требует совсем другого способа организации аннотаций @Path.

Но если у вас есть два метода, которые могут обслуживать один и тот же входящий запрос, у вас есть конфликт, и реализация JAX-RS может свободно выбирать, какой использовать (в зависимости от реализации) , Это, вероятно, не то, что вам нужно, поскольку компьютеры, как правило, принимают неверные решения, когда им предоставляется свободный выбор.

0 голосов
/ 19 ноября 2015

Вы можете достичь своей цели иметь / service / library / mynewlibrary, используя приведенную ниже конфигурацию.

В вашем существующем классе вы настроили / service / library на уровне класса, чтобы вы могли настроить / service на уровне класса в новом добавляемом классе, а затем на уровне метода configure / library / mynewlibrary.

Таким образом, у него не будет одинакового пути для обоих классов, и ваша цель также будет достигнута. Я попробовал это, и это работает.

...