9

spark+java+hibernate+postgres でユーザーをサインアップするために何かしたい

これは私のコードです:

post("/registrar", (request, response) -> {
        EntityManagerFactory emf = Persistence.
         createEntityManagerFactory("compradorcitoPU");
         EntityManager em = emf.createEntityManager();em.getTransaction().begin();
         em.persist(u);
         em.getTransaction().commit();
         em.close(); return null; });

しかし、このエラーが表示されます:

情報 spark.webserver.MatcherFilter - 要求されたルート [/registrarnull] は Spark でマッピングされていません

4

4 に答える 4

10

同様の問題がありました。返品するアイテムは大きいので、ストリーム経由で書き出したいと思っていました。したがって、私のソフトウェアは次のようになりました。

    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」は応答です)、エラーは解消されます。

[編集] スペルと文法。

于 2015-09-26T07:46:30.297 に答える
6

「nullを返す」のではなく、空の文字列または何かを返します

于 2015-09-23T16:03:33.270 に答える
3

この問題のコメントで説明されているように、SparkJava は null を返すことはルートがマップされていないことを意味すると見なし、エラー メッセージをログに記録し、404 ステータスの応答を返します。

このような動作を避けるには、文字列 (おそらく空) を返す必要があります。エラーメッセージが消え、文字列をボディに200ステータスのレスポンスが返信されます。

于 2017-08-04T17:38:17.230 に答える