4
respostas

Neither BindingResult nor plain target object for bean name 'contact' available as request attribute

Boa noite, pessoal!

Após finalizar o projeto do curso, criei um novo Controller para envio de formulário de contato via e-mail e armazenagem dos dados do formulário no banco de dados. Utilizei o mesmo código do ProdutoController para gravação dos dados, porém está retornando "Neither BindingResult nor plain target object for bean name 'contact' available as request attribute" quando tento acessar a Home onde está o formulário de contato. Segue abaixo o código:

Método Gravar na classe ContactController

@RequestMapping(method = RequestMethod.POST)
    public ModelAndView record(@Valid Contact contact, BindingResult result, RedirectAttributes redirectAttributes) {
        if (result.hasErrors()) {
            return add(contact);
        }

        contactDao.record(contact);
        sendMailContact(contact);

        redirectAttributes.addFlashAttribute("success", "Mensagem enviada com sucesso!");

        return new ModelAndView("redirect:/");
    }

JSP

<form:form
                                    servletRelativeAction="${s:mvcUrl('CC#record').build() }"
                                    method="POST" commandName="contact"
                                    cssClass="cmxform form-horizontal"
                                    enctype="multipart/form-data">
                                    <div class="form-group ">
                                        <label for="cname" class="control-label col-lg-3">Nome *</label>
                                        <form:errors path="name" />
                                        <div class="col-lg-6">
                                            <form:input path="name" cssClass="form-control" />
                                        </div>
                                    </div>
                                    <div class="form-group">
                                        <label class="control-label col-lg-3">E-mail *</label>
                                        <form:errors path="email" />
                                        <div class="col-lg-6">
                                            <form:input path="email" cssClass="form-control" />
                                        </div>
                                    </div>
                                    <div class="form-group">
                                        <label class="control-label col-lg-3">Celular *</label>
                                        <form:errors path="phone" />
                                        <div class="col-lg-6">
                                            <form:input path="phone" cssClass="form-control" />
                                        </div>
                                    </div>
                                    <div class="form-group">
                                        <label class="control-label col-lg-3">Assunto *</label>
                                        <form:errors path="subject" />
                                        <div class="col-lg-6">
                                            <form:input path="subject" cssClass="form-control" />
                                        </div>
                                    </div>
                                    <div class="form-group">
                                        <label class="control-label col-lg-3">Mensagem *</label>
                                        <form:errors path="message" />
                                        <div class="col-lg-6">
                                            <form:textarea path="message" cssClass="form-control" />
                                        </div>
                                    </div>
                                    <div class="form-group">
                                        <div class="col-lg-offset-3 col-lg-6">
                                            <button class="btn btn-primary" type="submit">Salvar</button>
                                            <button class="btn btn-default" type="button">Cancelar</button>
                                        </div>
                                    </div>
                                </form:form>

Se alguém puder dar uma força, desde já, agradeço! Abraço!

4 respostas

Fábio,

Meu palpite é que a raiz do problema é o enctype="multipart/form-data" lá no seu <form:form ...>.

Afinal de contas, você não recebe um MultipartFile, como no ProdutosController.

Retire o enctype e veja se funciona!

Alexandre,

Infelizmente não era o problema, os mesmos erros continuam.

Obrigado!

Você tem algum repositório no Git/GitLab/Bitbucket da vida com o código?

Se não, seria legal ver o código completo da classe ContactController.

Não tenho, mas segue o código:

import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import br.com.komalt.daos.ContactDAO;
import br.com.komalt.models.Contact;
import br.com.komalt.validation.ContactValidation;

@Controller
@RequestMapping("/painel/contato")
@Scope(value = WebApplicationContext.SCOPE_REQUEST)
public class ContactController {

    @Autowired
    private ContactDAO contactDao;

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.addValidators(new ContactValidation());
    }

    @RequestMapping("/contato")
    public ModelAndView contato(Contact contact) {
        ModelAndView modelAndView = new ModelAndView("contato");

        return modelAndView;
    }

    @RequestMapping("/adicionar")
    public ModelAndView add(Contact contact) {
        ModelAndView modelAndView = new ModelAndView("/painel/contato/adicionar");

        return modelAndView;
    }

    /*Gravar Form Home*/
    @RequestMapping(method = RequestMethod.POST)
    @CacheEvict(value = "contactHome", allEntries = true)
    public ModelAndView record(@Valid Contact contact, BindingResult result, RedirectAttributes redirectAttributes) {
        if (result.hasErrors()) {
            return add(contact);
        }

        contactDao.record(contact);        

        redirectAttributes.addFlashAttribute("success", "Mensagem enviada com sucesso!");

        return new ModelAndView("redirect:/");
    }

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView list() {
        List<Contact> contacts = contactDao.list();
        ModelAndView modelAndView = new ModelAndView("/painel/contato/index");
        modelAndView.addObject("contacts", contacts);

        return modelAndView;
    }


}