1

我正在使用 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") 从同一网络资源构建后续网络资源。

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

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);

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

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

4

2 回答 2

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 对象。

于 2012-08-14T21:27:21.037 回答
0

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

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

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

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

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

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

于 2012-08-14T17:35:28.007 回答