Настройка CRUD list.html в PlayFramework

#java #crud #playframework

#java #crud #playframework

Вопрос:

Здравствуйте, я пытаюсь настроить list.html просмотр раздела CRUD в игровом приложении.

Моя модель выглядит следующим образом

У меня есть объект, имеющий отношение к другому объекту, вот так:

 @Entity
public class MyObjectA extends Model {

    @Required
    public String myObjectAName;

    ...

    @Required
    @ManyToOne
    public MyObjectB myObjectB;
}
  

Теперь в list.html что я переопределяю, у меня есть это

 <div id="crudListTable">
    #{crud.table fields:['myObjectB', 'myObjectAName'] /}
</div>
  

Теперь при выполнении этого кода будет отображаться что-то вроде этого при вызове следующего URL http://myplayapp/admin/myObjectAs в браузере

myObjectB __ myObjectAName

MyObjectB [1] __ Эй, это имя для myObjectAName
MyObjectB [2] __ Эй, это другое имя для myObjectAName

Обратите внимание на использование имени объекта и идентификатора объекта в [] для моего MyObjectB.

Итак, чтобы отобразить свойство myObjectBName MyObjectB в списке выше, я пытаюсь сделать это:

 <div id="crudListTable">
    #{crud.table fields:['myObjectB.myObjectBName', 'myObjectAName'] /}
</div>
  

Но затем я получаю эту ошибку

Произошла ошибка выполнения в шаблоне {module:crud}/app/views/tags/crud/table.html . > Возникло исключение MissingPropertyException : Нет такого свойства: myObjectB.myObjectBName > для класса: models.MyObjectA.

Конечно, у MyObjectB есть общедоступное свойство myObjectBName

Итак, что я здесь делаю не так?

Ответ №1:

Это не работает, потому что fields параметр просто принимает список имен полей класса для отображения (здесь MyObjectA ) и "myObjectB.myObjectBName" не является именем поля в MyObjectA .

Это можно сделать двумя способами:

Простым решением является переопределение toString() метода MyObjectB . Недостатком этого является то, что везде, где отображается MyObjectB , используется одна и та же строка, и это может быть не то, что вы хотите.

Пример:

 public class MyObjectB extends Model {

  // ...

  @Override
  public String toString(() {
    return this.myObjectBName;
  }

}
  

Решение, специфичное для списка, заключается в использовании crud.custom тега.

Пример:

 #{crud.table fields:['myObjectB', 'myObjectAName']}
   #{crud.custom 'myObjectB'}
       ${object.myObjectB.myObjectBName}
   #{/crud.custom}
#{/crud.table}
  

Комментарии:

1. Спасибо, RoToRa! Тег crud.custom — это именно то, что мне было нужно