Java Jersey - 在同一个@path上使用不同参数的相同方法?

时间:2013-10-08 13:34:23

标签: java methods parameters path jersey

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

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

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

2 个答案:

答案 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
    }
}