SelectOneMenu is not sending the parameter to the Bean (Validation Error)

3

In XHTML, my SelectOneMenu is giving validation error at the time of Issue:

                <p:selectOneMenu value="#{relatorioProdutosLogsBean.usuarioSelecionado}">
                    <f:selectItem itemLabel="Selecione" itemValue="" />
                    <f:selectItems value="#{relatorioProdutosLogsBean.usuariosDisponiveis}"
                        var="usuario" itemLabel="#{usuario.nome}" itemValue="#{usuario}" />
                </p:selectOneMenu>

User implements Serializable:

private static final long serialVersionUID = 1L;

private Long id;
private String nome;
private String email;
private String senha;
private List<Grupo> grupos = new ArrayList<>();

@Id
@GeneratedValue
public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}

@Column(nullable = false, length = 80)
public String getNome() {
    return nome;
}
public void setNome(String nome) {
    this.nome = nome;
}

@Column(nullable = false, unique = true, length = 255)
public String getEmail() {
    return email;
}
public void setEmail(String email) {
    this.email = email;
}

@Column(nullable = false, length = 20)
public String getSenha() {
    return senha;
}
public void setSenha(String senha) {
    this.senha = senha;
}

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "usuario_grupo", joinColumns = @JoinColumn(name="usuario_id"),
        inverseJoinColumns = @JoinColumn(name = "grupo_id"))
public List<Grupo> getGrupos() {
    return grupos;
}
public void setGrupos(List<Grupo> grupos) {
    this.grupos = grupos;
}

@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;
    Usuario other = (Usuario) obj;
    if (id == null) {
        if (other.id != null)
            return false;
    } else if (!id.equals(other.id))
        return false;
    return true;
}

Users implements Serializable:

private static final long serialVersionUID = 1L;
@Inject
private EntityManager manager;

public Usuario guardar(Usuario usuario) {
    return manager.merge(usuario);
}

@Transactional
public void remover(Usuario usuario) {
    try {
        usuario = porId(usuario.getId());
        manager.remove(usuario);
        manager.flush();
    } catch (PersistenceException e) {
        throw new NegocioException("Usuario " + usuario.getNome() + " não pode ser excluído.");
    }
}

public Usuario porId(Long id) {
    return manager.find(Usuario.class, id);
}


public Usuario porNomeOuEmail(String nome, String email) {
    try {
        return manager.createQuery("from Usuario where upper(nome) = :nome and email = :email", Usuario.class)
                .setParameter("nome", nome.toUpperCase())
                .setParameter("email", email.toUpperCase())
                .getSingleResult();
    } catch (NoResultException e) {
        return null;
    }
}

public Usuario porEmail(String email) {
    Usuario usuario = null;

    try {
        usuario = this.manager.createQuery("from Usuario where lower(email) = :email", Usuario.class)
            .setParameter("email", email.toLowerCase()).getSingleResult();
    } catch (NoResultException e) {
        // nenhum usuário encontrado com o e-mail informado
    }

    return usuario;
}

@SuppressWarnings("unchecked")
public List<Usuario> filtrados(UsuarioFilter filtro) {
    Session session = manager.unwrap(Session.class);
    Criteria criteria = session.createCriteria(Usuario.class);

    if (StringUtils.isNotBlank(filtro.getNome())) {
        criteria.add(Restrictions.ilike("nome", filtro.getNome(), MatchMode.ANYWHERE));
    }

    return criteria.addOrder(Order.asc("nome")).list();
}

public List<Usuario> vendedores() {
    return this.manager.createQuery("from Usuario", Usuario.class)
            .getResultList();
}

@SuppressWarnings("unchecked")
public List<Usuario> todos() {
    Session session = manager.unwrap(Session.class);
    Criteria criteria = session.createCriteria(Usuario.class);

    return criteria.addOrder(Order.asc("nome")).list();

}

UserConverter implements Converter:

private Usuarios usuarios;

public UsuarioConverter() {
    this.usuarios = (Usuarios) CDIServiceLocator.getBean(Usuarios.class);
}

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    Usuario retorno = null;

    if (value != null) {
        retorno = this.usuarios.porId(new Long(value));
    }

    return retorno;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {

    if(value != null) {       
        Usuario usuario = (Usuario) value;
        return usuario.getId() == null ? null : usuario.getId().toString();
    }
    return "";
}

ReportProductsLogsBean implements Serializable:

private static final long serialVersionUID = 1L;

private Date dataInicio;
private Date dataFim;

