Olá galera!
Estou tentando usar o selectOneMenu do PrimeFaces com a opção de Filter. (http://www.primefaces.org/showcase-labs/ui/selectOneMenu.jsf)
Meu menu está trazendo normal a lista do banco de dados, porém quando eu digito algo no campo de filtro minha lista não filtra e fica vazia.
Meu menu está assim:
<p:selectOneMenu value="#{cadastroGuarnicaoBean.guarnicao.viatura}"
id="viatura" label="Viatura" var="vp" filter="true">
<f:selectItem itemLabel="Selecione" itemValue="" />
<f:selectItems value="#{cadastroGuarnicaoBean.viaturas}"
var="viatura" itemLabel="#{viatura.prefixo}"
itemValue="#{viatura}" />
<p:column> #{vp.prefixo} - #{vp.marca} </p:column>
</p:selectOneMenu>
Este é o conversor:
[code]@FacesConverter(forClass = Guarnicao.class)
public class GuarnicaoConverter implements Converter {
private Repositorios repositorios = new Repositorios();
@Override
public Object getAsObject(FacesContext context, UIComponent component,
String value) {
Guarnicao retorno = null;
Guarnicoes guarnicoes = this.repositorios.getGuarnicoes();
if (value != null && !value.equals("")) {
retorno = guarnicoes.porCodigo(new Integer(value));
}
return retorno;
}
@Override
public String getAsString(FacesContext context, UIComponent component,
Object value) {
if (value != null) {
Integer codigo = ((Guarnicao) value).getCodigo();
return codigo == null ? "" : codigo.toString();
}
return null;
}
}
[/code]
Aguém sabe como resolver este problema? :?:
tem o codigo do bean ai ?
public class CadastroGuarnicaoBean {
private Repositorios repositorios = new Repositorios();
private Guarnicao guarnicao = new Guarnicao();
private List<Viatura> viaturas = new ArrayList<Viatura>();
@PostConstruct
public void init() {
Viaturas viaturas = this.repositorios.getViaturas();
this.viaturas = viaturas.todos();
}
public void salvar() {
GestaoGuarnicoes gestaoGuarnicoes = new GestaoGuarnicoes(
this.repositorios.getGuarnicoes());
gestaoGuarnicoes.salvar(guarnicao);
this.guarnicao = new Guarnicao();
FacesUtil.adicionarMensagem(FacesMessage.SEVERITY_INFO,
"Salvo com sucesso!");
}
public List<Viatura> getViaturas() {
return viaturas;
}
public Guarnicao getGuarnicao() {
return guarnicao;
}
public void setGuarnicao(Guarnicao guarnicao)
throws CloneNotSupportedException {
this.guarnicao = guarnicao;
if (this.guarnicao == null) {
this.guarnicao = new Guarnicao();
} else {
this.guarnicao = (Guarnicao) guarnicao.clone();
}
}
}
você não especificou o converter no selectonemenu, será que não é isso?
<p:selectOneMenu value="#{cadastroGuarnicaoBean.guarnicao.viatura}"
id="viatura"
label="Viatura"
var="vp"
filter="true"> // TENTA COLOCAR O CONVERTER converter="guarnicao" //
<f:selectItem itemLabel="Selecione" itemValue="" />
<f:selectItems value="#{cadastroGuarnicaoBean.viaturas}"
var="viatura" itemLabel="#{viatura.prefixo}"
itemValue="#{viatura}" />
<p:column> #{vp.prefixo} - #{vp.marca} </p:column>
</p:selectOneMenu>
fabio,
Se eu fazer como você sugeriu aparece o erro “Erro de expressão: Objeto denominado: guarnicao não encontrado.”
Outra sugestão?
você precisa nomear o converter, eu só citei 1 exemplo
no converter coloca assim:
@FacesConverter(value="guarnicao",forClass = Guarnicao.class) // ou se preferir nomeie como guarnicaoConverter e mude tb ai o nome no selectonemenu
caso ainda assim não encontre o converter, ai voce precisa adicionar no face-config.xml
<converter>
<converter-id>guarnicaoConverter</converter-id>
<converter-class>caminho.pacote.sua.app.GuarnicaoConverter</converter-class>
</converter>
fabio,
agora apareceu o erro “java.lang.ClassCastException: java.lang.String cannot be cast to br.org.siscoweb.model.Guarnicao
at br.org.siscoweb.converter.GuarnicaoConverter.getAsString(GuarnicaoConverter.java:33)”
:?
Pode me ajudar?
o problema agora parece ser só de converter
tente mudar seu metodo conforme abaixo no converter:
adicionar:
private Guarnicao guarnicao = new Guarnicao();
e altere seu metodo conforme getAsString abaixo:
@Override
public String getAsString(FacesContext context, UIComponent component,,Object value) {
guarnicao = (Guarnicao) (value); // setando o atributo do converter, e não uma atributo interno do método sacou?
return String.valueOf(value); // retorna o valor como string
}
qualquer coisa pode responder
Fábio,
obrigado por responder.
Bem, ainda continua aparecendo o mesmo erro de cast.
Tem outra sugestão?
Ressucitando…
E ai Fábio, estou com o mesmo problema, conseguiu resolver?
Olá Guilherme,
eu não consegui fazer este componente funcionar. Acho que o componente que está com defeito. Se você conseguir faze-lo funcionar por favor, coloque aqui a solução.
Abraço
Consegui sim, so que estou em casa, amanha assim que chegar na empresa coloco a solução, abraço
Beleza cara, diga também qual versão do Primefaces vc conseguiu.
a ultima estavel que tem, 3.4.2 se nao me engano
Ainda não mudei para esta versão. Atualmente estou com a 3.3.1
Na época que tive este problema a versão que tinha era a 3.4 e esta versão não funcionava alguns componentes corretamente.
Bom dia, segue a minha solução
XHTML:
<p:autoComplete value="#{FuncionarioClienteMBean.clienteSelecionado}" id=“txtSelecionaCliente” completeMethod="#{FuncionarioClienteMBean.completarClientes}" var=“p” itemLabel="#{p.nomeFantasia.concat(’ - ').concat(p.endereco.estado)}" itemValue="#{p}" converter=“clienteConverter” forceSelection=“true”>
<p:ajax event="itemSelect" listener="#{FuncionarioClienteMBean.preencherListaSetores()}" update="comboSelecionaSetor"/>
</p:autoComplete>
MBEAN:
public List completarClientes(String query) {
List sugestoes = new ArrayList<>();
for (EmpresaCliente p : this.servicoCliente.listarAtivos()) {
if (p.getNomeFantasia().startsWith(query)) {
sugestoes.add(p);
}
}
return sugestoes;
}
CONVERTER:
@FacesConverter(value = “clienteConverter”, forClass = EmpresaCliente.class)
public class ClienteConverter implements Converter {
@EJB(name = "EmpresaClienteServico/remote")
private ServicoClienteRemoto servicoCliente;
public ClienteConverter() {
this.servicoCliente = new InjetaServicoClienteRemoto().injetar();
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
return this.servicoCliente.buscar(new Long(value));
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
String result = null;
if (value != null && value instanceof EmpresaCliente) {
EmpresaCliente cliente = (EmpresaCliente) value;
result = cliente.getId().toString();
}
return result;
}
}
Espero que resolva seu problema, comigo aqui funcionou 100%
Olá Guilherme!
Então, você conseguiu fazer funcionar utilizando o componente “autoComplete” do Primefaces. Utilizando este componente eu também consegui fazer.
Mas o que eu não consegui fazer foi com o componente “selectOneMenu” utilizando o “filter” deste componente.
Acho que estes dois componentes tem suas funções bem parecidas. Acho que o que difere é que o “selectOneMenu” pode ser adicionado imagem quando faz o filtro, assim como está no ShowCase do Primefaces.
Eu acabei utilizando o componente “autoComplete” mesmo.
Tenta utilizar o selectOneMenu no seu projeto pra ver se vai funcionar também.
Eu vou tentar utiliza-lo novamente com essa versão mais nova (3.4.2) e se conseguir eu publico o código aqui.
Guilherme, funcionou aqui beleza utilizando o “selectOneMenu”. Outra diferença entre o “autoComplete” é que não precisa colocar o código de filtro no ManagedBean.
Não fiz nenhuma alteração no meu código em relação ao que coloquei neste tópico. Pelo que parece o problema era na versão da biblioteca do PrimeFaces que eu estava utilizando.
Com esta versão mais nova (3.4.2) funcionou beleza.
ah foi mal cara, me confundi, eu também tava tentando fazer funcionar o SelecOneMenu, mas consegui apenas o autocomplete, embora eles sejam parecidos, nao consegui faze-lo funcionar, tem um autocomplete com dropdown nao sei se você chegou a ver, o primefaces esta lançando uma nova versão hoje, pelo que eu vi, parece que mexeram no OneMenu. Vou dar mais uma tentada aqui para ver se consigo algo, qualquer coisa posto aqui.
Wendell, da uma olhada nesse daqui http://www.primefaces.org/showcase/ui/autoCompleteItemtip.jsf, aparece foto também e tal, e é mais bonito do que a combo