我正在尝试确定与变种为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。
答案 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休息服务中的控制器逻辑分开。