Non riesco a capire la webapp hello-springboot

di il
31 risposte

Non riesco a capire la webapp hello-springboot

Non riesco a capire perché la webapp "hello-springboot" del testo "Beginning Spring Boot 2" non salva i dati del DBMS ma riesce a leggerli.
Faccio una premessa, l'applicazione funziona alla perfezione e dovrebbe eseguire questa query:
delete from user;
insert into user(id, name) values(1,'John');
insert into user(id, name) values(2,'Smith');
insert into user(id, name) values(3,'Siva');
per poi stampare su una pagina HTML la tabella.
Se la webapp azzera il DBMS dopo aver renderizzato da dove me accorgo?
Per creare il DBMS ho fatto in questo modo:
CREAZIONE DBMS
CREATE DATABASE test;
USE test;
CREATE TABLE user (
	id INT NOT NULL AUTO_INCREMENT,
	name CHAR(30) NOT NULL,
	PRIMARY KEY (id)
);
Leggo il DBMS da IntelliJ e sono quasi certo che funzioni e che la tabella user sia vuota.
Inoltre anche Mysql Workbench mi informa che la tabella user è vuota quindi sono certo che user sia vuota.
Sono sbigottito.
In Event Log leggo questo:
14/07/2020
17:43	All files are up-to-date

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL

17:43	Application: Failed to retrieve application JMX service URL
grazie come sempre

