Conversor está retornando Label do selectOneMenu

284 views
Skip to first unread message

Dionatan Hovoruski

unread,
Oct 2, 2011, 4:11:15 AM10/2/11
to javasf: JavaServer Faces Group
Estou usando um conversor para o meu selectOneMenu. Porém, ao realizar
a operação getAsObject o parametro de entrada está vindo com o label
do campo e não com seu valor.

Segue abaixo o conversor em que a variável de entrada "string" está
vindo com o label:

@Override
public Object getAsObject(FacesContext fc, UIComponent uic, String
string) {
if (string.trim().equals("")) {
return null;
} else {
try {
Integer number = Integer.parseInt(string);

Session session =
FacesContextUtil.getRequestSession();
InterfaceDAO<Aluno> alunoDAO = new
HibernateDAO<Aluno>(Aluno.class, session);
Aluno aluno = new Aluno();

aluno = alunoDAO.getBean(number);

if (aluno != null) {
return aluno;
}

} catch (NumberFormatException exception) {
throw new ConverterException(new
FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro de Conversão", "Não é
um aluno válido!"));
}
}
return null;
}


Segue o selectOneMenu:

<p:selectOneMenu id="Aluno"
value="#{matriculaController.matricula.aluno.id}" style="width:
300px;" converter="alunoconversor"
requiredMessage="O campo Aluno é de
preenchimento obrigatório">
<f:selectItem itemLabel="Selecione o Aluno"
itemValue=""/>
<f:selectItems value="#{alunoController.alunos}"
var="aluno" itemLabel="#{aluno.nome}" itemValue="#{aluno.id} "/>
</p:selectOneMenu>

Rafael Trindade Chiappetta

unread,
Oct 2, 2011, 11:26:30 AM10/2/11
to jav...@googlegroups.com
Mostra o trecho de código que popula a lista de alunos.

=====
Rafael Trindade Chiappetta

http://lanafeira.biz - Você compra e vende de tudo.
@LaNaFeira



2011/10/2 Dionatan Hovoruski <dionat...@gmail.com>

--
Você recebeu esta mensagem por que é membro do  Javasf
http://groups.google.com/group/javasf

Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil

Dionatan Hovoruski

unread,
Oct 2, 2011, 12:59:53 PM10/2/11
to javasf: JavaServer Faces Group
public List<Aluno> getAlunos() {
alunos = listarAlunos();
return alunos;
}



public List<Aluno> listarAlunos() {

Session session =
HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
InterfaceDAO<Aluno> cursoDAO = new
HibernateDAO<Aluno>(Aluno.class, session);

List<Aluno> lista = new ArrayList<Aluno>();
lista = cursoDAO.getBeans();

session.close();
return lista;
}




On Oct 2, 12:26 pm, Rafael Trindade Chiappetta <rafaelt...@gmail.com>
wrote:
> Mostra o trecho de código que popula a lista de alunos.
>
> =====
> Rafael Trindade Chiappettahttp://about.me/rafaeltc
> @rafaeltscs
>
> http://lanafeira.biz- Você compra e vende de tudo.
> @LaNaFeira
>
> 2011/10/2 Dionatan Hovoruski <dionatan1...@gmail.com>

Flavio Cysne

unread,
Oct 3, 2011, 7:38:30 AM10/3/11
to jav...@googlegroups.com
Isto é um bug conhecido que relatei no Issue Tracker do Mojarra.


O componente vai usar o toString do itemLabel pois é a opção selecionada por padrão.
O bug está declarado como sendo um problema com o <h:selectManyListBox/>, mas me parece que ele afeta todos os componentes baseados em <f:selectItem/> e <f:selectItems/> com converter.

Podes usar três saídas disso (são as que eu sei que funcionam):
    - sem usar converter: usar um List<SelectItem> ao invés de um List da sua entidade;
    - sem usar converter: definir no itemValue do <f:selectItems/> o id da entidade e no value do <h:selectOneMenu/> um atributo compatível (Integer, Long, etc); ou
    - usando converter: usar o JBoss Seam com <s:entityConverter/>

Gostaria muito de estar errado sobre o que acabei de dizer. Se acharem uma outra solução por favor postem p/ eu fazer o teste com os outros componentes e talvez apontar uma correção p/ o meu relato.

Espero ter ajudado.
Flávio Cysne

Mayara Madeira Trevisol

unread,
Oct 3, 2011, 7:45:35 AM10/3/11
to javasf: JavaServer Faces Group
Bom dia Dionatan,

eu uso assim e meu conversor está retornando o objeto normalmente:


XHTM (JSF 2):

<h:outputText value="Setor:"/>
<h:selectOneMenu value="#{papelSetorMBean.filtro.setor}"
converter="IndexedConverter">
<f:selectItems value="#{papelSetorMBean.setorLst}" var="setor"
itemLabel="#{setor.nome}" itemValue="#{setor}"/>
</h:selectOneMenu>

----------

MB:

@PostConstruct
public String carregaCombos() {
setorLst.add(new Setor(0, "Selecione"));
setorLst.addAll(setorEjb.buscarTodos());

return "";
}

----------

Converter (unico para qualquer tipo de combo):

package br.com.emp.proj.conversores;

import java.util.UUID;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

@FacesConverter(value = "IndexedConverter")
public class IndexedConverter implements Converter {

@Override
public String getAsString(FacesContext context, UIComponent
component,
Object value) {
String uuid = UUID.randomUUID().toString();
component.getAttributes().put(uuid, value);
return uuid;
}

@Override
public Object getAsObject(FacesContext context, UIComponent
component,
String value) {
if (value != null) {
return component.getAttributes().get(value);
}
return null;
}
}

Espero que te ajude! :)

