【问题标题】:Global param on multiple webresources多个网络资源上的全局参数
【发布时间】:2012-08-15 05:27:21
【问题描述】:

我正在使用 jersey,jax-rs 构建一个 web 服务应用程序

我在路径“/authenticate”中有单个 jax-rs 资源文件

我有多种方法具有单独的路径,例如“/user”“/test”

@Path ("/authenticate")
public class Authenticate{
private static final Log log = LogFactory.getLog(Authenticate.class);

@QueryParam("entityId")
String entity;

@GET
@Path ("/{param}")
public Response getMsg(@PathParam ("param") String msg) {
    String o = "Hello Welcome Back:"+msg;
    return Response.status(200).entity(o).build();
}

@GET
@Path ("/user")
@Produces({"application/json"})
public UserDTO getUser (@Context HttpServletRequest request,
        @QueryParam("userId") int userId) {
    System.out.println("In Get User, User:"+userId);    
    System.out.println("In Get User, Entity:"+entity);
}

@GET
@Path ("/test")
@Produces({"application/json"})
public TestPOJO getTestPOJO () {
    System.out.println("In Get TestPOJO");
    System.out.println("In Get Test, Entity:"+entity);
    return new TestPOJO();
}

}

根据泽西客户端的建议,我使用来自客户端的单个网络资源,并使用 .path("/xxx") 从同一网络资源构建后续网络资源。

这是我创建初始网络资源的方式

WebResource webResource = client.resource("http://localhost:8080/Service/jaxrs/authenticate");
webResource.queryParam("entityId", securityHelper.getEntityId().toString());

这是我随后使用网络资源的方式

MultivaluedMap<String, String> params = new MultivaluedMapImpl();           
ClientResponse userRes = webResource.path("/user").queryParams(params).accept("application/json").get(ClientResponse.class);

我想为初始 web 资源分配一个查询参数,并且我希望它被使用 .path() 创建的所有后续 web 资源保留。但这不是现在发生的。例如在上面的代码中,当使用 path("/user") 进行调用时,“entityId”不可用。

我的想法是一次性分配公共参数,webResource 的所有后续用户都不需要一次又一次地添加这些参数。有没有办法做到这一点?这种方法行得通吗?

【问题讨论】:

    标签: jersey jax-rs


    【解决方案1】:

    下面的行创建了一个新的 WebResource 并且不改变 webResource 对象的状态:

    webResource.queryParam("entityId", securityHelper.getEntityId().toString())
    

    最终你可以像这样改变你的代码来创建“基础”资源:

    WebResource webResource = client.resource("http://localhost:8080/Service/jaxrs/authenticate").queryParam("entityId", securityHelper.getEntityId().toString());
    

    然后根据需要使用此资源创建另一个资源。 WebResource.queryParam 和 WebResource.queryParams 总是创建一个新的 WebResource 对象。

    【讨论】:

    • 感谢您的回复。我休息了几天,才看到这个。因此,如果我理解它,如果我在创建 webResource 时使用 queryParam,它将保留它。我会试试的。
    • 请注意 queryParam 创建了一个新的网络资源,因此您应该使用该资源,而不是调用 queryParam 的资源。
    【解决方案2】:

    我可能不是回答这个问题的最佳人选,因为我不久前进入了 Jersey 和 RESTful 服务器的“世界”,但是自从我看到这个问题两天没有回答后,我会尽我所能提供帮助可以。

    如果我理解正确,您正在尝试通过使用查询将用户信息保存在 entityId 字符串上,以便在您进行后续调用时可用。

    好的,让我们从你所拥有的开始。使用您的代码(entityId 作为全局参数),您指定的是,当您从 Authenticate 类调用资源时,可以使用 '?entityId="something" 类型的查询和 ANY 方法进行任何调用在这个类中可以使用查询中发送的信息。

    问题是,对于我通过弄乱泽西岛所学到的知识,每当您拨打电话时,资源类(在您的情况下为 Authenticate)都会再次实例化。因此,您不能只将信息保存在全局参数中,因为后续调用会将 String entityId 设为 null。

    这意味着如果您想将信息保存在外部资源中(例如:数据库、文件等)。您选择哪种方法取决于您想要做什么以及您在应用程序中寻找什么。

    我希望我至少能够对您的问题有所了解。

    【讨论】:

    • 感谢您的回复。你的理解在任何程度上都是正确的。我正在尝试访问需要识别请求者的 Web 资源。因此,我没有尝试在使用 webresource 的代码中的任何地方添加它,而是尝试设置一次,以便将该参数添加到所有 webresource 请求中。
    猜你喜欢
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多