我是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,所以现在学习曲线显然非常难以作为初学者。
答案 0 :(得分:3)
如果您拥有UIData等HtmlDataTable主题广告,则应使用以下选项
但是你有一个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>