Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
10
respostas

java.lang.UnsupportedOperationException: The application must supply JDBC connections

Bom dia Pessoal, estou com um problema que parece ser de conexao no banco. estou usando postgres porque era o que ja tinha na maquina. criei o usuario e senha para o banco produto tudo certinho.

Exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.UnsupportedOperationException: The application must supply JDBC connections
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Root Cause

org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.UnsupportedOperationException: The application must supply JDBC connections
    org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:430)
    org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
    org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:438)
    org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:261)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
    br.com.casadocodigo.loja.dao.ProdutoDao$$EnhancerBySpringCGLIB$$34365de9.grava(<generated>)
    br.com.casadocodigo.loja.controller.ProdutosController.grava(ProdutosController.java:23)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

driver do postgres estou usando(pelo maven) :

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.2</version>
        </dependency>

segue abaixo minha classe JPAConfiguration

package br.com.casadocodigo.loja.conf;

import java.util.Properties;

import javax.persistence.EntityManagerFactory;

import org.springframework.context.annotation.Bean;
import org.springframework.jca.support.LocalConnectionFactoryBean;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@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("dnk");
            dataSource.setPassword("dnk");
            dataSource.setUrl("jdbc:postgresql://localhost:5432/produto");
            dataSource.setDriverClassName("org.postgresql.Driver");

            Properties properties = new Properties();
            properties.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
            properties.setProperty("hibernate.show_sql", "true");
            properties.setProperty("hibernate.hb2ddl.auto", "update");

            factoryBean.setJpaProperties(properties);

            factoryBean.setPackagesToScan("br.com.casadocodigo.loja.model");

            return factoryBean;

        }
        @Bean
        private JpaTransactionManager transactionManager(EntityManagerFactory emf ) {
            return new JpaTransactionManager(emf);
        }
}
10 respostas

Oi Thiago, tudo certo? Você anotou sua classe ProdutoDao com @Transactional ?

Bom dia Thais, Anotei sim, quando sobe a aplicação nem chega criar as tabelas, mas nao da nenhum erro no console do tomcat tambem

Certo, mande o código das classes ProdutoDao e ProdutosController pra eu dar uma olhada.

Bom dia Thais, segue abaixo as classes, mas estou achando que deve ser alguma coisa na parte da conexao, porque nem o banco ele esta criando

ProdutoDao

package br.com.casadocodigo.loja.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.casadocodigo.loja.model.Produto;

@Repository
@Transactional
public class ProdutoDao {

    @PersistenceContext
    private EntityManager manager;

    public void grava(Produto produto) {
        manager.persist(produto);
    }

    public List<Produto> listar() {
        return manager.createQuery("select p from produto p", Produto.class).getResultList();
    }

}

ProdutosController

package br.com.casadocodigo.loja.controller;

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.dao.ProdutoDao;
import br.com.casadocodigo.loja.model.Produto;
import br.com.casadocodigo.loja.model.TipoPreco;
import br.com.casadocodigo.loja.validation.ProdutoValidation;

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

    @Autowired
    private ProdutoDao  produtoDao = new ProdutoDao();

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

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

        return modelAndView;
    }

    @RequestMapping(method=RequestMethod.POST)
    private ModelAndView grava(@Valid Produto produto, BindingResult bindingResult, RedirectAttributes attributes) {
        if(bindingResult.hasErrors()) return form();
        produtoDao.grava(produto);
        System.out.println(produto);
        ModelAndView modelAndView = new ModelAndView("redirect:produtos");
        attributes.addFlashAttribute("sucesso", "cadastrado com sucesso");
        return modelAndView;
    }

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

oi Tiago, me parece que está tudo correto. você acrescentou a classe de configuração JPAConfiguration no método da classe ServletSpringMVC?

assim:


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

sim,

package br.com.casadocodigo.loja.conf;

import javax.servlet.Filter;

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

public class ServletSpringMVC extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

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

    @Override
    protected String[] getServletMappings() {
        return new String[] {"/"};
    }

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        return new Filter[] {characterEncodingFilter};
    }
}

Oi Thiago, desculpe a demora para responder. Você poderia enviar seu código pra nós? Se estiver no github já facilita.

Vamos testar aqui pra tentar achar o erro. Pelo que você nos enviou, seu código parece correto.

tambem peço desculpas da demora, estou acessando pouco, estou com um braço quebrado. segue o endereço para download do codigo: https://filenurse.com/download/f5b37bfa6794d12cd3d707252fe0032a.html

solução!

consegui resolver, estava faltando:

factoryBean.setDataSource(dataSource);

na classe JPAConfiguration

aqui tambem estava errado properties.setProperty("hibernate.hb2ddl.auto", "update"); properties.setProperty("hibernate.hbm2ddl.auto", "update");