La Annotation RequestBody

di il
9 risposte

La Annotation RequestBody

Ciao a tutti, ho un problema con questa annotation.

L'utente può effettuare una ricerca in base ad alcuni campi (per nome, cognome, età).
Ho quindi una classe filtroUser con quelle tre proprietà.

Nel mio controller avevo pensato di risolvere banalmente così :
@RequestParam(name = "nome", required = false) String nome,
@RequestParam(name = "cognome", required = false) String cognome,
@RequestParam(name = "età", required = false) int età
Andando poi a costruire il mio filtro in base agli input immessi dall'utente:
filtroUser filter =new filtroUser ()
					.setNome(nome)
					.setCognome(cognome)
					.setEtà(età)
e passando quindi questo filtro al metodo che effettua la query.

Soluzione bocciata, non devo famri passare parametro per parametro, ma l'intero oggetto con la @RequestBody.
Come faccio poi a settare il mio filtro se mi faccio passare tutto l'oggetto, una serie di:
filtroUser filter =new filtroUser ()
					.setNome(filtroPassato.getNome())
					.ecc
					
Non so neanche se sia possibile una cosa del genere.

9 Risposte

  • Re: La Annotation RequestBody

    WinstonSmith ha scritto:


    Soluzione bocciata, non devo famri passare parametro per parametro, ma l'intero oggetto con la @RequestBody.
    Su questo aspetto c'è una questione da valutare (che non si capisce dal poco codice che hai postato).
    Stai facendo webservice in stile REST ... o altro? (cioè una webapp con frontend classico in HTML/CSS/ecc...?)

    Perché se si tratta di webservice REST, devi ragionare bene sulle "risorse" e sui metodi HTTP da usare. Se quella che devi fare è una ricerca, allora tipicamente la si fa con metodo GET (e ovviamente NON puoi passare un body in request!).
    Quindi qualcosa del tipo:

    GET http://....blabla..../users?nome=Mario

    Dove /users è l'elemento finale del path che indica la collection degli utenti. E questo, in senso REST, è giusto/sensato.

    Una ricerca in stile REST si può anche fare con metodo POST se è necessario passare un body complesso che contiene parametri di filtro, ordinamento o che sia. Ma a quel punto si dovrebbe fare qualcosa del tipo:

    POST http://....blabla..../users/search

    body: un JSON es. {"nome":"Mario" ..........}

    Se invece si tratta di una webapp classica (non webservice REST) c'è più liberta in generale.
  • Re: La Annotation RequestBody

    Sì è un servizio Rest, con un metodo POST, quindi annotation PostMapping(value="/listaecc") e la RequestBody per il filtro che viene passato.
    Verrà quindi passato questo Json e da qui devo andare ad inizializzare il mio filtro che poi passerò al metodo del service... ma come?

    Con la soluzione scritta nel primo post pensavo di aver risolto...
  • Re: La Annotation RequestBody

    WinstonSmith ha scritto:


    Sì è un servizio Rest, con un metodo POST, quindi annotation PostMapping(value="/listaecc") e la RequestBody per il filtro che viene passato.
    Verrà quindi passato questo Json e da qui devo andare ad inizializzare il mio filtro che poi passerò al metodo del service... ma come?
    Ma infatti la soluzione, concettualmente, è quella. Anzi, il bean che ricevi (mappato da JSON) nel body lo puoi anche già passare al service. Non necessariamente devi creare un altro bean.

    Se puoi usare @PostMapping, allora stai usando almeno Spring 4.3 e quindi puoi anche usare @RestController (che è di Spring 4) invece di @Controller. @RestController rappresenta un controller in cui tutti i metodi hanno la semantica del @ResponseBody.

    Quindi qualcosa abbozzato del tipo:
    public class UserFilter {
        private String nome;
        private String cognome;
        private Integer eta;
        
        // ..setter/getter......ecc...
    }
    @RestController
    @RequestMapping("/users")
    public class UserController {
        // ....
    
        @PostMapping("/search")
        public List<User> searchUsers(@RequestBody UserFilter userFilter) {
    
            // ... chiama il service passando userFilter
        }
    }
    Puoi anche specificare il produces, se necessario.

    Ho indicato eta come Integer, così magari null vuol dire "qualunque eta" (se si vuole gestirlo così, ovviamente).
  • Re: La Annotation RequestBody

    Sì, sto già usando le annotation RestController e RequestMapping.

    Nel mio service però ho la mia query associata ad una stringa, quindi dovrei avere un qualcosa tipo (almeno io l'avevo immaginata così)
    SELECT ecc ecc WHERE nome = filtro.getNome() eccecc
    è possibile se non mi creo il FiltroUtente ma passo direttamente il filtro al service ?
  • Re: La Annotation RequestBody

    WinstonSmith ha scritto:


    Nel mio service però ho la mia query associata ad una stringa, quindi dovrei avere un qualcosa tipo (almeno io l'avevo immaginata così)
    SELECT ecc ecc WHERE nome = filtro.getNome() eccecc
    è possibile se non mi creo il FiltroUtente ma passo direttamente il filtro al service ?
    Quel UserFilter che ho mostrato lo si può passare benissimo direttamente al service. NON è quella la questione.
    Il punto innanzitutto è che dovresti precisare cosa stai usando per lo strato di accesso al DB: JDBC "nudo e crudo"? Il JDBC template di Spring? JPA? Altro?

    E comunque NON è il service che dovrebbe fare la query ma generalmente una apposita classe di DAO. Poi bisogna vedere che architettura avete scelto ..
  • Re: La Annotation RequestBody

    Sì, infatti ero abituato ad iniettare un'istanza della Repository nella classe Service, e nel'implementazione quindi della classe Dao scrivevo effettivamente la query, ma qui adesso mi è stato detto di fare così.

    Per lo strato di accesso al DB, JPA.
  • Re: La Annotation RequestBody

    WinstonSmith ha scritto:


    Per lo strato di accesso al DB, JPA.
    E quale è il dubbio specifico? Se usi JPA, puoi fare una query "dinamica" con un TypedQuery oppure una named query che si specifica in annotation o XML.

    EDIT: anche con CriteriaQuery
  • Re: La Annotation RequestBody

    Sì, il dubbio è sul filtro, perché come dicevo nel primo post avevo risolto prendendo parametro per parametro ed andando ad inizializzare i campi del mio oggetto filtro. Mentre col Request body non sapevo come prendere il campo nome ed andare poi ad associare al nome del mio oggetto filtro. Quindi posso -senza fare questo passaggio della creazione di un oggetto filtro - fare direttamente "WHERE nome = filtroRicevuto.nome".


    Però in questo caso... se l'utente dovesse riempire solo il campo "nome" e gli altri due no... la query funzionerebbe?
    where cognome = a nessun valore inserito ?
  • Re: La Annotation RequestBody

    WinstonSmith ha scritto:


    Sì, il dubbio è sul filtro, perché come dicevo nel primo post avevo risolto prendendo parametro per parametro ed andando ad inizializzare i campi del mio oggetto filtro. Mentre col Request body non sapevo come prendere il campo nome ed andare poi ad associare al nome del mio oggetto filtro.
    Ma questa, ripeto, non è la questione e non c'entra (tanto).

    WinstonSmith ha scritto:


    Quindi posso -senza fare questo passaggio della creazione di un oggetto filtro - fare direttamente "WHERE nome = filtroRicevuto.nome".
    No (scritto così no). La questione è che con JPA devi scegliere come fare la query. Ci sono diverse opzioni.
Devi accedere o registrarti per scrivere nel forum
9 risposte