it-swarm.com.ru

Учебник по созданию веб-сервисов 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

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

16
DavideChicco.it

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

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

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

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

22
Gilson Costa

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

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

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

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

3
Aruna

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

Еще один похожий вопрос здесь о StackOverflow .

2
Jiri Kremser

Я повторил ваш пример, и он работает из коробки на моей машине. Я скачал 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
  • джерси-1.14.jar JSON-
  • джерси-сервер 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.

2
ChrLipp

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

Хотя вам потребуется класс javax.servlet.Filter в вашем пути к классам для компиляции, чтобы пример кода компилировался, вы должны убедиться, что вы не включили этот класс в свое веб-приложение. От загрузчика класса Tomcat HOWTO:

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

  Bootstrap
      |
   System
      |
   Common
   /     \   

Webapp1 Webapp2 ...

По сути, (вероятно) servlet.jar в веб-приложении, вероятно, не найден должным образом из-за безопасности, настроенной в контейнере Tomcat. 

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

1
stevedbrown

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

0
Ajit

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

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

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

0
Ellipsis

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

0
Jeevan Patil

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

Сначала я попытался установить JAX-RS Project Facet в Eclipse с библиотеками Джерси 1.18 и 2.15, но это не сработало.

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

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

0
Luigi Martin Petrella

У меня была эта ошибка больше одного дня! Оказывается, проблема заключается в использовании разных версий Джерси. Если вы замените содержимое 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>

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

0
binte

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

0
Amrit

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

0
user1707141

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

По памяти у вас есть 2 варианта:

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

  2. Вам нужно добавить JAR-файлы в Tomcat в Eclipse с графическим интерфейсом в Eclipse. 

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

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

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

  1. См. «Северные местоположения», в середине должен быть тот, который «Управляет установкой Tomcat».
  2. Вы добавляете их на вкладке classpath, когда нажимаете ссылку «Открыть конфигурацию запуска» в поле «Общая информация» на изображении ниже. 

enter image description here

0
Doddie