如何在开机自检期间获取不同资源的 JAX-RS @Path?

2022-09-03 00:38:57

我有两个REST类用于涉及用户资源的简单Web服务(Jersey和GlassFish) - 一个用于对所有用户进行操作(例如,@POSTing的工厂),另一个用于单个用户(例如,@GET,@PUT,@DELETE)。他们分别位于:

@Stateless @Path("users") public class AllUsersResource {...}
@Stateless @Path("user") public class OneUserResource {...}

分别。当POST到AllUsersResource时,我想返回新用户的位置(通过),例如,Response.created(uri).build()

http://localhost:8080/.../user/152

我的问题是如何做到这一点。AllUsersResource注入@Context UriInfo uriInfo,但这并不能让我@Path OneUserResource的信息,只能获得当前调用(“用户”)的信息。我最终让它工作的方式只是使用反射,但我担心它是脆弱和不干净的:

OneUserResource.class.getAnnotation(Path.class).value();

搜索StackOverflow,我发现唯一要尝试的其他方法如下,但没有成功:

  • com.sun.jersey.api.core.ResourceContext
  • javax.ws.rs.core.UriInfo.getMatchedResources()
  • @javax.inject.Inject OneUserResource oneUserRes;

任何帮助都会很棒!


答案 1

您可以使用UriBuilder.fromresource(),但这仅在提供的 Resource 类是根资源时才有效(这在 javadocs 中明确提到)。我找到了一种方法来实现这一点,即使你在子资源类中:

@POST
@Consumes({MediaType.APPLICATION-XML, MediaType.APPLICATION-JSON})
public Response createUser(final User user, @Context UriInfo uriInfo) {
    // persist the user here
    URI uri = uriInfo.getAbsolutePathBuilder().path(user.getId()).build();
    return Response.created(uri).build();
}

答案 2

我发现了几个javax.ws.rs.core.UriBuilder方法,这些方法可以做到这一点,我想分享一下,以防其他人有这个问题。它们是:UriBuilder.fromResource(OneUserResource.class)和javax.ws.rs.core.UriBuilder.path(Class)。我在一次性通话中使用了后者:

URI newUserUri = uriInfo.getBaseUriBuilder().path(OneUserResource.class).path("/" + user.getId()).build();
return Response.created(newUserUri).build();

推荐