我有一个类用于网格中的每一行,它是多个实体数据的混合。问题是在哪里放?我尝试将类放在组件包中并在我的页面中实例化它,尝试从注入的服务返回类,并将类嵌套在页面POJO中。在所有情况下,它将工作一次然后刷新我得到这个错误:
Failure writing parameter 'row' of component admin/Add:grid.rows: Failure writing parameter 'row' of component admin/Add:grid: Could not find a coercion from type com.foo.bar.pages.admin.Add$RolesRow to type com.foo.bar.pages.admin.Add$RolesRow.
我认为这是一个非常有帮助的错误。我得到Tapestry希望你注入所有依赖项,但我还没有想出使用什么模式来注入一个你将要动态实例化的类。
编辑:这是班级
public static class RolesRow{
@Property public Boolean ROLE_SUPER;
@Property public Boolean ROLE_ADMIN;
@Property public Boolean ROLE_USER;
@Property public Boolean ROLE_VIEW;
@Property public Boolean ROLE_EMAIL;
private Map<String,Role> roles;
public RolesRow(){
}
public RolesRow(Map<String,Role> roles){
ROLE_SUPER = (roles.containsKey("ROLE_SUPER") ? true:false);
ROLE_ADMIN = (roles.containsKey("ROLE_ADMIN") ? true:false);
ROLE_USER = (roles.containsKey("ROLE_USER") ? true:false);
ROLE_VIEW = (roles.containsKey("ROLE_VIEW") ? true:false);
ROLE_EMAIL = (roles.containsKey("ROLE_EMAIL") ? true:false);
this.roles = roles;
}
public List<Role> selected(){
List<Role> r = new ArrayList<Role>();
checked(r,"ROLE_SUPER",ROLE_SUPER);
checked(r,"ROLE_ADMIN",ROLE_ADMIN);
checked(r,"ROLE_USER",ROLE_USER);
checked(r,"ROLE_VIEW",ROLE_VIEW);
checked(r,"ROLE_EMAIL",ROLE_EMAIL);
return r;
}
private void checked(List<Role> r,String field,Boolean obj){
if (obj !=null && obj == true){
r.add(roles.get(field));
}
}
我在setupRender中实例化记录:
void setupRender(){
List<RolesRow> list = new ArrayList<RolesRow>();
list.add(new RolesRow());
答案 0 :(得分:3)
这样的商业类不应该位于Tapestry的“魔术”文件夹(components
,mixins
,pages
或services
)内。
Tapestry将在其包中的任何文件发生更改时重新加载(并重新转换)该类。 (这是活动类重新加载机制的一部分。)当您在会话中存储该类的对象时,会导致奇怪的类转换异常,例如“A无法转换为A”。
作为一般规则,只将类放在components
文件夹中作为Tapestry组件,并将其他所有内容放在其他位置。当你有一个真正应该是组件类的内部类的类(例如你的类)时,这可能会很痛苦,因为你必须将它移到使用它的组件之外。
您也无法使用Tapestry的元编程魔法,例如@Property
。