2010-07-07 4 views
0

J'ai une classe que j'utilise pour chaque ligne d'une grille, c'est le mélange de données d'entités multiples. la question est de savoir où le mettre? J'ai essayé de placer la classe dans le paquet de composants et de l'instancier dans ma page, j'ai essayé de renvoyer la classe à partir d'un service injecté, et d'imbriquer la classe dans la page POJO. dans tous les cas, il fonctionnera une fois, puis lors de l'actualisation j'obtenir cette erreur:Tapisserie 5.2 Où puis-je définir une classe?

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. 

son non à peu près aussi utile une erreur que je peux penser. Je comprends que Tapestry veut que vous injectiez toutes les dépendances, mais je n'ai pas compris quel modèle utiliser pour injecter une classe que vous allez instancier à la volée.

Edit: voici la classe

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)); 
     } 

    } 

J'instancié avec l'enregistrement dans setupRender:

 void setupRender(){ 
     List<RolesRow> list = new ArrayList<RolesRow>(); 
    list.add(new RolesRow()); 

Répondre

3

classes d'affaires comme ça ne devraient pas être situés à l'intérieur des dossiers "magiques" de tapisserie (components, mixinspages ou services). Tapisserie rechargera (et re-transformer) la classe chaque fois que n'importe quel fichier dans son paquet change. (Cela fait partie du mécanisme de rechargement de classe en cours.) Lorsque vous stockez des objets de cette classe dans la session, cela entraîne des exceptions bizarres de distribution, comme "A ne peut pas être converti en A".

En règle générale, placez uniquement les classes du dossier components qui sont des composants Tapestry et placez tout le reste ailleurs. Cela peut être pénible quand vous avez une classe qui devrait vraiment être une classe interne d'une classe de composants, comme la vôtre, car vous devrez la déplacer en dehors du composant où elle est utilisée.

Vous ne pourrez pas non plus utiliser la magie de métaprogrammation de Tapestry, telle que @Property.