Perché le classi @Repository non sono accessibili in classi diverse da quella contrassegnata con @Controller?

di il
8 risposte

Perché le classi @Repository non sono accessibili in classi diverse da quella contrassegnata con @Controller?

Perché le classi @Repository non sono accessibili in classi diverse da quella contrassegnata con @Controller?
Nelle varie classi della webapp ho provato con:

@Autowired
    private UtenteRepository utenteRepository;
con:

@Autowired
    private UtenteRepository utenteRepository = new UtenteRepository();
e anche con:

    private UtenteRepository utenteRepository = new UtenteRepository();
Ma non funzionano.
Devo passare al metodo che risiede nella classe X la variabile utenteRepository e questo è scomodissimo per tanti altri motivi.
Perché non posso avere utenteRepository ovunque, come una normale classe?

8 Risposte

  • Re: Perché le classi @Repository non sono accessibili in classi diverse da quella contrassegnata con @Controller?

    iBaffiPro ha scritto:


    Perché le classi @Repository non sono accessibili in classi diverse da quella contrassegnata con @Controller?
    Risposta breve: un bean Spring lo puoi "iniettare" solo in un altro bean Spring. Non in "qualunque" classe Java (che Spring nemmeno "conosce" nel suo context).

    iBaffiPro ha scritto:


    Devo passare al metodo che risiede nella classe X la variabile utenteRepository e questo è scomodissimo per tanti altri motivi.
    Perché non posso avere utenteRepository ovunque, come una normale classe?
    Se in una classe NON bean Spring hai bisogno di usare un bean Spring, allora bisogna vedere perché, se serve davvero, se non ci sono altre strade per farlo, ecc.... Si tratta di una questione di design generale a livello di architettura.
    E questo potrebbe anche voler dire che il tuo design ... "fa acqua" ...
  • Re: Perché le classi @Repository non sono accessibili in classi diverse da quella contrassegnata con @Controller?

    Tu cosa consigli per evitare tutta questa acqua?
    Non posso mica mettere tutto nella classe @Controller oppure nella classe @Controller fornire 'utenteRepository' in input ad ogni metodo di una classe esterna! E' troppo scomodo! Non c'è un'annotazione come '@SpringBootTest(classes = {nome-application-con-il-mail.class})' che permette di usare '@Autowired private UtenteRepository utenteRepository;' nella classe predisposta per il test? Tu che design usi?
  • Re: Perché le classi @Repository non sono accessibili in classi diverse da quella contrassegnata con @Controller?

    iBaffiPro ha scritto:


    Tu cosa consigli per evitare tutta questa acqua?
    Non posso mica mettere tutto nella classe @Controller oppure nella classe @Controller fornire 'utenteRepository' in input ad ogni metodo di una classe esterna! E' troppo scomodo! Non c'è un'annotazione come '@SpringBootTest(classes = {nome-application-con-il-mail.class})' che permette di usare '@Autowired private UtenteRepository utenteRepository;' nella classe predisposta per il test? Tu che design usi?
    I controller comunque non dovrebbero fare query, quindi non ci dovresti iniettare dei @Repository, XyzDao, JdbcTemplate o che altro legato alla base dati.
    Hai seguito il design classico: Controller --> Service --> Repository/Dao ?
  • Re: Perché le classi @Repository non sono accessibili in classi diverse da quella contrassegnata con @Controller?

    I @Service li uso solo per la login. Ti mostro come è articolato il mio progetto e come uso le query.
    Controller:
    
    @Controller
    public class ControlloPagineWeb {
    
        @Autowired
        private UtenteRepository utenteRepository;
    
        @Autowired
        private RuoloRepository ruoloRepository;
    
        @Autowired
        // ...
    	
    	// ...
    	
    	@RequestMapping(value = "/pannello-di-controllo", method = RequestMethod.GET)
        public String pannelloControlloGet(
                Model model,
                Principal principal,
                HttpSession session,
                HttpServletRequest request,
                HttpServletResponse response
        ) {
            // ...
            try{
                // ...
    			// Questa classe permette di recuperare dei record da una tabella del dbms.
    			// Tutto quello che viene recuperato dal database viene salvato in 'eseguiVariabiliDiSistema.getVariabiliDiSistema()'
    			// e trasmesso alla pagina html grazie a "VariabiliDiSistema".
                EseguiVariabiliDiSistema eseguiVariabiliDiSistema = new EseguiVariabiliDiSistema(
                        // ...
                        utenteRepository, // Questo oggetto lo passo a EseguiVariabiliDiSistema ma vorrei non doverlo fare!!!
                        // ...
                );
                model.addAttribute("VariabiliDiSistema", eseguiVariabiliDiSistema.getVariabiliDiSistema());
            }catch (Exception e){
                model.addAttribute("VariabiliDiSistema", null);
            }
            return "pannello-di-controllo";
        }
    	
    	// ...
    	
    }
    
    Classe in cui non riesco a caricare utenteRepository:
    
    public class EseguiVariabiliDiSistema {
    
        // ...
        private List<VariabileSistema> variabiliDiSistema = null;
        // ...
    
        // Costruttori
        public EseguiVariabiliDiSistema() {
        }
    
        public EseguiVariabiliDiSistema(
                // ...
                UtenteRepository utenteRepository,
                // ...
        ) {
            // ...
        }
    
        public List<VariabileSistema> trovaTutteLeVariabili(
                // ...
                UtenteRepository utenteRepository,
                // ...
        ){
            // ...
    		// Qui viene lanciata la query e riempito un oggetto java.
            List<VariabileSistema> tutteLeVar = variabileSistemaRepository.trovaTutte();
            // ...
        }
    
    	// ...
    
        public VariabileSistema getVariabileDiSistema() {
            return variabileDiSistema;
        }
    	
    	// ...
    
    }
    
    Classe in cui risiedono le query in postgresql:
    
    @Repository
    public class VariabileSistemaRepository {
    
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
        @Transactional(readOnly=true)
        public List<VariabileSistema> trovaTutte() {
            return jdbcTemplate.query("SELECT * FROM variabili_sistema;", new VariabileSistemaRowMapper());
        }
        
        // ...
        
    }
    
    Quello che vorrei fare è poter usare l'oggetto VariabileSistemaRepository in EseguiVariabiliDiSistema mentre al momento VariabileSistemaRepository lo imposto da ControlloPagineWeb.
    Ti è più chiaro il passaggio oppure ti serve sapere altro?
    Ovviamente ho anche gli oggetti VariabileSistemaRowMapper e VariabileSistema che servono però a jdbcTemplate per funzionare (se serve posto anche loro ma c'è poso di interessante).
  • Re: Perché le classi @Repository non sono accessibili in classi diverse da quella contrassegnata con @Controller?

    iBaffiPro ha scritto:


    I @Service li uso solo per la login.
    Quindi sei già partito (e da mesi ... immagino) con una architettura "anomala"/critica, senza esserti posto le questioni giuste fin dall'inizio e ponendoti ora un sacco enorme di questioni che ti stanno solo complicando la vita (?)
  • Re: Perché le classi @Repository non sono accessibili in classi diverse da quella contrassegnata con @Controller?

    Se mi spieghi come rimediare sono tutto orecchie.
    Il problema è che ho altre classi con altri metodi e quando aggiungo un nuovo qualcosarepository devo aggiungere questo qualcosarepository da tante parti. In questo modo è molto scomodo apportare modifiche alla webapp.
  • Re: Perché le classi @Repository non sono accessibili in classi diverse da quella contrassegnata con @Controller?

    iBaffiPro ha scritto:


    Se mi spieghi come rimediare
    Controller ? Service ? Dao(Repository)
  • Re: Perché le classi @Repository non sono accessibili in classi diverse da quella contrassegnata con @Controller?

    Grazie Andrea!
    Che figata!
    Avevo provato ad aggiungere l'annotazione @Service prima di aprire il post e pensavo che non fosse così semplice "fare un @Service". Se mi scrivevi un esempio di codice mi sarebbe stato di aiuto.
    L'errore che facevo era quello di dimenticare l'@Autowired nel controller.
Devi accedere o registrarti per scrivere nel forum
8 risposte