在泽西2.x我得到的错误像java.util.concurrent.ExecutionException

时间:2015-06-09 18:40:44

标签: java rest tomcat jersey jersey-2.0

  1. 我已经使用了jaxrs的球衣实现,但是iam无法对程序进行跟踪是我遇到问题的任何想法帮助我

    在下面的程序中,我使用了jaxy的jersy 2.x实现 我使用jax-rs(restfull)的jersey实现实现了该程序 我编写了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 个答案:

答案 0 :(得分:1)

This说,@ApplicationPath("rest")可能只适用于Application的子类。

您可以分享更多关于您要做什么以及完整堆栈跟踪的内容。你在用web.xml吗?

答案 1 :(得分:1)

正如@MSD所提到的,您对@ApplicationPath的使用不正确。请参阅Application Deployment上的Jersey文档,了解所有不同的部署选项,以及它们在不同环境中的工作方式。

基本上,最简单的方法是将@ApplicationPath置于空Application

@ApplicationPath("/rest")
public class MyApplication extends Application {}

这将扫描@Provider@Path带注释类的整个类路径,以便向应用程序注册。虽然这看起来更容易,但更常见的方法是在使用Jersey时使用它的ResourceConfig类,它是Application的子类。您可以注册包,它将扫描包和子包

@ApplicationPath("/rest")
public class MyApplication extends ResourceConfig {
    public MyApplication() {
        packages("com.my.packages");
    }
}

有一个好处是,有时会有注释的第三方依赖项,但您不想注册。要注册单个班级,只需使用register(...class)中的ResourceConfig

现在Tomcat 7而不是6中出错的原因很可能是因为Tomcat 6(servlet 2.5)没有使用ServletContainerInitializer的sevlet可插拔机制。此初始化程序的Jersey实现加载应用程序,在@ApplicationPath子类上查找Application。如果您不在3.0环境中,则此功能将无效。

注意Jersey初始化程序包含在jersey-container-servlet jar中。您可以阅读更多相关信息here