@Inject
private FacesContext facesContext;

@Inject
private Usuarios usuarios;

@Inject
private HttpServletResponse response;

@Inject
private EntityManager manager;

private Usuario usuarioSelecionado;

private List<Usuario> usuariosDisponiveis;

public List<Usuario> getUsuariosDisponiveis() {
    return usuariosDisponiveis;
}


public void setUsuariosDisponiveis(List<Usuario> usuariosDisponiveis) {
    this.usuariosDisponiveis = usuariosDisponiveis;
}


public void inicializar() {
    if (FacesUtil.isNotPostback()) {
        usuariosDisponiveis = usuarios.todos();
    }
}

public void emitir() {

    Map<String, Object> parametros = new HashMap<>();
    parametros.put("data_inicio", this.dataInicio);
    parametros.put("data_fim", this.dataFim);
    if(usuarioSelecionado.getNome().equals("")){
        parametros.put("nome", "%%");
    } else {
        parametros.put("nome", usuarioSelecionado.getNome());
    }

    ExecutorRelatorio executor = new ExecutorRelatorio("/relatorios/relatorio_produtos_logs.jasper",
            this.response, parametros, "ProdutoLog.pdf");

    Session session = manager.unwrap(Session.class);
    session.doWork(executor);

    if (executor.isRelatorioGerado()) {
        facesContext.responseComplete();
    } else {
        FacesUtil.addErrorMessage("A execução do relatório não retornou dados.");
    }
}

public Date getDataInicio() {
    return dataInicio;
}

public void setDataInicio(Date dataInicio) {
    this.dataInicio = dataInicio;
}


public Date getDataFim() {
    return dataFim;
}

public void setDataFim(Date dataFim) {
    this.dataFim = dataFim;
}

public Usuario getUsuarioSelecionado() {
    return usuarioSelecionado;
}


public void setUsuarioSelecionado(Usuario usuarioSelecionado) {
    this.usuarioSelecionado = usuarioSelecionado;
}

ProductReportLogs.xhtml:

<f:metadata>
    <f:event listener="#{relatorioProdutosLogsBean.inicializar}"
        type="preRenderView" />
</f:metadata>

<ui:define name="titulo">Relatório de pedidos emitidos</ui:define>

<ui:define name="corpo">
    <h:form id="frm">
        <h1>Relatório de pedidos emitidos</h1>

        <p:messages autoUpdate="true" closable="true" />

        <p:toolbar style="margin-top: 20px">
            <p:toolbarGroup>
                <p:commandButton value="Emitir"
                    action="#{relatorioProdutosLogsBean.emitir}" ajax="false" />
            </p:toolbarGroup>
        </p:toolbar>

        <p:panelGrid columns="2" id="painel2"
            style="width: 100%; margin-top: 20px" columnClasses="rotulo, campo">
            <p:outputLabel value="Data de criação" />
            <h:panelGroup>
                <p:calendar value="#{relatorioProdutosLogsBean.dataInicio}"
                    label="Data inicial" pattern="dd/MM/yyyy" size="10" />
                <p:spacer width="8" />
                <h:outputText value="a" />
                <p:spacer width="8" />
                <p:calendar value="#{relatorioProdutosLogsBean.dataFim}"
                    label="Data final" pattern="dd/MM/yyyy" size="10" />
            </h:panelGroup>
        </p:panelGrid>
        <p:panelGrid columns="2" id="painel"
            style="width: 100%; margin-top: 20px" columnClasses="rotulo, campo">
            <p:outputLabel value="Nome" />
            <h:panelGroup>

                <p:selectOneMenu value="#{relatorioProdutosLogsBean.usuarioSelecionado}">
                    <f:selectItem itemLabel="Selecione" itemValue="" />
                    <f:selectItems value="#{relatorioProdutosLogsBean.usuariosDisponiveis}"
                        var="usuario" itemLabel="#{usuario.nome}" itemValue="#{usuario}" />
                </p:selectOneMenu>

            </h:panelGroup>
        </p:panelGrid>
    </h:form>
</ui:define>

    
asked by anonymous 06.10.2015 / 03:26

1 answer

1

Note your class that implements the Converter interface as follows:

@FacesConverter(value = "nome_conversor", forClass = Usuario.class)

In the% cos_de% component of primefaces you explicitly define the name of the converter in the selectOneMenu attribute. Another detail, leave the converter="nome_conversor" attribute in your noSelectOption="true" , anything we are there.

    
06.10.2015 / 03:54