giannino1995 ha scritto:
https://github.com/Apress/beg-spring-boot-2/tree/master/chapter-01/hello-springboot
Sì, conosco quel repo di Apress .... il libro ce l'ho anch'io! Ma non saprei se hai fatto modifiche .. pasticciato il codice o che altro.
Comunque, ho fatto un clone con Fork (client git che uso) di tutto quel repo e poi sono andato nel chapter-01\hello-springboot. Quindi prendendo esattamente quel progetto come è ..
Premesse:
- Oracle JDK 8 build 241
- Maven 3.6.3
- niente IDE, tutto da prompt
- per la prova 2, ho il MySQL Community Server 8.0.20
Prova 1) (db h2)
Lancio:
mvn spring-boot:run
Il codice compila tutto bene e si avvia SENZA alcun errore. In particolare dai log vedo:
-----------------------
2020-07-18 09:59:40.602 INFO 6204 --- [ restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
Hibernate: create table user (id integer not null, name varchar(255), primary key (id))
Hibernate: create sequence hibernate_sequence start with 1 increment by 1
2020-07-18 09:59:41.368 INFO 6204 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2020-07-18 09:59:41.486 INFO 6204 --- [ restartedMain] o.s.jdbc.datasource.init.ScriptUtils : Executing SQL script from URL [file:/R:/Prove/beg-spring-boot-2/chapter-01/hello-springboot/target/classes/data.sql]
2020-07-18 09:59:41.498 INFO 6204 --- [ restartedMain] o.s.jdbc.datasource.init.ScriptUtils : Executed SQL script from URL [file:/R:/Prove/beg-spring-boot-2/chapter-01/hello-springboot/target/classes/data.sql] in 7 ms.
-----------------------
Vuol dire che con H2 Hibernate ha creato la tabella (e una sequence per il id) partendo dalla ENTITY. Nota quel varchar(255), è per quanto dicevo prima: la entity non è "accurata" nella descrizione della tabella, quindi prende un default di 255 caratteri.
E poi ha letto il file data.sql ed applicato lo script.
Vado da browser sul localhost:8080 e la pagina mostra i 3 utenti.
Quindi: FUNZIONA
Prova 2) (db MySQL)
- Creo "a mano" il database "test" su MySQL (uso un client HeidiSQL)
- Modifico "a mano" il file application-prod.properties SOLO per cambiare la password di root
Lancio:
mvn spring-boot:run -Dspring-boot.run.profiles=prod
L'applicazione subito NON si avvia, dai log vedo:
-----------------------
Sat Jul 18 10:25:26 CEST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
2020-07-18 10:25:28.075 ERROR 11436 --- [ restartedMain] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization.
java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'.
-----------------------
Scopro (su StackOverflow
qui) che è un problema dovuto al fatto che nel MySQL 8.0.4 è stato cambiato il plugin di autenticazione.
Il progetto così come è usa un Connector/J meno recente:
mysql:mysql-connector-java:jar:
5.1.45
Quindi dato che ho il MySQL 8.x ho deciso di aggiornare il Connector/J, basta mettere:
<mysql.version>8.0.21</mysql.version>
in <properties> nel pom.xml. Poi però c'è da cambiare la classe del driver perché nel Connector/J 8 è cambiata:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Rilancio il comando di run. Continua a non funzionare ma per una cosa che mi stavo dimenticando (e che avevo già notato):
java.sql.SQLException: The server time zone value 'ora legale Europa occidentale' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
Anche qui è una questione di cambiamenti fatti nel MySQL. La soluzione è semplice:
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC
Rilancio e va molto meglio. Dai log vedo:
-----------------------
2020-07-18 10:49:23.828 INFO 4436 --- [ restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
Hibernate: create table hibernate_sequence (next_val bigint) engine=MyISAM
Hibernate: insert into hibernate_sequence values ( 1 )
Hibernate: create table user (id integer not null, name varchar(255), primary key (id)) engine=MyISAM
-----------------------
Ma NON vedo dai log la lettura del data.sql. Infatti se vado su localhost:8080 ho la pagina ma VUOTA, non ci sono utenti elencati.
Conclusione: mi FUNZIONA "quasi" tutto, salvo il fatto che con MySQL non ha preso il data.sql.
E tutto questo comunque mi ha preso meno di 1 ora di tempo.
EDIT: e la cosa curiosa (dovrei andare a documentarmi) è che con MySQL Hibernate non ha creato il id auto_increment ma si è fatto una tabella simil-sequence.