Создание RESTful веб-сервиса с Java, Eclipse. Apache Tomcat, не работает - программирование
Подтвердить что ты не робот

Создание RESTful веб-сервиса с Java, Eclipse. Apache Tomcat, не работает

Я хотел бы создать и запустить простейшее приложение RESTful на моем компьютере. Я использую язык программирования Java, на Eclipse Helios IDE, с сервером Apache Tomcat 7, в операционной системе Microsoft Windows Xp.

Я пытаюсь воспроизвести ту же процедуру этот учебник (от 3 до 3.4 шагов) на моем компьютере, но он не работа.

Вот что я сделал:

  • создан динамический проект в Eclipse с настройками Apache Tomcat 7

  • поместите файлы jar и jsr311-api-1.0 в проект \WEB-INF\lib\ каталог

  • скопировал части кода с веб-страницы в мой проект

  • щелкните правой кнопкой мыши по проекту, нажмите "Запустить как → Запустить на сервере"

  • попытался достичь http://localhost:8080/de.vogella.jersey.first/rest/hello

Но вот что я вижу:

Rest screenshot

Почему это не работает? Что я сделал не так? Почему?

Большое спасибо!

Изменить:

Вот что говорит консоль:

25-set-2012 9.35.07 org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Programmi\Java\jdk1.6.0_21\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Programmi/Java/jre6/bin/client;C:/Programmi/Java/jre6/bin;C:/Programmi/Java/jre6/lib/i386;C:\WINDOWS\;C:\WINDOWS\System32;"C:\ApacheMaven\apache-maven-3.0.4\bin";C:\WINDOWS\;C:\WINDOWS\System32;"C:\ApacheMaven\apache-maven-3.0.4\bin";C:\WINDOWS\;C:\WINDOWS\System32;"C:\ApacheMaven\apache-maven-3.0.4\bin";C:\WINDOWS\System32;C:\WINDOWS\;C:\WINDOWS\System32; C:\Programmi\R-Language\R-2.13.1\bin\;C:\Programmi\OpenVPN\bin\; C:\Programmi\Java\jdk1.6.0_21\bin\; "C:\ApacheMaven\apache-maven-3.0.4\bin";;C:\Programmi\eclipseEC;
25-set-2012 9.35.08 org.apache.tomcat.util.digester.SetPropertiesRule begin
AVVERTENZA: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:de.vogella.jersey.first' did not find a matching property.
25-set-2012 9.35.10 org.apache.coyote.AbstractProtocolHandler init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
25-set-2012 9.35.10 org.apache.coyote.AbstractProtocolHandler init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
25-set-2012 9.35.10 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 3459 ms
25-set-2012 9.35.10 org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
25-set-2012 9.35.10 org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.6
25-set-2012 9.35.11 org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: urn:com:sun:jersey:api:view is already defined
25-set-2012 9.35.12 org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: urn:com:sun:jersey:api:view is already defined
25-set-2012 9.35.12 org.apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: urn:com:sun:jersey:api:view is already defined
25-set-2012 9.35.12 org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet Jersey REST Service as unavailable
25-set-2012 9.35.12 org.apache.catalina.core.StandardContext loadOnStartup
GRAVE: Servlet /de.vogella.jersey.first threw load() exception
java.lang.ClassNotFoundException: javax.servlet.Filter
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1558)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1488)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:415)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:397)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:118)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1048)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:996)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4741)
    at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5062)
    at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5057)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)
25-set-2012 9.35.12 org.apache.coyote.AbstractProtocolHandler start
INFO: Starting ProtocolHandler ["http-bio-8080"]
25-set-2012 9.35.12 org.apache.coyote.AbstractProtocolHandler start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
25-set-2012 9.35.12 org.apache.catalina.startup.Catalina start
INFO: Server startup in 1790 ms

Может быть, какой-то класс отсутствует?

4b9b3361

Ответ 1

