Perché JPA non scrive su H2 ed il mio IntelliJ non riesce neppure a connettersi al DBMS in memory?

di il
2 risposte

Perché JPA non scrive su H2 ed il mio IntelliJ non riesce neppure a connettersi al DBMS in memory?

Ciao a tutti,
Eccomi tornato dopo una piccola interruzione.
Sto leggendo questa applicazione:
https://github.com/Apress/beg-spring-boot-2/tree/master/chapter-10/springboot-thymeleaf-demo
e ho qualche problema su alcuni punti.
1) UserValidator.java non svolge il suo lavoro, non lancia l’errore nell’html se l’email è già stata registrata. Sembra che il DBMS H2 non venga popolato, per quale ragione? Ho provato a ragionarci su ma non sono in grado di trovare l’errore nel codice in quando il mio obiettivo è riuscire a comprenderlo.
2) Perché usare due pagine di login (registration.html e login.html)? Perché in login.html manca il nome?
3) User findUserByEmail(String email), in UserRepository.java è la somma di 'find' + (nome dell'oggetto in cui cercare) + 'By' + (nome della variabile dell'oggetto scritto con la prima lettera maiuscola)?
4) Non ho capito nulla ma proprio nulla del file keyStore.jks e del discorso https ma la creazione di una connessione https funziona.
5) Perché sulla porta 8080 l’applicazione non funziona?
La parte di upload del file non l’ho ancora letta, sono arenato sulla login.
Grazie anticipatamente

