【问题标题】:Integrating Jetty with JAX-RS-Jersey将 Jetty 与 JAX-RS-Jersey 集成
【发布时间】:2012-04-20 08:07:08
【问题描述】:

在对 web 和 * 进行了详尽的搜索之后,我仍然试图弄清楚如何将 Jersey 提供的 RESTlet 样式接口与 Jetty 集成。

我的 Jetty 服务器已启动并正在运行,因此 Jersey 似乎也很容易使用,有人知道如何将两者联系在一起吗?任何具体的链接都会有所帮助——我对 servlet 编程也有点陌生。

【问题讨论】:

    标签: java servlets jetty jersey jax-rs


    【解决方案1】:

    不久前,我使用 Jetty 和 Jersey 创建了一个应用程序。它只是一个标准的 webapp:

    web.xml:

    <servlet>
        <servlet-name>rest.service</servlet-name>
        <servlet-class>
            com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
            <param-value>com.sun.jersey.api.core.PackagesResourceConfig</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>your.package.with.jersey.resources</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>rest.service</servlet-name>
        <url-pattern>/service/*</url-pattern>
    </servlet-mapping>
    

    休息资源:

    package your.package.with.jersey.resources;
    
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.Context;
    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.core.SecurityContext;
    
    @Path("login")
    public class LoginResource {
    
        @Context
        private SecurityContext security;
    
        @GET
        @Produces(MediaType.APPLICATION_XML)
        public String login() {
    
            String email = security.getUserPrincipal().getName();
            return "ok";
        }
    }
    

    码头启动器:

    public class StartJetty {
    
        public static void main(String[] args) throws Exception {
    
            Server server = new Server();
            SocketConnector connector = new SocketConnector();
            // Set some timeout options to make debugging easier.
            connector.setMaxIdleTime(1000 * 60 * 60);
            connector.setSoLingerTime(-1);
            connector.setPort(8080);
            server.setConnectors(new Connector[] { connector });
    
            WebAppContext bb = new WebAppContext();
            bb.setServer(server);
            bb.setContextPath("/");
            bb.setWar("src/main/webapp");
    
            server.addHandler(bb);
    
            try {
                System.out.println(">>> STARTING EMBEDDED JETTY SERVER, PRESS ANY KEY TO STOP");
                server.start();
                while (System.in.available() == 0) {
                    Thread.sleep(5000);
                }
                server.stop();
                server.join();
            } catch (Exception e) {
                e.printStackTrace();
                System.exit(100);
            }
        }
    }
    

    pom.xml:

    <!-- Jetty -->
    <dependency>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>jetty</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>jetty-util</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>jetty-management</artifactId>
    </dependency>
    
    <!-- Jersey (JAX-RS) -->
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey.contribs</groupId>
        <artifactId>jersey-spring</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>jsr311-api</artifactId>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-test-framework</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.sun.grizzly</groupId>
        <artifactId>grizzly-servlet-webserver</artifactId>
    </dependency>
    
    (...)
    
    <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>maven-jetty-plugin</artifactId>     
    </plugin>
    

    希望这些 sn-ps 为您指明正确的方向。

    【讨论】:

    • 谢谢,这或多或少是我想要的——尽管我将一些 .xml 内容抽象到 Java 代码中——让我少做一件事情!
    • 您还需要 web.xml 中的 ContextLoaderListener 和 web-inf 中的 applicationContext.xml
    • 你为什么要依赖 grizzly?
    • @Staineart 好问题。两种选择中的任何一种:1)由于某种原因我忘记了添加此依赖项时发现它起作用了 2)我复制了粘贴的依赖项并且没有费心检查每个依赖项。如果您发现它在没有灰熊的情况下也能正常工作,请告诉我们。
    • 谢谢。 @pk11 你介意将你从 web.xml 中提取的内容分享到 java 中吗?我很想知道,因为目前我的服务器没有加载球衣资源,除了 web.xml 没有正确加载之外,我找不到原因。我宁愿用java来做这个,移植起来会更容易。
    【解决方案2】:

    您可能希望查看 Dropwizard 以了解 Jetty、Jersey、Jackson、Logback/Log4j/JUL/CJL 和 JDBI 之间的开箱即用集成,所有这些都使用 Yammer Metrics 进行了很好的检测。

    【讨论】: