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

Spring não faz o bind do usuario

Boa tarde.

tenho um form que envia dados para o cadastro do usuario , o controller que atende e insere por um metodo no usuarioDao.

form :

<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="text" name="telefone" placeholder="Telefone" 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>

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.Usuario;


@Controller
@Transactional
public class Cadastro {

    @Autowired
    private UsuarioDao dao;


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

    }

    @RequestMapping(value = "/cadastro/add",method = RequestMethod.POST)
    public ModelAndView add(Usuario usuario){
        Usuario usuarioCadastrado = dao.addUsuario(usuario);
        return new ModelAndView("/cadastro");

    }
}

metodo Dao.

    public Usuario addUsuario(Usuario usuario) {

        manager.persist(usuario);        

        return usuario;

    }

o problema é que ele nao insere o usuario, algum dado do formulario esta incorreto, coloquei o usuario na mão dessa forma.

@RequestMapping(value = "/cadastro/add",method = RequestMethod.POST)
    public ModelAndView add(String nome, String senha,String email, String emailAlternativo,String telefone){
        Usuario usuario =  new Usuario();
        usuario.setNome(nome);
        usuario.setEmail(email);
        usuario.setEmailAleternativo(emailAlternativo);
        usuario.setTelefone(telefone);
        Usuario usuarioCadastrado = dao.addUsuario(usuario);
        return new ModelAndView("/cadastro");

    }

ele insere só que com a senha null ou seja, o problema acredito q seja a senha, mas ela esta sendo digitada, eu adicionei o spring security que criptografa senha, acredito q seja isso, alguma tag no form para criptografar a senha?

obrigado

9 respostas

Fala Gabriel, tudo bem ?

Não acredito que é interferência do security. O spring security apenas usa o passwordEncoder no filtro no momento da autenticação.

Na sua ação onde recebe a referência de usuário veja como ele está vindo (crie um toString que detalha todas as informações do Usuário), imprima a referencia Sysout(usuario). Assim conseguirá saber quais informações não estão sendo passadas.

Uma outra coisa. Você tem os setters pra todas essas informações que vem da página ? São por eles que o Spring preenche os dados, caso algum esteja em falta a informação será desconsiderada.

Veja que no método onde você trabalha manualmente pra testar você não insere a senha no objeto construído, logo sempre ela fica nula mesmo, e vai ser salva na base como nula.

Dê uma olhada nisso. Espero ter ajudado. Abraço!

Boa tarde Rafael obrigado pela resposta.

Quanto a não setar a senha verdade, me esqueci mas é que já mexi tanto no código, que quando refiz a alteração nao coloquei, fiz o que me disse no toString mas não imprimi ou seja, nem chega no controller? ou não chega a construir o usuario? provavel que não construa pq quando faço manualmente ele inseri no banco. Na classe Usuario tenho todos os seters sim, na verdade na classe Usuario eu tenho mais atributos, só que como estou com problemas na hora de incluir so estou mandando esses inputs por enquanto, vou colocar a classe aqui.

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.IDENTITY)
    private Integer id;
    private String nome;
    private String senha;
    private String email;
    private String emailAlternativo;
    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 List<Pedido> getPedido() {
        return pedido;
    }
    public void setPedido(List<Pedido> pedido) {
        this.pedido = pedido;
    }
    public static long getSerialversionuid() {
        return serialVersionUID;
    }
    public Integer getId() {
        return id;
    }
    public String getNome() {
        return nome;
    }
    @Override
    public String toString() {
        return "Usuario [id=" + id + ", nome=" + nome + ", senha=" + senha + ", email=" + email + ", emailAlternativo="
                + emailAlternativo + ", telefone=" + telefone + ", roles=" + roles + ", pedido=" + pedido + "]";
    }
    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 getEmailAlternativo() {
        return emailAlternativo;
    }
    public void setEmailAlternativo(String emailAleternativo) {
        this.emailAlternativo = 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;
    }

}

muito obrigado

Rafael eu fiz no metodo manual, veja o que o toString imprime:

Usuario [id=null, nome=renata, senha=renata, email=gabriel_bartholo_batista@hotmail.com, emailAlternativo=gabriel_bartholo_batista@hotmail.com, telefone=2452345234, roles=[], pedido=null]

o campo ide o campo pedido esta null seria isso?

Oi Gabriel

Na verdade no método onde faz manualmente não há problema. A ideia era fazer no método que recebe o Usuário pronto, assim poderíamos ver como o Spring Mvc entrega o objeto no seu controller.

Mas pelo que entendi, você disse que ele talvez nem chegue no controller .. O que acontece quando você manda os dados do form pra action que recebe Usuario ? O sistema quebra ? Lança alguma exception ? Ou devolve algum status code como 400 (por exemplo) ?

Oi rafael.

exatamente eu recebo um 400,não lança exception alguma, nada que faço no codigo do controller adianta porque acredito que ele nem chegue a passar

solução!

Hmm, entendi. Ele ta dando bad request.

Tradicionalmente isso acontece quando estamos enviando dados inválidos ao servidor. Provavelmente o Spring tentou receber as informações e pode ser que algum problema de conversão de dados - por exemplo, ocorreu, e ele informa isso.

Tente dar uma olhada em como a requisição está sendo enviada. Inspecione no deb tolls do chrome por exemplo (F12) na página > Aba network -> Aí envie os dados pelo form -> veja que no log da network vai aparecer a requisição que falhou -> Clique nela -> Inspecione na parte de Headers da requisição a parte destacada como Form Data.

Dê uma olhada em como está lá. Pode ser que alguma informação esteja indo de forma errada e o Spring não consegue receber e colocar no Usuário.

Você tem seu código em algum repositório no github, pra poder dar uma olhada mais próxima ?

Abraço!

Rafael.

Sinceramente não sei oq ocorreu, abri a aba network, dei dois cliques no índice add, que é o nome do método, ele reenviou e simplesmente adicionou!!, eu nao alterei código algum, como isso é possível? algum problema no navegador?

Muito obrigado mesmo, estava preso nisso fazia muito tempo.

Brigadão!!!

Fala Gabriel,

Estranho mesmo o que aconteceu. Nunca dá pra descartar algum problema com o browser ou até mesmo com o deploy do projeto via wtp do eclipse.

Também não entendi ou já vi algo nesse sentido. Mas agora está tudo ok ? Qualquer problema coloque aqui pra gente.

Abraço e bons estudos!

Agora sim esta tudo ok valeu!!!!