我想要一个 http 路由“POST/users/2”,它将表单提交到具有操作签名 Application.saveUser(User user) 的 Controller ,该签名将根据指定的实体 ID 更新现有用户的详细信息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)
我尝试的另一个选择是仅使用“id”参数名称,希望 Play 能够将其与用户 ID 属性相匹配:
POST /users/{id} Application.saveUser()
但这会产生预期的 NoRouteFoundException,因为“id”与操作方法参数名称“user”不匹配。最后一个明显的选择是使用参数名称“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 实体。我到处搜索,但没有找到如何正确完成此操作的示例。
最佳答案
Play 文档中有一个示例,它展示了解决您的问题的方法: http://www.playframework.com/documentation/1.2.7/jpa#save (本章第二个代码片段)
您需要一条路线(就像您在第二种方法中建议的那样),只需在其中传递要编辑的模型的 ID:
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);
}
}
关于java - 如何使用将加载 JPA 实体的动态 id 属性在 Play Framework v1.2.7 中配置 POST 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18800414/