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

Erro 400 ao enviar formulario

Boa tarde, estou fazendo um cadastro de cliente pegando as informações atraves de um form, mas ao mandar o formulario recebo erro 400 ao tentar enviar.

classe Controller:

package br.com.rprvidros.controllers;

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

import br.com.rprvidros.daos.UsuarioDao;
import br.com.rprvidros.models.Endereco;
import br.com.rprvidros.models.Usuario;


@Controller
@Transactional
public class Cadastro {

    @Autowired
    private UsuarioDao dao;

    @RequestMapping(value = "/cadastro")
    public ModelAndView cadastro(){
        ModelAndView modelAndView = new ModelAndView("/cadastro");        
        return modelAndView;
    }

    @RequestMapping(value = "/cadastro/add",method = RequestMethod.POST)
    public ModelAndView add(Usuario usuario, Endereco endereco){

        Usuario usuarioCadastrado = dao.inseriUsuario(usuario,endereco);
        ModelAndView modelAndView = new ModelAndView("/");

        return modelAndView;
    }
}

formulario

<form:form servletRelativeAction="/rprvidros/cadastro/add" method="post">

                    <div class="form-cadastro">
                        <div class="email-nome">
                            <span class="icon-user2"></span>
                            <label><input class="nome-orcamento" type="text" name="nome" placeholder="Nome" autofocus required></label>
                        </div>

                        <div class="email-email">    
                            <span class="icon-key2"></span>
                            <label><input class="email-orcamento" type="password" name="senha" placeholder="Senha" required></label>
                        </div>

                        <div class="email-email">    
                            <span class="icon-email"></span>
                            <label><input class="email-orcamento" type="email" name="email" placeholder="Email" required></label>
                        </div>

                        <div class="email-email">    
                            <span class="icon-email"></span>
                            <label><input class="email-orcamento" type="email" name="emailAlternativo" placeholder="Email-Alternativo" required></label>
                        </div>

                        <div class="email-telefone">
                            <span class="icon-phone2"></span>
                            <label><input class="telefone-orcamento" type="number" name="telefone" placeholder="Telefone" required></label>
                        </div>

                        <div class="email-telefone">
                            <span class="icon-milestone"></span>
                            <label><input class="telefone-orcamento" type="text" name="uf" placeholder="Estado" required></label>
                        </div>

                        <div class="email-telefone">
                            <span class="icon-building"></span>
                            <label><input class="telefone-orcamento" type="text" name="cidade" placeholder="Cidade" required></label>
                        </div>

                        <div class="email-telefone">
                            <span class="icon-location2"></span>
                            <label><input class="telefone-orcamento" type="text" name="cep" placeholder="Cep" required></label>
                        </div>


                        <div class="email-telefone">
                            <span class="icon-street-view"></span>
                            <label><input class="telefone-orcamento" type="text" name="logradouro" placeholder="Logradouro" required></label>
                        </div>


                        <div class="email-telefone">
                            <span class="icon-bell"></span>
                            <label><input class="telefone-orcamento" type="number" name="numero" placeholder="Número" required></label>
                        </div>

                            <input type="hidden" name="roles" value="'ROLE-ADM'">
                        <div class="enviar-orcamento">
                            <span class="icon-email2"></span>
                             <input type="hidden" name="${_csrf.parameterName }" value="${_csrf.token }" />
                            <button class="botao-orcamento" type="submit">Enviar</button>
                        </div>
                    </div>    
                </form:form>

metodo para adicionar o Usuario:

public Usuario inseriUsuario(Usuario usuario, Endereco endereco) {

        manager.persist(usuario);

        Usuario usuarioCadastrado = manager.find(Usuario.class, usuario);

        manager.persist(endereco);

        return usuario;

    }

obrigado

15 respostas

boa tarde Gabriel, está enviando algum campo vazio no formulário? pois isso impede que o Spring faça o binding pro objeto e dá erro

Boa tarde Guilherme, cara tbm pensei nisso, mas nao tem campo vazio, oq estou tentando fazer é inserir na mão os atributos do Usuario, mas estou com o seguinte erro:

Provided id of the wrong type for class br.com.rprvidros.models.Usuario. Expected: class java.lang.Integer, got class br.com.rprvidros.models.Usuario

