【问题标题】:Embedded jetty with Jersey or resteasy带有 Jersey 或 resteasy 的嵌入式码头
【发布时间】:2011-11-17 07:20:35
【问题描述】:

我想使用带有 JAX-RS(resteasy 或 jersey)的嵌入式码头制作 RESTful 服务。 我正在尝试使用 maven/eclipse 设置进行创建。 如果我尝试关注http://wikis.sun.com/pages/viewpage.action?pageId=21725365 链接,我将无法解决来自ServletHolder sh = new ServletHolder(ServletContainer.class); 的错误

public class Main {

    @Path("/")
    public static class TestResource {

        @GET
        public String get() {
            return "GET";
        }
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {
        ServletHolder sh = new ServletHolder(ServletContainer.class);

        /*
         * For 0.8 and later the "com.sun.ws.rest" namespace has been renamed to
         * "com.sun.jersey". For 0.7 or early use the commented out code instead
         */
        // sh.setInitParameter("com.sun.ws.rest.config.property.resourceConfigClass",
        // "com.sun.ws.rest.api.core.PackagesResourceConfig");
        // sh.setInitParameter("com.sun.ws.rest.config.property.packages",
        // "jetty");
        sh.setInitParameter("com.sun.jersey.config.property.resourceConfigClass",
            "com.sun.jersey.api.core.PackagesResourceConfig");
        sh.setInitParameter("com.sun.jersey.config.property.packages",
            "edu.mit.senseable.livesingapore.platform.restws");
        // sh.setInitParameter("com.sun.jersey.config.property.packages",
        // "jetty");
        Server server = new Server(9999);

        ServletContextHandler context = new ServletContextHandler(server, "/",
            ServletContextHandler.SESSIONS);
        context.addServlet(sh, "/*");
        server.start();
        server.join();
        // Client c = Client.create();
        // WebResource r = c.resource("http://localhost:9999/");
        // System.out.println(r.get(String.class));
        //
        // server.stop();
    }
}

即使这样也行不通。 谁能给我一些建议/教程/示例?

【问题讨论】:

    标签: jetty jersey resteasy


    【解决方案1】:

    嗯,链接页面很古老 - 最后一次更新是在 3 年前。

    你真的需要码头吗? Jersey 与 Grizzly(参见 http://grizzly.java.net)进行了出色的全面测试集成,它也充当 Glassfish 传输层,可以像在您的示例中一样使用它。

    从 Jersey 工作区查看 helloworld 示例,com.sun.jersey.samples.helloworld.Main 类启动 Grizzly 并“部署”helloworld 应用程序:http://repo1.maven.org/maven2/com/sun/jersey/samples/helloworld/1.9.1/helloworld-1.9.1-project.zip

    如果您真的需要基于码头的样品,我想我应该能够提供(请随时与我联系)。

    编辑:

    好的,如果你真的想要码头,你可以拥有它 :) 并且看起来相当简单。我按照http://docs.codehaus.org/display/JETTY/Embedding+Jetty 的指示,能够启动 helloworld 示例:

    public static void main(String[] args) throws Exception {
        Server server = new Server(8080);
        Context root = new Context(server,"/",Context.SESSIONS);
        root.addServlet(new ServletHolder(new ServletContainer(new PackagesResourceConfig("com.sun.jersey.samples.helloworld"))), "/");
        server.start();
    }
    

    http://localhost:8080/helloworld 可以访问。我使用了 Jetty 6.1.16。希望对您有所帮助!

    您可以在用户指南中找到有关在 servlet 环境中配置 Jersey 的更多信息,请参阅http://jersey.java.net/nonav/documentation/latest/

    编辑:

    依赖关系..但这有点难以指定,它最近在球衣中发生了变化..所以..

    1.10 之前:

    <dependency>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>jetty</artifactId>
        <version>6.1.16</version>
    </dependency>
    <dependency>
         <groupId>com.sun.jersey</groupId>
         <artifactId>jersey-server</artifactId>
         <version>${jersey.version}</version>
    </dependency>
    

    1.10 后:

    <dependency>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>jetty</artifactId>
        <version>6.1.16</version>
    </dependency>
    <dependency>
         <groupId>com.sun.jersey</groupId>
         <artifactId>jersey-servlet</artifactId>
         <version>${jersey.version}</version>
    </dependency>
    

    你需要这个用于码头的 maven repo:

    <repositories>
        <repository>
            <id>codehaus-release-repo</id>
            <name>Codehaus Release Repo</name>
            <url>http://repository.codehaus.org</url>
        </repository>
    </repositories>
    

    【讨论】:

