Я хотел бы иметь http-маршрут «POST/users/2», который отправляет форму контроллеру с подписью действия Application.saveUser(User user), который будет обновлять данные для существующего пользователя на основе идентификатора объекта, указанного в динамическом аргументе в URL. Тип User является сущностью JPA, и поддержка Play для JPA автоматически загрузит сущность, если в запросе/форме указан параметр «user.id». До сих пор я указывал «user.id» как скрытый ввод, но я действительно хочу, чтобы идентификатор был частью URL-адреса.
Моей первой идеей включить идентификатор пользователя в URL-адрес было определение маршрута следующим образом:
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 сможет сопоставить его с атрибутом идентификатора пользователя:
POST /users/{id} Application.saveUser()
Но это дает ожидаемое исключение NoRouteFoundException, потому что «id» не соответствует имени аргумента метода действия «user». Последний очевидный вариант — использовать имя аргумента «пользователь» и снова надеяться, что Play может использовать некоторый интеллект, чтобы определить, что это идентификатор:
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 не загружен. Я искал высоко и низко, но не нашел примера того, как это можно сделать правильно.