使用不同的QueryParams

时间:2016-08-04 18:09:29

标签: java rest jersey jax-rs

我正在尝试确定与变种为Collection<String>的Jersey Client端点进行交互的最佳方式。我不是100%肯定这样做是正确的,但我想知道这是否可行/实现这一目的的正确方法是什么 - 也许是一个带有消息体的@POST

DAO中的方法是Set<Foo> retrieveByKeys(Collection<String> keys)。因此,我试图找出为此创建端点的最佳方法。首先想到的是:

@POST
@Path('/foos')
@Consumes(MediaType.APPLICATAION_JSON)
@Produces(MediaType.APPLICATAION_JSON)
Response retrieveByKeys(Collection<String> keys) {
    ... //do things
}

OR:

@GET
@Path('/foos')
Response retrieveByKeys(@QueryParam('keys') Collection<String> keys) {
    ... //do things
}

我不太确定你可以做第二个但是被建议作为可能的解决方案。

这种方式很好,但同时我的DAO中有另一种方法List<Foo> retrievePageStartingFrom(String startKey, int pageSize)。我知道在可能的情况下重复使用url是最好的休息练习,这正是我试图用这两个做的。我正在努力寻找一种方法来区分这两种方法,但保持相同的网址。

我想知道是否有可能用其他@QueryParams重载端点,但这次是:

@GET
@Path('/foos')
Response retrievePageStartingFrom(@QueryParam('startKey') String startKey, @QueryParam('pageSize') int pageSize) {
    ... //do things
}

并且Jersey客户端会知道区分这两个调用,因为第一个方法有一个参数,第二个方法有两个不同类型的参数。

我想我想要做的最好的方法是在java中,当你可以有一个具有某些参数的构造函数,以及另一个具有不同/不同类型的参数但具有相同方法名称的构造函数(显然)。

无论正确答案是什么,如果可能的话,我会尝试为这两种方法保留相同的URL,并且我想知道实现这一目标的最佳方法是什么! THX。

2 个答案:

答案 0 :(得分:4)

不,如果所有端点方法都使用相同的HTTP方法(例如所有@Get Annotation)但查询参数不同,则无法重载端点方法。其余资源由URI唯一标识,而不是由参数标识。

您需要做的是检查不同查询参数的存在并调用所需的实现:

@GET
@Path('/foos')
Response retrieveByKeys(@QueryParam('keys') Collection<String> keys, @QueryParam('startKey') String startKey, @QueryParam('pageSize') int pageSize) {
    List<FooRes> fooResources;
 //check if keys Collection is empty
 if(keys==null||keys.isEmpty()){
    if(startKey==null || startKey.isEmpty()){
      return Response.status(Status.BAD_REQUEST).build();
    }else{
       if(pageSize==null||pageSize.isEmpty()){
          //set default pageSize
          pageSize=10;

          //call your DAO or Repository or Service methods
        fooResources=foosRepo.partialResults(startKey,pageSize);
         ....

        }
   }else{
     fooResources=foosRepo.findByKeys(keys);
   }
 }

 return Response.ok().entity(fooResources).build();
}

这是一个原始的想法,你可以让你更清楚,而不是使用if..else ..

的嵌套网

答案 1 :(得分:1)

最简单的方法是设置一个为端点提供服务的公共方法,然后让该方法根据您获得的输入类型调用一组私有方法。通常,在这种情况下,您应该将业务逻辑与Java休息服务中的控制器逻辑分开。