在 Jersey 中添加新资源

Add new resource in restfull with Jersey

我有一个 messages 资源:

@Path("/messages")
@Consumes("application/json")
@Produces("application/json")
public class MessageResource {

...

@Path("/{msgId}/comments")
public CommentsResource getCommentsResource() {
    return new CommentsResource();
}

现在我想为特定的 messageId

添加新评论

所以这是 comments 资源:

@Path("/")
@Produces("application/json")
@Consumes("application/json")
public class CommentsResource {

@POST
public Comment addNewComment(Comment newComment, @PathParam("msgId") long messageId) {
    commentService.addComment(messageId, newComment);
    return newComment;
}

这里是 commentService.addComment:

public Comment addComment(long msgId, Comment newComment) {
    Map<Long, Comment> allCommentsOfAMessage = messages.get(msgId).getComments();

    newComment.setId(allCommentsOfAMessage.size() + 1);
    allCommentsOfAMessage.put(newComment.getId(), newComment);
    return newComment;
}

但问题是 CommentsResource class 的 addNewComment() 方法从未被某些 URL 调用过,例如:http://localhost:8080/messages/2/comments

通过 POST 方法以 Json 格式包含新评论。

(此 URL 应向 ID=2 的消息添加新评论)

Jersey 文档说您可以通过根资源为 /messages/comments/{msgId} 的方式执行此操作。如果您在根资源而不是子资源中捕获它,它可能无法传播路径参数。

也许您应该将它们放在同一个 class 中,或者将评论作为根资源,例如 POST /comments/{msgId}.