Meu formulário de cadastro de cartão de crédito tem uma lista de bandeiras para escolher:
<c:forEach var="bandeira" items="${bandeiras}">
<form:radiobutton path="bandeira" />${bandeira.nome}
</c:forEach>
se eu troco o atriuto de path, o console me dá o erro que não existe o atributo escrito, por exemplo bandeira1 não existe em cartãoDeCredito.
Eu deixei no método gravar System.out.println(cartaoDeCredito.getBandeira());
, e quando eu clico em salvar aparece no console NULL.
O metodo gravar e o form
@RequestMapping(method = RequestMethod.POST)
public ModelAndView gravar(@Valid CartaoDeCredito cartaoDeCredito, BindingResult result) {
System.out.println(cartaoDeCredito.getBandeira());
System.out.println(cartaoDeCredito.getNome());
if (result.hasErrors()) {
return form(cartaoDeCredito);
}
cartaoCreditoRepository.save(cartaoDeCredito);
return new ModelAndView("redirect:/cartao-credito/cadastro");
}
<form:form action="${s:mvcUrl('CCC#gravar').build() }" method="post"
modelAttribute="cartaoDeCredito">
<div class="row">
<div class="col-md-6">
<div class="form-group label-floating">
<label class="control-label"> <fmt:message
key="cartaoDeCredito.cadastro.nome" />
</label>
<form:input type="text" path="nome" cssClass="form-control" />
<form:errors path="nome" />
</div>
</div>
<div class="col-md-6">
<div class="form-group label-floating">
<label class="control-label"> <fmt:message
key="cartaoDeCredito.cadastro.limite" />
</label>
<form:input type="text" path="limite" cssClass="form-control" />
<form:errors path="limite" />
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group label-floating">
<label class="control-label"> <fmt:message
key="cartaoDeCredito.cadastro.diaFechamento" />
</label>
<form:input type="text" path="diaFechamento"
cssClass="form-control" />
<form:errors path="diaFechamento" />
</div>
</div>
<div class="col-md-6">
<div class="form-group label-floating">
<label class="control-label"> <fmt:message
key="cartaoDeCredito.cadastro.diaPagamento" />
</label>
<form:input type="text" path="diaPagamento"
cssClass="form-control " />
<form:errors path="diaPagamento" />
</div>
</div>
</div>
<!-- FOREACH DA BANDEIRA -->
<c:forEach var="bandeira" items="${bandeiras}">
<form:radiobutton path="bandeira" />${bandeira.nome}
</c:forEach>
<button type="submit" class="btn btn-info pull-right">
<fmt:message key="cartaoDeCredito.cadastro.salvar" />
</button>
<div class="clearfix"></div>
</form:form>
Tem como eu pegar o objeto bandeira e colocar em cartãoDeCrédito?
Pergunta, a sua bandeira não deveria está vindo em algum lugar? Se sim de onde ela vem? Acredito que o problema se dá porque ela não está sendo instanciada, dai vem o NULL.
Caso sim, o correto não seria: ${cartaoDeCredito.bandeira} a menos que esteja sendo passada por uma outra Action ou até instanciada pelo próprio JSP,
Desculpa, realmente eu não fui claro. Fiquei com a cabeça tão quente com isso que não coloquei essa parte e não expliquei.
A página lista as bandeiras disponíveis e eu consigo selecionar um radiobutton.
E eu vou tentar sua sugestão.
aqui o codigo:
@RequestMapping("/cadastro")
public ModelAndView form(CartaoDeCredito cartaoDeCredito) {
ModelAndView modelAndView = new ModelAndView("/cadastro/cadastro-ccredito");
List<Bandeira> bandeiras=bandeiraRepository.findAll();
if (cartaoDeCredito==null) {
modelAndView.addObject("cartaoDeCredito", new CartaoCreditoController());
}
modelAndView.addObject("bandeiras", bandeiras);
return modelAndView;
}
Edit:
Coloquei:
<form:radiobutton path="${cartaoDeCredito.bandeira}" />${bandeira.nome}
E a página inicia com os dois radiosbuttons selecionados.
Algo que percebi agora é que se eu volto para versão original, e quando abro a pagina, o ultimo radiobutton já inicia selecionado.
E se eu troco o trecho para:
<input type="radio" value="${cartaoDeCredito.bandeira}""> ${bandeira.nome}
O radiobutton inicia não-selecionado.
E eu aproveitei e testei:
<input type="radio" value="${bandeira}"> ${bandeira.nome}
<input type="radio" value="bandeira"> ${bandeira.nome}
<input type="radio" value="${cartaoDeCredito.bandeira}" name="${cartaoDeCredito.bandeira}"> ${bandeira.nome}
Todos quando eu clico em salvar volta para mim Null no console.
Não é necessario. O objeto bandeira já está sendo passado.
Seu radio está dentro do forEach? porque a entrada do seu objeto está como bandeiras e não como bandeira. modelAndView.addObject(“bandeiras”, bandeiras);
${bandeira.nome}
veja o retorno que está indo para lista, para confirma se há algo vindo também.
List bandeiras=bandeiraRepository.findAll();
Está dentro do foreach
<c:forEach var="bandeira" items="${bandeiras}">
<form:radiobutton path="bandeira" />${bandeira.nome}
</c:forEach>
E a minha tela do cadastro do cartão de crédito aparece a lista de bandeiras cadastradas no banco do lado de suas respectivos radiobuttons, então o findall() está trazendo as bandeiras. O meu problema é que quando eu seleciono o radiobutton e clico em salvar ele não recupera a bandeira selecionada.
Se entendi, então no formulario está tudo ok, o problema está na hora de processar as informações ao lado do servidor, certo?
Então, acredito que você consiga recuperar ele passando como paremetro, assim como fez com o CartaoDeCredito. Testa na sua action se ele consegue recuperar como parâmetro Bandeiras
@RequestMapping(method = RequestMethod.POST)
public ModelAndView gravar(@Valid CartaoDeCredito cartaoDeCredito, List<Bandeira> bandeira BindingResult result)
Se eu coloco o List bandeira ou até Bandeira bandeira como parâmetro nada acontece quando clico no salvar. Não recebo erro e não sou encaminhado para nenhuma tela. O spring não deve conseguir executar a ação solicitada, eu tenho que procurar sobre isso para descobrir o porque.
Mas depois de muito bater a cabeça eu consegui contornar o problema.
Eu fiz o seguinte:
<c:forEach var="theBandeira" items="${bandeiras}">
<form:radiobutton path="bandeira.id" value="${theBandeira.id}"/>
<img src="<c:url value='../${theBandeira.sumarioPath}'/>"alt="${theBandeira.nome}" />
<p><c:out value="${theBandeira.nome}"/> </p>
</c:forEach>
Como eu tentei explicar no começo do tópico, eu não consigo passar o objeto bandeira que foi selecionado no radioButton para o .setBandeira(), no caso bandeira no jsp, mas o controller aceitou eu passar o Id do objeto do radioButton para o setBandeira().setId() , bandeira.id no jsp, e no controller eu posso preencher o objeto com a lista que ele possui (e gerou a lista de radiobuttons)
Muito Obrigado Jonathan.sky pela sua ajuda e seu tempo.

1 curtida