0

I have selectManyCheckbox, but I cant get checked values from it after change event (list of selected values stay empty). Change event is triggered but in debug mode there is no values in listSelectedSignalCauses. I tried to set some converter but it didnt help either (maybe it was wrong converter).

<p:selectManyCheckbox value="#{SignalAnalysisBean.listSelectedSignalCauses}" layout="pageDirection" styleClass="lstSignal">  
  <f:selectItems value="#{SignalAnalysisBean.listSignalCauses}" var="causes" itemValue="#{causes}" itemLabel="#{causes.name}"  />
  <p:ajax process="@this" update="test" event="change" listener="#{SignalAnalysisBean.checkCausesList}" />  
                    </p:selectManyCheckbox>
<h:outputText value="#{SignalAnalysisBean.arrSize}" id="test" />
public class SignalAnalysisBean extends AbstractBean {
    private List<GeneralCollDTO> listSignalCauses;
    private List<GeneralCollDTO> listSelectedSignalCauses;
    //...

    public void checkCausesList(){
        arrSize = 4 + listSelectedSignalCauses.size();
    }
    //...
}

public class GeneralCollDTO {
    private String name;
    private String value;

    public GeneralCollDTO() { }

    public GeneralCollDTO(String n, String v) {
        this.name = n;
        this.value = v;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}
Tom
  • 16,842
  • 17
  • 45
  • 54
Zivko
  • 367
  • 5
  • 16

2 Answers2

1

In order to send a custom object to your managed bean you need to implement a converter, otherwise you will not be able to do that. The code below implements it based on your code and it may be the solution to the problem.

@FacesConverter(value = "generalCollDTOConverter", forClass = GeneralCollDTOConverter.class)
public class GeneralCollDTOConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext ctx, UIComponent component, String value) {
        if (value != null) {
            return component.getAttributes().get(value);
        }
        return null;
    }

    @Override
    public String getAsString(FacesContext ctx, UIComponent component, Object value) {
        if (value != null && value instanceof GeneralCollDTO) {
            GeneralCollDTO generalCollDTO = (GeneralCollDTO) value;

            if (generalCollDTO.getName() != null) {
                component.getAttributes().put(generalCollDTO.getName(), value);
                return generalCollDTO.getName();
            }
        }
        return null;
    }
}



<p:selectManyCheckbox converter="generalCollDTOConverter" value="#{SignalAnalysisBean.listSelectedSignalCauses}" layout="pageDirection" styleClass="lstSignal">
Postal
  • 11
  • 2
  • Still not working. I added a converter, a bit different then above one. It return string and objects for filling checkbox list and for processing selected options (I see values in debug mode), but then I get messege "a value is not valid". Conversion to Strings work OK, but I get error when converting to Object. – Zivko Sep 25 '14 at 11:31
  • public Object getAsObject(FacesContext ctx, UIComponent component, String value) { try { if (value != null && value.trim().length() > 0) { List list = getBean(TestBean.class).getListRiskOutcomes(); for (GeneralCollDTO item : list) { if(value.equals(item.getValue())){ return new GeneralCollDTO(item.getName(), value); } } } return null; } catch (Exception e) { e.printStackTrace(); return null; } } – Zivko Sep 25 '14 at 11:32
1

Eventualy I end up with generic converter that works fine for me.

@FacesConverter(value = "generalCollDTOConverter", forClass = GeneralCollDTOConverter.class)
public class GeneralCollDTOConverter  implements Converter {

  private static Map<Object, String> entities = new HashMap<Object, String>();

  @Override
  public String getAsString(FacesContext context, UIComponent component, Object value) {
    synchronized (entities) {
        if (!entities.containsKey(value)) {
            String uuid = UUID.randomUUID().toString();
            entities.put(value, uuid);
            return uuid;
        } else {
            return entities.get(value);
        }
    }
  }

  @Override
  public Object getAsObject(FacesContext context, UIComponent component, String value) {
    for (Entry<Object, String> entry : entities.entrySet()) {
        if (entry.getValue().equals(value)) {
            System.out.println("getKey:" + entry.getKey());
            return entry.getKey();
        }
    }
    return value;
  }
}
Dani
  • 3,744
  • 4
  • 27
  • 35
Zivko
  • 367
  • 5
  • 16