Problema com o converter do jsf

7 respostas
T

Ae galera, no sistema que estou mexendo, a parte Web está implementada com JSF+Richfaces, em varias telas, tem comboLists, seja selectOneListbox, ou selectOneMenu, esses combos estao sendo criados utilizando o converter do jsf.

O que acontece é o seguinte, o objeto que referencia o item selecionado, nao está sendo passado para a backbean, entao ocorrem problemas como o seguinte, se eh uma tela de gravar, seleciona-se um item do combo, e manda salvar, vai dar null pointer exception, pois o objeto selecionado nao é passado para o model, retornando null.

Esse problema apenas ocorre no ie6 ou menor, no ie7 ou firefox tudo roda perfeitamente, o que reparei analisando o log, é que na classe que implementa o converter, o metodo getAsObject() nao é executado, o que explica o objeto nao ser retornado, porém, nao tenho ideia de como resolver, alguem ja passou por isso e sabe como me ajudar?

Obrigado desde ja.

7 Respostas

B

Você poderia postar um código como exemplo… para enterdermos corretamente o que você está fazendo…

Obrigado

T
<h:selectOneListbox value="#{backbean.obj}" converter="#{backbean.objCombo}" >
	<f:selectItems value="#{backbean.getResultItems}" />
</h:selectOneListbox>
public class ObjCombo implements Converter {
	public ObjCombo () {}
	
	public synchronized List  getResultItems() {
		ArrayList resultList = new ArrayList();
		
		Iterator<ClassDao>  iterator = getResultList().iterator();
		while (iterator.hasNext()) {
			ClassDao ite = iterator.next();
			SelectItem item = new SelectItem (ite, ite.getNome());
			resultList.add (item);
        }
        return resultList;
    }
	
	public final Object getAsObject(final FacesContext context, final UIComponent component, final String value) {
		if (value == null || "".equals(value))
			return null;
		Object result = null;
		Iterator<SelectItem> iterator = getResultItems().iterator();
		while (iterator.hasNext()) {
			SelectItem o= iterator.next();
			if ( ((ClassDao)o.getValue()).getId().trim().equalsIgnoreCase(value.trim())){
				result = o.getValue();
				break;
			}
		}
		
		return result;
	}

	public final String getAsString(final FacesContext context, final UIComponent component, final Object object) {
		String result = "";

		if ( object instanceof ClassDao) {
			result = "" + ((ClassDao)object).getId();
		}
		return result; 
	}
}

OBS: obj é uma instancia de ClassDao e objCombo uma instancia de ObjCombo

O que deveria acontecer é o seguinte, se o usuário selecionou algum campo, esse campo fica guardado no obj, isso realmente acontece, mas apenas no firefox e ie7, pois no ie6 ou versao inferior o método getAsObject() nao é executado em nenhum momento, alguem pode me ajudar a solucionar isso?

B

A finalidade do Converter não é popular a lista com os valores a serem apresentados no selectOneMenu, etc…

O converter serve para fazer validações quanto ao dado informado, bem como customizar tipos específicos que não são suportados automaticamente pelo JSF. Vale lembrar que os converters de alguns tipos de dados são associados automaticamente pelo JSF.

<blockquote>All JSF implementations must define a set of converters with predefined IDs:

? javax.faces.DateTime (used by f:convertDateTime)

? javax.faces.Number (used by f:convertNumber)

? javax.faces.Boolean, javax.faces.Byte, javax.faces.Character, javax.faces.Double,

javax.faces.Float, javax.faces.Integer, javax.faces.Long, javax.faces.Short (automatically

used for primitive types and their wrapper classes)

? javax.faces.BigDecimal, javax.faces.BigInteger (automatically used for

BigDecimal/BigInteger)

Fonte: Core JavaServer Faces Second Edition

T

sim, concordo com vc, realmente me expressei mal, o que popula a lista é o metodo getResultItens() que retorna uma lista, conforme foi mostrado no codigo, mas para isso passa pela validacao feita pelo converter(String-Objeto) e para que possa retornar esse objeto, é preciso passar pelo método getAsObject(), mas nao passa apenas nas versoes anteriores a 7 do ie, obrigado corrigir minha frase, mas vc sabe porque essa implementacao do converter nao funciona no ie6 ou inferior?

Obrigado

R

TRex:
sim, concordo com vc, realmente me expressei mal, o que popula a lista é o metodo getResultItens() que retorna uma lista, conforme foi mostrado no codigo, mas para isso passa pela validacao feita pelo converter(String-Objeto) e para que possa retornar esse objeto, é preciso passar pelo método getAsObject(), mas nao passa apenas nas versoes anteriores a 7 do ie, obrigado corrigir minha frase, mas vc sabe porque essa implementacao do converter nao funciona no ie6 ou inferior?

Obrigado


A implementação do seu converter está muita confusa, acredito que vale a pena você entender como um converter realmente funciona,
http://www.ibm.com/developerworks/java/library/j-jsf3/

Depois disso, caso você queria trabalhar diretamente com os objetos [entidades] então aconselho uma lida nesse post,
http://www.rponte.com.br/2008/07/26/entity-converters-pra-da-e-vender/

Abraços e boa sorte.

T

A implementação do seu converter está muita confusa, acredito que vale a pena você entender como um converter realmente funciona,
http://www.ibm.com/developerworks/java/library/j-jsf3/

Depois disso, caso você queria trabalhar diretamente com os objetos [entidades] então aconselho uma lida nesse post,
http://www.rponte.com.br/2008/07/26/entity-converters-pra-da-e-vender/

Sinceramente, nao fui eu que implementei o converter, apenas o estou usando, pq o sistema está dessa maneira, porem, nao axei confuso nao, o getResultItems popula uma lista de maneira bem trivial e o getAsObject compara o objeto que está no jsf com a lista, tambem de maneira totalmente trivial, retornando o valor se a comparacao for true, nao digo que é a melhor implementacao pra isso, mas funciona corretamente e está bem simples o entendimento NA MINHA OPNIAO.

Porem a duvida pela qual o topico foi criado nao é sobre como implementar um converter de maneira melhor, e sim, pq no ie6 ou inferior o getAsObject nao é chamado quando a classe que implementa o converter é executada, alguem pode me ajudar nisso?

S

Alguem tem alguma implementacao do convert para realizar formatacao monetaria
no meu caso quando digito 10.50 e gravado em banco 10.5, mais se digitar 10.51
ele grava corretamente. alguem pode me ajudar?

Criado 8 de janeiro de 2009
Ultima resposta 11 de mai. de 2010
Respostas 7
Participantes 4