JSF - Converter Boolean para Character

16 respostas
Z

Olá Pessoal,

Tenho um pojo com campo Character(‘S’ ou ‘N’) correspondendo a TRUE ou FALSE.

Na tela, estou utilizando:

<h:selectBooleanCheckbox id=“ativo” value="#{meuMB.pojo.ativo}" required=“true” rendered=“true”>
<f:converter converterId=“MyBooleanConverter”/>
</h:selectBooleanCheckbox>

Retornar do Banco de Dados ‘S’ convertendo para Boolean (True)… Estou conseguir :smiley: … O problema está no retorno…
Apresenta erro de validação…

Por enquanto para solucionar, estou utilizando por exemplo: meuMB.pojo.ativoBoolean.

Será que alguem tem uma solução mais elegante?

Desde já agradeço pela colaboração

16 Respostas

L

esse link pode (e vai) lhe ajudar (pra caramba)

http://www.ibm.com/developerworks/java/library/j-jsf3/

Eu tive que fazer alguns converters, por exemplo, converter de ENUM

não é NENHUM bixo de 7 cabeças. É muito tranquilo e não dói nada (sério, no inicio eu tinha muito pavor só de ler a palavra converter rsrs), vai por mim :slight_smile:

abração

Z

Leozin,

Obrigado por responder…

Estou apanhando feio com este tal conversor… :cry:

Quando executo o metodo Salvar por exemplo, deveria converter novamente true para ‘S’… Mas, apresenta erro informando que o atributo ativo é do tipo Character e está recebendo ‘true’. Veja o código abaixo do conversor:

public Object getAsObject(FacesContext context, UIComponent component, String valorTela) throws ConverterException {
    LOG.info("MyBooleanConverter.getAsObject: " + valorTela);
    
    try{
    	return valorTela == null || !Boolean.parseBoolean(valorTela) ? new Character('N') : new Character('S');
	} catch (Exception e) {
        throw new ConverterException(e);
	}
}

public String getAsString(FacesContext context, UIComponent component, Object value) throws ConverterException {
    LOG.info("MyBooleanConverter.getAsString: " + value);
    
    try {
    	
    	Boolean result = ((Character) value).equals('S')  ? true : false;
    	
    	return result.toString();
    	
	} catch (Exception e) {
        throw new ConverterException(e);
	}
    
}
Z

Hoje andei lendo varios artigos e foruns pela internet a fora… O que vc passou ja havia lido hoje a tarde… Não encontrei ainda o caminho das pedras… :frowning:

L

cara, posta o teu POJO que retorna do banco (você tá usando hibernate né?)

Z

Tem vários Pojos com o atributo ativo do tipo Character…

Estou pensando em criar um Checkbox extends com.sun.faces.renderkit.html_basic.CheckboxRenderer para reconhecer ‘S’ com True e ‘N’ com False

@Entity
public class CCusto implements Serializable{

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=TABLE, generator = "MySeqCCusto")
@TableGenerator(name="MySeqCCusto", table = "SEQUENCE", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "CCusto",allocationSize=1)
private Integer id;

private String codigo;

private String codigoContabil;

private String codigoReduzido;

private String descricao;

private Character permiteLancamento = 'S';

private Character ativo 			= 'S';

@ManyToOne
private Empresa empresa;

@ManyToMany
private List<Conta> conta;
Z

Mensagem de Erro quando executo o Salvar por exemplo:

/pages/ccusto/ccustoEdit.xhtml @72,110 value="#{ccustoMB.ccusto.ativo}": Can’t set property ‘ativo’ of type ‘java.lang.Character’ on class ‘com.intecnologia.ipc.ccusto.model.vo.CCusto’ to value ‘true’.

Estou utilizando:

provider: TopLink
JSF 1.2 com Facelets

Eu poderei até mudar de Char para Bit o tipo de Campo… Mas, convencer DBA para mudar todos os campos é um pouco complicado… Posso até queimar o filme sobre a minha argumentação de utilizar JSF+Facelets :lol:

L

faça um workaround do tipo

private Character ativo;

// getters and setters

public void setAtivoBool( boolean ativo ) {
  this.ativo = (ativo) ? 'S' : 'N';
}

public boolean isAtivoBool() {
  if( ativo == null )
    return false;
   
  return ativo.equals( 'S' );
}

daí na tua página JSP tu faz #{meuBean.ativoBool}

Z

Leozin,

Obrigado pela sugestão…

Por enquanto, estou utilizando este mecanismo de conversão…

Estou procurando outra alternativa neste projeto para não precisar criar vários get’s/set’s adicionais…

L

eu só quero entender porque o teu converter não está funcionando

você chegou a debuggar ele pra ver se funciona legal?

não sei se tu tá ligado, mas assim: o getAsString é o que vai ficar no JSP e o getAsObject é o que vai ser chamado ANTES de ser setado no bean

Z

Cheguei debugar… Não passa pelo getAsObject… Parece que outro conversor entra em ação ou validator… ConverterCharacter…

Será que tem haver eu está utilizando facelets?

L

você adicionou o teu validator no faces-config.xml?

Z

Sim!

O Converter que criei, executa o metodo getAsString. Transformando o Character ‘S’ por exemplo em true… Assim, o Checkbox dor formulario é marcado… O problema está na devolução do valor… Apresenta a mensagem já postada…

Já perdi algumas noites de sono procurando entender o problema… Como dizem, eu sou brasileiro… não desisto nunca… :lol:

Z

Encontrei este artigo na web sobre bug converter boolean checkbox…

http://www.i-coding.de/www/en/jsf/bug-selectbooleancheckbox-converter.html

Estou tentando entender…

L

eu outro dia desses tava pensando que os combo box tinha algum bug com validators ou afins

bom então vamos voltar pra primeira opção, de criar os get/set/is do teu boolean no teu bean

Z

isso mesmo… :smiley:

Obrigado pelas dicas…

Feliz 2008…

S

Mal ai ressucitar o tópico mas esse problema do converte utilizando selectBooleanCheckbox foi corrigido ? Alguem conseguiu fazer esse converter ? Aqui ele não passa pelo método getAsObject, se alguém resolveu isso por favor deixe a solução.

Até.

Criado 26 de dezembro de 2007
Ultima resposta 27 de ago. de 2014
Respostas 16
Participantes 3