Abs,

Mayara Madeira Trevisol

Dionatan Hovoruski

unread,
Oct 3, 2011, 12:34:41 PM10/3/11
to javasf: JavaServer Faces Group
setorLst é do tipo List?

O seu método setorEjb.buscarTodos() retorna uma list com todos os
campos ou apenas o ID e a descrição do campo?

On Oct 3, 8:45 am, Mayara Madeira Trevisol <mayara...@gmail.com>
wrote:

Mayara Madeira Trevisol

unread,
Oct 3, 2011, 12:39:02 PM10/3/11
to javasf: JavaServer Faces Group
Oi Dionatan,

é isso mesmo:

private List<Setor> setorLst = new ArrayList<Setor>();

e o método setorEjb.buscarTodos() retorna uma lista de objetos Setor.

Abs,

Mayara Madeira Trevisol

Dionatan Hovoruski

unread,
Oct 3, 2011, 5:10:52 PM10/3/11
to javasf: JavaServer Faces Group
Boa tarde Mayara

Só agora pude testar o teu conversor. Mais infelizmente sem sucesso.
Ocorreu o seguinte Erro:

javax.el.ELException: /matricula/alterar.xhtml @26,93
value="#{matriculaController.matricula.aluno}": Cannot convert
Dionatan Hovoruski of type class java.lang.String to class
br.com.webscola.model.bean.Aluno

On Oct 3, 1:39 pm, Mayara Madeira Trevisol <mayara...@gmail.com>
wrote:

Alexandre Silveira

unread,
Oct 3, 2011, 5:19:15 PM10/3/11
to jav...@googlegroups.com
Dionatan

Só não entendi pq tu ta usando o conversor, se no fim das contas tu estás usando o "id" no teu value:

   <p:selectOneMenu id="Aluno"
value="#{matriculaController.matricula.aluno.id}" style="width:
300px;" converter="alunoconversor"
                            requiredMessage="O campo Aluno é de
preenchimento obrigatório">
               <f:selectItem itemLabel="Selecione o Aluno"
itemValue=""/>
               <f:selectItems value="#{alunoController.alunos}"
var="aluno" itemLabel="#{aluno.nome}" itemValue="#{aluno.id} "/>
           </p:selectOneMenu>