Чтобы решить вашу проблему, не используя Maven, вам нужно добавить грань JAX-RS в свой проект. Что здесь происходит, так это то, что Eclipse не развертывает правильные libs на сервере. Доступ к этой конфигурации осуществляется через ваш проект. Свойства | Границы проекта.

Честно говоря, я не знаю, какие конкретные банки добавить, чтобы заставить Джерси работать, потому что я использую Maven для управления зависимостями. Поэтому вместо zip файла я загрузил Jersey bundle и сконфигурировал фасет JAX-RS. Эффект этого можно увидеть в проекте Properties | Развертывание сборки, в котором уже настроены развертывания Jersey libs. Кстати, вы можете вручную настроить развернутые библиотеки на сервер.

Но потом я вспомнил, почему я использую Maven для управления зависимостями. В комплекте нет всего, что нужно для запуска Джерси. В нем отсутствует asm jar (присутствует в zip файле). Поэтому мне пришлось добавить его к пути создания проектов и вручную перенастроить сборку развертывания....

Итак, вот учебник с Maven, Jersey и Eclipse. Попробуйте и сделайте свои выводы:)

Ответ 2

Я прошел один и тот же учебник, чтобы разработать свой первый RESTFUL-сервис. В начале я также получил 404 ошибки несколько раз, поэтому я постоянно менял несколько вещей, наконец, это сработало для меня. Это то, что я сделал -

1) удалили остальную часть с вкладки URL-Pattern; Я думаю, что это по ошибке. 2) используется корневой контекст в URL, а не имя пакета.

my url is, "http://mylocalhost:8080/contextroot/classname, который определен в аннотации @path.

надеюсь, что это поможет.

Ответ 3

servlet.jar не должен находиться в результирующем файле войны (или в WEB-INF/lib). Он должен предоставляться самим сервером приложений. (см. Tomcat FAQ) Если вы используете Maven для создания проекта, вы можете установить область действия сервлета api как provided (ссылка).

Другой аналогичный вопрос здесь, на fooobar.com/questions/326346/....

Ответ 4

Я повторил ваш пример, и он работает из коробки на моей машине. Я загрузил jersey-archive-1.14.zip и помещал весь контент включенного каталога lib в WEB-INF/lib, а не только Jersey и jsr311-api-1.0 jar, как и вы.

Банки:

  • ASM-3.1.jar
  • ДЖЕКСОНА-ядро-ASL-1.9.2.jar
  • ДЖЕКСОНА-jaxrs-1.9.2.jar
  • ДЖЕКСОНА-картографа-ASL-1.9.2.jar
  • ДЖЕКСОНА-хс-1.9.2.jar
  • джерси-клиент-1.14.jar
  • джерси-ядро-1.14.jar
  • джерси-JSON-1.14.jar
  • джерси-сервер 1.14.jar
  • джерси-сервлет-1.14.jar
  • отстрелить-1.1.jar
  • jsr311-апи-1.1.1.jar

Некоторые из них могут быть ненужными, вы можете попытаться их уменьшить. Но начните со всех них.

Однако сообщение об ошибке странно. В нем говорится, что javax.servlet.Filter отсутствует, что должно <your tomcat dir>/lib/servlet-api.jar. Этот файл всегда находится в пути к классам при запуске tomcat.

Ответ 5

Вам нужно удалить servlet.jar или любой другой jar, содержащий javax.servlet.Filter из вашего каталога WEB-INF/lib.

В то время как вам понадобится класс javax.servlet.Filter для вашего класса пути к компиляции, чтобы образец кода был скомпилирован, вам необходимо убедиться, что вы не включили этот класс в свой webapp. С загрузчика класса Tomcat HOWTO:

Когда Tomcat запущен, он создает набор загрузчиков классов, которые организованы в следующие отношения родитель-ребенок, где загрузчик родительского класса находится выше загрузчика дочерних классов:

  Bootstrap
      |
   System
      |
   Common
   /     \   

