я использовал трикотажную реализацию jaxrs, но я не могу использовать следующую программу, это случай, когда у меня возникают проблемы, любая идея поможет мне
в следующей программе я использовал реализацию jersy 2.x для jaxrs, я реализовал программу, используя реализацию jersy для jax-rs (restfull) 2 класса, которые я написал вместо web.xml, я использовал класс
MyResource.java
package com.rest.application; import java.util.HashSet; import java.util.Set; import javax.ws.rs.ApplicationPath; import com.rest.webservice.SampleService; @ApplicationPath("rest") public class MyResource { private Set s; public MyResource() { s=new HashSet(); s.add(new SampleService()); } public Set getSingletons() { return s; } }
SampleService.java
import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @Path("sample") public class SampleService { @GET @Produces("text/html") @Path("{username}") public String sayHello(@PathParam("username")String s) { return "<font color='blue' size=8>Hello:" +s+ "</font>"; } @GET @Produces("text/plain") public String sayBye() { return "Bye"; } }
я добавил все банки, необходимые для этой программы, но я получаю следующую ошибку
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina]. StandardHost[localhost].StandardContext[/RestApp2]] Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina]. StandardHost[localhost].StandardContext[/RestApp2]]
вроде везде такая же ошибка
когда я изменил сервер tomcat 7 на 6, он работает, но не отображает вывод, кто-нибудь знает, заранее спасибо
в джерси 2.x я получаю сообщение об ошибке, например java.util.concurrent.ExecutionException
Ответы (2)
здесь говорится, что @ApplicationPath("rest")
может применяться только к подкласс приложения.
Можете ли вы рассказать больше о том, что вы пытаетесь сделать, и что такое полная трассировка стека. Вы используете web.xml?
Как упоминалось в @MSD, ваше использование @ApplicationPath
неверно. См. документацию Джерси по адресу Развертывание приложений, чтобы увидеть все различные варианты развертывания, а также как они работают в разных средах.
По сути, самый простой способ поместить @ApplicationPath
в пустой класс Application
@ApplicationPath("/rest")
public class MyApplication extends Application {}
Это просканирует весь путь к классам на наличие аннотированных классов @Provider
и @Path
для регистрации в приложении. Хотя это может показаться проще, более распространенным подходом при работе с Джерси является использование его ResourceConfig
, который является подклассом Application
. Вы можете зарегистрировать пакеты, которые будут сканировать пакеты и подпакеты
@ApplicationPath("/rest")
public class MyApplication extends ResourceConfig {
public MyApplication() {
packages("com.my.packages");
}
}
Одним из преимуществ является то, что иногда будут аннотированные сторонние зависимости, которые вы не хотите регистрировать. Чтобы зарегистрировать отдельные классы, просто используйте register(...class)
в файле ResourceConfig
.
Теперь причина ошибки в Tomcat 7, а не 6, скорее всего, в том, что Tomcat 6 (сервлет 2.5) не имеет механизма подключаемости sevlet, который использует ServletContainerInitializer
. Реализация этого инициализатора на Джерси загружает приложение, ища @ApplicationPath
в подклассе Application
. Если вы не находитесь в среде 3.0, эта функция не будет работать.
Обратите внимание, что инициализатор Jersey включен в банку jersey-container-servlet
. Подробнее об этом можно прочитать здесь