Bom dia galera estou com um problema ao utilizar SelectOneMenu. seguinte, eu tenho uma lista de categorias e uma lista de contas que gostaria de selecionar em um selectonemenu para associar estas duas entidades a uma transação. Porem não estou conseguindo, já tentei inumeras soluções sem sucesso.
Atualmente estou tentando da seguinte forma:
este é meu form:
[code]<?xml version=“1.0” encoding=“ISO-8859-1” ?>
<ui:composition xmlns=“http://ww.w3.org/1999/xhtml”
xmlns:f=“http://java.sun.com/jsf/core”
xmlns:h=“http://java.sun.com/jsf/html”
xmlns:ui=“http://java.sun.com/jsf/facelets”
xmlns:p=“http://primefaces.org/ui”>
<h:inputHidden id=“hiddenID” value="#{transacaoBean.transacao.id}"></h:inputHidden>
<p:growl id=“growl” showDetail=“true” sticky=“true” />
<p:panel id="panel" style="align: center">
<p:panelGrid columns="4">
<p:outputLabel value="Selecione uma Conta: " for="campo-conta" />
<p:selectOneMenu value="#{transacaoBean.transacao.conta}"
id="campo-conta" required="true"
requiredMessage="Por favor selecione uma conta" converter="conta">
<f:selectItem itemLabel="Selecione" noSelectionOption="true" />
<f:selectItems value="#{transacaoBean.contas}" var="conta"
itemValue="#{conta.id}" itemLabel="#{conta.descricao}" />
<p:ajax update="gridTransacao" />
</p:selectOneMenu>
<p:message for="campo-conta" />
<p:tooltip for="campo-conta"
value="Selecione uma conta para incluir ou alterar uma transação"
showEffect="slide" hideEffect="explode"></p:tooltip>
</p:panelGrid>
<p:separator></p:separator>
<p:panelGrid columns="4" id="gridTransacao">
<f:facet name="header">
Informações da Transação
</f:facet>
<p:outputLabel value="Descrição da Transação" for="campo-transacao" />
<p:inputText id="campo-transacao"
value="#{transacaoBean.transacao.descricao}" required="true"
requiredMessage="Por favor informe uma descrição para a transação"></p:inputText>
<p:message for="campo-transacao" />
<p:tooltip for="campo-transacao"
value="Por favor preencha uma descrição para a transação"
showEffect="slide" hideEffect="explode"></p:tooltip>
<p:outputLabel value="Data de Vencimento" for="campo-data-vencimento" />
<p:calendar id="campo-data-vencimento"
value="#{transacaoBean.transacao.dataVencimento}"
pattern="dd/MM/yyyy" locale="pt" showButtonPanel="true"
navigator="true" required="true"
requiredMessage="Por favor informe a data de vencimento para a conta" />
<p:message for="campo-data-vencimento" />
<p:tooltip for="campo-data-vencimento"
value="Por favor preencha uma descrição para a transação"
showEffect="slide" hideEffect="explode"></p:tooltip>
<p:outputLabel value="Data de Pagamento" for="campo-data-pagamento" />
<p:calendar id="campo-data-pagamento"
value="#{transacaoBean.transacao.dataTransacao}"
pattern="dd/MM/yyyy" locale="pt" readonly="true"
showButtonPanel="true" navigator="true" />
<p:message for="campo-data-pagamento" />
<p:tooltip for="campo-data-pagamento"
value="Caso necessário preencha a data em que a transação foi paga"
showEffect="slide" hideEffect="explode"></p:tooltip>
<p:outputLabel value="Selecione um Status: " for="campo-status" />
<p:selectOneMenu value="#{transacaoBean.transacao.status}" id="campo-status"
required="true" requiredMessage="Por favor selecione um status">
<f:selectItem itemLabel="Selecione" noSelectionOption="true" />
<f:selectItem itemLabel="Pago" itemValue="1" />
<f:selectItem itemLabel="Pendente" itemValue="2" />
</p:selectOneMenu>
<p:message for="campo-status" />
<p:tooltip for="campo-status"
value="Selecione um status para incluir ou alterar uma transação"
showEffect="slide" hideEffect="explode"></p:tooltip>
<p:outputLabel value="Selecione uma Categoria " for="campo-categoria" />
<p:selectOneMenu value="#{transacaoBean.transacao.categoria}"
id="campo-categoria" required="true"
requiredMessage="Por favor selecione um status"
converter="categoria">
<f:selectItem itemLabel="Selecione" noSelectionOption="true" />
<f:selectItems value="#{transacaoBean.categorias}" var="categoria"
itemValue="#{categoria.id}" itemLabel="#{categoria.descricao}" />
</p:selectOneMenu>
<p:message for="campo-categoria" />
<p:tooltip for="campo-categoria"
value="Selecione uma Categoria para incluir ou alterar uma transação"
showEffect="slide" hideEffect="explode"></p:tooltip>
<p:outputLabel value="Valor da Transação" for="campo-valor" />
<p:inputText value="#{transacaoBean.transacao.valor}"
id="campo-valor" required="true" requiredMessage="Campo Obrigatório"
maxlength="40" type="decimal">
<f:convertNumber pattern="#,##0.00;(#,##0.00)"></f:convertNumber>
<p:ajax update="campo-valor,msgCampo-valor" />
</p:inputText>
<p:message for="campo-valor" id="msgCampo-valor" />
<p:tooltip for="campo-valor" value="Preencha o valor da transação"
showEffect="slide" hideEffect="explode"></p:tooltip>
</p:panelGrid>
<p:commandButton value="Salvar"
update="panel,gridTransacao,growl,hiddenID" id="ajax"
actionListener="#{transacaoBean.adiciona}" />
</p:panel>
</ui:composition>[/code]
este é meu managedbean:
[code]@ManagedBean
public class TransacaoBean {
private Transacao transacao = new Transacao();
private List<Conta> contas;
private List<Transacao> transacoes;
private List<Categoria> categorias;
public void adiciona() {
EntityManager manager = this.getManager();
TransacaoRepository repository = new TransacaoRepository(manager);
ContaRepository contaRepository = new ContaRepository(manager);
CategoriaRepository categoriaRepository = new CategoriaRepository(
manager);
String mensagem = "";
if (this.transacao.getId() == null || this.transacao.getId() == 0) {
repository.adiciona(this.transacao);
mensagem = "Transação cadastrada com sucesso";
} else {
repository.atualiza(transacao);
mensagem = "Transação atualizada com sucesso";
}
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("sucesso", mensagem));
this.transacao = new Transacao();
this.transacoes = null;
}
public void preparaAlteracao() {
Map<String, String> params = FacesContext.getCurrentInstance()
.getExternalContext().getRequestParameterMap();
Long id = Long.parseLong(params.get("id"));
EntityManager manager = this.getManager();
TransacaoRepository repository = new TransacaoRepository(manager);
this.transacao = repository.procurar(id);
}
public void remove() {
Map<String, String> params = FacesContext.getCurrentInstance()
.getExternalContext().getRequestParameterMap();
Long id = Long.parseLong(params.get("id"));
EntityManager manager = this.getManager();
TransacaoRepository repository = new TransacaoRepository(manager);
repository.remove(id);
this.transacoes = null;
}
public List<Transacao> getTransacoes() {
if (this.transacoes == null) {
EntityManager manager = this.getManager();
TransacaoRepository repository = new TransacaoRepository(manager);
this.transacoes = repository.getLista(this.transacao.getConta());
}
return this.transacoes;
}
public Transacao getTransacao() {
return transacao;
}
public void setTransacao(Transacao transacao) {
this.transacao = transacao;
}
public void setTransacoes(List<Transacao> transacoes) {
this.transacoes = transacoes;
}
public List<Conta> getContas() {
if (this.contas == null) {
EntityManager manager = this.getManager();
ContaRepository repository = new ContaRepository(manager);
this.contas = repository.getLista();
}
return this.contas;
}
public void setContas(List<Conta> contas) {
this.contas = contas;
}
public List<Categoria> getCategorias() {
if (this.categorias == null) {
CategoriaRepository repository = new CategoriaRepository(
this.getManager());
this.categorias = repository.getLista();
}
return this.categorias;
}
public void setCategorias(List<Categoria> categorias) {
this.categorias = categorias;
}
private EntityManager getManager() {
FacesContext fc = FacesContext.getCurrentInstance();
ExternalContext ec = fc.getExternalContext();
HttpServletRequest request = (HttpServletRequest) ec.getRequest();
return (EntityManager) request.getAttribute("EntityManager");
}
}
[/code]
Está eh a minha entidade de transações:
[code]@Entity
public class Transacao {
@Id
@GeneratedValue
private Long Id;
private String Descricao;
@Temporal(TemporalType.DATE)
private Date DataTransacao;
@Temporal(TemporalType.DATE)
private Date DataVencimento;
private Integer Status;
@ManyToOne
private Conta conta;
@ManyToOne
private Categoria categoria;
private Double Valor;
public Long getId() {
return Id;
}
public void setId(Long id) {
Id = id;
}
public String getDescricao() {
return Descricao;
}
public void setDescricao(String descricao) {
Descricao = descricao;
}
public Date getDataTransacao() {
return DataTransacao;
}
public void setDataTransacao(Date dataTransacao) {
DataTransacao = dataTransacao;
}
public Date getDataVencimento() {
return DataVencimento;
}
public void setDataVencimento(Date dataVencimento) {
DataVencimento = dataVencimento;
}
public Integer getStatus() {
return Status;
}
public void setStatus(Integer status) {
Status = status;
}
public Conta getConta() {
return conta;
}
public void setConta(Conta conta) {
this.conta = conta;
}
public Categoria getCategoria() {
return categoria;
}
public void setCategoria(Categoria categoria) {
this.categoria = categoria;
}
public Double getValor() {
return Valor;
}
public void setValor(Double valor) {
Valor = valor;
}
}
[/code]
e este é um dos converters que estou tentando utilizar:
[code]@FacesConverter(value = “conta”, forClass = Conta.class)
public class ContaSelectConverter implements Converter {
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String value) {
Long id = Long.valueOf(value);
Utilidades utils = new Utilidades();
ContaRepository repository = new ContaRepository(utils.getManager());
return repository.procurar(id);
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object value) {
if (value != null && value instanceof Conta) {
Conta conta = (Conta) value;
return conta.getDescricao();
}
return null;
}
}
[/code]
O primeiro problema que estou tentando é que ao clicar no botão salvar, está sendo enviado o conteudo do label do selectonemenu e não o value… o segundo problema é que mesmo modificando meu label para conter o id (no codigo final não poderia ficar assim mas testei…) o jsf retorna a seguinte mensagem: Selecione uma Categoria : Validation Error: Value is not valid
Se alguem puder me ajudar agradeço muitooooo… se tiverem algum exemplo que use este tipo de estrutura vai me ajudar muito mesmo… Meu unico problema é este maldito selectonemenu o resto está perfeito =/
