Solucionado (ver solução)
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");