Olá a todos.
Ao acessar a página do meu projeto (https://cdcspringmvc-alura-maury.herokuapp.com/), ocorreu uma exception fazendo com que a página de erro fosse exibida ao invés da home. Como na página erro coloquei uma linha para imprimir a stack trace da exception, consegui ver que é alguma coisa em relação ao banco de dados, mas não entendi o que está causando o erro.
A stack trace que aparece no html é a seguinte:
Exception: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763)
Não coloquei as demais linhas para o post não ficar gigante.
A minha classe JPAConfiguratio está assim:
@EnableTransactionManagement
public class JPAConfiguration {
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, Properties aditionalProperties) {
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
factoryBean.setJpaVendorAdapter(vendorAdapter);
factoryBean.setDataSource(dataSource);
factoryBean.setJpaProperties(aditionalProperties);
factoryBean.setPackagesToScan("br.com.casadocodigo.loja.models");
return factoryBean;
}
@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory emf) {
return new JpaTransactionManager(emf);
}
@Bean
@Profile("dev")
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUsername("root");
dataSource.setPassword("");
dataSource.setUrl("jdbc:mysql://localhost/casadocodigo?useTimezone=true&serverTimezone=UTC&useUnicode=yes&characterEncoding=UTF-8");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
return dataSource;
}
@Bean
@Profile("dev")
private Properties aditionalProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
properties.setProperty("hibernate.show_sql", "true");
properties.setProperty("hibernate.hbm2ddl.auto", "update");
return properties;
}
}
A minha classe JPAProductionConfiguration está assim:
@Profile("prod")
public class JPAProductionConfiguration {
@Autowired
//org.springframework.core.env.Environment
private Environment environment;
@Bean
public DataSource dataSource() throws URISyntaxException {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.postgresql.Driver");
//usuario:senha@host:port/path
//DATABASE_URL -> variável de ambiente que o Heroku fornece ao rodar o sistema
URI dbUrl = new URI(environment.getProperty("DATABASE_URL"));
dataSource.setUrl("jdbc:postgresql://"+dbUrl.getHost()+":"+dbUrl.getPort()+dbUrl.getPath());
dataSource.setUsername(dbUrl.getUserInfo().split(":")[0]);
dataSource.setPassword(dbUrl.getUserInfo().split(":")[1]);
return dataSource;
}
@Bean
private Properties aditionalProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
properties.setProperty("hibernate.show_sql", "true");
properties.setProperty("hibernate.hbm2ddl.auto", "update");
return properties;
}
}
A minha classe ServletSpringMVC está assim:
public class ServletSpringMVC extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {SecurityConfiguration.class,
AppWebConfiguration.class, JPAConfiguration.class,
JPAProductionConfiguration.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {};
}
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
encodingFilter.setEncoding("UTF-8");
return new Filter[] {encodingFilter, new OpenEntityManagerInViewFilter()};
}
@Override
protected void customizeRegistration(Dynamic registration) {
registration.setMultipartConfig(new MultipartConfigElement(""));
}
//Método necessário para dizer para o String MVC qual o profile que deve usar ao subir o servidor
/*@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
servletContext.addListener(new RequestContextListener());
servletContext.setInitParameter("spring.profiles.active", "dev");
}*/
}
Eu revisei o meu projeto, mas não encontrei nada de errado. Provavelmente é um pequeno detalhe.