Seam DataModel无法强制转换为ArrayList

时间:2010-07-30 19:31:41

标签: seam

我是SEAM的新手,尝试从生成的应用程序中进行一些更改。就像实现一个数据SelectOneMenu一样,我可以在表格中显示表格中的数据。

我收到以下异常

  

java.util.ArrayList无法强制转换为javax.faces.model.DataModel

这可能是非常基本的东西,但我没有找到任何好的例子。也许有人可以向我指出一个。我正在阅读来自YUAN的Seam in Action和Seam Framework,还没有找到像我正在尝试的那样的例子。

这是我的豆子

@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

}

这是我在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>

有人能指出我正确的方向吗?就像我说的我是SEAM的新手,以及JAVA / Hibernate的平均经验。我来自PHP,所以现在学习曲线显然非常难以作为初学者。

2 个答案:

答案 0 :(得分:3)

如果您拥有UIDataHtmlDataTable主题广告,则应使用以下选项

  • 数组或bean列表
  • 单个豆
  • java.sql.ResultSet中
  • javax.servlet.jsp.jstl.Result
  • javax.faces.model.DataModel

但是你有一个HtmlSelectOneMenu,它不是UIData组件。所以你不能使用它。如果要渲染HtmlSelectOneMenu,则应删除@DataModel 注释,这是JSF DataModel包装器。你可以

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

或者

/**
  * @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;
}

并使用

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

请记住,您应该使用绑定表达式(在托管bean属性后注意#{}

建议:首选使用带有返回值的@Factory而不是@ Out-jection。 @ Out-jection将被弃用,以支持@Factory方法

答案 1 :(得分:0)

我发布答案以供将来参考。

好的,接缝组件的代码就像这样结束了它的工作原理。最后的错误是将ID字段传递给ItemList上的字符串。

再次感谢Arthur为您的代码提供的帮助。

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

这是Dropbox代码的视图部分

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

             </h:selectOneMenu>