Recuperar id form select na jsp

Boa noite!

Estou com um problema me atormentando. Tenho duas tabelas no banco com relação de 1xn (uma Marca pode ter muitos veículos). Acontece o seguinte,na tela de cadastro do veículo, carrego um select com dados da tabela marca, passando uma lista para a view na action do formulário. Os dados da marca populam a select sem problema, mas ao persistir o veículo no banco, o marca_id fica nulo. Alguem passou por algo parecido (estou usando jsp+springMVC+JPA)?

Marca Model:

@Entity
@Table(name="marca")
public class Marca {

    private Integer id;
    private String marca;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    
    @NotNull
    public String getMarca() {
        return marca;
    }
    public void setMarca(String marca) {
        this.marca = marca;
    }

Viatura Model:

@Entity
@Table(name="viatura")
public class Viatura {

    private Integer id;
    private String placa;
    private String modelo;
    private String prefixo;
    private Integer ano;
    private String patrimonio;
    private String renavam;
    private Boolean ativo;
    private Combustivel tipoCombustivel;
    private TipoServico tipoServico;
    private Marca marca;
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getPlaca() {
        return placa;
    }
    public void setPlaca(String placa) {
        this.placa = placa;
    }
    public String getModelo() {
        return modelo;
    }
    public void setModelo(String modelo) {
        this.modelo = modelo;
    }
    public String getPrefixo() {
        return prefixo;
    }
    public void setPrefixo(String prefixo) {
        this.prefixo = prefixo;
    }
    public Integer getAno() {
        return ano;
    }
    public void setAno(Integer ano) {
        this.ano = ano;
    }
    public String getPatrimonio() {
        return patrimonio;
    }
    public void setPatrimonio(String patrimonio) {
        this.patrimonio = patrimonio;
    }
    
    public String getRenavam() {
        return renavam;
    }
    public void setRenavam(String renavam) {
        this.renavam = renavam;
    }
    public Boolean getAtivo() {
        return ativo;
    }
    public void setAtivo(Boolean ativo) {
        this.ativo = ativo;
    }
    
    
    @ManyToOne
    public Marca getMarca() {
        return marca;
    }
    public void setMarca(Marca marca) {
        this.marca = marca;
    }

Viatura Controller:

@Controller
@Transactional
@RequestMapping("/viaturas")
public class ViaturaController {
    
    @Autowired
    private ViaturaDAO viaturaDAO;
    @Autowired
    private MarcaDAO marcaDAO;
    


//========================================REDIRECTS===============================================================
    @RequestMapping("/form")
    public ModelAndView form  (Viatura viatura){
        List<Marca> listaMarcas = new ArrayList<>();

        listaMarcas = marcaDAO.list();
    
        ModelAndView modelAndView = new ModelAndView("/viaturas/formulario");
        modelAndView.addObject("marcas", listaMarcas);
        return modelAndView;
        
    }
    
//========================================CRUD====================================================================
    @RequestMapping(method=RequestMethod.POST)
    public ModelAndView save(@Valid Viatura viatura, BindingResult bindingResult, RedirectAttributes attributes){
    
        
        viaturaDAO.save(viatura);
        attributes.addFlashAttribute("sucesso", "Viatura cadastrada com sucesso");
        return new ModelAndView("redirect:viaturas");
    }
    
}

JSP:

<%@ include file="/WEB-INF/views/header.jsp" %>


<form:form class="form-horizontal" role="form" action="${spring:mvcUrl('VC#save').arg(0,viatura).build()}" method="post" commandName="viatura" enctype="multipart/form-data">
    <div class="col-sm-9 col-sm-offset-3 col-md-5 col-md-offset-2 main">
        
        <div class="form-group row">
        
            <div class="col-sm-5">
                <label  for="placa">Placa:</label>
                <form:input class="form-control" placeholder=" Número da placa"  path="placa"/>
                <form:errors path="placa"/>
                
                <label class="control-label" for="prefixo">Prefixo:</label>
                <form:input class="form-control" placeholder="Número da frota"  path="prefixo"/>
                <form:errors path="prefixo"/>
                
                <label class="control-label" for="modelo">Modelo:</label>
                <form:input class="form-control" placeholder="Modelo do veículo"  path="modelo"/>
                <form:errors path="modelo"/>
                
                <label class="control-label" for="patrimonio">Patrimônio:</label>
                <form:input class="form-control" placeholder="Número de patrimônio"  path="patrimonio"/>
                <form:errors path="patrimonio"/>
                
