Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Salvar tipos usando radio

Senhores na aula foi usado input type text para duas situação, mostrar os valores da enum e para receber a informação do usuario.

Tentei adaptar para utilizar radio no formulario deu certo mas quando tento cadastrar recebo uma mensagem de erro

The request sent by the client was syntactically incorrect.

infelizmente nao consegui encontrar nem entender o motivo desse erro segue

minha jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>Cliente Oculto</title>
</head>
<body>
    <h1>Cadastro de clientes</h1>
    <c:url value="/clientes" var="url" />
    <form action="${url }" method="post">
        <div>
            <label for="nomeFantasia">Nome Fantasia</label> <input type="text"
                name="nomeFantasia" id="nomeFantasia" />
        </div>
        <div>
            <label for="razaoSocial">Razão Social</label> <input type="text"
                name="razaoSocial" id="razaoSocial" />

        <c:forEach items="${listaTipos }" var="tipoEmpresa" varStatus="status">
            </div>
                <input type="radio" name="tipos" id="tipo_${tipoEmpresa }"/>
                <c:out value="${tipoEmpresa}"/>
            <div>
        </c:forEach>
            <input type="submit" value="Cadastrar" />
        </div>
    </form>
</body>
</html>

meu controller

package br.com.clienteoculto.controllers;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import br.com.clienteoculto.daos.ClienteDAO;
import br.com.clienteoculto.models.Cliente;
import br.com.clienteoculto.models.TipoEmpresa;

@Controller
public class ClientesController {

    @Autowired
    ClienteDAO clienteDAO;

    @RequestMapping("/clientes/form")
    public ModelAndView form() {
        ModelAndView modelAndView = new ModelAndView("clientes/cadastro_clientes");
        modelAndView.addObject("listaTipos", TipoEmpresa.values());
        return modelAndView;
    }

    @RequestMapping("/clientes")
    @Transactional
    public String save(Cliente cliente) {
        clienteDAO.save(cliente);
        System.out.println(cliente);
        return "clientes/ok";
    }

}

classe Cliente

package br.com.clienteoculto.models;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Cliente {

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;

    private String nomeFantasia;
    private String razaoSocial;
    @ElementCollection
    private List<Tipos> tipos = new ArrayList<Tipos>() ;


    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getNomeFantasia() {
        return nomeFantasia;
    }
    public void setNomeFantasia(String nomeFantasia) {
        this.nomeFantasia = nomeFantasia;
    }
    public String getRazaoSocial() {
        return razaoSocial;
    }
    public void setRazaoSocial(String razaoSocial) {
        this.razaoSocial = razaoSocial;
    }
    public List<Tipos> getTipos() {
        return tipos;
    }
    public void setTipos(List<Tipos> tipos) {
        this.tipos = tipos;
    }




}

classe Tipos

package br.com.clienteoculto.models;

import javax.persistence.Embeddable;

@Embeddable
public class Tipos {

    private TipoEmpresa tipoEmpresa;


    public TipoEmpresa getTipoEmpresa() {
        return tipoEmpresa;
    }

    public void setTipoEmpresa(TipoEmpresa tipoEmpresa) {
        this.tipoEmpresa = tipoEmpresa;
    }
}

e a minha enum

package br.com.clienteoculto.models;

public enum TipoEmpresa {
    MATRIZ,
    FILIAL;
}

meu ClienteDAO

package br.com.clienteoculto.daos;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;

import br.com.clienteoculto.models.Cliente;

@Repository
public class ClienteDAO {

    @PersistenceContext
    private EntityManager manager;

    public void save(Cliente cliente) {
        manager.persist(cliente);
    }

}

muito obrigado pela ajuda

5 respostas

Só fazendo uma atualização da jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>Cliente Oculto</title>
</head>
<body>
    <h1>Cadastro de clientes</h1>
    <c:url value="/clientes" var="url" />
    <form action="${url }" method="post">
        <div>
            <label for="nomeFantasia">Nome Fantasia</label> <input type="text"
                name="nomeFantasia" id="nomeFantasia" />
        </div>
        <div>
            <label for="razaoSocial">Razão Social</label> <input type="text"
                name="razaoSocial" id="razaoSocial" />
        </div>    

        <c:forEach items="${listaTipos }" var="tipos" varStatus="status">
                <input type="radio" name="tipos" value="${tipos}"  id="tipo_${tipos }" checked="checked" />${tipos}
        </c:forEach>
        <div>
            <input type="submit" value="Cadastrar" />
        </div>
    </form>
</body>
</html>

tipos é uma lista na sua classe cliente, só que na página vc não faz referência a isso. Eu trocaria o nome do input para tipos[0].

Olá Alberto obrigado pela ajuda, porem seguindo a sua sugestão tentei trocar name="tipos" de duas formas

<c:forEach items="${listaTipos }" var="tipos" varStatus="status">
                <input type="radio" name="tipos[0]" value="${tipos}"  id="tipo_${tipos }" />${tipos}
        </c:forEach>

e tentei usando a variável status


<c:forEach items="${listaTipos }" var="tipos" varStatus="status">
                <input type="radio" name="tipos[${status.index}]" value="${tipos}"  id="tipo_${tipos }" />${tipos}
        </c:forEach>

mas essa ultima não deu muito certo por que foi gerado dois inputs radio diferente sendo assim permitindo que pudesse ser selecionado as duas opções

Em ambas as implementações recebi o mesmo erro 400 com a mensagem

 The request sent by the client was syntactically incorrect.

é necessário fazer mais alguma mudança?

solução!

name="tipos[0]" para name="tipos[0].tipoEmpresa"

vlw muito pela ajuda, muito obrigado!!