Ir ao conteúdo
  • Cadastre-se
ruangb

Java RESOLVIDO Salvar dados do form - Spring Boot

Recommended Posts

Boa tarde pessoal,

 

Não estou conseguindo salvar os dados de um formulário no MySql, usando SpringBoot. Até consigo fazer a conexão com o banco, porém todos os dados da minha tabela aparecem como NULL. Alguém sabe o que pode ser?

 

Formulário:

<form action ="#" method="post" data-form-title="DEIXE SEU CONTATO">

                        <input type="hidden" value="qTfFImcOg3JDt6gBwXjmlAu8q6wFsshvr9oINVfza0NbNOxSAmySVneX0XEYiq3+KJOvQbivpU8Qms4XXuCsxtKBxztdvHmBkMJ03eto/6UTMuVPKZQ9F8tnGcE3kYT5" data-form-email="true"></input>

                        <div class="row row-sm-offset">

                            <div class="col-xs-12 col-md-4">
                                <div class="form-group">
                                    <label class="form-control-label" for="form1-17-name" >Nome<span class="form-asterisk">*</span> </label>
                                    <input type="text" class="form-control" th:field="*{nome}" name="nome" required="required" data-form-field="Name" id="form1-17-name" value=""></input>
                                </div>
                            </div>

                            <div class="col-xs-12 col-md-4">
                                <div class="form-group">
                                    <label class="form-control-label" for="form1-17-email" >E-mail<span class="form-asterisk">*</span></label>
                                    <input type="email" th:field="*{email}" class="form-control" name="email" required="required" data-form-field="Email" id="form1-17-email" value=""></input>
                                </div>
                            </div>

                            <div class="col-xs-12 col-md-4">
                                <div class="form-group">
                                    <label class="form-control-label" for="form1-17-phone"> Telefone</label>
                                    <input type="tel" th:field="*{telefone}" class="form-control" name="telefone" data-form-field="Phone" id="form1-17-phone" value=""></input>
                                </div>
                            </div>
                        </div>
                        
                        <div class="form-group">
                            <label class="form-control-label" for="form1-17-message">Mensagem</label>
                            <textarea class="form-control" th:field="*{mensagem}" name="mensagem" rows="7" data-form-field="Message" id="form1-17-message" value=""></textarea>
                        </div>

                        <div><button type="submit" class="btn btn-black">ENVIAR MENSAGEM</button></div>

                    </form>

 

Controller:

@Controller
public class IndexController {
    
    @Autowired
    private ContatoRepository cr;
    
    @RequestMapping(value="/", method=RequestMethod.GET)
    public String form() {
        return "Index";
    }
    
