2014-09-09 13 views
6

Quindi in realtà non si possono chiamare risorse nidificate da una prospettiva Rest, ma sono interessato a come strutturare una classe Jersey come provider di riposo, in modo che possa rispondere alle richieste incatenate.Risorse nidificate in Jersey/JAX-RS -come implementare l'esempio Restangular

ie sto bene con la base/utenti, sto bene con/users/123 per ottenere un utente specifico, ma come poi dirammo verso le proprietà dell'utente ..../users/123/cars,/utenti/123/auto/23 ecc.

Siamo spiacenti per la mancanza di informazioni, ma ho visto questo come un esempio nella documentazione Restangular per Angular.

https://github.com/mgonto/restangular#production-apps-using-

restangular 

// Restangular returns promises 
Restangular.all('users').getList() // GET: /users 
.then(function(users) { 
    // returns a list of users 
    $scope.user = users[0]; // first Restangular obj in list: { id: 123 } 
}) 

// Later in the code... 

// Restangular objects are self-aware and know how to make their own RESTful requests 
$scope.user.getList('cars'); // GET: /users/123/cars 

// You can also use your own custom methods on Restangular objects 
$scope.user.sendMessage(); // POST: /users/123/sendMessage 

// Chain methods together to easily build complex requests 
$scope.user.one('messages', 123).one('from', 123).getList('unread'); 
// GET: /user/123/messages/123/from/123/unread 

risposta

8

penso resource locator dovrebbe fare il lavoro. In generale stanno riposizionando la richiesta su una risorsa diversa, che è in grado di consumarla.

Nel tuo caso Avrai una risorsa radice UserResource, che gestirà utenti e risorse secondarie per auto, messaggi - CarsResource, MessagesResource.

La risorsa principale:

@Path("users") 
class UsersResource { 

    // GET: /users 
    @GET 
    @Path("{id}") 
    public User getById(@PathParam("id") long id) {...} 

    @Path("{id}/cars") 
    public CarResource getCarResource(@PathParam("id") long userId) { 
     return new CarResource(uesrId); 
    } 

    @Path("{id}/sendMessage") 
    public MessagesResource getMessagesResourceForSend(@PathParam("id") long userId) { 
     return new MessagesResource(userId); 
    } 

    @Path("{id}/messages") 
    public MessagesResource getMessagesResourceForRead(@PathParam("id") long userId) { 
     return new MessagesResource(userId); 
    } 
} 

Auto e Messaggi risorse:

class CarsResource { 
    long userId  

    // GET: /users/123/cars 
    @GET 
    public Car getAllCars() { 
     /*retrieve all cars for user userId*/ 
    } 

    // GET: /users/123/cars/3 
    @GET 
    @Path("{carId}") 
    public Car getById(@PathParam("carId") carId) { 
     /*retrieve car for id carId*/ 
    } 
} 

class MessagesResource { 
    long userId 

    // POST: /users/123/sendMessage 
    @POST   
    public void sendMessage(@FormParam("content") String content) { 
     /*send message to user userId*/ 
    } 

    // GET: /user/123/messages/123/from/123/unread 
    @GET 
    @Path("{id1}/from/{id2}/unread") 
    public void getUnread(@PathParam("id1") long id1, @PathParam("id2") long id2) { 
      /*return unread messages*/ 
    } 
} 

Sub-risorse non devono essere annotati con @Path sul livello di classe e hanno bisogno di essere registrati presso la JAX -RS runtinme in una classe di applicazione

+0

Grazie per la risposta, mi permette di fare un po 'di indagine nel mio progetto poi verrò indietro e accettare come risposta, grazie molto tanto. Non sono sicuro di aver ancora capito come restituire CarResource come risposta funziona in questa istanza, quando quello che voglio è una raccolta di istanze Car ... ma qui restituiamo l'istanza CarResource. – smackenzie

+0

Sì, questo è il trucco, che restituire un'istanza di risorsa invia effettivamente la richiesta alla risorsa restituita. puoi leggere ulteriori informazioni [qui] (https://jersey.java.net/documentation/latest/jaxrs-resources.html#d0e2176) –

0

in aggiunta alla risposta di Thomas Bartalos, è possibile utilizzare l'id del parametro di percorso nelle risorse secondarie

@GET 
@Path("{id1}/from/{id2}/unread") 
public void getUnread(@PathParam("id") long userId,@PathParam("id1") long id1, @PathParam("id2") long id2) 
{ 
     /*return unread messages for user with userId*/ 
} 

questo è utile nel caso in cui si utilizzino fagioli statless, evita di passare il parametro userId durante l'instanciazione.

Esempio: risorsa Root:

@Path("users") 
@Stateless 
class UsersResource { 
    @Inject CarResource cr; 
    @Inject MessageResource mr; 
    // GET: /users 
    @GET 
    @Path("{id}") 
    public User getById(@PathParam("id") long id) {...} 

    @Path("{userId}/cars") 
    public CarResource getCarResource() { 
     return cr; 
    } 

    @Path("{userId}/sendMessage") 
    public MessagesResource getMessagesResourceForSend() { 
     return mr; 
    } 

    @Path("{userId}/messages") 
    public MessagesResource getMessagesResourceForRead() { 
     return mr; 
    } 
} 

risorse sub:

@Stateless 
@Path("/") 
class CarsResource { 
    @GET 
    public Car getAllCars(@PathParam("userId") long userId) {//the path param is retrieved from parent path 
     /*retrieve all cars for user userId*/ 
    } 

    @GET 
    @Path("{carId}") 
    public Car getById(@PathParam("userId") long userId,@PathParam("carId") carId) { 
     /*retrieve car for id carId fr the user with userId*/ 
    } 
} 

@Stateless 
@Path("/") 
class MessagesResource { 
    @POST   
    public void sendMessage(@PathParam("userId") long userId,@FormParam("content") String content) { 
     /*send message to user userId*/ 
    } 

    @GET 
    @Path("{id1}/from/{id2}/unread") 
    public void getUnread(@PathParam("userId") long userId,@PathParam("id1") long id1, @PathParam("id2") long id2) { 
      /*return unread messages*/ 
    } 
} 
Problemi correlati