Metod never used...

di il
6 risposte

Metod never used...

Salve,

Sto sviluppando un semplice CRUD, usando come base di dati il DB "world" scaricato dal sito di MYSQL.

Ho scritto una classe CountryController.java con due metodi, uno con annotazione @GetMapping e uno @PostMapping e l'IDE (NetBeans) mi segnala come warning: “getCountry is never used”, il deploy dell'applicazione è eseguito correttamente su un web server Tomcat in locale. Ecco il codice:

package com.example.demoWold;

import jakarta.persistence.Id;
import java.util.Optional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 *
 * @author paolo
 */


@RestController
public class CountryController {
    
    private final RepoCountry repocountry;
    
    
    
    public CountryController(RepoCountry _repocountry){
    
        repocountry= _repocountry;
    
    }
    
  @GetMapping("/country")
    Iterable<Country> getCountry(){
        return repocountry.findAll();
    }
    @PostMapping("/country/{code}")
    Optional<Country> getId(@PathVariable Long code){    	
    	return repocountry.findById(code);
    } 
    
    
}

Come mai i due metodi non sono mai usati? durante la compilazione ed il deploy non ricevo errori, però il browseraperto all'indirizzo “127.0.0.1:8080/demoWorld” mi restitusce come errore 404. Anche se scrivo nella barra degli indirizzi “127.0.0.1:8080/demoWorld/country” ricevo sempre come errore 404. Lo stesso avviene se scrivo:“127.0.0.1:8080/country”. Percheè i due metodi non vengono usati?

6 Risposte

  • Re: Metod never used...

    Innanzitutto i metodi dei controller (quelli @GetMapping ecc..) mettili sempre public. Come li hai scritti tu ora, sono package-level. E se l'IDE è un po' pignolo ….

    I metodi dei controller generalmente non sono mai chiamati direttamente da codice (a meno di casi particolari come unit-test diretti dei controller). I framework come Spring li invocano tramite reflection, quindi tecnicamente è per questo che un IDE potrebbe dedurre che non sono “usati” da altre classi.

    Riguardo il deploy, quando dici “web server Tomcat in locale”, deduco che l'applicazione sia impacchettata nel classico WAR. In questo caso, “conta” il nome del contesto, che dipende solo da chi/come fa il deploy sul server (Tomcat). Il nome del contesto dipende, normalmente, dal nome del war. Se rinomini un war in pippo.war, il nome del contesto diventa “pippo”, quindi host:porta/pippo/blabla

  • Re: Metod never used...

    Quando dici “contesto” deduco che intendi il “contexr path” nel file context.xml, nel mio caso il context path è demoWorld. Fatto il deploy sul mio ide (Netbeans) compare la cartella “demoWorld” visto che ho collegato tomcat al mio IDE.

    Mettendo il modificatore “public” nei metodi sopracitati il messaggio di warning scompare, ma purtroppo il mop browser mi resituisce sempre il messaggio 404 page not found.

    Ho provato con tre indirizzi:

    http://127.0.0.1:8080/demoWorld
    http://127.0.0.1:8080/demoWorld/country
    http://127.0.0.1:8080/country

    e mi becco sempre un bel 404 page not found

    Il db che sto utilizzando è “world” scaricato dal sito di MYSQL.

    Ho provato anche ad utilizzare il software postman ma niente.

    Comunque i messaggi di warning sono spariti grazie ai tuoi suggerimenti.

    Avresti qualche altro suggerimento per me?

  • Re: Metod never used...

    Il problema è che hai detto molto poco della applicazione. Si tratta di una applicazione con Spring “puro” (solo Spring Framework, intendo) oppure con Spring Boot (2.x o 3.x?). Se è solo con Spring Framework, come è configurato? Cioè, con XML o Java configuration?

    Con Spring Framework “puro”, tutta la configurazione è (purtroppo) completamente a tuo carico, compresa la impostazione del component scanning per trovare le classi @RestController, @Service, @Component, ecc…

    Senza sapere questi dettagli della applicazione, è praticamente quasi impossibile darti una risposta esaustiva. Come prima cosa, magari, verifica che il CountryController venga “pescato” da Spring. Metti un log o println nel costruttore che hai scritto per vedere che effettivamente il construttore venga invocato.

  • Re: Metod never used...

    L'applicazione è stata creata utilizzando SpringInizialitzr e come IDE uso Netbeans.

    I moduli inclusi sono:

    Thymeleaf

    Spring Web

    Spring Data JPA

    Spring Web

    Ho configurato lil file application.properties nel modo seguente:

    spring.application.name=demoWorld
    spring.datasource.url=jdbc:mysql://localhost:3306/world
    spring.datasource.username=root
    spring.datasource.password=cristiano

    Il file persitence è invece configurato così:

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence           http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
      <persistence-unit name="com.example_demoWold_war_0.0.1-SNAPSHOTPU" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>com.example.demoWorld.Login</class>
        <class>com.example.demoWorld.Country</class>
        <class>com.example.demoWorld.Countrylanguage</class>
        <class>com.example.demoWorld.City</class>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
          <property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/world?zeroDateTimeBehavior=CONVERT_TO_NULL"/>
          <property name="jakarta.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
          <property name="jakarta.persistence.jdbc.user" value="root"/>
          <property name="jakarta.persistence.jdbc.password" value="cristiano"/>
        </properties>
      </persistence-unit>
    </persistence>

    Dopo ho creato l'interfaccia RepoCountry

    package com.example.demoWorld;
    
    import org.springframework.data.repository.CrudRepository;
    
    /**
     *
     * @author paolo
     */
    public interface RepoCountry extends CrudRepository<Country, Long> {
        
    }

    Dopo ancora ho creato la classe CountryController

    package com.example.demoWorld;
    
    import jakarta.persistence.Id;
    import java.util.Optional;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     *
     * @author paolo
     */
    
    
    @RestController
    public class CountryController {
        
        private final RepoCountry repocountry;
        
        
        
        public CountryController(RepoCountry _repocountry){
        
            repocountry= _repocountry;
        
        }
        
      @GetMapping("/country")
        public Iterable<Country> getCountry(){
            return repocountry.findAll();
        }
        @PostMapping("/country/{code}")
        public Optional<Country> getId(@PathVariable Long code){    	
        	return repocountry.findById(code);
        } 
        
        
    }
    

    Dopo con postman provo a fare la chiamata GET su questi tre indirizzi

    http://127.0.0.1:8080/demoWorld
    http://127.0.0.1:8080/demoWorld/country
    http://127.0.0.1:8080/country

    Ricevo sempre come risposta 404 page not found

    Mille grazie per il tuo aiuto.

  • Re: Metod never used...

    11/07/2024 - starcris ha scritto:


    L'applicazione è stata creata utilizzando SpringInizialitzr

    E quindi, direi, Spring Boot. (presumo il 3.x perché ormai start.spring.io non mostra più il 2.x)

    Le applicazioni Spring Boot generalmente sono fatte per funzionare in maniera “standalone”, con il JAR da avviare come normale applicazione Java.

    Se hai un Tomcat esterno (distinto dalla applicazione) e vuoi fare un WAR da deployare,  è possibile farlo ma ci sono degli step aggiuntivi da fare. Sono descritti nella documentazione: Create a Deployable War File. Se è questo il tuo caso (come presumo), hai fatto questi passi?

  • Re: Metod never used...

    No, ora mi studio tutto. Buon lavoro e grazie ancora.

Devi accedere o registrarti per scrivere nel forum
6 risposte