Tapestry 5.2我在哪里定义一个类?

时间:2010-07-07 22:46:22

标签: java tapestry

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

1 个答案:

答案 0 :(得分:3)

这样的商业类不应该位于Tapestry的“魔术”文件夹(componentsmixinspagesservices)内。

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

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

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