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; });
しかし、このエラーが表示されます:
INFOspark.webserver.MatcherFilter-要求されたルート[/ registrarnull]はSparkにマップされていません
私も同様の問題を抱えていました。返品する商品は大きいので、ストリームで書きたかったのです。だから、私のソフトウェアは次のようになりました:
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ルートが定義されていません」。
Sparkのドキュメントを見ると、次のようになっています。
Sparkアプリケーションの主要な構成要素は、ルートのセットです。ルートは、次の3つの単純な部分で構成されています。
動詞(get、post、put、delete、head、trace、connect、options)
パス(/ hello、/ users /:name)
コールバック(要求、応答)-> {}
明らかにSparkは、生のHttpResponseに何を書き込んだかわからないため、Webサーバーとして、呼び出し元に何らかの応答を提供する必要があります。したがって、応答がnullの場合、実行されていません。コールバックを提供するための要件で、Sparkが期待どおりに動作した場合でも、マップが見つからないというエラーが発生します。応答を返すだけです(nullは応答ではなく、 "200 OK"は)エラーはなくなります。
[編集]スペルと文法。
「nullを返す」のではなく、空の文字列などを返します
この issue のコメントで説明されているように、SparkJavaは、nullを返すことはルートがマップされていないことを意味すると見なし、エラーメッセージをログに記録し、応答に404ステータスで応答します。
このような動作を回避するには、文字列(おそらく空)を返す必要があります。エラーメッセージが消え、文字列が本文で200ステータスの応答が返されます。
私の場合、プリフライトCORSチェックを満足させるためにオプションリクエストを実装する必要がありました。
options("/*", (request,response)->{
String accessControlRequestHeaders = request.headers("Access-Control-Request-Headers");
if (accessControlRequestHeaders != null) {
response.header("Access-Control-Allow-Headers", accessControlRequestHeaders);
}
String accessControlRequestMethod = request.headers("Access-Control-Request-Method");
if(accessControlRequestMethod != null){
response.header("Access-Control-Allow-Methods", accessControlRequestMethod);
}
return "OK";
});