Estou fazendo um tela para cadastro de usuário do sistema com atribuições de grupo. Cada usuário vai pertencer ao grupo que estiver cadastrado limitando assim o acesso a funcionalidades do sistema. A limitação já funciona. Todo cadastro para novo usuário estava sendo feito diretamente no banco, e convenhamos isso não é nada pratico. Porém ao tentar selecionar o grupo para o usuário e passar para variável que armazena o grupo que foi escolhido para ser adicionado na lista de grupos do usuário, o valor recebido pela mesma está sendo "null" com base em um teste de print do valor recebido. Já andei pesquisando porém todo lugar que eu olho, meu código está praticamente igual, tenho absoluta certeza que é algum detalhe que estou deixando passar desapercebido. Poderiam verificar onde estou errando?
Tela de Cadastro<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>
</ui:composition>
@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;
}
}
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);
}
}
@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;
}
}
Lembrando que o combo-box é preenchido corretamente com todos os nomes de grupos que estão na tabela grupo.