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

APPLICATION FAILED TO START

Não estou conseguindo subir a aplicação. Utilizando Eclipse Photon e mySQL8

erro no console:

...
2018-07-30 14:21:59.403  INFO 13132 --- [           main] org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000227: Running hbm2ddl schema export
2018-07-30 14:21:59.418  INFO 13132 --- [           main] org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000230: Schema export complete
2018-07-30 14:21:59.484  INFO 13132 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2018-07-30 14:21:59.606  WARN 13132 --- [           main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'convidadoController': Unsatisfied dependency expressed through field 'repository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'convidadoRepository': Cannot create inner bean '(inner bean)#5db0003d' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#5db0003d': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory': Post-processing of FactoryBean's singleton object failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSourceInitializer': Invocation of init method failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Tomcat.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.tomcat.jdbc.pool.DataSource]: Factory method 'dataSource' threw exception; nested exception is org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Cannot determine embedded database driver class for database type NONE. If you want an embedded database please put a supported one on the classpath. If you have database settings to be loaded from a particular profile you may need to active it (no profiles are currently active).
2018-07-30 14:21:59.606  INFO 13132 --- [           main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2018-07-30 14:21:59.618  INFO 13132 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2018-07-30 14:21:59.647  INFO 13132 --- [           main] utoConfigurationReportLoggingInitializer : 

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2018-07-30 14:21:59.657 ERROR 13132 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

APPLICATION FAILED TO START

Description:
Cannot determine embedded database driver class for database type NONE

Action:
If you want an embedded database please put a supported one on the classpath. If you have database settings to be loaded from a particular profile you may need to active it (no profiles are currently active).

Configuracao.java

@SpringBootApplication
public class Configuracao {

    public static void main(String[] args) {
        SpringApplication.run(Configuracao.class, args);
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        factoryBean.setJpaVendorAdapter(vendorAdapter);

        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUsername("root");
        dataSource.setPassword("mySQLpassword123*");
        dataSource.setUrl("jdbc:mysql://localhost/listavip?useTimezone=true&serverTimezone=UTC&useSSL=false");
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        factoryBean.setDataSource(dataSource);

    Properties properties = new Properties();
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        properties.setProperty("hibernate.show_sql", "true");
        properties.setProperty("hibernate.hbm2ddl.auto", "create");

        factoryBean.setJpaProperties(properties);
        factoryBean.setPackagesToScan("br.com.listavip.model");

        return factoryBean;
    }
6 respostas

Fala Eduardo, tudo bem ?

Quando trabalhamos com o Spring Boot uma das coisas mais legais que ganhamos é a possibilidade de nos livrarmos dos códigos de configuração que comumente eram escritos (quase que iguais) de projeto pra projeto.

Ao invés de escrever esse @Bean na sua classe de configuração você pode apenas expor algumas chaves em um arquivo de properties em src/main/resources/application.properties (com esse nome).

Exemplo application.properties

# data source configuration
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=mySQLpassword123*
spring.datasource.url=jdbc:mysql://localhost/listavip?useTimezone=true&serverTimezone=UTC&useSSL=false

# jpa properties
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true

Com isso o Spring Boot (que já sabe que você está usando JPA com Hibernate e necessita de um DataSource depois de escanear seu classpath) vai rodar as classes de *AutoConfiguration que já possui pra configurar o bean do DataSource e do EntityManagerFactory que serão inicializados por ele.

Inclusive, imagino que o erro que está dando seja justamente porque ele não está encontrando um @Bean que devolva um DataSource, e nem as chaves no application.properties pra auto-configuração - Parece que ele não encontra a definição da classe do driver que deve ser usado: Cannot determine embedded database driver class for database type NONE. Aparece esse NONE no lugar. Outra prossibilidade é de não haver a classe do driver disponível no classpath. Você tem certeza que a dependencia do driver do mysql está no pom.xml do projeto?

Dê uma olhada nisso, creio que deve ajudar.

Caso ainda queira permanecer com o código de configuração aconselharia você expor o @Bean do DataSource ao Spring, extraindo do método já existente. Exemplo:

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setUsername("root");
        dataSource.setPassword("mySQLpassword123*");
        dataSource.setUrl("jdbc:mysql://localhost/listavip?useTimezone=true&serverTimezone=UTC&useSSL=false");
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
        emf.setDataSource(dataSource);
        emf.setPackagesToScan(new String[] {"br.com.listavip.model"});
        emf.setJpaVendorAdapter(new HibernateJpaVendorAdapter());

        Properties properties = new Properties();
        properties.setProperty("hibernate.hbm2ddl.auto", "update");
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        properties.setProperty("hibernate.show_sql", "true");
        properties.setProperty("hibernate.format_sql", "true");

        emf.setJpaProperties(properties);
        return emf;
    }

Espero ter ajudado. Abraço!

Estou utilizando as configurações conforme você colocou acima, tentei utilizar a versão com o arquivo final do exercício, mas também paro neste erro. Segue as clases: ConvidadoController


@Controller
public class ConvidadoController {
    @Autowired
    private ConvidadoRepository repository;
    @RequestMapping("/")
    public String index() {
        return "index";
    }

    @RequestMapping("listaconvidados")
    public String listaConvidados(Model model) {
        Iterable<Convidado> convidados = repository.findAll();
        model.addAttribute("convidados", convidados);
        return "listaconvidados";
    }
}

ConvidadoRepository

public interface ConvidadoRepository extends CrudRepository<Convidado, Long> {
}

Convidado.Java


import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity(name = "convidado")
public class Convidado {

    @Id
    @GeneratedValue
    private Long id;

    private String nome;
    private String email;
    private String telefone;

    ...getters and setters

POM

<dependencies>
            <dependency>            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
         <version>1.5.14.RELEASE</version>
        </dependency>
        <dependency>            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
             <version>1.5.14.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
             <version>1.5.14.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
    </dependencies>

Novo Erro Console

2018-07-31 16:25:28.760  INFO 13276 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2018-07-31 16:25:29.057  WARN 13276 --- [           main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'convidadoController': Unsatisfied dependency expressed through field 'repository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'convidadoRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class br.com.alura.listavip.model.Convidado
2018-07-31 16:25:29.057  INFO 13276 --- [           main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2018-07-31 16:25:29.061  INFO 13276 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2018-07-31 16:25:29.095  INFO 13276 --- [           main] utoConfigurationReportLoggingInitializer : 

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2018-07-31 16:25:29.119 ERROR 13276 --- [           main] o.s.boot.SpringApplication               : Application startup failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'convidadoController': Unsatisfied dependency expressed through field 'repository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'convidadoRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class br.com.alura.listavip.model.Convidado
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) ~[spring-beans-4.3.18.RELEASE.jar:4.3.18.RELEASE]
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.18.RELEASE.jar:4.3.18.RELEASE]
....
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'convidadoRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class br.com.alura.listavip.model.Convidado
....
Caused by: java.lang.IllegalArgumentException: Not a managed type: class br.com.alura.listavip.model.Convidado
    at org.hibernate.jpa.internal.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:210) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]

Fala Eduardo, tudo bem ?

A interface ConvidadoRepository está anotada com @Repository, para o Spring poder gerenciar e injetar a implementação que ele vai gerar ?

Por mais que o erro não fale expressamente isso, foi o que consegui perceber no código que você postou. Não consigo ver mais nada de errado no que tange a configuração nem nada.

Consegue compartilhar esse código pra eu poder dar uma olhada ? Via github talvez ?

Abs

Espero ter feito o compartilhamento correto...não tenho muita experiencia com o Git, mas segue o link:

https://github.com/EduBuchele/AluraListaVip.git

abs

Fala Edu, tudo bem ?

Dei uma olhada no código. O problema é que o Hibernate não está conseguindo mapear sua entidade Convidado.

No código da classe configuração (https://github.com/EduBuchele/AluraListaVip/blob/master/listavip/src/main/java/br/com/alura/listavip/Configuracao.java) no trecho onde deveria mapear os pacotes a serem escaneados ..

emf.setPackagesToScan(new String[] { "br/com/alura/listavip/model/Convidado.java" });

.. uma classe é passada, além disso ao invés de . a separação é feita por / o que também é um problema ao inferir para um pacote.

Tente alterar para esse exemplo:

emf.setPackagesToScan(new String[] { "br.com.alura.listavip.model" }); // pacote exato onde se encontram as Entities

Deve resolver.

Abraço!

solução!

Consegui, na minha classe convidado, estava importando o Id da spring, coloquei o import javax.persistence.Id;

e atualizei as dependências agora com :

<dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        <version>2.0.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>2.0.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>2.0.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>