1
resposta

Spring não injeta input check na entidade

Boa tarde,

Ao enviar para persistir uma entidade, o meu spring não injeta o input check na entidade, apenas os outros atributos.

Sabem alguma configuração que é necessário fazer? Ou resgato com o @RequestParam mesmo ?

Treco do html:

                <p class="col m3">
                  <input id="checkEnderecoNotaFiscalBoleto" type="checkbox" name="endereco.checkEnderecoNotaFiscalBoleto" />
                  <label for="checkEnderecoNotaFiscalBoleto">Endereço nota fiscal / Boleto</label>
                </p>

Meu Controller:

        @Transactional
    @PostMapping(path = "/add")
    public ModelAndView add(@Valid Empresa empresa){
        ModelAndView modelAndView = new ModelAndView();

        empresaService.create(empresa);

        modelAndView.setViewName("redirect:/empresas/all");    
        return modelAndView;
    }
1 resposta

Fala Renan, tudo bem ?

A princípio não é necessário nem a alternativa do @RequestParam nem qualquer outra configuração adicional. O binding de um input checkbox é padrão no Spring. Só precisamos observar algumas coisas ...

Como está seu modelo ? Imagino que esteja mais ou menos assim: Empresa > Endereço > boolean checkEnderecoNotaFiscalBoleto (">" == tem um). Sendo assim verifique se a empresa tem o setter para endereço, e se endereço tem o setter para checkEnderecoNotaFiscalBoleto.

Fiz um teste rápido por aqui. Veja como ficou...

public class Empresa {

    private Integer id;
    private String nome;
    private Endereco endereco;

    //getters and setters necessários

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    @Override
    public String toString() {
        return "Empresa [id=" + id + ", nome=" + nome + ", endereco=" + endereco + "]";
    }
}
package br.com.casadocodigo.loja.models;

public class Endereco {

    private Integer id;
    private String logradouro;
    private boolean checkEnderecoNotaFiscalBoleto;

    //getters and setters necessários

    public boolean isCheckEnderecoNotaFiscalBoleto() {
        return checkEnderecoNotaFiscalBoleto;
    }

    public void setCheckEnderecoNotaFiscalBoleto(boolean checkEnderecoNotaFiscalBoleto) {
        this.checkEnderecoNotaFiscalBoleto = checkEnderecoNotaFiscalBoleto;
    }

    @Override
    public String toString() {
        return "Endereco [id=" + id + ", logradouro=" + logradouro + ", checkEnderecoNotaFiscalBoleto="
                + checkEnderecoNotaFiscalBoleto + "]";
    }
}

Controller simples:

@Controller
public class EmpresaController {

    @RequestMapping(value = "/empresa/form", method = RequestMethod.GET)
    public String form() {
        return "empresa/form";
    }


    @RequestMapping(value = "/empresa", method = RequestMethod.POST)
    public String add(@Valid Empresa empresa) {

        System.out.println(empresa);

        return "redirect:/empresas/all";
    }
}

form:

...
<body>
    <form action="<c:url value='/empresa'/>" method="post">
        Nome: <input type="text" name="nome" />

        Endereço __________________________________

        Logradouro: <input type="text" name="endereco.logradouro" />
        <p class="col m3">
           <input type="checkbox" name="endereco.checkEnderecoNotaFiscalBoleto" />
           <label for="checkEnderecoNotaFiscalBoleto">Endereço nota fiscal / Boleto</label>
        </p>

        <input type="submit"/>
    </form>
</body>

Resultado do binding: form preenchido

resultado do envio

console com os dados

Espero ter ajudado. Abraço!