2016-07-18 18 views
0

Ich mache einen Bildschirm für Systembenutzerkonto mit Gruppenzuordnungen. Jeder Benutzer gehört zu der Gruppe, die registriert ist, wodurch der Zugriff auf Systemfunktionen eingeschränkt wird. Begrenzen längerer Arbeiten. Die Registrierung für neue Benutzer wurde direkt in der Bank vorgenommen, und wir stimmen zu, dass dies nichts Praktisches ist. Aber wenn versucht wird, die Gruppe für den Benutzer auszuwählen und zu einer Variablen zu wechseln, die die Gruppe speichert, wurde zur Liste der Benutzergruppen hinzugefügt, wobei der empfangene Betrag "null" ist, basierend auf einem Drucktest des empfangenen Werts. Ich bin recherchiert gegangen, aber überall, wo ich hinsehe, ist mein Code fast derselbe, ich bin mir absolut sicher, dass es ein Detail ist, das ich unbemerkt loslasse. Kannst du sehen, wo ich falsch liege?SelectItems gab null zurück

Ansicht 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 (Repository)

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

Erinnern, dass die Combobox korrekt ausgefüllt mit allen Namen der Gruppen, die auf der Tabellengruppe sind.

@Edit 19/07/2016

Ich weiß nicht, wenn sie nicht richtig, das Problem angegeben. Das Problem ist nicht der Wert in SelectItens angezeigt werden, sondern durch die "Gruppe hinzufügen" klicken:

<p:commandButton value="Adicionar ao grupo" 
       style="margin-top: 10px; width:160px; margin-left: 5px" 
       action="#{cadastroUsuarioBean.adicionarGrupo}" process="@this" 
       update="grupoTable" /> 

Wenn die Funktion aufrufen

public void adicionarGrupo() { 
    System.out.println("Grupo selecionado: " + grupoSelecionado.getDescricao()); 
    listaGrupo.add(grupoSelecionado); 
} 

Bei der Anwendung Konsole ausgegeben: "Grupo selecionado: null" anstatt den Wert des Druckens, die in selectitens

mit dem null-Objekt ausgewählt wurde, ist es nicht möglich, die Datentabelle

<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> 
anzuzeigen
+0

Sind Sie sicher, dass Ihre Liste initialisiert wird? –

+0

ich auch nicht verstanden. [link] (http://i17.photobucket.com/albums/b87/forjefantasma/erro%20user.jpg) –

Antwort

0

Ich fand die Lösung, wie er sich vorgestellt hatte, war ein Detail, das unbemerkt blieb.

<p:commandButton value="Adicionar ao grupo" 
      style="margin-top: 10px; width:160px; margin-left: 5px" 
      action="#{cadastroUsuarioBean.adicionarGrupo}" process="@this" 
      update="grupoTable" /> 

Diese Taste, die für die Herstellung der Wert von SelectItens verantwortlich gehen auf die Variable „grupoSelecionado“ wurde die Komponente „SelectItem“ nicht verarbeiten, sondern nur sich selbst.Aus diesem Grund war der Wert der Variablen immer Null.

änderte es die Taste, auf diese Weise bekommen:

<p:commandButton value="Adicionar ao grupo" 
        style="margin-top: 10px; width:160px; margin-left: 5px" 
        action="#{cadastroUsuarioBean.adicionarGrupo}" process="grupo, @this " 
        update="grupoTable" /> 

So das Problem gelöst wurde und jetzt kann ich die Systembenutzer von Seite erstellt und nicht mehr direkt in der Datenbank registrieren.

Entschuldigung, ich bin Engländer, ich lerne immer noch diese Sprache.

0

Ich habe noch nie ein Element auf der Seite so gemacht. Ich habe immer eine Funktion in der Backing Bean erstellt.

Ich benutze die Werte auf der XHTML-Seite wie folgt aus:

<p:selectOneMenu id="grupo" 
        value="#{cadastroUsuarioBean.grupoSelecionado}" 
        style="width:160px;"> 
        <f:selectItem itemLabel="Selecione ..." itemDisabled="true" /> 
        <f:selectItems value="#{cadastroUsuarioBean.getGroupRaizesSelectOne()}"/> 
       </p:selectOneMenu> 

getGroupRaizesSelectOne wie folgt aussieht:

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

Wir mussten auch etwas Linie haben Omni-Gesichter unserer Objekte zu konvertieren und es ihnen zu ermöglichen, als ein Objekt auf der Seite verwendet werden.

+0

Ich verwende immer '' für ' Getters ' – Kukeltje

+0

Ich fügte weitere Details zu dem Problem hinzu. –