1

我是使用 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);
    }
}

显然,当我尝试调用这两种方法中的任何一种时,我的服务器都会引发异常。

是否有任何解决方案可以在同一路径上实现具有不同参数的相同方法?

4

2 回答 2

2

我不认为你可以用泽西岛做你想做的事情。即使您要切换到@PathParam,它也不会给您所需的控制权。如果我是你,无论如何我都不会尝试在泽西岛做条件逻辑,老实说有点令人困惑。相反,我会在一个列表中获取所有 @QueryParams,然后查看您想要的内容是否在该列表中。请参阅此处的示例。另一种选择是同时获取@QueryParams 并查看哪个为空。由于 @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
    }
}
于 2013-10-08T13:42:04.760 回答
2

如果您想将条件逻辑应用于同一路径,另一种解决方案是利用从类创建的子资源定位器(对于 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) {};
}
于 2015-11-07T17:38:01.220 回答