在PlayFramework中自定义CRUD list.html

Ala*_*ain 3 java crud playframework

您好我正在尝试自定义播放应用程序的CRUD部分的list.html视图.

我的模特是这样的

我有一个与其他对象有关系的对象,如下所示:

@Entity
public class MyObjectA extends Model {

    @Required
    public String myObjectAName;

    ...

    @Required
    @ManyToOne
    public MyObjectB myObjectB;
}
Run Code Online (Sandbox Code Playgroud)

现在在我覆盖的list.html中,我有这个

<div id="crudListTable">
    #{crud.table fields:['myObjectB', 'myObjectAName'] /}
</div>
Run Code Online (Sandbox Code Playgroud)

现在,当在浏览器中调用以下URL http:// myplayapp/admin/myObjectAs时,执行此代码将显示类似的内容

myObjectB _ _ myObjectAName

MyObjectB [1] _ _这是myObjectAName的名称
MyObjectB [2] _ _嘿这是myObjectAName的另一个名字

注意在我的MyObjectB中使用[]中的Object名称和对象id.

所以要在上面的列表中显示MyObjectB的myObjectBName属性,我试试这个:

<div id="crudListTable">
    #{crud.table fields:['myObjectB.myObjectBName', 'myObjectAName'] /}
</div>
Run Code Online (Sandbox Code Playgroud)

但后来我得到了这个错误

模板{module:crud} /app/views/tags/crud/table.html中发生执行错误.>引发的异常是MissingPropertyException:没有这样的属性:myObjectB.myObjectBName> for class:models.MyObjectA.

当然MyObjectB有一个公共属性myObjectBName

那么我在这里做错了什么?

RoT*_*oRa 7

它不起作用,因为fields参数只是显示要显示的类的字段名称列表(此处MyObjectA),"myObjectB.myObjectBName"而不是字段的名称MyObjectA.

有两种方法可以做到这一点:

简单的解决方案是覆盖toString()方法MyObjectB.这样做的缺点是,每次MyObjectB显示都会使用相同的字符串,这可能不是您想要的.

例:

public class MyObjectB extends Model {

  // ...

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

}
Run Code Online (Sandbox Code Playgroud)

列表特定解决方案是使用crud.custom标记.

例:

#{crud.table fields:['myObjectB', 'myObjectAName']}
   #{crud.custom 'myObjectB'}
       ${object.myObjectB.myObjectBName}
   #{/crud.custom}
#{/crud.table}
Run Code Online (Sandbox Code Playgroud)