2 Risposte

  • Re: Perché JPA non scrive su H2 ed il mio IntelliJ non riesce neppure a connettersi al DBMS in memory?

    giannino1995 ha scritto:


    Sembra che il DBMS H2 non venga popolato, per quale ragione? Ho provato a ragionarci su ma non sono in grado di trovare l’errore nel codice in quando il mio obiettivo è riuscire a comprenderlo.
    Beh, a me pare ovvio ..... guarda bene il handleRegistration() di RegistrationController. Ti pare che lì ci sia il salvataggio su DB dello User??

    1) Spring applica la validazione "dichiarativa" (il parametro User è @Valid)
    2) Poi c'è una validazione programmatica custom (userValidator)
    3) Se qualunque cosa della validazione generale ha dato errore, si torna nella pagina di registrazione (l'utente ri-verifica, corregge, ecc...)
    4) Se non ci sono errori di validazione ...... dovrebbe salvare su DB. Beh, NON LO FA.
    5) Poi va su un'altra pagina (va bene la login ma potrebbe essere una "home" o una pagina di "welcome" per nuovi utenti ...)

    giannino1995 ha scritto:


    Perché usare due pagine di login (registration.html e login.html)? Perché in login.html manca il nome?
    "registrazione" e "login" sono due concetti (e due momenti!) ben differenti!! Perché secondo te non dovrebbero essere separati??
    E nel login basta username/password (quel demo usa email come "username") ... perché dovresti metterci anche un Nome ??
    Ma siamo proprio a questioni a questo livello?

    giannino1995 ha scritto:


    User findUserByEmail(String email), in UserRepository.java è la somma di 'find' + (nome dell'oggetto in cui cercare) + 'By' + (nome della variabile dell'oggetto scritto con la prima lettera maiuscola)?
    Spring Data JPA si basa su interfacce per i Repository e sulla possibilità di definire nuovi metodi custom per le query seguendo tutta una serie di convenzioni e specifiche ben precise:

    EDIT: corretto link 4.4. Defining Query Methods

    E vanno studiate.

    giannino1995 ha scritto:


    Non ho capito nulla ma proprio nulla del file keyStore.jks e del discorso https ma la creazione di una connessione https funziona.
    Lascia perdere per un po' certificati, HTTPS, SSL, security ecc...

    giannino1995 ha scritto:


    Perché sulla porta 8080 l’applicazione non funziona?
    Perché non dovrebbe funzionare?? (non ho ancora avuto tempo di provare ma provo più tardi)
  • Re: Perché JPA non scrive su H2 ed il mio IntelliJ non riesce neppure a connettersi al DBMS in memory?

    Grazie infinite!
    Eccomi tornato sull’esercitazione dopo un’altra interruzione.
    Rivedendo la seconda parte dell’esercitazione, quella sull’upload dei file, ho queste domande:
    application.properties
    1) Il programmatore imposta “spring.messages.cache-duration=-1” perché nel pom.xml usa “spring-boot-devtools” e vuole che durante lo sviluppo il contenuto di “messages.properties” non venga cancellato dalla cache? Se sì quale sarebbe l’utilità di questa pratica? Perché usare “spring-boot-devtools” per poi disabilitare la cache? Ma soprattutto perché disabilitare la cache quando questi script vengono usati principalmente in fase di test?
    Il bundle di cui si parla a questo indirizzo:
    https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html
    sarebbe il file “messages.properties”, giusto? Si parla spesso di bundle ma non ne comprendo a fondo il significato nei vari contesti.
    2)spring.servlet.multipart.file-size-threshold=5MB’ a cosa serve? Non capisco la definizione della proprietà che trovo sul sito.
    3) Perché l’autore scrive ‘spring.servlet.multipart.max-request-size=100MB’ quando nell’HTML manca persino ‘multiple’ nel tag input ‘<!--<input type="file" name="myFile" multiple/>’? Leggendo FileUploadController.java non mi sembra che il programmatore abbia pensato ad un upload multiplo, il codice mi è abbastanza chiaro.
    fileUpload.html
    4) Perché ci sono 2 action?
    <form action="uploadMyFile" th:action="@{/uploadMyFile}" method="post" enctype="multipart/form-data">
    5) enctype="multipart/form-data" è il tipo di codifica che richiedono i metodi di Spring Boot per gestire l’upload dei file dal browser?
    FileUploadController.java
    byte[] bytes = file.getBytes();
    Il comando sopra dovrebbe convertire un file in una sequenza di byte. 1 byte è uguale ad 8 bit, quindi significa che l’array, al posto di numeri o stringhe, ha dei raggruppamenti di 1 e 0. Concettualmente è una successione di numeri compresi tra 0 e 255 espressi in linguaggio macchina (linguaggio binario). E’ giusto quello che scrivo?
    Upload di un file di 2GB:
    6) Se cerco di caricare un file di 600MB funziona tutto alla perfezione anche se mi sembra tutto quanto un po’ lento ma se provo a caricare un file di 9GB ottengo questo errore:
    Whitelabel Error Page
    This application has no explicit mapping for /error, so you are seeing this as a fallback.
    Fri Oct 09 22:57:51 CEST 2020
    There was an unexpected error (type=Internal Server Error, status=500).
    Java heap space

    Come risolvo?
    WebConfig.java
    ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
    application.properties
    spring.servlet.multipart.max-file-size=10240MB
    spring.servlet.multipart.max-request-size=40960MB
    IntelliJ
    -Xms128m
    -Xmx18192m
    -XX:ReservedCodeCacheSize=240m
    -XX:+UseConcMarkSweepGC
    -XX:SoftRefLRUPolicyMSPerMB=50
    -ea
    -XX:CICompilerCount=2
    -Dsun.io.useCanonPrefixCache=false
    -Djava.net.preferIPv4Stack=true
    -Djdk.http.auth.tunneling.disabledSchemes=""
    -XX:+HeapDumpOnOutOfMemoryError
    -XX:-OmitStackTraceInFastThrow
    -Djdk.attach.allowAttachSelf
    JAVA
    C:\Program Files\Java\jre1.8.0_261\bin
    1.png
    1.png

    7) Se si vuole permettere l’upload solo ad utenti autenticati come potrei fare? Ho editato FileUploadController.java nel modo seguente ma credo che sia sbagliato perché !userRepository.findAll().isEmpty() cerca nel DBMS e non nel model, quindi come devo procedere per capire se c’è un utente autenticato?
    @Autowired
    private UserRepository userRepository;
    ...
    @RequestMapping(value = "/uploadMyFile", method = RequestMethod.POST)
    public String handleFileUpload(@RequestParam("myFile") MultipartFile file, 
    RedirectAttributes redirectAtttributes) {
    if (!file.isEmpty() && !userRepository.findAll().isEmpty()) {
    String name = file.getOriginalFilename();
    ...
    
    HomeController.java
    
    	@RequestMapping(value="/login", method=RequestMethod.POST)
    	public String login(User user, Model model) {
    		System.out.println("Parametri dell'utente inseriti nel form: " + user);
    		String passwordDigitata = user.getPassword();
    		User savedUser = userRepository.findUserByEmail(user.getEmail());
    		String passwordDBMS = savedUser.getPassword();
    		if(passwordDigitata.equals(passwordDBMS)){
    			model.addAttribute("user", savedUser);
    			System.out.println("Utente trovato nel DBMS ed aggiunto alla sessione: " + savedUser);
    		} else {
    			System.out.println("Utente non presente a database o credenziali errate.");
    			return "redirect:/login";
    		}
    		return "redirect:/";
    	}
    
Devi accedere o registrarti per scrivere nel forum
2 risposte