Estou tentando entender como funciona o pickList do PrimeFaces, mas até agora sem sucesso. Até tentei montar um Converter padrão para o tratamento que é ignorado.
Xhtml:
<p:pickList id="tencargos"
styleClass="form-control"
value="#{tverbaBean.listTencargos}"
var="listTencargos"
converter="primeFacesPickListConverter"
itemLabel="#{listTencargos.iEncargo}"
itemValue="#{listTencargos}"
showSourceControls="true" showTargetControls="true">
<f:facet name="sourceCaption">Encargos Incidentes</f:facet>
<f:facet name="targetCaption">Encargos Cadastrados</f:facet>
</p:pickList>
Converter:
@FacesConverter(value = "primeFacesPickListConverter")
public class PrimeFacesPickListConverter implements Converter {
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
Object ret = null;
if (arg1 instanceof PickList) {
Object dualList = ((PickList) arg1).getValue();
DualListModel dl = (DualListModel) dualList;
for (Iterator iterator = dl.getSource().iterator(); iterator
.hasNext();) {
Object o = iterator.next();
String id = (new StringBuilder()).append(
((AbstractBean) o).getId()).toString();
if (arg2.equals(id)) {
ret = o;
break;
}
}
if (ret == null) {
for (Iterator iterator1 = dl.getTarget().iterator(); iterator1
.hasNext();) {
Object o = iterator1.next();
String id = (new StringBuilder()).append(
((AbstractBean) o).getId()).toString();
if (arg2.equals(id)) {
ret = o;
break;
}
}
}
}
return ret;
}
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
String str = "";
if (arg2 instanceof AbstractBean)
str = ((AbstractBean) arg2).getId().toString();
return str;
}
}
MB:
public DualListModel<Tencargos> getListTencargos() {
// ENCARGOS INCIDENTES
TencargosRN tencargosRN = new TencargosRN();
String verifica = "N";
encargosListaCarga = tencargosRN.listar();
if (tverbas.getListTencargos() != null)
encargosIncididos = this.tverbas.getListTencargos();
for (Tencargos item : encargosListaCarga) {
for (Tencargos incidido : encargosIncididos) {
if (item.equals(incidido)) {
verifica = "S";
break;
} else {
verifica = "N";
}
}
if (verifica.equals("N")) {
encargosLista.add(item);
}
}
listTencargos = new DualListModel<Tencargos>(encargosIncididos, encargosLista);
return listTencargos;
}
Método Salvar:
public String salvar() {
this.tverbas.setIdverba(tverbas.getIdverba());
List<Tencargos> listaBanco = new ArrayList<Tencargos>();
listaBanco = (List<Tencargos>) listTencargos.getSource();
this.tverbas.setListTencargos(listaBanco);
TverbasRN tverbasRN = new TverbasRN();
tverbasRN.salvar(tverbas);
return "listaVerbas";
}
Quando eu uso o converter explicitando na tag do picklist converter="primeFacesPickListConverter
" ele não carrega nem o Source nem o target
Quando eu retiro, ele me dá simplesmente uma referência em memória:
E eu não consigo pega isso e jogar numa lista de objetos para que eu possa salvar no banco. Ele carrega perfeitamente em tela, esse não é o problema. O ponto é quando eu aciono o método salvar, no momento que preciso recuperar as listas.
Alguém sabe como funciona?