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 の「マジック」フォルダ ( componentsmixinspages、またはservices) 内に配置しないでください。

Tapestry は、パッケージ内のファイルが変更されるたびにクラスをリロード (および再変換) します。(これは、ライブ クラスのリロード メカニズムの一部です。) そのクラスのオブジェクトをセッションに保存すると、「A を A にキャストできない」などの奇妙なクラス キャスト例外が発生します。

原則として、componentsTapestry コンポーネントであるクラスのみをフォルダに配置し、それ以外はすべて別の場所に配置します。コンポーネントクラスの内部クラスであるべきクラスがある場合、それが使用されているコンポーネントの外に移動する必要があるため、これは面倒です。

また、Tapestry のメタプログラミング マジック ( など) を使用することもできなくなります@Property

于 2010-07-08T12:12:36.137 に答える