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

Problema na criação do Bean

Olá, estou com um problema que estou tentando resolver a muito tempo, consiste em:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'produtosController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private br.com.casadocodigo.loja.infra.FileSaver br.com.casadocodigo.loja.controllers.ProdutosController.fileSaver; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [br.com.casadocodigo.loja.infra.FileSaver] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

Parece que a culpa é do ProdutosController, caso queiram dar uma olhada:


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

    @Autowired
    private ProdutoDAO dao;

    @Autowired
    private FileSaver fileSaver;

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

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

    @RequestMapping(method=RequestMethod.POST)
    public ModelAndView gravar(MultipartFile sumario, @Valid Produto produto, BindingResult result, 
                RedirectAttributes redirectAttributes){

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

        String path = fileSaver.write("arquivos-sumario", sumario);
        produto.setSumarioPath(path);

        dao.gravar(produto);

        redirectAttributes.addFlashAttribute("sucesso", "Produto cadastrado com sucesso!");

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

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

    @RequestMapping("/detalhe/{id}")
    public ModelAndView detalhe(@PathVariable("id") Integer id){
        ModelAndView modelAndView = new ModelAndView("/produtos/detalhe");
        Produto produto = dao.find(id);
        modelAndView.addObject("produto", produto);
        return modelAndView;
    }
}

Apesar da error message citar as dependências acredito que não existe algum problema nelas.

Desde já agradeço.
1 resposta
solução!

Por incrível que pareça, o problema não era (pelo menos não por cima dos panos) com os @Beans que perpetuavam (ou faltavam) nos projetos, nem com a dependência ou os @Autowired.

Solução:

O problema estava na definição das classes que iriam ser "trackadas" (rastreadas), ou seja, no @ComponentScan, veja o antes:

@ComponentScan(basePackageClasses= {HomeController.class, ProdutoDAO.class})

e o depois com a classe que faltava referenciar (CORRETO, SOLUÇÃO):

@ComponentScan(basePackageClasses= {HomeController.class, ProdutoDAO.class, FileSaver.class})