Webapp1 Webapp2...

В принципе, (возможно) servlet.jar в webapp, вероятно, не найден должным образом d/t безопасности, настроенной в контейнере Tomcat.

Вы можете увидеть, загружен ли javax.servlet.Filter из странного местоположения, включив многословную загрузку класса verbose:class. Найдите класс, если он не из библиотеки Tomcat, это, скорее всего, ваша проблема.

Ответ 6

Может быть, вам не хватает servlet-api.jar. Добавьте последнюю банку в свой /WEB -INF/lib или путь к классам и посмотрите, работает она или нет.

Ответ 7

Кажется, что он не находит барабаны с сервлетами в классе. Обязательно включите их. Я предполагаю, что вы упаковываете в войну и развертываете, прежде чем тестируете это право. Поэтому просто проверьте, включает ли война все банки, которые были доступны вашему приложению во время компиляции.

Ответ 8

Как и предыдущие ответы. Вам не хватает некоторых банок. Вы можете добавить эти файлы jar в папку Project > WebContent > WEB-INF > lib > или в папку вашего веб-сервера lib (например, \apache-tomcat\lib).

Попробуйте вставить список или скриншот из ваших обеих папок lib, если вы хотите, чтобы мы рассказали вам, какой именно банку вам не хватает.

Надеюсь, что это поможет

Ответ 9

Насколько я могу судить, вы запускаете Tomcat из Eclipse. Возможно, вы не используете установочный каталог на своем компьютере (то есть тот, на котором вы скопировали JAR), но на самом деле используете временную копию, которую создает Eclipse локально (извините, я не на моем компьютере-разработчике, поэтому не можете проверить детали)?

Из памяти у вас есть 2 варианта:

  • Вам нужно изменить (рабочий) каталог, который Eclipse использует для Tomcat, чтобы он был тем, где у вас действительно есть файлы Tomcat.

  • Вам нужно добавить JARs в Tomcat в Eclipse с интерфейсом GUI в Eclipse.

В качестве альтернативы, я мог бы быть совершенно не прав, -)

EDIT: Включая скриншот бит, о котором я говорю.

Для моих вариантов выше:

  • См. раздел "Северные местоположения" в середине, который должен быть в том, что "принимает контроль над установкой tomcat".
  • Вы добавляете их на вкладку пути к классу, когда вы нажимаете ссылку "Открыть запуск" в поле "Общая информация" на изображении ниже.

enter image description here

Ответ 10

Вы должны добавить все банки, которые вы найдете в архиве jersey 1.6, загрузите этот архив и добавьте все банки в WebContent/WEB-INF/lib вашего проекта.

Ответ 11

У меня была эта ошибка более одного дня! Оказывается, проблема связана с использованием разных версий Джерси. Если вы замените контент web.xml содержимым, представленным ниже, все будет в порядке!

    <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>    
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>de.vogella.jersey.first</param-value>
    </init-param>
    <init-param>
     <param-name>unit:WidgetPU</param-name>
     <param-value>persistence/widget</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>

Надеюсь, мой ответ сэкономит много времени для кого-то, кто также решает следовать одному и тому же учебнику!

Ответ 12

Удалите файл servlet.jar из папки WEB-INF/lib. Servlet.jar не должно быть там, это фиксировало проблему для меня.

Ответ 13

У меня также была проблема с HTTP Status 404, следуя тому же учебнику.

Сначала я попытался установить грань проекта JAX-RS в Eclipse с помощью либо библиотек Jersey 1.18 и 2.15, но и не работал.

Наконец, я решил проблему, заменив имя пакета (de.vogella.jersey.first) в URL-адресе с помощью корня контекста (т.е. название проекта затмения).

Этот учебник от mkyong.com дал мне подсказку, чтобы найти решение. В любом случае, я не знаю, является ли имя пакета в URL определенно ошибкой или имеются некоторые детали конфигурации, которые могли бы заставить его работать.