Шов DataModel не может быть приведен к ArrayList - PullRequest
1 голос
/ 30 июля 2010

Я новичок в SEAM, пробуя из сгенерированного приложения некоторые изменения.Как реализация данных SelectOneMenu, где я могу показать данные из таблицы в форме.

Я получаю следующее исключение

java.util.ArrayList не может быть приведен к javax.faces.model.DataModel

Это может быть что-то очень простое, но я не нашел хороших примеров.Может быть, кто-то может указать мне один.Я читаю Seam in Action и Seam Framework из YUAN, но не нашел пример, подобный тому, который я пробую.

Это мой бин

@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 ]

3 голосов
/ 31 июля 2010

Если у вас есть UIData compenet, такой как HtmlDataTable , вы должны использовать следующие опции

  • Массив или Список бобов
  • Один боб
  • 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>

Имейте в виду, что вы должны использовать связывающее выражение (обратите внимание # { и } после свойства управляемого компонента)

Совет: предпочитайте использовать @Factory с возвращаемым значением вместо @ Out-jection. @ Out-jection будет устаревшим в пользу метода @Factory

0 голосов
/ 13 августа 2010

Я публикую ответ для справки в будущем.

Хорошо, код компонента шва закончился, и это сработало.Последняя ошибка была при передаче поля ID в строку в ItemList.

Еще раз спасибо Артуру за помощь, которую ваш код был в основном на месте.

@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>
...