動的引数で指定されたエンティティ ID に基づいて既存のユーザーの詳細を更新するアクション署名 Application.saveUser(User user) を使用してコントローラーにフォームを送信する http ルート "POST /users/2" が必要です。 URLで。タイプ User は JPA エンティティであり、リクエスト/フォームでパラメータ「user.id」が指定されている場合、JPA の Play サポートはエンティティを自動的にロードします。これまでは「user.id」を非表示の入力として指定していましたが、ID を URL の一部にしたいのです。
URL にユーザー ID を含める最初のアイデアは、次のようなルートを定義することでした。
POST /users/{user.id} Application.saveUser()
残念ながら、これにより次の例外が発生します。
Oops: PatternSyntaxException
An unexpected error occured caused by exception PatternSyntaxException: unknow class: {user.id}
play.exceptions.UnexpectedException: Unexpected Error
at play.Invoker$Invocation.onException(Invoker.java:244)
at play.Invoker$Invocation.run(Invoker.java:286)
at Invocation.HTTP Request(Play!)
Caused by: jregex.PatternSyntaxException: unknow class: {member.id}
at jregex.CharacterClass.parseName(jregex/CharacterClass.java:361)
at jregex.Term.append(jregex/Term.java:482)
at jregex.Term.makeTree(jregex/Term.java:259)
at jregex.Term.makeTree(jregex/Term.java:219)
at jregex.Term.makeTree(jregex/Term.java:206)
at jregex.Pattern.compile(jregex/Pattern.java:164)
at jregex.Pattern.<init>(jregex/Pattern.java:150)
at jregex.Pattern.<init>(jregex/Pattern.java:108)
at play.mvc.Router$Route.compute(Router.java:755)
私が試した別のオプションは、Play がそれをユーザー id 属性に一致させることができることを期待して、単に 'id' 引数名を使用することでした:
POST /users/{id} Application.saveUser()
しかし、'id' がアクション メソッドの引数名 'user' と一致しないため、予期される NoRouteFoundException が返されます。最後の明白なオプションは、引数名 'user' を使用することです。ここでも、Play が何らかのインテリジェンスを使用して、これが id であることが判明することを期待しています。
POST /users/{user} Application.saveUser()
これにより、フォームで指定された正しいルートでページをレンダリングできますが、送信時に正しい JPA エンティティが読み込まれません。
<form action="/users/3" method="post" accept-charset="utf-8" enctype="application/x-www-form-urlencoded">
私が試した最後の方法は、マッピングを行うことでしたが、これがサポートされているかどうかはわかりません:
POST /users/{user} Application.saveUser(user.id: user)
ここでも、正しい JPA エンティティがロードされていません。高低を検索しましたが、これを正しく行う方法の例は見つかりませんでした。