Pegando objeto de radiobutton JSP Spring MVC

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.
:slight_smile:

1 curtida