31 Risposte

  • Re: Non riesco a capire la webapp hello-springboot

    Puoi postare il file "application.properties" e il blocco dependencies del pom.xml? Io ho un sospetto...
  • Re: Non riesco a capire la webapp hello-springboot

    giannino1995 ha scritto:


    Se la webapp azzera il DBMS dopo aver renderizzato da dove me accorgo?
    Devi vedere tra le properties:

    spring.datasource.initialize=.......
    spring.jpa.hibernate.ddl-auto=......

    e il file data.sql

    Ma usa la versione di Spring Boot indicata nel libro, non l'ultimissima. Perché se non sbaglio (adesso verifico), la questione della initialize di un DB allo startup è un'area in cui hanno fatto dei cambiamenti ...
  • Re: Non riesco a capire la webapp hello-springboot

    Per me ha messo nelle dependencies H2 o Derby o, comunque, un db in-memory... se c'è un db in-memory in classpath Spring Boot carica quello.
  • Re: Non riesco a capire la webapp hello-springboot

    LeleFT ha scritto:


    Puoi postare il file "application.properties" e il blocco dependencies del pom.xml? Io ho un sospetto...
    application.properties
    logging.level.org.springframework=INFO
    
    ################### Hibernate Configuration ##########################
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.show-sql=true
    application-prod.properties
    logging.level.org.springframework=INFO
    
    ################### DataSource Configuration ##########################
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/test
    spring.datasource.username=root
    spring.datasource.password=admin
    
    spring.datasource.initialize=true
    
    ################### Hibernate Configuration ##########################
    
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.show-sql=true
    
    pom.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    						http://maven.apache.org/maven-v4_0_0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<groupId>com.apress</groupId>
    	<artifactId>hello-springboot</artifactId>
    	<packaging>jar</packaging>
    	<version>0.0.1-SNAPSHOT</version>
    	<name>hello-springboot</name>
    
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.0.0.BUILD-SNAPSHOT</version>
    	</parent>
    
    	<properties>
    		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    		<java.version>1.8</java.version>
    	</properties>
    
    	<repositories>
    		<repository>
    			<id>spring-snapshots</id>
    			<name>Spring Snapshots</name>
    			<url>https://repo.spring.io/snapshot</url>
    			<snapshots>
    				<enabled>true</enabled>
    			</snapshots>
    		</repository>
    		<repository>
    			<id>spring-milestones</id>
    			<name>Spring Milestones</name>
    			<url>https://repo.spring.io/milestone</url>
    			<snapshots>
    				<enabled>false</enabled>
    			</snapshots>
    		</repository>
    	</repositories>
    	<pluginRepositories>
    		<pluginRepository>
    			<id>spring-snapshots</id>
    			<name>Spring Snapshots</name>
    			<url>https://repo.spring.io/snapshot</url>
    			<snapshots>
    				<enabled>true</enabled>
    			</snapshots>
    		</pluginRepository>
    		<pluginRepository>
    			<id>spring-milestones</id>
    			<name>Spring Milestones</name>
    			<url>https://repo.spring.io/milestone</url>
    			<snapshots>
    				<enabled>false</enabled>
    			</snapshots>
    		</pluginRepository>
    	</pluginRepositories>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    			</plugin>
    		</plugins>
    	</build>
    
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-data-jpa</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-thymeleaf</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-devtools</artifactId>
    			<optional>true</optional>
    		</dependency>
    		<dependency>
    			<groupId>mysql</groupId>
    			<artifactId>mysql-connector-java</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>com.h2database</groupId>
    			<artifactId>h2</artifactId>
    		</dependency>
    	</dependencies>
    
    
    </project>
  • Re: Non riesco a capire la webapp hello-springboot

    andbin ha scritto:


    giannino1995 ha scritto:


    Se la webapp azzera il DBMS dopo aver renderizzato da dove me accorgo?
    Devi vedere tra le properties:

    spring.datasource.initialize=.......
    spring.jpa.hibernate.ddl-auto=......

    e il file data.sql

    Ma usa la versione di Spring Boot indicata nel libro, non l'ultimissima. Perché se non sbaglio (adesso verifico), la questione della initialize di un DB allo startup è un'area in cui hanno fatto dei cambiamenti ...
    Da dove scelgo la versione di Spring Boot su IntelliJ? Non è scaricato in modo automatico da Maven sulla base delle specifiche del file pom.xml?
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.0.0.BUILD-SNAPSHOT</version>
    	</parent>
    delete from user;
    
    insert into user(id, name) values(1,'John');
    insert into user(id, name) values(2,'Smith');
    insert into user(id, name) values(3,'Siva');
    
    Il "delete from user;" è all'inizio dello script poi ci sono 3 query.
  • Re: Non riesco a capire la webapp hello-springboot

    giannino1995 ha scritto:


    		<dependency>
    			<groupId>com.h2database</groupId>
    			<artifactId>h2</artifactId>
    		</dependency>
    
    E infatti hai il H2 che è "in memory".

    giannino1995 ha scritto:


    Da dove scelgo la versione di Spring Boot su IntelliJ?
    Nel pom.xml
    Non c'entra l'IDE.

    giannino1995 ha scritto:


    delete from user;
    
    insert into user(id, name) values(1,'John');
    insert into user(id, name) values(2,'Smith');
    insert into user(id, name) values(3,'Siva');
    
    E dove sta il create table ecc... ?? (il setup dello schema dovrebbe stare in un schema.sql)
  • Re: Non riesco a capire la webapp hello-springboot

    E' sicuramente come dici tu, infatti l'applicazione funziona anche senza MySQL attivo. Credo che il mio errore sia stato quello di testare tutto senza MySQL installato e JDK 1.14. Pensavo di aver risolto avendo installato MySQL ma in realtà ho risolto installando JDK 1.8. Sono un fesso, ho dimenticato che installando MySQL ho anche aggiornato la JDK. Che pirla colossale...
    La domanda comunque resta: da dove capisci che l'applicazione usa H2?
    Nel pom.xml c'è H2, è vero, ma c'è anche MySQL. In application.properties e in application-prod.properties non vedo scritto H2 da nessuna parte.
    Altra domanda: come costringo l'applicazione ad usare MySQL ovvero i parametri application-prod.properties?
    L'IDE mi segna errato questo codice:
    spring.datasource.initialize=true
    Non mi piace molto questa cosa...
    Grazie mille!
  • Re: Non riesco a capire la webapp hello-springboot

    giannino1995 ha scritto:


    La domanda comunque resta: da dove capisci che l'applicazione usa H2?
    Nel pom.xml c'è H2, è vero, ma c'è anche MySQL. In application.properties e in application-prod.properties non vedo scritto H2 da nessuna parte.
    Non ho ora la documentazione facilmente a portata di mano, vedo di rispondere meglio domani.

    Comunque riguarda una delle tante "autoconfigurazioni" di Spring Boot che devi ancora approfondire.
    Se Spring Boot si accorge che in classpath c'è il db H2 (o il Derby) crea/attiva tutta una serie di cose per gestire quel tal db "in memory".
    E in questo momento ho solo il dubbio se ciò viene fatto in preferenza (o no) rispetto alla presenza di un db non in memory.

    E ho la sensazione che se ti scrivessi un esempio io, ti funzionerebbe prima/meglio ....
    Dovrei solo valutare cosa metterci, sicuramente Thymeleaf per fare una paginetta con un templare, poi o JPA-Hibernate o banalmente il JDBC templare di Spring.
  • Re: Non riesco a capire la webapp hello-springboot

    Da qui:
    https://docs.spring.io/spring-boot/docs/2.4.0-M1/reference/html/using-spring-boot.html#using-boot-auto-configuration
    Spring Boot auto-configuration attempts to automatically configure your Spring application based on the jar dependencies that you have added. For example, if HSQLDB is on your classpath, and you have not manually configured any database connection beans, then Spring Boot auto-configures an in-memory database.
  • Re: Non riesco a capire la webapp hello-springboot

    Perfetto, grazie mille!

    Il programmatore ha però creato due file:
    application.properties
    application-prod.properties

    e mi sorge spontanea la domanda: come si testa 'application-prod.properties' su IntelliJ?
    In teoria se mettessi il .jar sul server funzionerebbe 'application-prod.properties', giusto?
    Non posso creare un server per testare il .jar o copiare il contenuto di 'application-prod.properties' dentro 'application.properties', sono operazioni troppo dispendiose.

    Se copio il contenuto di 'application-prod.properties' dentro 'application.properties' il programma non si connette a MySQL ed ottengo questo errore:
    Wed Jul 15 20:53:34 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.
    Ho anche provato ad aggiungere '?autoReconnect=true&amp;useSSL=false' a 'jdbc:mysql://localhost:3306/test' come scritto qui:
    https://stackoverflow.com/questions/34189756/warning-about-ssl-connection-when-connecting-to-mysql-database
    ma non risolvo e bisognerebbe modificare il codice dell'autore, non vedrei la cosa di buon auspicio. Devo assolutamente capire come passare da un file all'altro perché nei capitoli precedenti ci sono sempre tutti e 2. Nelle esercitazioni successive vedo anche un application-test.properties.
  • Re: Non riesco a capire la webapp hello-springboot

    giannino1995 ha scritto:


    e mi sorge spontanea la domanda: come si testa 'application-prod.properties' su IntelliJ?
    Non c'entra tanto l'IDE. C'entra il "profilo" che si può impostare in Spring.

    Intanto: 4.2.4. Profile-specific Properties

    E il profilo si può impostare a diversi livelli: con una variabile di ambiente del sistema, da linea di comando all'avvio della app, ecc...

    9.2.6. Set the Active Spring Profiles

    giannino1995 ha scritto:


    In teoria se mettessi il .jar sul server funzionerebbe 'application-prod.properties', giusto?
    No, non c'entra dove metti il jar.

    giannino1995 ha scritto:


    Se copio il contenuto di 'application-prod.properties' dentro 'application.properties'
    Non devi "copiare" nulla ... in generale solo attivare il profilo che si vuole usare.

    giannino1995 ha scritto:


    il programma non si connette a MySQL ed ottengo questo errore:
    Wed Jul 15 20:53:34 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.
    Quale versione del server MySQL stai usando??
    Tra l'altro mi pare che il libro NON citi nemmeno la versione del MySQL che è stata usata per quel progettino.
  • Re: Non riesco a capire la webapp hello-springboot

    Grazie Andbin! Problema dei profili risolto.
    Ora riesco ad utilizzare application-prod.properties ma l'applicazione non crea lo schema e non scrive i record.
    Ho provato a fare queste modifiche ma senza successo:
    logging.level.org.springframework=INFO
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false
    spring.datasource.username=root
    spring.datasource.password=admin
    spring.datasource.initialization-mode=always
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.show-sql=true
    In Event Log compare sempre:
    17:51	Application: Failed to retrieve application JMX service URL
    Nel pom.xml ho provato a fare questa modifica ma nulla:
    		<dependency>
    			<groupId>mysql</groupId>
    			<artifactId>mysql-connector-java</artifactId>
    			<version>8.0.21</version>
    		</dependency>
  • Re: Non riesco a capire la webapp hello-springboot

    Anche l'IDE sta impazzendo come me. Mi ha mostrato questa finestra:
    https://ibb.co/swpWkB
    poi questa:
    https://ibb.co/tsDQW4
    !?!?
  • Re: Non riesco a capire la webapp hello-springboot

    giannino1995 ha scritto:


    ma l'applicazione non crea lo schema e non scrive i record.
    Come ti aspetti che venga creato lo schema? Intendo dire: vuoi che sia Hibernate a creare tabelle e quant'altro DALLE ENTITY .... oppure vuoi che venga creato da uno script (che per default si chiama schema.sql) ?
    Attenzione perché se è il primo, le entity vanno molto ben annotate con tutti i dettagli su nomi, limiti (es. delle stringhe) e quant'altro. Altrimenti non serve a (quasi) un piffero ...

    giannino1995 ha scritto:


    		<dependency>
    			<groupId>mysql</groupId>
    			<artifactId>mysql-connector-java</artifactId>
    			<version>8.0.21</version>
    		</dependency>
    Questa è la versione del Connector/J, il driver. Io comunque prima chiedevo la versione del server MySQL.
Devi accedere o registrarti per scrivere nel forum
31 risposte