Conversor/BoolcheckBox
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
Curtidas 0
Respostas
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
att Davi
GOSTEI 0
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.
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
04/09/2012
Eclipse Link
GOSTEI 0
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
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
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,
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
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
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