我是使用Jersey创建Web服务的新手,我正面临着这个问题:
@GET
@Path("/logoutUser")
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
public Response logoutUser(@QueryParam("userName") String userName) {
if (userName.equalsIgnoreCase("jmart") || userName.equalsIgnoreCase("jromero")) {
return Response.status(Response.Status.OK).entity("Logout realizado").type(MediaType.APPLICATION_JSON).build();
}else {
throw new CustomNotFoundException("No se ha podido realizar el logout del usuario " + userName);
}
}
@GET
@Path("/logoutUser")
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
public Response logoutUser(@QueryParam("idUsuario") int idUsuario) {
if (idUsuario == 1 || idUsuario == 2) {
return Response.status(Response.Status.OK).entity("Logout realizado").type(MediaType.APPLICATION_JSON).build();
}else {
throw new CustomNotFoundException("No se ha podido realizar el logout del usuario " + idUsuario);
}
}
显然,当我尝试调用这两种方法中的任何一种时,我的服务器都会抛出异常。
是否有在同一路径上使用不同参数实现相同方法的任何解决方案?
答案 0 :(得分:2)
如果要将条件逻辑应用于同一路径,另一种解决方案是利用子资源定位器created from classes(对API版本控制也非常有用)。
@Path("/users")
public class UsersResource {
@Path("logout")
@GET
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
public Class<?> logout(@QueryParam("condition") String condition) {
if (check(condition)) {
return ConditionalLogoutA.class;
} else {
return ConditionalLogoutB.class;
}
}
}
@Singleton
public class ConditionalLogoutA {
@Path("/")
public void logout(@QueryParam("userName") String userName) {};
}
@Singleton
public class ConditionalLogoutB {
@Path("/")
public void logout(@QueryParam("userName") String userName) {};
}
答案 1 :(得分:1)
我认为你不能做你想用泽西做的事。即使您要切换到@PathParam,它也不会为您提供您正在寻找的控件。如果我是你,我不会尝试在泽西岛做条件逻辑,老实说有点令人困惑。相反,我会在列表中获取所有@QueryParams,然后查看您想要的是否在该列表中。请参阅示例here。另一种选择是只获取@QueryParams并查看哪一个为null。由于@QueryParams是可选的,所以你应该检查null。您的新代码可能如下所示:
@GET
@Path("/logoutUser")
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
public Response logoutUser(@QueryParam("idUsuario") int idUsuario, @QueryParam("userName") String userName) {
if(userName != null) {
//do what you want with the username
}
else if (idUsuario == 1 || idUsuario == 2) {
//do what you want with the id
}
}