Развертывание ресурсов Джерси в контейнере с поддержкой API Servlet 3.0 завершается с треском

#java #jetty #jersey #jax-rs #servlet-3.0

#java #причал #джерси #jax-rs #сервлет-3.0

Вопрос:

(Я случайно удалил суть, на которую я ссылаюсь в этом вопросе; извините за неудобства.)

Вопрос

Я пытаюсь использовать Servlet 3.0 API для развертывания корневых ресурсов Джерси (с аннотацией @Path аннотации), следуя руководству пользователя Джерси.

Я создал gist на GitHub, содержащий два класса: Foo.java который является подклассом Application , который предоставляет Bar.java (класс ресурсов) через его getClasses() метод. ( pom.xml Тоже есть, так что любой может легко попробовать это для себя.)

Однако, когда я пытаюсь развернуть упакованный war в экземпляре Jetty 8.0.x, я получаю вывод, доступный здесь, в pastebin.

Foo.java вызывается, его getClasses() метод тоже вызывается, хотя Bar.java никогда не вызывается.

Я могу получить доступ к странице приветствия Jetty по адресу http://localhost:8080/ , однако я не могу получить http://localhost:8080/foo доступ к or http://localhost:8080/foo/bar . Последние два приводят к следующей ошибке:

ОШИБКА не найдена

пользовательская страница 404

В чем может быть проблема? Я делаю что-то не так здесь?

Ответ

Учитывая ВОЙНУ, которую я использовал ( test-0.0.1-SNAPSHOT.war ), мой путь к приложению стал http://localhost:8080/test-0.0.1-SNAPSHOT/foo/bar вместо http://localhost:8080/foo/bar . Видите, что я там сделал? Хорошо. Запечатлейте это в своем сознании, люди, или потеряете от 3 до 5 драгоценных часов своей жизни!

Ответ №1:

ОК. Я решил проблему.

Путь моего приложения указан не at http://localhost:8080/foo/bar , а at http://localhost:8080/<the name of my war file>foo/bar . Итак, учитывая pom.xml , что я опубликовал, это становится http://localhost:8080/test-0.0.1-SNAPSHOT/foo/bar .

Я ненавижу файлы ВОЙНЫ.

Ответ №2:

У вас есть один вызов с @Path , в то время как у другого есть @ApplicationPath без @Path в методе.

Как вы можете здесь,

JAX-RS API (начиная с версии 1.1.4) ввел специальную аннотацию ( @javax.ws.rs.ApplicationPath ), которая предоставляет альтернативу web.xml конфигурация:

Но вам понадобится хотя бы @Path для вызываемого метода. Однако проще всего, вероятно, начать с классического старого web.xml , затем используя @Path для ресурсов. В Интернете вы найдете множество примеров, в то время как @ApplicationPath не является распространенным.

Комментарии:

1. You've got one call with @Path, while the other have @ApplicationPath with NO @Path on the method. Какой метод должен иметь дополнительную @Path аннотацию? Вы говорите, что у этого Bar#bar() должна быть @Path аннотация? Тогда я думаю, что вы ошибаетесь. @Path("bar") поверх Bar.java и @GET на его bar() метод указывает, что bar() будет (или должен) вызываться по GET запросу на http://localhost:8080/foo/bar . Кроме этого: @ApplicationPath есть ли возможность использовать a web.xml , что он делает отлично. log Говорится, что путь .../foo/* зарегистрирован.

2. Я думаю, у вас должен быть @Path в Foo.getClass, потому что сервлет знает только, как найти путь к ресурсу, но не правильный метод. Возможно, я ошибаюсь, у меня есть nerver user ApplicationPath, потому что он появился совсем недавно.

3. Foo.java это не ресурс JAX-RS, а Application . Аннотирование его с @ApplicationPath("foo") помощью, по сути, означает, что вы создаете сервлет для Джерси <url-pattern>/foo/*</url-pattern> . Это работает без сбоев. Однако я пробовал аннотировать Foo.java с @Path("foo") помощью, но это ничего не дало.

4. Хорошо, я получил материал для приложения 🙂 Похоже, что GET localhost:8080/foo/bar должен выполнять эту работу до тех пор, пока сервер может извлекать класс приложения при запуске. У вас есть прекрасные CLASSESCLASSESCLASSESCLASSESCLASSESCLASSESCLASSESCLASSESCLASSES! где-то отображается? Какой сервер вы используете?

5. Пожалуйста, обратитесь к вопросу… В любом случае, журнал, на который я ссылался, содержит прекрасные строки, которые вы упомянули, также я упомянул, что я использую Jetty.

Ответ №3:

Хотя это не было вашей проблемой, если вы пытаетесь выполнить развертывание в Jetty 8 в Cargo, вы, вероятно, столкнулись бы с этой ошибкой: http://jira.codehaus.org/browse/CARGO-1133