pelo jeito ele fala que estou provendo tipo errado do id mas o id é autoIncremente, não estou entendendo.

O que estou tentando fazer agora é apenas inserir o usuario sem o endereço, mas mesmo assim não vai.

Cola aqui tua classe Usuario por favor

Claro

Classe Usuario

package br.com.rprvidros.models;

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

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

@Entity
public class Usuario implements UserDetails{

    private static final long serialVersionUID = 1L;


    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;
    private String nome;
    private String senha;
    private String email;
    private String emailAleternativo;
    private String telefone;
    @OneToMany(fetch=FetchType.EAGER)
    private List<Role> roles = new ArrayList<Role>();
    @OneToMany(mappedBy = "id", targetEntity = PedidoItem.class)
    private List <Pedido> pedido;

    public Integer getId() {
        return id;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public String getSenha() {
        return senha;
    }
    public void setSenha(String senha) {
        this.senha = senha;
    }
    public String getTelefone() {
        return telefone;
    }
    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getEmailAleternativo() {
        return emailAleternativo;
    }
    public void setEmailAleternativo(String emailAleternativo) {
        this.emailAleternativo = emailAleternativo;
    }
    public List<Role> getRoles() {
        return roles;
    }
    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        // TODO Auto-generated method stub
        return this.roles;
    }
    @Override
    public String getPassword() {
        // TODO Auto-generated method stub
        return senha;
    }
    @Override
    public String getUsername() {
        // TODO Auto-generated method stub
        return email;
    }
    @Override
    public boolean isAccountNonExpired() {
        // TODO Auto-generated method stub
        return true;
    }
    @Override
    public boolean isAccountNonLocked() {
        // TODO Auto-generated method stub
        return true;
    }
    @Override
    public boolean isCredentialsNonExpired() {
        // TODO Auto-generated method stub
        return true;
    }
    @Override
    public boolean isEnabled() {
        // TODO Auto-generated method stub
        return true;
    }
    public void setId(Integer id) {
        this.id = id;
    }

}

valeu

Mesmo colocando o setId não foi?

mesmo quando coloco, ele me retorna o mesmo erro.

Guilherme eu adicionei um <input> com o id, ele mudou de erro:

detached entity passed to persist

acredito q seja pq estou inserindo na mão

ele chega a bater controller? ou para no navegador?

Bom, está chegando no DAO... onde você abre a transação?

Acredito que sim, o console imprime o erro.

eu abro no Controller,

@Autowired private UsuarioDao dao;

depois so invoco o método.

Perdão, não tinha visto... Só um ultimo teste...

altera:

@GeneratedValue(strategy=GenerationType.AUTO)

para:

@GeneratedValue(strategy=GenerationType.IDENTITY)

e recria a tabela

Retira o campo de id do form (senão vai falar que o objeto está detached), coloca um breakpoint no método e debuga as informações... vê se está montando certinho o Usuario. Depois dá um desc na tabela Usuario no banco e vê se as informações batem

Guilherme troquei as annotacion, dropei o banco e refiz, coloquei um breakpoint , na chamada do metodo, debuguei no server, ele me retorna 404, ou seja nao esta chegando correto?

solução!

Se está voltando 404, significa que ocorreu tudo bem no controller, provavelmente inseriu o usuário no banco (faz um select para confirmar por favor). Agora veja que o parâmetro do construtor do ModelAndView manda pra /cadastro, assim como o teu controller.. verifica se existe uma página chamada cadastro.jsp no teu WEB-INF, o erro pode estar ai

Guilherme muito obrigado pela atenção, eu acredito que achei o erro, no fim do log esta indicando uma linha:

Usuario usuarioCadastrado = manager.find(Usuario.class, usuario);

eu estava cadastrando o usuario e tentando chamar ele sem terminar o metodo, acredito que seja isso, retirei a linha e cadastrou.

Agora se vc puder so me explicar uma coisa, porque o bind do Spring nao funcionou?

mas uma pergunta sem abusar tanto, kk eu tenho uma tabela de usuario e outra de endereço, na tabela endereço eu tenho um campo: usuario_id, como posso fazer esse cadastro com o mesmo request?

minha ideia era cadastrar o usuario , logo apos pegar no banco o id dele e cadastrar o endereco mas pelo jeito assim não vai funcionar