3
respostas

[Dúvida] Opção selecionada em select não sendo salva

ola, boa noite! tenho um forEach em uma JSP que deveria montar uma tabela e exibir um campo selecionável abaixo dela, para cada um dos itens na lista que defini no atributo items do forEach.

A tela é exibida da forma correta, porém, ao selecionar uma opção no campo de seleção, a resposta não é salva na variável que defini como datasource do campo.

vou deixar um exemplo do código abaixo:

<c:forEach var="item" items="variavelDoController"> ---tabela--- <netui:select dataSource="item.resposta" tagId="resposta" optionsDataSource="item.mapOptions" onChange="metodoDoController">

estou usando a lib beehive.apache.org/netui/tags-html-1.0 para importar o select.

o evento de chance desse método funciona e chama o método do controller, neste momento ele me gera a seguinte exception:

NetUI Warning: Unable to update expression "{item.resposta}". The typical cause is that the object represented by the expression is not available or is the wrong type for updating. Cause: org.apache.beehive.netui.script.ExpressionUpdateException: Exception when attempting to update {item.resposta}" with available binding contexts [actionForm, pageFlow, globalApp]. Root cause: org.apache.beehive.netui.script.IllegalExpressionException: Could not resolve variable named "item" for an expression update

o map que uso para popular as opções é do tipo (Integer,String) e o atributo resposta dos itens é do tipo Integer, com a intenção de guardar a key.

obrigado!

3 respostas

Oi Gustavo,

Não conheço muito de Servlet, mas vou tentar dar um caminho.

Acho que o problema está no uso da expressão "{item.resposta}" como o dataSource do campo de seleção. De acordo com a mensagem de erro, o NetUI não consegue atualizar essa expressão, provavelmente porque a variável "item" não está disponível ou é do tipo incorreto para atualização.

Uma possível solução para esse problema seria tentar acessar o item atual do loop usando a variável "var" em vez da variável "item". Por exemplo:

<netui:select dataSource="${var.resposta}" tagId="resposta" optionsDataSource="${var.mapOptions}" onChange="metodoDoController">

Outra opção seria tentar acessar o item atual do loop usando a variável "pageScope", como no exemplo abaixo:

<netui:select dataSource="${pageScope.item.resposta}" tagId="resposta" optionsDataSource="${pageScope.item.mapOptions}" onChange="metodoDoController">

Essas alterações podem ajudar a resolver o problema e permitir que o valor selecionado no campo de seleção seja salvo corretamente na variável "resposta" do item atual do loop.

Espero ter ajudado,

Abcs!

Olá Natan! Obrigado pela resposta! Tentarei essas soluções, porém acredito que a expressão item.resposta esteja funcionando corretamente como dataSource do campo de seleção, pois fiz o seguinte teste:

Suponhamos que tenha o seguinte map como optionsDatasource: {1, resposta1; 2,resposta2; 3,resposta3}. Se, antes de exibir a tela, eu definir o valor 1 para a resposta de algum dos objetos da lista que defini no atributo items do forEach , quando a tela é exibida o campo de select já vem com a resposta1 selecionada.

Sobre a váriavel não estar disponivel, eu tentei deixa-la como pública, e mesmo assim não funcionou. E em relação a estar com o tipo errado, daria erro no teste que fiz acima, certo?

Oi Gustavo!

Sim, se a expressão "item.resposta" está funcionando corretamente como dataSource do campo de seleção, isso já é um bom sinal. Quer dizer que o valor do atributo "resposta" está sendo carregado corretamente e pode ser usado para preencher o campo de seleção.

Em relação à variável "item" não estar disponível, verifique se ela está sendo passada corretamente para o escopo da JSP. Ela deve estar disponível no escopo do forEach para que possa ser usada pelo campo de seleção. Além disso, verifique se ela está sendo passada corretamente para o método do controller que é chamado pelo evento onChange do campo de seleção.

Em relação ao tipo de variável "item", se o valor do atributo "resposta" está sendo carregado corretamente e exibido no campo de seleção, isso também é um bom sinal. Isso significa que o tipo da variável "item" é compatível com o uso no campo de seleção.

Uma coisa que você poderia tentar é adicionar mais informações de depuração no código para tentar achar a origem do problema.

Espero ter ajudado e bons estudos,

Abcs!