【问题标题】:Java Jersey - Same method with different parameter on same @path?Java Jersey - 相同@path上具有不同参数的相同方法?
【发布时间】:2013-10-15 11:07:36
【问题描述】:

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

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

有没有在同一路径上实现不同参数的相同方法的解决方案?

【问题讨论】:

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

标签: java methods parameters path jersey


【解决方案1】:

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

【讨论】:

    【解决方案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) {};
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-22
      • 1970-01-01
      • 2014-06-03
      • 2012-06-24
      • 2016-09-21
      • 2019-06-15
      • 1970-01-01
      • 2020-10-26
      • 2015-01-28
      相关资源
      最近更新 更多