Ao meu ver, deveria ser:

   <p:selectOneMenu id="Aluno" value="#{matriculaController.matricula.aluno}" style="width: 300px;" converter="alunoconversor" requiredMessage="O campo Aluno é de preenchimento obrigatório">

               <f:selectItem itemLabel="Selecione o Aluno" itemValue=""/>
               <f:selectItems value="#{alunoController.alunos}" var="aluno" itemLabel="#{aluno.nome}" itemValue="#{aluno} "/>
           </p:selectOneMenu>


2011/10/3 Dionatan Hovoruski <dionat...@gmail.com>
--
Você recebeu esta mensagem por que é membro do  Javasf
http://groups.google.com/group/javasf

Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil



--
_________________________________
Alexandre Silveira Neto
Analista e Desenvolvedor de Sistemas
Voiza - Soluções em Java

masami

unread,
Oct 3, 2011, 5:04:03 PM10/3/11
to javasf: JavaServer Faces Group
Para mim acontece a mesma coisa, acredito que seja problema no Mojarra
como o Flavio falou.

Como alternativa resolvi atribuir um itemValue para o f:selectItem,
assim:

<h:selectOneMenu id="item"
value="#{servicosController.contratoServicoSelecionado}"
required="true" requiredMessage="Servi&ccedil;o n&atilde;o foi
selecionado">
<f:selectItem itemLabel="Selecione um Servi&ccedil;o" itemValue="0"
noSelectionOption="true" />
<f:selectItems
value="#{servicosComAsController.contratoServicoList}" var="item"
itemLabel="#{item.codContratoServico} - #{item.descricao}"
itemValue="#{item}" />
<f:converter converterId="converterContratoServico" />
</h:selectOneMenu>


@FacesConverter(value = "converterContratoServico", forClass =
ContratoServico.class)
public class ContratoServicoConverter implements Converter {

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

try {
if (value == null || value.equals("") ||
value.equals("0")) {
return null;
}
int id = Integer.parseInt(value);
ContratoServicoFacade contratoServicoFacade =
(ContratoServicoFacade)
AppContext.getApplicationContext().getBean("ContratoServicoFacade");
return contratoServicoFacade.find(id);
} catch (NumberFormatException ne) {
throw new ConverterException(new
FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível converter
'" + value + "' para ContratoServico: identificador não é um número
inteiro.", ne.getMessage()));
} catch (IllegalArgumentException e) {
throw new ConverterException(new
FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível converter
'" + value + "' para ContratoServico: identificador desconhecido.",
e.getMessage()));
}
}

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

