多个网络资源的全球参数

时间:2012-08-13 12:25:43

标签: jersey jax-rs

我正在使用jersey,jax-rs

构建一个webservices应用程序

我在路径“/ 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();
}

}

正如针对jersey客户端的建议,我使用来自客户端的单个webresource,并使用.path(“/ xxx”)从同一个webresource构建后续webresource。

以下是我创建初始网络资源的方法

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,我想要使用.path()创建的所有后续webresource保留它。但现在这种情况并没有发生。例如,在上面的代码中,当使用路径(“/ user”)进行调用时,“entityId”不可用。

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

2 个答案:

答案 0 :(得分: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对象。

答案 1 :(得分:0)

我可能不是回答这个问题的最佳人选,因为我不久前进入了泽西岛和REST服务器的“世界”,但是因为我看到这两天没有得到答案,所以尽量帮助我可以。

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

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

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

这意味着如果要保存信息,则必须在外部资源中执行此操作(例如:db,file等)。您选择何种方法取决于您想要做什么以及您在应用程序中寻找什么。

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