Nano Hash - криптовалюты, майнинг, программирование

Как настроить маршрут POST в Play Framework v1.2.7 с атрибутом динамического идентификатора, который будет загружать объект JPA

Я хотел бы иметь 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 не загружен. Я искал высоко и низко, но не нашел примера того, как это можно сделать правильно.


Ответы:


1

В документации по игре есть пример, который показывает подход к вашему вопросу: http://www.playframework.com/documentation/1.2.7/jpa#save (второй фрагмент кода в этой главе)

Вам нужен маршрут (как вы предложили во втором подходе), где вы просто передаете идентификатор модели, которую хотите отредактировать:

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);
    }
}
14.09.2013
  • Итак, этот подход является более явным и требует немного большего количества шаблонов — первых трех строк, чтобы соответствовать автоматической загрузке, выполняемой плагином Play JPA, если идентификатор объекта предоставляется в формате, который понимает плагин. Я надеялся, что есть немного более элегантное решение, которое кажется возможным, но это определенно верно и не является огромным бременем. Спасибо 16.09.2013

  • 2

    [Привет, tazmaniax], просто попробуйте включить и идентификатор, и модель, но включите в свой маршрут только идентификатор.

    POST /users/{id}   Application.saveUser()
    
    Application.saveUser(Long id, User user)
    
    <form action="@{Application.saveUser(user.id)}" method="post".....
    
    23.09.2013
  • спасибо за совет, выглядит очень интересно, скоро попробую 15.10.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..