UI:repeat + selectCheckboxMenu + Map<Integer,List<Integer> = Ljava.lang.Object; cannot be cast to java.util.List

No meu xhtml eu tenho:

<ui:repeat var="q" value="#{bean.questions}">
 <p:selectCheckboxMenu converter="javax.faces.Integer" filter="true" 
    value="#{bean.selectedDinamicRoadmap[q.id]}">
    <f:selectItems value="#{bean.roadmaps}" var="roadm" itemLabel="#{roadm.description} " itemValue="#{roadm.id}" />
 </p:selectCheckboxMenu>
</ui:repeat>

E no meu bean eu preciso salvar selectedDinamicRoadmap e fiz assim:

private Map<Integer, List<Integer>> selectedDinamicRoadmap = new HashMap<>();
//gets and sets
public void save() {
 for (Entry<Integer, List<Integer>> ee : selectedDinamicRoadmap.entrySet()) {
  Integer key = ee.getKey();
  List<Integer> values = ee.getValue();  /* Caused by: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.List */
  for (String id : values) {
   //saveData
  }
 }
}
//or
selectedDinamicRoadmap.entrySet().forEach(entry -> { /* java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.Collection */
 Integer key = entry.getKey();
 Logger2debug.d("Key: {}", key.toString());
 List<Integer> items = new ArrayList<Integer>();
 items.addAll(entry.getValue());
 items.forEach(item -> {
  Logger2debug.d("   Value: {}", item.toString());
 });
});

Alguém sabe como resolvo isso? Qual seria e melhor maneira de resolver essa situação
Eu tentei várias soluções do Stackoverflow e acho q estou deixando passar algo muito besta para resolver esse problema. :frowning:

Dá uma inspecionada no que está retornando o

ee.getValue()

Fala maninho, Tirei um print com o value da variável.

O que será que posso fazer para receber esse valor corretamente?

Os value de sua Entry não é um List, é um array.
É muito importante entender a diferença entre uma implementação de List e um array.
Você pode fazer seu laço assim:

for (Entry<Integer, Integer[]> ee : selectedDinamicRoadmap.entrySet()) {
    Integer key = ee.getKey();
    Integer[] values = ee.getValue();
    for (Integer id : values) {
        //saveData
    }
}

Olá staroski,
Agora estou recebendo o seguinte erro:
Caused by: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
Usando essa forma que vc sugeriu, tenho essa imagem com os valores da variavel:

Ja tentei até usar (Integer[] values = ee.getValue().clone():wink: mas o erro persiste.

Alguma outra ideia?

Não faz o menor sentido usar clone(), isso serve só pra criar uma cópia rasa de seu objeto.

Pelo jeito você está populando seu selectedDinamicRoadmap com Object[] e não com Integer[].
Ou você popula ele com o que realmente precisa, ou itera dessa forma:

for (Entry<Integer, Object[]> ee : selectedDinamicRoadmap.entrySet()) {
    Integer key = ee.getKey();
    Object[] values = ee.getValue();
    for (Object id : values) {
        //saveData
    }
}
1 curtida

Fala maninho, bom dia.
Com o Object[] funcionou. só não entendi o motivo do p:selectCheckboxMenu com ui:repeat, ele só aceita Object[] para retirar os dados dele.

Mas ótimo que está funcionando. Valeu.

Não é que ele só aceita Object[], é que o seu selectedDinamicRoadmap foi preenchido com Objetc[], de uma olhada no código onde você insere itens nesse selectedDinamicRoadmap.

Talvez o erro esteja aqui

<ui:repeat var="q" value="#{bean.questions}">
 <p:selectCheckboxMenu converter="javax.faces.Integer" filter="true" 
    value="#{bean.selectedDinamicRoadmap[q.id]}">
    <f:selectItems value="#{bean.roadmaps}" var="roadm" itemLabel="#{roadm.description} " itemValue="#{roadm.id}" />
 </p:selectCheckboxMenu>
</ui:repeat>

Essa é a melhor forma de fazer isso? value="#{bean.selectedDinamicRoadmap[q.id]}"?

Nesse código ali não dá pra saber o tipo de dado do selectedDinamicRoadmap, só dá pra ver que você acessa o indice do array na posição q.id.
Mostra o fonte do seu Bean, que tipo de dado é o selectedDinamicRoadmap?

Inicialmente coloquei como mostrado acima e estava recebendo o erro de conversão

/* Caused by: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.List */

Só consegui fazer funcionar declarando a variavel como a seguir:

private Map<Integer, Object[]> selectedDinamicRoadmap = new HashMap<>();