0

動的引数で指定されたエンティティ 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 エンティティがロードされていません。高低を検索しましたが、これを正しく行う方法の例は見つかりませんでした。

4

2 に答える 2

1

あなたの質問へのアプローチを示すプレイのドキュメントに例があります: http://www.playframework.com/documentation/1.2.7/jpa#save (この章の2番目のコードスニペット)

編集するモデルのIDを渡すだけのルートが必要です(2番目のアプローチで提案したように):

POST /users/{id}   Application.saveUser()

対応するアクション メソッドは次のようになります。

public static void save(Long id) {
    User user = User.findById(id);  // here you load the entity you want to edit by it's id
    user.edit("user", params.all());  // here the entity will be edited
    validation.valid(user);
    if(validation.hasErrors()) {
        edit(id);
    } else{
        user.save(); // explicit save here
        show(id);
    }
}
于 2013-09-14T11:58:07.057 に答える
1

[hi tazmaniax] さん、ID とモデルの両方を含めるようにしてください。ルートには ID のみを含めてください。

POST /users/{id}   Application.saveUser()

Application.saveUser(Long id, User user)

<form action="@{Application.saveUser(user.id)}" method="post".....
于 2013-09-23T21:42:04.663 に答える