SelectItems返回null

时间:2016-07-18 23:50:21

标签: jsf selectonemenu

我正在为具有组分配的系统用户帐户创建一个屏幕。每个用户都属于已注册的组,因此限制了对系统功能的访问。限制更长的工作。新用户的所有注册都是直接在银行进行的,我们同意这不实用。但是当尝试向用户选择组并移动到存储该组的变量时,选择将该组添加到用户组列表中,同一个接收的数量为" 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(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

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

回顾组合框正确地填写了表组中所有组的名称。

@Edit 19/07/2016

我不知道是否没有正确指定问题。问题不是在SelectItens中显示值,而是单击&#34;添加组&#34;按钮:

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

在应用程序控制台中打印:&#34; Grupo selecionado:null&#34;而不是打印在selectitens中选择的值

使用null对象,无法显示数据表

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

2 个答案:

答案 0 :(得分:0)

我从来没有像这样在页面中做过选择项目。我总是在辅助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;
}

我们还必须有一些行Omni-faces来转换我们的对象并允许它们用作页面上的对象。

答案 1 :(得分:0)

我找到了解决方案,因为他想象的是一个未被注意的细节。

<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”而只处理他自己。因此,变量的值始终为null。

我改变了按钮,这样:

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

因此问题解决了,现在我可以按创建的页面注册系统用户,而不再直接在数据库中注册。

抱歉,我是英国人,我还在学习这门语言。