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. 
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()
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<>();