5
respostas

Erro em ProdutosController -> ProdutoDAO -> @PersistenceContext

Não estou conseguindo identificar o motivo deste erro, se precisar posso mandar meu fonte todo.
Erro: 
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'produtosController': Unsatisfied dependency expressed through field 'produtoDao'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'produtoDAO': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManagerFactory' available
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:581)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:367)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1340)

HomeControllers:
@Controller
public class ProdutosController {

    @Autowired
    private ProdutoDAO produtoDao;

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

    @RequestMapping("produtos/")
    public String gravar(Produto produto) {
        System.out.println(produto);
//        Erro         
//        produtoDao.gravar(produto);
        return "produtos/ok";
    }
}

ProdutoDao:
@Repository
public class ProdutoDAO {
    @PersistenceContext
    private EntityManager manager;
}

AppWebConfigure:
@EnableWebMvc
@ComponentScan(basePackageClasses={homeController.class, ProdutoDAO.class})  
public class AppWebConfiguration  {
    @Bean
    public InternalResourceViewResolver internalResourceViewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}
5 respostas

Posta sua classe JPAConfiguration,, para agente ver como esta,.

Já vi casos também em que as configurações não estavam sendo carregadas por causa do ComponentScan.

Tenta usar a anotação @ComponentScan(basePackages="").

Ex.: @ComponentScan({"seu.pacote.contendo.as.classes"})

Edit: Apenas para quem tiver dúvidas quanto ao Component Scan, ele basicamente diz "procure por Beans do Spring" nesse pacote, ou nessa classe, por exemplo

Segue classe JPAConfiguration

@EnableTransactionManagement public class JPAConfiguration { @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); factoryBean.setJpaVendorAdapter(vendorAdapter); DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setUsername("postgres"); dataSource.setPassword("sharingam"); dataSource.setUrl("jdbc:postgresql://localhost:5432/exerciciosJava"); dataSource.setDriverClassName("org.postgresql.Driver"); factoryBean.setDataSource(dataSource); Properties props = new Properties(); props.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); props.setProperty("hibernate.show_sql", "true"); props.setProperty("hibernate.hbm2ddl.auto", "update"); factoryBean.setJpaProperties(props); factoryBean.setPackagesToScan("br.com.casadocodigo.loja.models"); return factoryBean; }

@Bean public JpaTransactionManager transactionManager(EntityManagerFactory emf) { return new JpaTransactionManager(emf); } }

Troquei: @ComponentScan(basePackageClasses={homeController.class, ProdutoDAO.class}) por: @ComponentScan(basePackages={"br.com.casadocodigo.loja.controllers", "br.com.casadocodigo.loja.daos"}) Está apresentando mesmo erro.

Inicialmente o projeto usaria MySQL mas optei por usar postgre versao 9.4

Ivano, boa tarde !

É possível você verificar se na classe que extend AbstractAnnotationConfigDispatcherServletInitializer você setou o seu JPAConfig? Ex:

@Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { AppWebConfig.class, JPAConfig.class };
}