Ir ao conteúdo

Java Salvar dados do form - Spring Boot


Ir à solução Resolvido por psykotico,

Posts recomendados

Postado

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;

Postado

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
Postado

@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>

  • Solução
Postado

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
Postado

@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>

  • 2 semanas depois...
Postado

@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

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...