Jersey / JAX-RS中的嵌套资源 - 实现Restangular示例

问题描述 投票:6回答:2

因此,实际上可能不会从Rest视图中调用嵌套资源,但我对如何将Jersey类构造为rest提供程序感兴趣,因此它可以响应链接请求。

即我对基本/用户没问题,我可以使用/ users / 123来获取特定用户,但是如何分支到用户的属性.... / users / 123 / cars,/ users / 123 / cars / 23等

很抱歉缺少信息,但在Angular的Restangular文档中看到了这个例子。

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
java rest jersey jax-rs
2个回答
8
投票

我认为资源定位器应该完成这项工作。通常,他们将请求重新定位到能够使用它的不同资源。

在您的情况下,您将拥有一个根资源UserResource,它将处理汽车的用户和子资源,消息 - CarsResource,MessagesResource。

根资源:

@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);
    }
}

汽车和消息资源:

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*/
    }
}

不应在类级别使用@Path注释子资源,并且需要在Application类中使用JAX-RS runtinme注册它们


2
投票

除了Thomas Bartalos的回答,还可以在子资源中使用path参数id

@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*/
}

这在您使用无状态bean的情况下很有用,它避免在实例化期间传递参数userId。

示例:根资源:

@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;
    }
}   

子资源:

@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*/
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.