4

応答としてXML/JSON形式のpojoを返すRESTfulGETサービスを作成したいJettyサーバーを組み込みました。誰かが私に桟橋のハンドラーを書く方法の1つの基本的な例を教えてもらえますか?与えられた例は、テキストタイプの出力のみを示しています。

4

4 に答える 4

1

組み込み桟橋全般についての参考までに...私は謙虚に提出するgithubプロジェクトを作成しました。これは、発生し続ける組み込み桟橋の問題のほとんどをカバーする可能性があります。詳細については、 https://github.com/ZenGirl/EmbeddedJettyRepositoryを参照してください。

于 2012-05-24T02:21:32.543 に答える
1

Jersey java RESTフレームワーク(http://jersey.java.net/)を使用することをお勧めします。フレームワークは簡単に習得できます。JAXBのようなObjectからXmlへのコンバーターを使用して、作業を楽にすることができます。

于 2011-09-05T08:27:08.600 に答える
1

うーん。私も同じ問題を抱えていました。結果のアプリケーションjarがコンテキストを自動的に構成し、コマンドラインから実行されるように、プロパティファイルを読み取ってジャージーサーブレット、ハンドラー、静的ファイル、展開されたWebアプリケーションなどのコンテキストを構成するユーティリティ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);

次に、Jersey サーブレットの例を示します。

@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) が多数のコンテキスト、ハンドラー、サーブレット、 JerseyServlets、StaticFiles、および ExplodedWebApps。その結果、再起動、リロード、停止などをほぼゼロの労力で実行できる自己完結型の実行可能 Jar が作成されます。追加の利点は、疑似クラスローダーとして機能し、jar 地獄を回避できることです。(副作用は、 mvn clean test がそれに対しても機能することです)

興味のある人は、私に連絡してください。会社がそれをオープンソース化し、GitHub にアップすることを許可してくれるかどうかを確認できます。または、自分のサイトhttp://www.randomactsofsentience.comで文書化することもできます。

于 2012-01-26T02:12:55.933 に答える
0

フレームワークを使用して 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();
    }
}
于 2019-09-02T05:23:52.480 に答える