Il @Service non riesce a prelevare le classi @Repository

di il
19 risposte

Il @Service non riesce a prelevare le classi @Repository

Ho le seguenti classi:
Controller:

@Controller
public class ControlloPagineWeb {
    @Autowired
    private ClientRepository clientRepository;
    @Autowired
    private ConteggioVisiteSito conteggioVisiteSito;
}
Service:

@Service
public class ConteggioVisiteSito {
    @Autowired
    private ControlloPagineWeb controlloPagineWeb;
    @Autowired
    private ClientRepository clientRepository;
}
Repository:

@Repository
public class ClientRepository {
    @Autowired
    private JdbcTemplate jdbcTemplate;
}
Il problema che riscontro è il seguente:
ClientRepository (la classe che contiene le query) ha dei metodi che sono recuperabili in ControlloPagineWeb ma non in ConteggioVisiteSito. Dove sbaglio?

19 Risposte

  • Re: Il @Service non riesce a prelevare le classi @Repository

    iBaffiPro ha scritto:


    Controller:
    
    @Controller
    public class ControlloPagineWeb {
        @Autowired
        private ClientRepository clientRepository;
        @Autowired
        private ConteggioVisiteSito conteggioVisiteSito;
    }
    
    Service:
    
    @Service
    public class ConteggioVisiteSito {
        @Autowired
        private ControlloPagineWeb controlloPagineWeb;
        @Autowired
        private ClientRepository clientRepository;
    }
    
    Un Service NON dovrebbe MAI ricevere/avere il riferimento ad un Controller. Sia per motivi concettuali (è poco sensato), sia per motivi tecnici (a seconda di come sono configurati i contesti di Spring potrebbe non essere tecnicamente possibile).

    Quindi quanto sopra è inappropriato (della serie "fa acqua").
  • Re: Il @Service non riesce a prelevare le classi @Repository

    Quindi come faccio ad usare ClientRepository in una classe diversa da ControlloPagineWeb? Non mi va di aggiungere ai metodi di ConteggioVisiteSito le variabili in arrivo dal controller...
    
    metodo(ClientRepository clientRepository) // questo non lo voglio fare!
    
  • Re: Il @Service non riesce a prelevare le classi @Repository

    iBaffiPro ha scritto:


    Quindi come faccio ad usare ClientRepository in una classe diversa da ControlloPagineWeb?
    Te lo avevo già detto in una precedente discussione: i Controller chiamano i Service; i Service chiamano i Dao/Repository.
    Se fai qualche altro giro "all'inverso", molto, molto, molto probabilmente l'architettura non quadra ...

    E per queste cose ci vuole comunque un po' di esperienza ...
  • Re: Il @Service non riesce a prelevare le classi @Repository

    Intendi dire una configurazione di questo tipo?
    Controller:
    
    @Controller
    public class ControlloPagineWeb {
        @Autowired
        private ConteggioVisiteSito conteggioVisiteSito;
    }
    
    Service:
    
    @Service
    public class ConteggioVisiteSito {
        @Autowired
        private ClientRepository clientRepository;
    }
    
    Repository:
    
    @Repository
    public class ClientRepository {
        @Autowired
        private JdbcTemplate jdbcTemplate;
    }
    
  • Re: Il @Service non riesce a prelevare le classi @Repository

    iBaffiPro ha scritto:


    Intendi dire una configurazione di questo tipo?
    Risposta breve: sì

    Risposta lunga: devi avere ben chiaro a cosa servono i 3 strati controller/service/dao e cosa ha senso (ed è appropriato) fare in ciascuno di essi.
  • Re: Il @Service non riesce a prelevare le classi @Repository

    Andrea sembra che tu sappia ma non voglia dirmi.
    Il codice che ho postato non funziona.
  • Re: Il @Service non riesce a prelevare le classi @Repository

    iBaffiPro ha scritto:


    Il codice che ho postato non funziona.
    Non "funziona" che cosa?? Non posso sapere tutto il tuo codice e architettura ...

    Ma almeno ora hai compreso bene cosa puoi fare (o non dovresti fare) in ciascuno degli strati?
  • Re: Il @Service non riesce a prelevare le classi @Repository

    Quando Spring Boog esegue il codice della classe @Service ed arriva al punto seguente si interrompe:
    Client ... = clientRepository.trovaClient..(...); 
    generando la seguente eccezione:
    
    java.lang.NullPointerException
    null
    null
    null
    ERRORE! Impossibile eseguire il conteggio delle visite.
    
    
    catch (Exception e){
                System.out.println(e);
                System.out.println(e.getLocalizedMessage());
                System.out.println(e.getMessage());
                System.out.println(e.getCause());
                System.out.println("ERRORE! Impossibile eseguire il conteggio delle visite.");
    }
    
    In pratica questo clientRepository non è proprio presente in Spring Boot, la classe ClientRepository non viene proprio letta!
    Non vorrei che oltre a questi @Autowired bisognasse fare del resto.
    Ti mostro un codice forse più comprensibile:
    Controller:
    
    @Controller
    public class ControlloPagineWeb {
    
        @Autowired
        private ConteggioVisiteSito conteggioVisiteSito;
    
        public void variabiliGeneraliPerPaginaHTML(
                Principal principal, 
                Model model, 
                HttpSession session,
                HttpServletRequest request,
                HttpServletResponse response
        ){
            //...
    		// Posso aggiungere questo pezzo o non metterlo, conteggioVisiteSito parte in ogni caso...
    		conteggioVisiteSito = new ConteggioVisiteSito(session, request, response);
        }
    
        @RequestMapping(value = { "/", "/benvenuto" }, method = RequestMethod.GET)
        public String paginaBenvenuto(
                Model model, 
                Principal principal, 
                HttpSession session, 
                HttpServletRequest request, 
                HttpServletResponse response
        ) {
            variabiliGeneraliPerPaginaHTML(principal, model, session, request, response);
            return "index";
        }
    	
    }
    
    Service:
    
    @Service
    public class ConteggioVisiteSito {
    
        @Autowired
        private ClientRepository clientRepository;
    	
        public ConteggioVisiteSito() {
        }
    
        public ConteggioVisiteSito(HttpSession session, HttpServletRequest request, HttpServletResponse response) {
            //...
    		creaSessione(session, request, response);
        }
    
        public void creaSessione(HttpSession session, HttpServletRequest request, HttpServletResponse response){
    		//...
    		conta(request, response);
        }
    
        public void conta(HttpServletRequest request, HttpServletResponse response){
            //...
    		String tipoClient = tipoDiClient(response, ipCookie, idCookie, ipClient);
        }
    
        // Questo metodo permette di individuare il tipo di client connesso al sito
        public String tipoDiClient(
                HttpServletResponse response,
                String ipCookie,
                String idCookie,
                String ipClient
        ){
    		//...
    		// qui si genera l'eccezione che ti ho mostrato perché clientRepository sembra inesistente
    		Client clientProvider = clientRepository.trovaClient..(...); 
    		
        }
    	
    }
    
    Repository:
    
    @Repository
    public class ClientRepository {
        @Autowired
        private JdbcTemplate jdbcTemplate;
    	
    	// query verso il dbms postgresql...
    }
    
    I metodi della classe @Service funzionano tutti tranne quelli che per lavorare necessitano della classe @Repository. La classe con @Repository non viene caricata in @Service.
    Si credo di aver capito bene cosa dovrei fare in questi strati.
  • Re: Il @Service non riesce a prelevare le classi @Repository

    iBaffiPro ha scritto:


    La classe con @Repository non viene caricata in @Service.
    La prima cosa che posso pensare è: questioni sui package.

    In Spring Boot per default (se non cambi le cose con @ComponentScan) il component scanning parte dal package della classe con il main() e trova i bean in quel package e sotto-package.

    Quindi come sono messi i package?

    Ma potrebbe esserci dell'altro, naturalmente .... (che non è evidente qui)
  • Re: Il @Service non riesce a prelevare le classi @Repository

    Dentro la cartella "package1" c'è la classe con il main e altri due pakage, "package2" e "package3", in "package2" c'è ConteggioVisiteSito ed in "package3" c'è ClientRepository. @ComponentScan non è presente in nessuna classe della mia webapp.
    P.S.: ovviamente i nomi dei package sono diversi, contengono lettere minuscole non accentate e anche il carattere "_" (es.: jdbc_postgresql, ecc...).
    Cosa altro ti serve sapere?
    Il progetto da cui sono partito è questo:
    https://o7planning.org/11543/create-a-login-application-with-spring-boot-spring-security-spring-jdbc
  • Re: Il @Service non riesce a prelevare le classi @Repository

    iBaffiPro ha scritto:


    Dentro la cartella "package1" c'è la classe con il main e altri due pakage, "package2" e "package3", in "package2" c'è ConteggioVisiteSito ed in "package3" c'è ClientRepository.
    Si capisce poco .... elenca il nome completamente qualificato delle classi (main, controller, service, repository)
  • Re: Il @Service non riesce a prelevare le classi @Repository

    package it.applicazionijava.gestioneutenti;
    @SpringBootApplication
    @Profile("sviluppo")
    public class GestioneUtentiApplication extends SpringBootServletInitializer {
    	public static void main(String[] args) {
    	}
    }
    package it.applicazionijava.gestioneutenti.pagine_web_spring_boot;
    @Service
    public class ConteggioVisiteSito {}
    package it.applicazionijava.gestioneutenti.pagine_web_spring_boot;
    @Controller
    public class ControlloPagineWeb {}
    package it.applicazionijava.gestioneutenti.database_jdbc;
    @Repository
    public class ClientRepository {}
  • Re: Il @Service non riesce a prelevare le classi @Repository

    Se hai tutto tutto sotto it.applicazionijava.gestioneutenti (che è già il package della classe con main() ) allora è ok, NON è un problema di package.

    @Profile("sviluppo") lo hai solo nella classe di main??
  • Re: Il @Service non riesce a prelevare le classi @Repository

    Si @Profile("sviluppo") solo in quella classe.
    In application.properties ho anche messo:
    spring.profiles.active=sviluppo
    Dalla classe in cui eseguo i test i metodi di ClientRepository funzionano alla perfezione.
    Per caso nella configurazione di spring security bisogna elencare le classi @Service da qualche parte?
Devi accedere o registrarti per scrivere nel forum
19 risposte