同様の問題がありました。返品するアイテムは大きいので、ストリーム経由で書き出したいと思っていました。したがって、私のソフトウェアは次のようになりました。
post("/apiserver", "application/json", (request, response) -> {
log.info("Received request from " + request.raw().getRemoteAddr());
ServerHandler handler = new ServerHandler();
return handler.handleRequest(request, response);
});
ハンドラーで生の HttpResponse オブジェクトを取得し、その OutputStream を開き、次のように上書きしました。
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(response.raw().getOutputStream(), records);
呼び出し元がその時点 (またはエラー) で要求したものを OutputStream に上書きしたことはわかっていたので、null を返すだけでよいと考えました。私のプログラムはうまくいきました。Spark は、期待どおりに要求をハンドラーにルーティングします。そして、私は生の OutputStream を上書きしていたので、クライアント側で期待されていたものを返していました。しかし、サーバーログに「/apiserver route not defined」というメッセージが表示され続けました。
Sparkのドキュメントを見ると、次のように書かれています:
Spark アプリケーションの主要な構成要素は一連のルートです。ルートは、次の 3 つの単純な部分で構成されます。
動詞 (get、post、put、delete、head、trace、connect、options)
パス (/hello、/users/:name)
コールバック (リクエスト、レスポンス) -> { }
明らかに、Spark は生の HttpResponse に何を書き込んだかを認識していません。Web サーバーとして、呼び出し元に何らかの応答を提供する必要があります。そのため、応答が null の場合、コールバックを提供する要件を満たしていないため、Spark が期待どおりに動作した場合でも、マップが見つからないというエラーが発生します。応答を返すだけで (null は応答ではなく、「200 OK」は応答です)、エラーは解消されます。
[編集] スペルと文法。