SelectItems 返回 null
SelectItems returned null
我正在为具有组分配的系统用户帐户创建一个屏幕。每个用户都将属于已注册的组,从而限制对系统功能的访问。限制较长的作品。所有新用户的注册都是直接在银行完成的,我们同意这是不切实际的。但是,当尝试将 select 组分配给用户并移动到存储该组的变量时,已选择将其添加到用户组列表中,根据打印测试,该组收到的数量为 "null"收到的价值。我一直在研究,但无论我看哪里,我的代码几乎都是一样的,我绝对确定这是我没有注意到的一些细节。能看出我哪里错了吗?
查看Cadastro.class
<ui:composition template="/WEB-INF/tema/LayoutPadrao.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui" xmlns:o="http://omnifaces.org/ui">
<f:metadata>
<o:viewParam name="usuario" value="#{cadastroUsuarioBean.usuario}" />
<f:event listener="#{cadastroUsuarioBean.inicializar}"
type="preRenderView" />
</f:metadata>
<ui:define name="titulo">#{cadastroUsuarioBean.editando ? 'Edição de Usuário' : 'Cadastro de Novo Usuário'}</ui:define>
<ui:define name="corpo">
<h:form id="frmUsuario">
<h1>#{cadastroUsuarioBean.editando ? 'Edição de Usuário' :
'Cadastro de Novo Usuário'}</h1>
<p:messages autoUpdate="true" closable="true" />
<p:toolbar style="margin-top:20px;">
<p:toolbarGroup>
<p:button value="Novo" icon="ui-icon-circle-plus" />
<p:commandButton value="Salvar" icon="ui-icon-disk"
id="botaoSalvar" action="#{cadastroUsuarioBean.salvar}"
update="@form" />
</p:toolbarGroup>
<p:toolbarGroup align="right">
<p:button value="Pesquisa" icon="ui-icon-circle-zoomin" />
</p:toolbarGroup>
</p:toolbar>
<p:panelGrid columns="2" style="width: 100%; margin-top: 20px;"
columnClasses="rotulo, campo, rotulo, campo">
<f:facet name="header">
Dados do Usuário do Sistema
</f:facet>
<p:outputLabel value="Matrícula:" for="matricula" />
<p:inputText id="matricula" size="5"
value="#{cadastroUsuarioBean.usuario.matricula}" />
<p:outputLabel value="Nome do Usuário:" for="nome" />
<p:inputText id="nome" size="50" maxlength="60"
value="#{cadastroUsuarioBean.usuario.nome}" />
<p:outputLabel value="Senha de Acesso:" for="senha1" />
<p:password id="senha1" match="senha2" label="Senha" feedback="true"
promptLabel="Digite sua senha" weakLabel="Fraca" goodLabel="Média"
strongLabel="Forte" />
<p:outputLabel value="Confirmação de senha:" for="senha2" />
<p:password id="senha2" value="#{cadastroUsuarioBean.usuario.senha}"
label="Confirmação de senha" />
<p:outputLabel value="E-mail:" for="email" />
<p:inputText id="email" size="50"
value="#{cadastroUsuarioBean.usuario.email}" />
############# Problema nessa parte ########
############# Inicio #####################
<p:outputLabel value="Grupo" for="grupo" />
<h:panelGroup>
<p:selectOneMenu id="grupo"
value="#{cadastroUsuarioBean.grupoSelecionado}"
style="width:160px;">
<f:selectItem itemLabel="Selecione ..." itemDisabled="true" />
<f:selectItems value="#{cadastroUsuarioBean.gruposRaizes}"
var="grupo" itemValue="#{grupo}" itemLabel="#{grupo.descricao}" />
</p:selectOneMenu>
<p:commandButton value="Adicionar ao grupo"
style="margin-top: 10px; width:160px; margin-left: 5px"
action="#{cadastroUsuarioBean.adicionarGrupo}" process="@this"
update="grupoTable" />
<p:dataTable value="#{cadastroUsuarioBean.listaGrupo}"
style="margin-top: 10px;"
emptyMessage="Usuário não pertence a nenhum grupo!"
id="grupoTable" var="item" rowIndexVar="linha">
<p:column headerText="Grupo" style="text-align: left; width: 100%">
<h:outputText value="#{item.descricao}" />
</p:column>
<p:column style="text-align: center; width: 50px;">
<p:commandButton icon="ui-icon-trash" title="Excluir" />
</p:column>
</p:dataTable>
########### Fim ########
</h:panelGroup>
</p:panelGrid>
</h:form>
</ui:define>
CadastroUsuarioBean.class
@Named
@ViewScoped
public class CadastroUsuarioBean implements Serializable {
private static final long serialVersionUID = 1L;
private Usuario usuario;
private List<Grupo> listaGrupo = new ArrayList<>();
@Inject
private Grupos grupos;
@Inject
private CadastroUsuarioService cadastroUsuarioService;
private Grupo grupoSelecionado;
private List<Grupo> gruposRaizes;
public CadastroUsuarioBean() {
limpar();
}
public void inicializar() {
if (FacesUtil.isNotPostback()) {
gruposRaizes = grupos.raizes();
}
}
public void salvar() {
this.usuario = cadastroUsuarioService.salvar(this.usuario);
// limpar();
FacesUtil.addInfoMessage("Usuário cadastrado com sucesso!");
}
private void limpar() {
usuario = new Usuario();
grupoSelecionado = new Grupo();
}
public void adicionarGrupo() {
System.out.println("Grupo selecionado: " + grupoSelecionado.getDescricao());
listaGrupo.add(grupoSelecionado);
}
public void removerGrupo(int linha){
listaGrupo.remove(linha);
}
public Usuario getUsuario() {
return usuario;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
public boolean isEditando() {
return usuario.getMatricula() != null;
}
public List<Grupo> getGruposRaizes() {
return gruposRaizes;
}
public void setGruposRaizes(List<Grupo> gruposRaizes) {
this.gruposRaizes = gruposRaizes;
}
public Grupo getGrupoSelecionado() {
return grupoSelecionado;
}
public void setGrupoSelecionado(Grupo grupoSelecionado) {
this.grupoSelecionado = grupoSelecionado;
}
public List<Grupo> getListaGrupo() {
return listaGrupo;
}
public void setListaGrupo(List<Grupo> listaGrupo) {
this.listaGrupo = listaGrupo;
}
}
Grupos.class(存储库)
public class Grupos implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private EntityManager manager;
public List<Grupo> raizes() {
return this.manager.createQuery("from Grupo", Grupo.class).getResultList();
}
public Grupo porId(Long id) {
return this.manager.find(Grupo.class, id);
}
}
Grupo.class
@Entity
@Table(name = "grupo")
public class Grupo implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String nome;
private String descricao;
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(nullable = false, length = 40)
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@Column(nullable = false, length = 80)
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Grupo other = (Grupo) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}
回顾一下,组合框正确填写了 table 组中的所有组名称。
@编辑 2016 年 7 月 19 日
不知道是不是没有正确指定的问题。问题不是在 SelectItens 中显示值,而是通过单击 "Add Group" 按钮:
<p:commandButton value="Adicionar ao grupo"
style="margin-top: 10px; width:160px; margin-left: 5px"
action="#{cadastroUsuarioBean.adicionarGrupo}" process="@this"
update="grupoTable" />
调用函数时
public void adicionarGrupo() {
System.out.println("Grupo selecionado: " + grupoSelecionado.getDescricao());
listaGrupo.add(grupoSelecionado);
}
在应用程序控制台中打印:"Grupo selecionado: null" 而不是打印 select 在 selectitens
中编辑的值
空对象无法显示数据table
<p:dataTable value="#{cadastroUsuarioBean.listaGrupo}"
style="margin-top: 10px;"
emptyMessage="Usuário não pertence a nenhum grupo!"
id="grupoTable" var="item" rowIndexVar="linha">
<p:column headerText="Grupo" style="text-align: left; width: 100%">
<h:outputText value="#{item.descricao}" />
</p:column>
<p:column style="text-align: center; width: 50px;">
<p:commandButton icon="ui-icon-trash" title="Excluir" />
</p:column>
</p:dataTable>
我从来没有像这样在页面中做过 select 项目。我总是在支持 bean 中创建一个函数。
我像这样使用 xhtml 页面上的值:
<p:selectOneMenu id="grupo"
value="#{cadastroUsuarioBean.grupoSelecionado}"
style="width:160px;">
<f:selectItem itemLabel="Selecione ..." itemDisabled="true" />
<f:selectItems value="#{cadastroUsuarioBean.getGroupRaizesSelectOne()}"/>
</p:selectOneMenu>
getGroupRaizesSelectOne
看起来像:
function SelectItem[] getGroupRaizesSelectOne()
{
int len = this.groupRaizes.size();
SelectItem[] selects = new SelectItem[len];
for(Grupo group:gruopRaizes)
{
selects[i] = new SelectItem(group, group.getDescricao());
}
return selects;
}
我们还必须有一些 line Omni-faces 来转换我们的对象并允许它们用作页面上的对象。
我找到了解决办法,正如他想象的那样,是一个被忽视的细节。
<p:commandButton value="Adicionar ao grupo"
style="margin-top: 10px; width:160px; margin-left: 5px"
action="#{cadastroUsuarioBean.adicionarGrupo}" process="@this"
update="grupoTable" />
这个负责使 SelectItens 的值转到变量 "grupoSelecionado" 的按钮没有处理组件 "SelectItem" 而只是他自己。因此,变量的值始终为空。
我换了按钮,变成这样:
<p:commandButton value="Adicionar ao grupo"
style="margin-top: 10px; width:160px; margin-left: 5px"
action="#{cadastroUsuarioBean.adicionarGrupo}" process="grupo, @this "
update="grupoTable" />
这样问题就解决了,现在我可以通过创建的页面注册系统用户,不再直接在数据库中注册。
抱歉我是英国人,我还在学习这门语言。
我正在为具有组分配的系统用户帐户创建一个屏幕。每个用户都将属于已注册的组,从而限制对系统功能的访问。限制较长的作品。所有新用户的注册都是直接在银行完成的,我们同意这是不切实际的。但是,当尝试将 select 组分配给用户并移动到存储该组的变量时,已选择将其添加到用户组列表中,根据打印测试,该组收到的数量为 "null"收到的价值。我一直在研究,但无论我看哪里,我的代码几乎都是一样的,我绝对确定这是我没有注意到的一些细节。能看出我哪里错了吗?
查看Cadastro.class
<ui:composition template="/WEB-INF/tema/LayoutPadrao.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui" xmlns:o="http://omnifaces.org/ui">
<f:metadata>
<o:viewParam name="usuario" value="#{cadastroUsuarioBean.usuario}" />
<f:event listener="#{cadastroUsuarioBean.inicializar}"
type="preRenderView" />
</f:metadata>
<ui:define name="titulo">#{cadastroUsuarioBean.editando ? 'Edição de Usuário' : 'Cadastro de Novo Usuário'}</ui:define>
<ui:define name="corpo">
<h:form id="frmUsuario">
<h1>#{cadastroUsuarioBean.editando ? 'Edição de Usuário' :
'Cadastro de Novo Usuário'}</h1>
<p:messages autoUpdate="true" closable="true" />
<p:toolbar style="margin-top:20px;">
<p:toolbarGroup>
<p:button value="Novo" icon="ui-icon-circle-plus" />
<p:commandButton value="Salvar" icon="ui-icon-disk"
id="botaoSalvar" action="#{cadastroUsuarioBean.salvar}"
update="@form" />
</p:toolbarGroup>
<p:toolbarGroup align="right">
<p:button value="Pesquisa" icon="ui-icon-circle-zoomin" />
</p:toolbarGroup>
</p:toolbar>
<p:panelGrid columns="2" style="width: 100%; margin-top: 20px;"
columnClasses="rotulo, campo, rotulo, campo">
<f:facet name="header">
Dados do Usuário do Sistema
</f:facet>
<p:outputLabel value="Matrícula:" for="matricula" />
<p:inputText id="matricula" size="5"
value="#{cadastroUsuarioBean.usuario.matricula}" />
<p:outputLabel value="Nome do Usuário:" for="nome" />
<p:inputText id="nome" size="50" maxlength="60"
value="#{cadastroUsuarioBean.usuario.nome}" />
<p:outputLabel value="Senha de Acesso:" for="senha1" />
<p:password id="senha1" match="senha2" label="Senha" feedback="true"
promptLabel="Digite sua senha" weakLabel="Fraca" goodLabel="Média"
strongLabel="Forte" />
<p:outputLabel value="Confirmação de senha:" for="senha2" />
<p:password id="senha2" value="#{cadastroUsuarioBean.usuario.senha}"
label="Confirmação de senha" />
<p:outputLabel value="E-mail:" for="email" />
<p:inputText id="email" size="50"
value="#{cadastroUsuarioBean.usuario.email}" />
############# Problema nessa parte ########
############# Inicio #####################
<p:outputLabel value="Grupo" for="grupo" />
<h:panelGroup>
<p:selectOneMenu id="grupo"
value="#{cadastroUsuarioBean.grupoSelecionado}"
style="width:160px;">
<f:selectItem itemLabel="Selecione ..." itemDisabled="true" />
<f:selectItems value="#{cadastroUsuarioBean.gruposRaizes}"
var="grupo" itemValue="#{grupo}" itemLabel="#{grupo.descricao}" />
</p:selectOneMenu>
<p:commandButton value="Adicionar ao grupo"
style="margin-top: 10px; width:160px; margin-left: 5px"
action="#{cadastroUsuarioBean.adicionarGrupo}" process="@this"
update="grupoTable" />
<p:dataTable value="#{cadastroUsuarioBean.listaGrupo}"
style="margin-top: 10px;"
emptyMessage="Usuário não pertence a nenhum grupo!"
id="grupoTable" var="item" rowIndexVar="linha">
<p:column headerText="Grupo" style="text-align: left; width: 100%">
<h:outputText value="#{item.descricao}" />
</p:column>
<p:column style="text-align: center; width: 50px;">
<p:commandButton icon="ui-icon-trash" title="Excluir" />
</p:column>
</p:dataTable>
########### Fim ########
</h:panelGroup>
</p:panelGrid>
</h:form>
</ui:define>
CadastroUsuarioBean.class
@Named
@ViewScoped
public class CadastroUsuarioBean implements Serializable {
private static final long serialVersionUID = 1L;
private Usuario usuario;
private List<Grupo> listaGrupo = new ArrayList<>();
@Inject
private Grupos grupos;
@Inject
private CadastroUsuarioService cadastroUsuarioService;
private Grupo grupoSelecionado;
private List<Grupo> gruposRaizes;
public CadastroUsuarioBean() {
limpar();
}
public void inicializar() {
if (FacesUtil.isNotPostback()) {
gruposRaizes = grupos.raizes();
}
}
public void salvar() {
this.usuario = cadastroUsuarioService.salvar(this.usuario);
// limpar();
FacesUtil.addInfoMessage("Usuário cadastrado com sucesso!");
}
private void limpar() {
usuario = new Usuario();
grupoSelecionado = new Grupo();
}
public void adicionarGrupo() {
System.out.println("Grupo selecionado: " + grupoSelecionado.getDescricao());
listaGrupo.add(grupoSelecionado);
}
public void removerGrupo(int linha){
listaGrupo.remove(linha);
}
public Usuario getUsuario() {
return usuario;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
public boolean isEditando() {
return usuario.getMatricula() != null;
}
public List<Grupo> getGruposRaizes() {
return gruposRaizes;
}
public void setGruposRaizes(List<Grupo> gruposRaizes) {
this.gruposRaizes = gruposRaizes;
}
public Grupo getGrupoSelecionado() {
return grupoSelecionado;
}
public void setGrupoSelecionado(Grupo grupoSelecionado) {
this.grupoSelecionado = grupoSelecionado;
}
public List<Grupo> getListaGrupo() {
return listaGrupo;
}
public void setListaGrupo(List<Grupo> listaGrupo) {
this.listaGrupo = listaGrupo;
}
}
Grupos.class(存储库)
public class Grupos implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private EntityManager manager;
public List<Grupo> raizes() {
return this.manager.createQuery("from Grupo", Grupo.class).getResultList();
}
public Grupo porId(Long id) {
return this.manager.find(Grupo.class, id);
}
}
Grupo.class
@Entity
@Table(name = "grupo")
public class Grupo implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String nome;
private String descricao;
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(nullable = false, length = 40)
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@Column(nullable = false, length = 80)
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Grupo other = (Grupo) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}
回顾一下,组合框正确填写了 table 组中的所有组名称。
@编辑 2016 年 7 月 19 日
不知道是不是没有正确指定的问题。问题不是在 SelectItens 中显示值,而是通过单击 "Add Group" 按钮:
<p:commandButton value="Adicionar ao grupo"
style="margin-top: 10px; width:160px; margin-left: 5px"
action="#{cadastroUsuarioBean.adicionarGrupo}" process="@this"
update="grupoTable" />
调用函数时
public void adicionarGrupo() {
System.out.println("Grupo selecionado: " + grupoSelecionado.getDescricao());
listaGrupo.add(grupoSelecionado);
}
在应用程序控制台中打印:"Grupo selecionado: null" 而不是打印 select 在 selectitens
中编辑的值空对象无法显示数据table
<p:dataTable value="#{cadastroUsuarioBean.listaGrupo}"
style="margin-top: 10px;"
emptyMessage="Usuário não pertence a nenhum grupo!"
id="grupoTable" var="item" rowIndexVar="linha">
<p:column headerText="Grupo" style="text-align: left; width: 100%">
<h:outputText value="#{item.descricao}" />
</p:column>
<p:column style="text-align: center; width: 50px;">
<p:commandButton icon="ui-icon-trash" title="Excluir" />
</p:column>
</p:dataTable>
我从来没有像这样在页面中做过 select 项目。我总是在支持 bean 中创建一个函数。
我像这样使用 xhtml 页面上的值:
<p:selectOneMenu id="grupo"
value="#{cadastroUsuarioBean.grupoSelecionado}"
style="width:160px;">
<f:selectItem itemLabel="Selecione ..." itemDisabled="true" />
<f:selectItems value="#{cadastroUsuarioBean.getGroupRaizesSelectOne()}"/>
</p:selectOneMenu>
getGroupRaizesSelectOne
看起来像:
function SelectItem[] getGroupRaizesSelectOne()
{
int len = this.groupRaizes.size();
SelectItem[] selects = new SelectItem[len];
for(Grupo group:gruopRaizes)
{
selects[i] = new SelectItem(group, group.getDescricao());
}
return selects;
}
我们还必须有一些 line Omni-faces 来转换我们的对象并允许它们用作页面上的对象。
我找到了解决办法,正如他想象的那样,是一个被忽视的细节。
<p:commandButton value="Adicionar ao grupo"
style="margin-top: 10px; width:160px; margin-left: 5px"
action="#{cadastroUsuarioBean.adicionarGrupo}" process="@this"
update="grupoTable" />
这个负责使 SelectItens 的值转到变量 "grupoSelecionado" 的按钮没有处理组件 "SelectItem" 而只是他自己。因此,变量的值始终为空。
我换了按钮,变成这样:
<p:commandButton value="Adicionar ao grupo"
style="margin-top: 10px; width:160px; margin-left: 5px"
action="#{cadastroUsuarioBean.adicionarGrupo}" process="grupo, @this "
update="grupoTable" />
这样问题就解决了,现在我可以通过创建的页面注册系统用户,不再直接在数据库中注册。
抱歉我是英国人,我还在学习这门语言。