#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
есть ли возможность использовать aweb.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