0

我有一个用于网格中每一行的类,它是多个实体数据的混合。问题是放在哪里?我尝试将类放在组件包中并在我的页面中实例化它,尝试从注入的服务返回类,并将类嵌套在页面 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());
4

1 回答 1

3

像这样的业务类不应位于 Tapestry 的“魔术”文件夹(componentsmixinspagesservices)中。

每当其包中的任何文件发生更改时,Tapestry 都会重新加载(并重新转换)该类。(这是实时类重新加载机制的一部分。)当您在会话中存储该类的对象时,会导致奇怪的类转换异常,例如“A 不能转换为 A”。

作为一般规则,仅将components作为 Tapestry 组件的类放在文件夹中,而将其他所有内容放在其他位置。当您有一个真正应该是组件类的内部类的类(例如您的类)时,这可能会很痛苦,因为您必须将其移到使用它的组件之外。

您也将无法使用 Tapestry 的元编程魔法,例如@Property.

于 2010-07-08T12:12:36.137 回答