JSF - Converter Boolean para Character

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

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

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);
	}
    
}

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:

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

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;

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:

faça um workaround do tipo

[code]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’ );
}[/code]

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

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…

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

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?

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

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:

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…

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

isso mesmo… :smiley:

Obrigado pelas dicas…

Feliz 2008…

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é.