                <label class="control-label" for="marca">Marca:</label>
                <form:select path="marca" class="form-control"   >
                    <form:option value = "SELECIONE"/>                    
                    <form:options items="${marcas}" itemLabel="marca"/>
                </form:select>
                 
                </br>
                
                <label class="control-label" for="ativo">Ativo:</label>
                <input type="checkbox" name="ativo" checked data-toggle="toggle" data-on="SIM" data-off="NÃO" />
                <form:errors path="ativo"/>    
                
            </div>
            
            
            
            <div class="col-sm-5">
                <label  for="ano">Ano:</label>
                <form:input class="form-control" placeholder="Ano"  path="ano"/>
                <form:errors path="ano"/>
                
                <label class="control-label" for="renavam">RENAVAM:</label>
                <form:input class="form-control" placeholder="Número do renavam" path="renavam"/>
                <form:errors path="renavam"/>
                    

                
            </br>
                
                <div>
                    <button type="submit" class="btn btn-primary" value="Salvar">
                      <span class="glyphicon glyphicon-floppy-disk"></span> Salvar
                    </button>
                </div>    
            </div>
            
            
        </div>
        
    </div>

Boa noite Alexandre, eu tive praticamente o mesmo problema que vc, e para resolver no meu select eu atribui um name=“id”(cfe exemplo abaixo) e no controller eu(2º exemplo) eu recebi esse paramêtro
pela anotação @RequestParam(value=“id”) Long id. e Ai criei um estado(cfe meu caso) e setei o id recebido do parametro pra ele. Veja se consegue ter uma idéia pelo exemplo. Abraço;.

                           <select name="id">
                                <option>Selecione o Estado</option>
                                <c:forEach items="${estados}" var="e">
                                    <option value="${e.id}">
                                        ${e.nome} - ${e.sigla}
                                    </option>
                                </c:forEach>
                            </select>


@RequestMapping("adicionaCidade")
    public String adiciona(Cidade cidade, @RequestParam(value="id") Long id) {
        Estado estado = new Estado();
        estado.setId(id);
        cidade.setEstado(estado);
        dao.salvar(cidade);
        return "redirect: listaCidades";
    }

Boa tarde, Filipe! Entendi. Fiz o teste aqui e ele me retorna o erro 400 (The request sent by the client was syntactically incorrect), imagino que seja algo relacionado ao formato que o parâmetro vem da view.

Na view ficou assim:

<label class="control-label" for="marca">Marca:</label>
                <form:select path="marca" class="form-control" name="id"   >
                    <form:option value = "SELECIONE"/>                    
                    <form:options items="${marcas}" itemLabel="marca"/>
                </form:select>

E o Controller:

    @RequestMapping(method=RequestMethod.POST)
        public ModelAndView save(@Valid Viatura viatura, @RequestParam Integer id, BindingResult bindingResult, RedirectAttributes attributes){
            if(viatura.getAtivo() == null){
                viatura.setAtivo(false);
            }
            Marca marca = new Marca();
            marca.setId(id);
            viatura.setMarca(marca);

Fala Alexandre,

Faltou identificar qual é o RequestParam que vc deseja (igual ao feito pelo Filipe), no caso

@RequestParam(value="id")

além disso, por causa do JSP, receba esse tipo de parâmetro no método em um Long e faça o tratamento para Integer se for necessário.

...,@RequestParam(value="id") Long id,...

Opa!

Então, percebi depois que postei o código que tinha esquecido de identificar o RequestParam, mas no teste ele estava identificado, e mudei o id para Long apenas para fazer o teste sem ter que tratar.

Ainda recebo o erro 400. Meu controller ficou assim:

@RequestMapping(method=RequestMethod.POST)
    public ModelAndView save(@Valid Viatura viatura,@RequestParam(value="id") Long id, BindingResult bindingResult, RedirectAttributes attributes){
        if(viatura.getAtivo() == null){
            viatura.setAtivo(false);
        }
        
        Marca marca = new Marca();
        
        marca.setId(id);
        
        viatura.setMarca(marca);

        viaturaDAO.save(viatura);
        attributes.addFlashAttribute("sucesso", "Viatura cadastrada com sucesso");
        return new ModelAndView("redirect:viaturas");
    }

Eu diria para vc repassar tudo para verificar se algum item ficou com alguma configuração diferente. Altere a ordem dos argumentos no action do form

.arg(viatura,0)