因此,实际上可能不会从Rest视图中调用嵌套资源,但我对如何将Jersey类构造为静态提供程序感兴趣,因此它可以响应链接请求。
即我对基本/用户没问题,我可以使用/ users / 123来获取特定用户,但是如何分支到用户的属性.... / users / 123 / cars,/用户/ 123 /汽车/ 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
答案 0 :(得分: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进行注册
答案 1 :(得分:2)
除Thomas Bartalos回答外,还可以在子资源中使用路径参数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*/
}
}