Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di andbaz
    Registrato dal
    Jul 2011
    Messaggi
    440

    RESTful con Jersey, @Autowired di Spring ritorna null

    Ciao, nel mio RESTful web service sviluppato in Java con Jersey instanzio un service che andrà a chiamare poi un DAO ecc. ma questo service ("userService") resta sempre a null!


    Perché? Allego il codice.


    (Alla riga 27 del file ApiUsers.java mi ritorna NullPointerException) https://github.com/andreabazerla/aff...iJWU8rhJp62ewg


    Per lanciare il progetto mvn clean compile package e poi mvn jetty:run e andare sull'URL localhost:8080/api/users/all ritorna errore 505.


    Grazie!

    P.S. I file pom.xml, web.xml e applicationContext.xml sono corretti? Sembra quasi che Jetty non riesca a caricare il contesto di Spring, cosa che invece riesco a fare manualmente nel Main della classe ApiUsers.java! Perché?
    Ultima modifica di andbaz; 07-02-2020 a 13:28

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da andbaz Visualizza il messaggio
    Ciao, nel mio RESTful web service sviluppato in Java con Jersey instanzio un service che andrà a chiamare poi un DAO ecc. ma questo service ("userService") resta sempre a null!
    Scusa, ho poco tempo perché tra poco devo uscire ed ho giusto guardato al volo alcuni di quei file.
    Ma .... qui bisogna chiarire un po' di cose concettuali a monte. Perché vuoi usare Spring E Jersey (JAX-RS)? Sono due cose diverse a livelli un po' differenti.
    Perché fai un controller Spring (@Controller è di Spring) ma poi ci metti @Path che è di JAX-RS? Non c'entrano come i cavoli a merenda ...
    Che miscugli vuoi fare??

    P.S. presumo che se chiedi localhost:8080/api/users/all venga gestita da Jersey (e non da Spring). Quindi è Jersey che istanzia la classe e del @Autowired non gliene importa un piffero ...
    Ultima modifica di andbin; 07-02-2020 a 13:48
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di andbaz
    Registrato dal
    Jul 2011
    Messaggi
    440
    Ho incluso Spring per sfruttare la dependency injection tramite @Autowired per iniettare la sessionFactory di Hibernate.

    Sto per caso sbagliando? Non saprei come altrimenti fare.

    Ecco qui il repository aggiornato, troverai un Main nella classe ApiUsers.java che ho utilizzato per testare il caricamento del contesto.
    https://github.com/andreabazerla/affittagram

    Ora se vadu su http://localhost:8080/api/users/all mi ritorna errore 500:

    Caused by: java.lang.NullPointerException
    at com.company.affittagram.dao.GenericDao.openSession (GenericDao.java:15)
    at com.company.affittagram.dao.GenericDao.getSession (GenericDao.java:25)
    at com.company.affittagram.dao.UserDao.getAll (UserDao.java:21)
    at com.company.affittagram.service.UserService.read (UserService.java:26)
    at com.company.affittagram.ApiUsers.getUsers (ApiUsers.java:27)...

    Ti ringrazio per la pazienza.
    Ultima modifica di andbaz; 15-02-2020 a 21:42

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da andbaz Visualizza il messaggio
    Ho incluso Spring per sfruttare la dependency injection tramite @Autowired per iniettare la sessionFactory di Hibernate.

    Sto per caso sbagliando? Non saprei come altrimenti fare.

    Ecco qui il repository aggiornato, troverai un Main nella classe ApiUsers.java che ho utilizzato per testare il caricamento del contesto.
    https://github.com/andreabazerla/affittagram
    Non ho modo di provare ora la tua app ma a vedere il codice mi pare abbastanza chiaro. Ora hai usato due @Inject. Questi "funzionano" semplicemente perché è stato usato HK2 (nel pom c'è jersey-hk2) che è un framework di Dependency Injection con concetti molto simili a quelli di Spring. Ma appunto NON è Spring. E per HK2 quel @Autowired (di Spring) non conta nulla.

    Ora, la questione la ripeto di nuovo: perché ti stai sforzando di usare Spring Framework E Jersey?
    Perché non puoi fare tutto con Spring?

    Tra l'altro io vedo comunque anche "altre" questioni che devi sistemare. Intanto, piccola svista, in ApiUsers hai usato List non parametrizzato. Dovresti usare List<User> .
    Ma la questione è un'altra. Quando poi tutto funziona, la lista degli utenti in quale formato intendi fornirla al client? XML? JSON? Altro?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di andbaz
    Registrato dal
    Jul 2011
    Messaggi
    440
    Mi sto costringendo ad usare Jersey perché secondo alcune discussioni che ho letto nei forum sembra essere il framework migliore per lo sviluppo di un RESTful. Ho poi implementato Spring per la DI della sessionFactory di Hibernate che non sono riuscito ad implementare con HK2.

    Eviterei anche di implementare Spring, ma non ho trovato esempi che utilizzino sia Jersey che Hibernate senza un @Autowired.

    Che cosa mi consiglieresti di fare?
    Ultima modifica di andbaz; 17-02-2020 a 02:04

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da andbaz Visualizza il messaggio
    Mi sto costringendo ad usare Jersey perché secondo alcune discussioni che ho letto nei forum sembra essere il framework migliore per lo sviluppo di un RESTful.
    Sul "migliore" beh, qui si potrebbe discutere, naturalmente. Comunque sì, è valido. JAX-RS (questa è la specifica di cui Jersey è solo una delle implementazioni esistenti) è usato in Java EE proprio per la gestione dei servizi RESTful. E non a caso il Eclipse MicroProfile che è una specifica per applicazioni che espongono micro-servizi ha alla base proprio JAX-RS e il CDI.

    Il CDI (Contexts and Dependency Injection) è la specifica di Java EE per una gestione della DI in maniera similare a Spring.
    Se potessi usare un application server completo (es. GlassFish, NON Tomcat o Jetty) anche senza considerare il MicroProfile ovvero in Java EE "puro", potresti usare JAX-RS e il CDI e sarebbe più che valido.

    Quote Originariamente inviata da andbaz Visualizza il messaggio
    Ho poi implementato Spring per la DI della sessionFactory di Hibernate che non sono riuscito ad implementare con HK2.

    Eviterei anche di implementare Spring, ma non ho trovato esempi che utilizzino sia Jersey che Hibernate senza un @Autowired.
    Se vuoi "integrare" davvero Jersey e Spring allora devi inserire un altro artifact:

    codice:
    <dependency>
      <groupId>org.glassfish.jersey.ext</groupId>
      <artifactId>jersey-spring5</artifactId>
      <version>2.30</version>
    </dependency>

    Questo piccolo modulo si aggancia alla API interna di Jersey. Quando Jersey incontra un @Autowired, chiama una classe in questo modulo, che fornisce il bean andandolo a prendere dal contesto di Spring.

    Non mi ricordo ora se c'è da fare qualche configurazione particolare per usare questo jersey-spring5 ma credo di no. Ma puoi cercare in rete, se trovi info su jersey-spring4, è similare solo per Spring 4 invece che il 5.

    Comunque cerca di chiarirti bene le idee su questi framework e specifiche. Anche perché come ho detto ci sono comunque "altre" questioni nel tuo codice. E se hai dubbi, chiedi, per quanto possibile riesco a rispondere anche su questi aspetti più architetturali.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di andbaz
    Registrato dal
    Jul 2011
    Messaggi
    440
    Esatto, a me interesserebbe più la questione architturale che il codice per ora.

    Come puoi vedere ho una classe ApiUser che gestisce le GET. Qui pensavo di instanziare un service tramite la DI che a sua volta instazierà un DAO. In GenericDao pensavo di sfruttare la sessionFactory di Hibernate per dialogare con il database.

    Vorrei continuare ad utilizzare Jersey, e anche Hibernate perché mi farebbe comodo ma evitare Spring se possibile.

    Questa architettura potrebbe andare? Grazie. Accetto consigli.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da andbaz Visualizza il messaggio
    Esatto, a me interesserebbe più la questione architturale che il codice per ora.

    Vorrei continuare ad utilizzare Jersey, e anche Hibernate perché mi farebbe comodo ma evitare Spring se possibile.
    Allora: se vuoi utilizzare un meccanismo di Dependency Injection senza usare Spring, altre possibilità sì, ci sono.

    Puoi usare un application server completo (non solo un Servlet container) tipo GlassFish, JBoss, ecc... che mette già a disposizione il CDI più ovviamente tutto il resto di Java EE.

    Oppure con solo un Servlet container (es. Tomcat, Jetty) puoi integrare tu manualmente nella webapp il Weld che è la implementazione di "riferimento" del CDI. So che si può fare ma personalmente non l'ho mai fatto.

    Oppure puoi sfruttare il HK2 che è insieme a Jersey, che è un'altra forma di DI ma è più limitata e non c'entra niente né con Spring e nemmeno con il CDI.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.