    • 是的,实际上我正在寻找基于嵌入式码头的示例,您能指导我吗?
    • 好的,答案已更新,如果需要,我可以提供完整的(maven 项目)示例。
    • 嗨,这太棒了,这正是我想要的 :) 但我无法解决所有 maven 依赖项.. 你能发布所有必需的依赖项吗?感谢您的帮助:)
    • 完成。您将需要 jersey-client 等的额外依赖项,但您应该能够轻松弄清楚。
    • 您好,我收到以下错误:HTTP ERROR 503 Problem accessing /helloworld/. Reason: com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes. Caused by: javax.servlet.UnavailableException: com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes.
    【解决方案2】:

    这是一个 github 存储库,其中包含一个基于 Maven 的 HelloWorld 示例,该示例在 master 分支上为 Grizzly 配置,在“jetty”分支上为 Jetty 配置:

    https://github.com/jesperfj/jax-rs-heroku

    尽管有 repo 名称,但它不是 Heroku 特定的。通过运行 Procfile 中指定的命令来启动服务器,例如

    $ java -cp "target/dependency/*":target/classes Main
    

    【讨论】:

      【解决方案3】:

      无需 web.xml 即可轻松实现嵌入式码头

      java代码:

          final QueuedThreadPool threadPool = new QueuedThreadPool();
          threadPool.setMinThreads(2); // 10
          threadPool.setMaxThreads(8); // 200
          threadPool.setDetailedDump(false);
          threadPool.setName(SERVER_THREAD_POOL);
          threadPool.setDaemon(true);
      
          final SelectChannelConnector connector = new SelectChannelConnector();
          connector.setHost(HOST);
          connector.setAcceptors(2);
          connector.setPort(PROXY_SEVLET_PORT);
          connector.setMaxIdleTime(MAX_IDLE_TIME);
          connector.setStatsOn(false);
          connector.setLowResourcesConnections(LOW_RESOURCES_CONNECTIONS);
          connector.setLowResourcesMaxIdleTime(LOW_RESOURCES_MAX_IDLE_TIME);
          connector.setName(HTTP_CONNECTOR_NAME);            
      
          /* Setup ServletContextHandler */
          final ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
          contextHandler.setContextPath("/");
          contextHandler.addEventListener(new ProxyContextListener());
      
          contextHandler.setInitParameter("resteasy.servlet.mapping.prefix","/services");
      
          final ServletHolder restEasyServletHolder = new ServletHolder(new HttpServletDispatcher());
          restEasyServletHolder.setInitOrder(1);
      
      /* Scan package for web services*/
      restEasyServletHolder.setInitParameter("javax.ws.rs.Application","com.viacom.pl.cprox.MessageApplication");
      
          contextHandler.addServlet(restEasyServletHolder, "/services/*");
      
          final HandlerList handlers = new HandlerList();
          handlers.setHandlers(new Handler[] { contextHandler });
      
          final Server server = new Server();
          server.setThreadPool(threadPool);
          server.setConnectors(new Connector[] { connector });
          server.setHandler(handlers);
          server.setStopAtShutdown(true);
          server.setSendServerVersion(true);
          server.setSendDateHeader(true);
          server.setGracefulShutdown(1000);
          server.setDumpAfterStart(false);
          server.setDumpBeforeStop(false);
      
          server.start();
          server.join();
      

      Web 服务检测器:

      package com.viacom.pl.cprox;
      
      import java.util.HashSet;
      import java.util.Set;
      
      import javax.ws.rs.core.Application;
      
      import org.reflections.Reflections;
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      
      import com.viacom.pl.cprox.services.impl.AbstractWebServiceMethod;
      
      public class MessageApplication extends Application {
      
          private static final Logger LOGGER = LoggerFactory.getLogger(MessageApplication.class);
      
          private Set<Object> singletons = new HashSet<Object>();
      
          @SuppressWarnings("rawtypes")
          public MessageApplication() {
      
              /* Setup RestEasy */
              Reflections reflections = new Reflections("com.viacom.pl.cprox.services.impl");
      
              /*All my web services methods wrapper class extends AbstractWebServiceMethod, so it is easy to get sub set of expected result.*/
              Set<Class<? extends AbstractWebServiceMethod>> set = reflections
                      .getSubTypesOf(AbstractWebServiceMethod.class);
              for (Class<? extends AbstractWebServiceMethod> clazz : set) {
                  try {
                      singletons.add(clazz.newInstance());
                  } catch (InstantiationException e) {
                      LOGGER.error(e.getMessage(), e);
                  } catch (IllegalAccessException e) {
                      LOGGER.error(e.getMessage(), e);
                  }
              }
          }
      
          @Override
          public Set<Object> getSingletons() {
              return singletons;
          }
      }
      

      pom.xml

      <dependency>
          <groupId>org.jboss.resteasy</groupId>
          <artifactId>resteasy-jaxb-provider</artifactId>
          <version>2.2.0.GA</version>
      </dependency>
      <dependency>
          <groupId>org.reflections</groupId>
          <artifactId>reflections</artifactId>
          <version>0.9.9-RC1</version>
      </dependency>
      
      <dependency>
          <groupId>org.jboss.resteasy</groupId>
          <artifactId>resteasy-jaxrs</artifactId>
          <version>3.0.3.Final</version>
      </dependency>
      

      【讨论】:

        【解决方案4】:

        我能够在半小时内启动并运行这个 maven 原型。

        https://github.com/cb372/jersey-jetty-guice-archetype

        步骤:

        git clone https://github.com/cb372/jersey-jetty-guice-archetype.git
        mvn install
        mvn archetype:generate -DarchetypeGroupId=org.birchall \
            -DarchetypeArtifactId=jersey-jetty-guice-archetype -DarchetypeVersion=1.0
        mvn compile exec:java -Dexec.mainClass=com.yourpackage.Main
        

        非常感谢 cb372 创建了这个原型。它让一切变得如此简单。

        【讨论】:

          猜你喜欢
          • 2016-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-24
          • 1970-01-01
          • 2018-04-22
          • 1970-01-01
          相关资源
          最近更新 更多