如何在 JAX-RS 中为子资源中的子资源设计路径?
How to design paths for sub-resource within sub-resource in JAX-RS?
我是一个完全的初学者,正在学习构建 RESTful 网络服务。我想知道如何在 JAX-RS 的子资源中设置子资源的路径。
我有三种资源:简介、消息和评论。
我希望我的网址如下所示。
个人资料
/profiles
留言
/profiles/{profileName}/messages
征求意见
/profiles/{profileName}/messages/{messageId}/comments
我的资源路径如下。
Profile Resource
@Path("/profiles")
public class ProfileResource {
@Path("/{profileName}/messages")
public MessageResource getMessageResource() {
return new MessageResource();
}
}
Message Resource
@Path("/")
public class MessageResource {
@Path("/{messageId}/comments")
public CommentResource getCommentResource() {
return new CommentResource();
}
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Message addMessage(@PathParam("profileName") String profileName, Message message){
return messageService.addMessage(profileName, message);
}
}
Comment Resource
@Path("/")
public class CommentResource {
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Comment postComment(@PathParam("messageId") long messageId, Comment comment) {
return commentService.addComment(messageId, comment);
}
}
但是我得到以下错误,
SEVERE: Servlet [Jersey Web Application] in web application [/messenger] threw
load() exception org.glassfish.jersey.server.model.ModelValidationException:
Validation of the application resource model has failed during application
initialization.
[[FATAL] A resource model has ambiguous (sub-)resource method for HTTP method POST
and input mime-types as defined by"@Consumes" and "@Produces" annotations at
Java methods public sokkalingam.restapi.messenger.model.Message
sokkalingam.restapi.messenger.resources.MessageResource.addMessage(java.lang.Strin
g,sokkalingam.restapi.messenger.model.Message) and public
sokkalingam.restapi.messenger.model.Comment
sokkalingam.restapi.messenger.resources.CommentResource.postComment(long,sokkaling
am.restapi.messenger.model.Comment) at matching regular expression /. These two
methods produces and consumes exactly the same mime-types and therefore their
invocation as a resource methods will always fail.;
问题:
我应该如何设置子资源的路径?
在子资源中做子资源的更好方法是什么?是吗
子资源内做子资源的共同点?
How should I set my paths for my sub resources?
删除子资源 class 上的 @Path
。当 class 用路径注释时,它将作为根资源添加到 Jersey 应用程序。所以你有一堆资源映射到 /
,这是错误的,因为有多个 @POST
(具有相同的 @Consumes
和 @Produces
)映射到相同的路径
有了子资源 classes,您就不需要 @Path
。就子资源路径而言,它将被忽略。
What is a better way to do sub resource within sub resource? Is it common to do sub-resource within sub-resource?
我看不出你在做什么有什么问题。
我是一个完全的初学者,正在学习构建 RESTful 网络服务。我想知道如何在 JAX-RS 的子资源中设置子资源的路径。
我有三种资源:简介、消息和评论。 我希望我的网址如下所示。
个人资料
/profiles
留言
/profiles/{profileName}/messages
征求意见
/profiles/{profileName}/messages/{messageId}/comments
我的资源路径如下。
Profile Resource
@Path("/profiles")
public class ProfileResource {
@Path("/{profileName}/messages")
public MessageResource getMessageResource() {
return new MessageResource();
}
}
Message Resource
@Path("/")
public class MessageResource {
@Path("/{messageId}/comments")
public CommentResource getCommentResource() {
return new CommentResource();
}
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Message addMessage(@PathParam("profileName") String profileName, Message message){
return messageService.addMessage(profileName, message);
}
}
Comment Resource
@Path("/")
public class CommentResource {
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Comment postComment(@PathParam("messageId") long messageId, Comment comment) {
return commentService.addComment(messageId, comment);
}
}
但是我得到以下错误,
SEVERE: Servlet [Jersey Web Application] in web application [/messenger] threw
load() exception org.glassfish.jersey.server.model.ModelValidationException:
Validation of the application resource model has failed during application
initialization.
[[FATAL] A resource model has ambiguous (sub-)resource method for HTTP method POST
and input mime-types as defined by"@Consumes" and "@Produces" annotations at
Java methods public sokkalingam.restapi.messenger.model.Message
sokkalingam.restapi.messenger.resources.MessageResource.addMessage(java.lang.Strin
g,sokkalingam.restapi.messenger.model.Message) and public
sokkalingam.restapi.messenger.model.Comment
sokkalingam.restapi.messenger.resources.CommentResource.postComment(long,sokkaling
am.restapi.messenger.model.Comment) at matching regular expression /. These two
methods produces and consumes exactly the same mime-types and therefore their
invocation as a resource methods will always fail.;
问题:
我应该如何设置子资源的路径?
在子资源中做子资源的更好方法是什么?是吗 子资源内做子资源的共同点?
How should I set my paths for my sub resources?
删除子资源 class 上的 @Path
。当 class 用路径注释时,它将作为根资源添加到 Jersey 应用程序。所以你有一堆资源映射到 /
,这是错误的,因为有多个 @POST
(具有相同的 @Consumes
和 @Produces
)映射到相同的路径
有了子资源 classes,您就不需要 @Path
。就子资源路径而言,它将被忽略。
What is a better way to do sub resource within sub resource? Is it common to do sub-resource within sub-resource?
我看不出你在做什么有什么问题。