    @RequestMapping(value="/", method=RequestMethod.POST)
    public String form(Contato contato) {
        
        cr.save(contato);
        return "redirect:/Index";

 

Entidade:

@Entity
public class Contato implements Serializable{
    
    private static final long serialVersionUID = 1L;
    
    //Método construtor
    public Contato() {
    }
    
    @Id
    @Column(name="id")
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;
    
    @Column(name="nome", nullable=false)
    private String nome;
    @Column(name="email", nullable=false)
    private String email;    
    @Column(name="telefone", nullable=true)
    private int telefone;
    @Column(name="mensagem", nullable=true)
    private String mensagem;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa ... 
No seu Controller, falta anotar o parâmetro para o Spring entender que esse valor está relacionado ao request:

    @RequestMapping(value="/", method=RequestMethod.POST)
    public String form(@RequestBody Contato contato) {
        cr.save(contato);
        return "redirect:/Index";
    }

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@psykotico Obrigado pela dica, já adicionei o parâmetro ao controller mas mesmo assim o banco não puxa os dados do form.

 

Será que é o problema principal é na hora de atribuir valores ao form? Vejo algumas pessoas usando o th:field=*{} do Thymeleaf e outras não. No meu ficou assim, porém não tenho certeza se está certo:

 

Formulário:

 

<form action ="#" th:object="${contato}" th:action="@{/}" method="post" data-form-title="DEIXE SEU CONTATO">

                        <input type="hidden" value="qTfFImcOg3JDt6gBwXjmlAu8q6wFsshvr9oINVfza0NbNOxSAmySVneX0XEYiq3+KJOvQbivpU8Qms4XXuCsxtKBxztdvHmBkMJ03eto/6UTMuVPKZQ9F8tnGcE3kYT5" data-form-email="true"></input>

                        <div class="row row-sm-offset">

                            <div class="col-xs-12 col-md-4">
                                <div class="form-group">
                                    <label class="form-control-label" for="form1-17-name" >Nome<span class="form-asterisk">*</span> </label>
                                    <input type="text" class="form-control" th:field="*{nome}" name="nome" required="required" data-form-field="Name" id="form1-17-name" value=""></input>
                                </div>
                            </div>

                            <div class="col-xs-12 col-md-4">
                                <div class="form-group">
                                    <label class="form-control-label" for="form1-17-email" >E-mail<span class="form-asterisk">*</span></label>
                                    <input type="email" th:field="*{email}" class="form-control" name="email" required="required" data-form-field="Email" id="form1-17-email" value=""></input>
                                </div>
                            </div>

                            <div class="col-xs-12 col-md-4">
                                <div class="form-group">
                                    <label class="form-control-label" for="form1-17-phone"> Telefone</label>
                                    <input type="tel" th:field="*{telefone}" class="form-control" name="telefone" data-form-field="Phone" id="form1-17-phone" value=""></input>
                                </div>
                            </div>
                        </div>
                        
                        <div class="form-group">
                            <label class="form-control-label" for="form1-17-message">Mensagem</label>
                            <textarea class="form-control" th:field="*{mensagem}" name="mensagem" rows="7" data-form-field="Message" id="form1-17-message" value=""></textarea>
                        </div>

                        <div><button type="submit" class="btn btn-black">ENVIAR MENSAGEM</button></div>

                    </form>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, Desculpe falha minha ... Por estar trabalhando muito com JSON, acabei passando a anotação errada (Sim, caso você queira trabalhar com AJAX, essa seria a anotação correta) .. Desculpe mesmo.

vamos a duas soluçoes:

A primeira é você anotar com @RequestParam e pegar atributo por atributo. Não é tão simples, mas talvez em casos mais específicos te ajude:

    @RequestMapping(value="/", method=RequestMethod.POST)
    public String form(@RequestParam("nome") String nome, @RequestParam("email") String email, 
            @RequestParam("telefone") String telefone, @RequestParam("mensagem") String mensagem) {
        Contato contato = new Contato();
        contato.setNome(nome);
        contato.setEmail(email);
        contato.setMensagem(mensagem);
        contato.set
        cr.save(contato);
        return "redirect:/Index";
    }


A segunda, e acredito que seja a que mais se adeque ao que você deseja (O Thymeleaf automaticamente seta o ModelAttribute quando você utiliza th:object="${contato}") :

    @RequestMapping(value="/", method=RequestMethod.POST)
    public String form(@ModelAttribute Contato contato) {
        cr.save(contato);
        return "redirect:/Index";
    }

 
 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@psykotico Cara, muito obrigado mesmo pela atenção dada.

 

Fiz os dois procedimentos que você me orientou porém há uma coisa que eu não havia falado, não estou conseguindo usar th:field=*{} em nenhum de meus inputs. Aparece o seguinte erro quando eu tento: Error during execution of processor 'org.thymeleaf.spring4.processor.attr.SpringInputGeneralFieldAttrProcessor' (Index:169)

 

Sendo assim, não sei o que fazer para meu input conversar com o controller. Eu até consigo usar th:object="${contato}" th:action="@{/}" no form mas nada de th:field. Agora meu input de nome, por exemplo, ficou assim:

 

<form action ="#" th:object="${contato}" th:action="@{/}" method="post" data-form-title="DEIXE SEU CONTATO">

 

                            <div class="col-xs-12 col-md-4">
                                <div class="form-group">
                                    <label class="form-control-label" for="form1-17-name" >Nome<span class="form-asterisk"</span</label>
                                    <input type="text" class="form-control" name="nome" required="required" data-form-field="Name" id="form1-17-name"value=""> </input>
                                </div>
                            </div>

Compartilhar este post


Link para o post
Compartilhar em outros sites

@psykotico Muito obrigado, fiz um método baseado no seu e consegui salvar os dados no banco. Para obter sucesso eu também tive que desativar um javascript chamado formoid que veio automático do template que peguei, isso estava impedindo a gravação dos dados no banco.

 

    @RequestMapping(value="/", method=RequestMethod.POST)
    public String form(@PathVariable("contato") @RequestParam("nome") String nome, @RequestParam("email") String email, 
      @RequestParam("telefone") BigInteger telefone, @RequestParam("mensagem") String mensagem) {
        
    	Contato contato = new Contato();
    	contato.setNome(nome);
    	contato.setEmail(email);
    	contato.setTelefone(telefone);
    	contato.setMensagem(mensagem);  
        cr.save(contato);
        return "redirect:/Enviado";
    }

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×