2010-07-30 6 views
1

Je suis nouveau sur SEAM en train d'essayer quelques modifications. Comme l'implémentation d'un SelectOneMenu de données où je peux montrer des données d'une table dans un formulaire.Seam DataModel ne peut pas être converti en ArrayList

Je reçois l'exception suivante

java.util.ArrayList ne peut pas être jeté à javax.faces.model.DataModel

Il peut être quelque chose de très basique, mais je n'ai pas trouvé de bons exemples. Peut-être que quelqu'un peut m'en désigner un. Je lis Seam in Action et Seam Framework de YUAN, mais je n'ai pas trouvé un exemple comme celui que j'essaie.

Ceci est mon haricot

@Name("FuncionesAcciones") 
public class FuncionesAcciones { 
@Logger 
private Log log; 

@In 
StatusMessages statusMessages; 

@In 
protected EntityManager entityManager = null; 

@DataModelSelection 
@Out(required = false) 
protected Usuarios selectedUser; 

@DataModel 
@Out(required = false) 
protected List<Usuarios> listaUsers = null; 

public String view() { 
    return "/AccionesEdit.xhtml"; 
} 

@Factory("listaUsers") 
public void listarUsuarios() { 
    List resultList = entityManager.createQuery(
      "select idUsuarios from Usuarios") 
    .getResultList(); 
    listaUsers = (List<Usuarios>) resultList; 
// "select idUsuarios,NombreUsuario from Usuarios") 
} 

public void funcionesAcciones() { 
    // implement your business logic here 
    log.info("FuncionesAcciones.funcionesAcciones() action called"); 
    statusMessages.add("funcionesAcciones"); 
} 

// add additional action methods 

} 

Ceci est la partie où je l'utilise dans le Facelet

<s:decorate id="usuariosIdUsuariosField" value="#{FuncionesAcciones.selectedUser}"   template="layout/edit.xhtml"> 
     <ui:define name="label">Usuario que Identifica Accion</ui:define> 
     <h:selectOneMenu name="usuario" id="usuariosIdUsuarios" required="true" value="Usuarios.nombreUsuario"> 
      <f:selectItems var="_usuario" value ="#{listaUsers}" label="#{_usuario.NombreUsuario}"/> 
      <s:convertEnum/> 
     </h:selectOneMenu> 
     </s:decorate> 

Quelqu'un peut-il me diriger dans la bonne direction. Comme je l'ai dit je suis nouveau à SEAM, et une expérience assez moyenne dans JAVA/Hibernate. Je viens de PHP donc la courbe d'apprentissage est apparemment très difficile en ce moment en tant que débutant.

+0

Si possible, utilisez SeamTest comme un moyen d'éviter Pour déployer votre application. Jetez un oeil à http://www.exadel.com/tutorial/jsf/jsftags-guide.html –

Répondre

3

Lorsque vous avez un UIData compenet tels que HtmlDataTable vous devez utiliser les options suivantes

  • Un tableau ou une liste de haricots
  • Un haricot unique
  • java.sql.ResultSet
  • javax. servlet.jsp.jstl.Result
  • javax.faces.model.DataModel

Mais vous avez un HtmlSelectOneMenu qui n'est pas un composant UIData. Donc vous ne pouvez pas l'utiliser. Si vous voulez rendre un HtmlSelectOneMenu, , vous devez supprimer l'annotation @DataModel qui est l'encapsuleur JSF DataModel. Vous pouvez

@Out(required=false) 
private List<SelectItem> listaUsers; 

/** 
    * void method with @Out-jection 
    */ 
@Factory("listaUsers") 
public void listarUsuarios() { 
    List<Usuario> resultList = entityManager.createQuery("from Usuarios").getResultList(); 

    for(Usuario usuario: resultList) 
     listaUsers.add(new SelectItem(usuario.<VALUE_PROPERTY>, usuario.NombreUsuario)); 
} 

Ou

/** 
    * @Factory method itself returns List<SelectItem> 
    */ 
@Factory("listaUsers") 
public List<SelectItem> listarUsuarios() { 
    List<Usuario> resultList = entityManager.createQuery("from Usuarios").getResultList(); 

    List<SelectItem> listaUsers = new ArrayList<SelectItem>(); 
    for(Usuario usuario: resultList) 
     listaUsers.add(new SelectItem(usuario.<VALUE_PROPERTY>, usuario.NombreUsuario)); 

    return listaUsers; 
} 

Et utiliser

<h:selectOneMenu name="usuario" id="usuariosIdUsuarios" required="true" value="#{Usuarios.nombreUsuario}"> 
    <f:selectItems value="#{listaUsers}"/> 
    <s:convertEnum/> 
</h:selectOneMenu> 

Gardez à l'esprit que vous devez utiliser l'expression de liaison (Avis # { et } suivante propriété gérée de haricot)

Conseil: Préférez Utiliser @Factory avec une valeur de retour au lieu de @ Out-jection. @ Out-jection sera déconseillé en faveur de la méthode @Factory

+0

Merci beaucoup pour votre réponse Arthur votre exemple et explication a beaucoup de sens maintenant, j'ai seulement un problème avec votre code . Sur cette ligne du haricot: pour (Usuario usuario: de résultats) Je reçois et erreur Incompatibilité de type: ne peut pas convertir type d'élément objet à Usuarios – demolina

+0

Im lecture.Jusqu'à que j'ai besoin peut-être un convertisseur pour cela sur mon classe d'entité, il semble devenir trop compliqué pour juste une simple combobox y at-il une combobox UIDATA qui est plus rapide et plus simple pour accomplir ce qu'elle veut? – demolina

+0

@demo Désolé, Mise à jour –

0

Je publierai la réponse pour référence dans le futur.

Ok le code du composant de couture s'est terminé comme ceci et cela a fonctionné. L'erreur finale était de passer le champ ID à la chaîne sur ItemList.

Merci encore Arthur pour l'aide de votre code était la plupart du temps sur place.

@Factory("listaUsers") 
    public List<SelectItem> listarUsuarios() { 
     List<Usuarios> resultList = entityManager.createQuery(
       "from Usuarios") 
       .getResultList(); 

     List<SelectItem> listaUsers = new ArrayList<SelectItem>(); 
     for(Usuarios usuario: resultList) 
      listaUsers.add(new SelectItem(Integer.toString(usuario.getIdUsuarios()), usuario.getNombreUsuario())); 

     return 

listaUsers; 
    } 

Ceci est la partie de vue du code pour le Dropbox

<h:selectOneMenu name="usuarioIdent" id="usuariosIdUsuarios" required="true" value="#{accionesHome.instance.usuariosIdUsuarios}"> 
       <f:selectItems value ="#{listaUsers}" /> 

      </h:selectOneMenu> 
Questions connexes