if (value == null || value.equals("") || value.equals("0")) {
return null;
}
if (value instanceof ContratoServico) {
ContratoServico aux = (ContratoServico) value;
return aux.getCodContratoServico().toString();
} else if (value instanceof Integer || value instanceof
String) {
return value.toString();
} else {
throw new ConverterException(new
FacesMessage(FacesMessage.SEVERITY_ERROR, "ERRO", "(" +
value.getClass() + ") não é uma instância."));

Dionatan Hovoruski

unread,
Oct 3, 2011, 5:26:19 PM10/3/11
to javasf: JavaServer Faces Group
Ola Alexandre...

Na realidade ele está assim:

<p:selectOneMenu id="Aluno"
value="#{matriculaController.matricula.aluno}" style="width: 300px;"
requiredMessage="O campo Aluno é de
preenchimento obrigatório">
<f:selectItem itemLabel="Selecione o Aluno"
itemValue=""/>
<f:selectItems value="#{alunoController.alunos}"
var="aluno" itemLabel="#{aluno.nome}" itemValue="#{aluno} "/>
</p:selectOneMenu>

Colei uma versão antiga do código na qual estava testando passar no
itemValue="#{aluno.id}
(To tentando de todas as formas pra tentar fazer isto funcionar, to
perdendo muito tempo com isto). =P

PS,: Ainda não consegui resolver.

Att
Dionatan Hovoruski

On Oct 3, 6:19 pm, Alexandre Silveira <alexandre.sn...@gmail.com>
wrote:
> Dionatan
>
> Só não entendi pq tu ta usando o conversor, se no fim das contas tu estás
> usando o "id" no teu value:
>
>    <p:selectOneMenu id="Aluno"
> value="#{matriculaController.matricula.aluno.id<http://matriculacontroller.matricula.aluno.id/>}"
> style="width:
> 300px;" converter="alunoconversor"
>                             requiredMessage="O campo Aluno é de
> preenchimento obrigatório">
>                <f:selectItem itemLabel="Selecione o Aluno"
> itemValue=""/>
>                <f:selectItems value="#{alunoController.alunos}"
> var="aluno" itemLabel="#{aluno.nome}" itemValue="#{aluno.id} "/>
>            </p:selectOneMenu>
>
> Ao meu ver, deveria ser:
>
>    <p:selectOneMenu id="Aluno"
> value="#{matriculaController.matricula.aluno<http://matriculacontroller.matricula.aluno.id/>}"
> style="width: 300px;" converter="alunoconversor" requiredMessage="O campo
> Aluno é de preenchimento obrigatório">
>                <f:selectItem itemLabel="Selecione o Aluno" itemValue=""/>
>                <f:selectItems value="#{alunoController.alunos}" var="aluno"
> itemLabel="#{aluno.nome}" itemValue="#{aluno <http://aluno.id/>} "/>
>            </p:selectOneMenu>
>
> 2011/10/3 Dionatan Hovoruski <dionatan1...@gmail.com>
>
>
>
>
>
>
>
>
>
> > Boa tarde Mayara
>
> > Só agora pude testar o teu conversor. Mais infelizmente sem sucesso.
> > Ocorreu o seguinte Erro:
>
> > javax.el.ELException: /matricula/alterar.xhtml @26,93
> > value="#{matriculaController.matricula.aluno}": Cannot convert
> > Dionatan Hovoruski of type class java.lang.String to class
> > br.com.webscola.model.bean.Aluno
>
> > On Oct 3, 1:39 pm, Mayara Madeira Trevisol <mayara...@gmail.com>
> > wrote:
> > > Oi Dionatan,
>
> > > é isso mesmo:
>
> > > private List<Setor> setorLst = new ArrayList<Setor>();
>
> > > e o método setorEjb.buscarTodos() retorna uma lista de objetos Setor.
>
> > > Abs,
>
> > > Mayara Madeira Trevisol
>
> > --
> > Você recebeu esta mensagem por que é membro do  Javasf
> >http://groups.google.com/group/javasf
>
> > Conheça também o Java Brazil:http://groups.google.com/group/thejavabrazil
>
> --
> _________________________________
> *Alexandre Silveira Neto*

Mayara Madeira Trevisol

unread,
Oct 4, 2011, 7:15:28 AM10/4/11
to javasf: JavaServer Faces Group
Oi Dionatan,

voce está usando JSF 2 certo?

realmente está muito estranho... teu atributo matricula tem get e set
no controller? esses campos estão dentro de um form?

não sei como está a tua tela no todo, mas pensando que essa lista de
alunos pode ficar bem grande, não seria mais adequado usar o
componente autoComplete?

http://www.primefaces.org/showcase/ui/autoCompleteBasic.jsf

Abs,

Mayara Madeira Trevisol

Dionatan Hovoruski

unread,
Oct 4, 2011, 8:24:58 AM10/4/11
to javasf: JavaServer Faces Group
Bom dia Mayara.

Isso mesmo estou usando JSF2.

Acredito que estou sofrendo do bug com o bug que o Alexandre falou
anteriormente. Sim, matrícula tem get e set. Estão dentro de um form
também.

Acho que a melhor alternativa é realmente usar o autoComplete. Já
testei anteriormente o componente e funcionou bem.



On Oct 4, 8:15 am, Mayara Madeira Trevisol <mayara...@gmail.com>
wrote:
Reply all
Reply to author
Forward
0 new messages