Встроенный причал с ответом json / xml - PullRequest
4 голосов
/ 05 сентября 2011

У меня есть встроенный джет-сервер. Я хочу создать службу RESTful GET, которая возвращает ответ в формате XML / JSON. Кто-нибудь может дать мне один основной пример, как написать обработчик для пристани? приведенный пример показывает только вывод текста типа.

Ответы [ 3 ]

1 голос
/ 26 января 2012

Хм. У меня такая же проблема. Я решил эту проблему с помощью файла jar утилиты, который считывает файл свойств для настройки контекстов для сервлетов Джерси, обработчиков, статических файлов, разорванных веб-приложений и т. Д. Таким образом, чтобы результирующий jar приложения автоматически настраивал контексты и запускался из командной строки.

По сути, у меня есть коллекция HandlerCollection, и я последовательно добавляю к ней сервлеты.

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);

Тогда у меня есть пример сервлета Джерси:

@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;
  }

}

Первые звонки получают большой успех, когда Джерси настраивает вещи, но это работает просто замечательно.

Тест 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, который перезапускается, перезагружается, останавливается и т. Д. Практически без усилий. Дополнительным преимуществом является то, что он может выступать в роли псевдоклассника и избегать адской игры. (Побочным эффектом является то, что mvn clean test также работает против него)

Если кому-то будет интересно, пингуйте меня, и я смогу посмотреть, разрешит ли компания мне его OpenSource и установить на GitHub. Или, возможно, даже документировать это через мой собственный сайт http://www.randomactsofsentience.com

1 голос
/ 24 мая 2012

Только к вашему сведению на встроенной Jetty в целом ... Я создал проект github, который я смиренно отправляю, может покрыть большинство проблем встроенной пристани, которые продолжают появляться. Подробнее см. https://github.com/ZenGirl/EmbeddedJettyRepository.

1 голос
/ 05 сентября 2011

Я предлагаю вам использовать Java REST Framework Джерси (http://jersey.java.net/). Фреймворк прост в освоении. Вы можете использовать конвертер объектов в XML, например JAXB, чтобы облегчить свою жизнь.

...