2011-09-05 76 views
4

我有嵌入式碼頭服務器我想創建RESTful GET服務,它返回XML/JSON格式作爲響應pojo。任何人都可以給我一個基本的例子,如何編寫碼頭的處理程序?給出的示例僅顯示文本類型輸出。嵌入jetty與json/xml響應

回答

1

我建議你使用Jersey java REST框架(http://jersey.java.net/)。該框架很容易學習。您可以像JAXB一樣使用Object to Xml轉換器來讓您的生活更輕鬆。

+0

但它沒有任何嵌入式服務器的例子 – rinku

1

嗯。我有同樣的問題。 我通過一個實用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); 

然後,我有一個例子新澤西州的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; 
    } 

}

第一個電話被擊中澤西一個PERF配置的東西,但它只是桃色。

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!"); 
} 

捲曲調用看起來是這樣的:

# 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)爲許多上下文,Handlers,Servlets,JerseyServlets,StaticFiles和ExplodedWebApps完全配置Jetty8實例。結果是一個自包含的可執行Jar,幾乎毫不費力地重新啓動,重新加載,停止等。另外一個好處是它可以作爲一個僞類加載器,避免瓶頸。 (一個副作用是,mvn clean test也可以對付它)

如果有人有興趣,ping我和我可以看看公司是否允許我打開它並在GitHub上獲取它。 或者甚至通過我自己的網站http://www.randomactsofsentience.com