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

Java Jersey-在同一@path上使用不同参数的相同方法?,java,methods,parameters,path,jersey,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.equalsIgnor

我是使用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);
    }
}
显然,当我试图调用这两个方法中的任何一个时,我的服务器会抛出一个异常


有没有办法在同一条路径上用不同的参数实现相同的方法?

我认为你不能用Jersey做你想做的事情。即使你切换到@PathParam,它也不会给你想要的控制权。如果我是你,我不会尝试在泽西岛做条件逻辑,老实说,这有点混乱。相反,我会在一个列表中获取所有@QueryParams,然后查看您想要的是否在该列表中。参见示例。另一个选项是只获取两个@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
    }
}

我不认为你能做你想做的事。即使你切换到@PathParam,它也不会给你想要的控制权。如果我是你,我不会尝试在泽西岛做条件逻辑,老实说,这有点混乱。相反,我会在一个列表中获取所有@QueryParams,然后查看您想要的是否在该列表中。参见示例。另一个选项是只获取两个@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
    }
}

如果要将条件逻辑应用于同一路径,另一种解决方案是利用子资源定位器,这对于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) {};
}

如果要将条件逻辑应用于同一路径,另一种解决方案是利用子资源定位器,这对于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) {};
}

如果我没记错的话,参数的计数必须不同。不同的类型是不够的。如果我没记错的话,参数的计数必须不同。不同类型是不够的。