Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

RequestMapping na Classe controller.

Ao chegar no último passo da aula (anotar o controller de produto com o request mapping)

@Controller @RequestMapping("/produtos") public class ProdutosController {

// restante do código omitido

}

o controller para de funcionar e só aparece erro 404.

Sem a anotação, tudo funciona. Qual a diferença que ela faz no projeto?

Segue minha classe controller:

package br.com.casadocodigo.loja.controllers;

import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired; 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.servlet.ModelAndView; import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import br.com.casadocodigo.loja.daos.ProdutoDAO; import br.com.casadocodigo.loja.models.Produto; import br.com.casadocodigo.loja.models.TipoPreco; import br.com.casadocodigo.loja.validation.ProdutoValidation;

@Controller @RequestMapping("/produtos") public class ProdutosController {

@Autowired
private ProdutoDAO produtoDAO;

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

@RequestMapping("/produtos/form")
public ModelAndView form(){
    ModelAndView modelAndView = new ModelAndView("produtos/form");
    modelAndView.addObject("tipos", TipoPreco.values());
    return modelAndView;
}

@RequestMapping(value="/produtos", method=RequestMethod.GET)
public ModelAndView listar() {
    List<Produto> produtos = produtoDAO.listar();
    ModelAndView modelAndView = new ModelAndView("produtos/lista");
    modelAndView.addObject("produtos", produtos);
    return modelAndView;
}    

@RequestMapping(value="/produtos", method=RequestMethod.POST)
public ModelAndView gravar(@Valid Produto produto, BindingResult result, RedirectAttributes redirectAttributes){
    System.out.println(produto);

    if (result.hasErrors()) {
        return form();
    }

    produtoDAO.gravar(produto);
    redirectAttributes.addFlashAttribute("sucesso","Produto cadastrado com sucesso!");
    return new ModelAndView("redirect:produtos");
}

}

}

1 resposta
solução!

Olá Bruna!

Provavelmente ela está parando de funcionar pois você está chamando ela mais de uma vez.

Quando você usa o @RequestMapping("/produtos") na classe você não precisa mapear o "/produtos" nos métodos como está sendo feito:

@RequestMapping("/produtos/form")
public ModelAndView form(){

Dessa forma, para acessar o form você teria que acessar a url: /produtos/produtos/form.

Para que isso não aconteça você pode retirar esse /produtos e deixar somente o /form:

@RequestMapping("/form")
public ModelAndView form(){

Dessa forma você pode acessar a URL normalmente: /produtos/form

Os outros métodos seguem a mesma ideia.

Espero que tenha ajudado.

Bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software