Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Could not instantiate bean class [org.springframework.web.multipart.MultipartFile]: Specified class is an interface

=( alguém ajuda? implementei todas as conf da aula9 e Spring dá erro .

GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/casadocodigo] threw exception [Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.web.multipart.MultipartFile]: Specified class is an interface] with root cause
org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.web.multipart.MultipartFile]: Specified class is an interface
7 respostas

Oi Aline,

só para garantir, vc configurou o MultipartResolver?

@Bean
public MultipartResolver multipartResolver() {
    return new StandardServletMultipartResolver();
}

abs, Nico

Oi Nico, Sim.

package br.com.casadocodigo.loja.conf;

import java.sql.Date;

import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.access.ContextBeanFactoryReference;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.event.ApplicationContextEvent;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.format.datetime.DateFormatterRegistrar;
import org.springframework.format.support.DefaultFormattingConversionService;
import org.springframework.format.support.FormattingConversionService;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.support.StandardServletMultipartResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceView;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

import br.com.casadocodigo.loja.controllers.HomeController;
import br.com.casadocodigo.loja.daos.ProdutoDao;

@ComponentScan(basePackageClasses = { HomeController.class, ProdutoDao.class }) // onde estarao nossos controllers
public class AppWebConfiguration {

    @Bean // gerenciando pelo Spring
    public InternalResourceViewResolver internalResourceViewResolver() {// Resolvedor Interno de Recursos de View -
                                                                        // ajuda o Spring a encontrar as views
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");


        return resolver;
    }

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("WEB-INF/messages");
        messageSource.setDefaultEncoding("UTF-8");
        messageSource.setCacheSeconds(1);
        return messageSource;
    }

    @Bean
    public FormattingConversionService mvcConversionService() {
        DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
        DateFormatterRegistrar registrar = new DateFormatterRegistrar();
        DateFormatter dateFormatter = new DateFormatter("dd-MM-yyyy");
        registrar.setFormatter(dateFormatter);
        registrar.registerFormatters(conversionService);

        return conversionService;
    }

    @Bean
    public MultipartResolver multipartResolver() {
        return new StandardServletMultipartResolver();

    }

}

Também incluí o método "customizeRegistration".

package br.com.casadocodigo.loja.conf;

import javax.servlet.Filter;
import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletRegistration.Dynamic;

import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import br.com.casadocodigo.loja.infra.FileSaver;

//configurando Servlet do Spring para atender as requisicoes do Tomcat
public class ServletSpringMVC extends AbstractAnnotationConfigDispatcherServletInitializer{

    @Override
    protected Class<?>[] getRootConfigClasses() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] {AppWebConfiguration.class, JPAConfiguration.class, FileSaver.class};//array de classes de config
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] {"/"};//array de mapeamentos para responder
    }

    @Override
    protected Filter[] getServletFilters() {//javax.servlet.Filter
        CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
        encodingFilter.setEncoding("UTF-8");

        return new Filter[] {encodingFilter};
    }

    //para atender o input file
    @Override
    protected void customizeRegistration(Dynamic registration) {
        registration.setMultipartConfig(new MultipartConfigElement(""));//dizemos q o arquivo do input file nao terá um caminho específico, será somente o nome dele

        // TODO Auto-generated method stub
//        super.customizeRegistration(registration);
    }
}

E o sumario no Controller como parâmetro.

import org.springframework.web.multipart.MultipartFile;

@RequestMapping(method=RequestMethod.POST)//recebe o get e post do form action=/casadocodigo/produtos
    public ModelAndView gravar(MultipartFile sumario, @Valid Produto produto, BindingResult bindingResult) {//bindingResult retorna se houver erro nas validacoes

        System.out.println(sumario.getOriginalFilename());//nome do arquivo

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

        String path = fileSaver.write("arquivo-sumario", sumario);
        produto.setSumarioPath(path);        
        System.out.println(produto);
        produtoDao.gravar(produto);
        //return listar();//sempre depois do post temos q fazer o redirect para nao cair no bug do F5

         //nos redirects perdemos o objeto modelAndView pois sao feitos dois requests, nesse caso a soulcao é usar o flash
         //modelAndView.addObject("sucesso", "Prod cadastrado com sucesso.");

//         redirectAttributes.addFlashAttribute("sucesso", "Prod cadastrado com sucesso");

         ModelAndView modelAndView = new ModelAndView("redirect:produtos");
         return modelAndView;

    }

Aline, existe a possibilidade de compartilhar o projeto comigo? Realmente parece tudo ok ... pelo menos nao estou enxergando o problema.

Obrigado, Nico

solução!

oi Nico, acho que descobri, deixei escapar a notação "@EnableWebMvc" em algum momento... agora rodou ok, obg.

Otimo, obrigado por avisar!