【问题标题】:Embedded jetty with json/xml response带有 json/xml 响应的嵌入式码头
【发布时间】:2011-09-05 07:47:41
【问题描述】:

我有嵌入式码头服务器,我想创建 RESTful GET 服务,该服务返回 XML/JSON 格式的 pojo 作为响应。谁能给我一个如何编写码头处理程序的基本示例?给出的示例仅显示文本类型输出。

【问题讨论】:

    标签: java json rest jetty embedded-jetty


    【解决方案1】:

    我建议你使用 Jersey java REST framework (http://jersey.java.net/)。该框架易于学习。您可以使用像 JAXB 这样的 Object to Xml 转换器来让您的生活更轻松。

    【讨论】:

    • 但它没有嵌入式服务器的任何示例
    【解决方案2】:

    嗯。我有同样的问题。 我通过一个实用程序 jar 文件解决了这个问题,该文件读取一个属性文件来配置 Jersey Servlet、处理程序、静态文件、展开的 webapps 等的上下文,从而生成的应用程序 jar 自动配置上下文并从命令行运行。

    基本上我有一个 HandlerCollection 并连续将 servlet 添加到它。

    ServletHolder servletHolder = new ServletHolder(ServletContainer.class);
    servletHolder.setInitParameter(
      "com.sun.jersey.config.property.packages", 
      clazz.getPackage().getName()
    );
    ServletContextHandler context = new ServletContextHandler(
      server, 
      "/some_path", 
      ServletContextHandler.SESSIONS
    );
    context.setClassLoader(Thread.currentThread().getContextClassLoader());
    context.addServlet(servletHolder, "/");
    context.setHandler(handler);
    handlers.addHandler(context);
    

    然后我有一个示例 Jersey servlet:

    @Path("/user1")
    public class JerseyResource1 {
      public JerseyResource1() {
      }
      @GET
      @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
      public ExamplePojo getUser() {
        log.debug("Inside ExampleJerseyResource1 getUser()");
        ExamplePojo pojo = new ExamplePojo();
        pojo.setNumber(100);
        pojo.setWords("hello world 1");
        return pojo;
      }
    

    }

    Jersey 配置内容时,第一次调用得到了性能提升,但它的工作原理非常好。

    junit 测试如下所示:

    @BeforeClass
    public static void setUpClass() throws Exception {
        Thread startupThread = new Thread() {
    
            @Override
            public void run() {
                try {
                    System.out.println("Starting Jetty...");
                    JettyMain.main(new String[] {});
                    // CHECKSTYLE_OFF: Because it does throw Exception!
                } catch (Exception ex) {
                    // CHECKSTYLE_ON
                    System.err.println("Error Starting Jetty: " + ex);
                }
            }
        };
        startupThread.start();
        System.out.println("Waiting a few seconds to ensure Jetty is started");
        Thread.sleep(2000);
        System.out.println("Ok. Starting tests");
    }
    
    @AfterClass
    public static void tearDownClass() throws Exception {
      ClientConfig config = new DefaultClientConfig();
      Client client = Client.create(config);
      WebResource service = client.resource(
        UriBuilder.fromUri(
         "http://localhost:8080/admin/stop?secret=YourSecret"
         ).build());
        service.get(String.class);
        System.out.println("Sent stop command");
    }
    
    @Test
    public void testJersey1() {
        System.out.println("Jersey1 returns correct 200 and body");
        ClientResponse response = getService(
          "http://localhost:8080/jersey1/user1/"
          ).get(ClientResponse.class);
        assertEquals("Response is 200", 200, response.getStatus());
        assertEquals(
          "Valid body", 
          "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
          + "<examplePojo><number>100</number><words>hello world 1</words></examplePojo>", 
          response.getEntity(String.class)
        );
        System.out.println("--> WORKED!");
    }
    

    CURL 调用如下所示:

    # Show static public files folder:
    curl -v http://localhost:8080/public/x.html
    curl -v http://localhost:8080/public/x.txt
    # Use baseline handlers:
    curl -v http://localhost:8080/handler1/?url=hello
    curl -v http://localhost:8080/handler2/?url=hello
    # Use raw servlets with specific contexts:
    curl -v http://localhost:8080/servlet1?url=hello
    curl -v http://localhost:8080/servlet2?url=hello
    # Call a Jersey servlet using default Accept header (xml):
    curl -v http://localhost:8080/jersey1/user1/
    curl -v http://localhost:8080/jersey2/user2/
    # Request Jersey servlet but want JSON:
    curl -v --header "Accept:application/json" http://localhost:8080/jersey1/user1/
    # Use an exploded webapp:
    curl -v http://localhost:8080/www/x.html
    # Stop the server:
    curl -v http://localhost:8080/admin/stop?secret=MySecret
    

    呃...以下不是插件。严重地。可能会被公司拒绝……

    我有一个完整的解决方案,其中添加了 1 个 jar 文件作为依赖项和几个小文件(app.properties、classpath.sh、log4j.properties 和 run.sh),它们为众多上下文、处理程序完全配置了一个 Jetty8 实例、Servlets、JerseyServlets、StaticFiles 和 ExplodedWebApps。结果是一个自包含的可执行 Jar,它以几乎零的努力重新启动、重新加载、停止等。另一个好处是它可以充当伪类加载器并避免 jar-hell。 (副作用是 mvn clean test 也适用于它)

    如果有人感兴趣,请联系我,我可以看看公司是否允许我将其开源并在 GitHub 上发布。 或者甚至可以通过我自己的网站http://www.randomactsofsentience.com 记录它

    【讨论】:

      【解决方案3】:

      一般来说,仅供参考...我创建了一个 github 项目,我谦虚地提交它可能涵盖了大多数不断出现的嵌入式码头问题。详情请见https://github.com/ZenGirl/EmbeddedJettyRepository

      【讨论】:

        【解决方案4】:

        使用框架来处理 JSON 的序列化是要走的路。然而,这里是一个简单的例子:

        public class MyServer extends AbstractHandler
        {
            private static final int PORT = 8080;
        
            @Override
            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
                response.setContentType("application/json");
                response.setCharacterEncoding("UTF-8");
                response.getWriter().print("{ \"my_data\": \"Hello from Java!\" }");
                response.setStatus(HttpServletResponse.SC_OK);
                baseRequest.setHandled(true);
            }
        
            public static void main(String[] args) throws Exception {
                Server server = new Server(PORT);
        
                server.setHandler(new MeServer());
                server.start();
                System.out.println("Jetty started: http://localhost:" + PORT + "/");
                server.join();
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2011-11-17
          • 1970-01-01
          • 1970-01-01
          • 2014-05-24
          • 1970-01-01
          • 2014-09-25
          • 1970-01-01
          • 2020-02-02
          • 1970-01-01
          相关资源
          最近更新 更多