Conversor/BoolcheckBox

Java

04/09/2012



Pessoal,



Estou tentando fazer um conversor para usar um "BoolCheckBox" mas não está funcionando... estou tentando essa solução pq na tabela (mysql.user) o campo é definido como enum(''N'',''S'') e a única maneira que vejo é converter a string para boolean (conforme trecho do xhtml abaixo):



<p:selectBooleanCheckbox id="chkc" value="#{mBUser.selectedUser.createpriv}">
<f:converter converterId="Cie.Converter.CoversorStringBoolean" for="chkc" ></f:converter>
</p:selectBooleanCheckbox>


Acontece que o tipo do campo na minha tabela é conforme abaixo:












Field

Type

Null

Key

Defaul



Host

char(60)

NO

PRI




User

char(16)

NO

PRI




Create_priv

enum(''N'',''Y'')

NO


N






Na minha entidade User (gerada automaticamente inclusive) está assim:


public class User implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
protected UserPK userPK;
@Column(name = "Create_priv")
private String createpriv;

.

.

.

}


e meu conversor:


@FacesConverter("Cie.Converter.CoversorStringBoolean")
public class CoversorStringBoolean implements Converter {

/**
* Creates a new instance of CoversorStringBoolean
*/
public CoversorStringBoolean() {
}

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
System.out.println("as Object " + value);
if (value.equalsIgnoreCase("false")) {
System.out.println("true");
return true;
} else {
System.out.println("false");
return false;
}
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
System.out.println("as String " + value);
if (value == null) {
return "unnamed";
}

if ( value.toString().equalsIgnoreCase("Y") ) {
return "Sim";
} else {
return "Falso";
}
}

}



Se alguém puder me orientar,
Ricardo Pestana

Ricardo Pestana

Curtidas 0

Respostas

Davi Costa

Davi Costa

04/09/2012

Muito mais simples de vc fazer o que vc ker é fazer um atributo transient (senão sabe o que é pesquise) e no dependendo do valor que ele receber dá um set no seu campo enum, simples simples.

att Davi
GOSTEI 0
Danilo Gomes

Danilo Gomes

04/09/2012

Está usando o Hibernate para o JPA?

Se estiver, pode utilizar a anotation org.hibernate.annotations.Type e construir seu "conversor".

Assim, sua propriedade continua sendo Boolean, mas, para persistir/ler, será utilizada a forma de String.
GOSTEI 0
Ricardo Pestana

Ricardo Pestana

04/09/2012

Eclipse Link
GOSTEI 0
Ricardo Pestana

Ricardo Pestana

04/09/2012

Bom dia,

Vou pesquisar as demais soluções, mas o funcionamento do converter está me deixando muito curioso pq coloquei algumas mensagens no programa ele passa pelo conversor corretamente, fixei para retornar sempre true mas mesmo assim o <p:selectBooleanCheckbox> não é atualizado.

<p:selectBooleanCheckbox id="chkc" value="#{mBUser.selectedUser.createpriv}">
<f:converter converterId="Cie.Converter.CoversorStringBoolean" for="chkc"></f:converter>
</p:selectBooleanCheckbox>

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
System.out.println("as Object " + value);
Boolean toReturn = false;
if (value.equalsIgnoreCase("true")) {
toReturn = true;
System.out.println(toReturn);
return toReturn;
} else {
toReturn = true;
System.out.println(toReturn);
return toReturn;
}
}

Saida no console:

Informações: as Object false
Informações: true
Informações: [EL Info]: 2012-09-05 09:10:24.034--ServerSession(2091422952)--EclipseLink, version: Eclipse Persistence Services - 2.3.2.v20111125-r10461
GOSTEI 0
Ricardo Pestana

Ricardo Pestana

04/09/2012

Mais uma curiosidade,

Se mudo para:
<h:outputLabel value="Permissão Criação" id="Create"/>
<h:outputText value="#{mBUser.selectedUser.createpriv}" label="Create">
<f:converter converterId="Cie.Converter.CoversorStringBoolean"></f:converter>
</h:outputText>

Automaticamente o método a ser utilizado passa a ser:
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
System.out.println("as String " + value);
if (value == null) {
return "unnamed";
}

if ( value.toString().equalsIgnoreCase("Y") ) {
return "Sim";
} else {
return "Falso";
}
}

E aí funciona perfeitamente o retorno passa a ser "sim" ou "falso" de acordo com o conteúdo do campo/atributo "createpriv".

Mal uso do conversor??? Mal funcionamento do componente???

Abraços,
GOSTEI 0
Davi Costa

Davi Costa

04/09/2012

Poderia também no seu model usar alguma estratégia assim:
public boolean getCampoBoolean() {
return campoBoolean;
}

public void setCampoBoolean(boolean campoBoolean) {
this.campoBoolean = campoBoolean;
}


public String getCampoString() {
return this.campoBoolean == true ? "S" : "N";
}

public void setCampoString(String campoString) {
this.campoBoolean = (campoString.equals("S")?true: false);
}

Essa estratégia também funciona se seu campo for enum.

att Davi
GOSTEI 0
POSTAR