【问题标题】:@QueryParam or HttpServletRequest in javajava中的@QueryParam或HttpServletRequest
【发布时间】:2019-05-14 09:29:14
【问题描述】:

我有资源类 - UserResource 接口,我已将端点定义为 getUsers。

现在我想根据用户状态过滤这些用户 - (活动,非活动)并且它不是强制性的,所以如果我没有通过状态,它将获取所有用户。

现在的问题是我应该将其作为 @QueryParam 传递还是从

获取
HttpServletRequest - httpServletRequest.getParameter("Status").

以上两种中哪一种是最好的方法,在什么情况下我应该使用哪一种。

1. 第一种方法是将状态作为查询参数传递并在资源文件本身中定义。这里的 UserResource 是控制器接口或资源类。在 getUsers 方法中有 @QueryParam

import javax.ws.rs.core.Response;

    @Path(/user)
    public interface UserResource{

          @GET
          @Path("/")
          @Produces({ MediaType.APPLICATION_JSON })
          Response getUsers(@QueryParam("status") String status);

    }

    @Component
    Public class UsersResourceImpl implement UserResource{

    public Response getPlan(String status){

    String userStatus = status;
    // some logic

    } 
}

2. 第二种方法是从 HttpServletRequest 获取查询参数。所以我有 自动装配 HttpServletRequest 并从 httpservlet 请求。

import javax.ws.rs.core.Response;

@Path(/user)
public interface UserResource {

    @GET
    @Path("/")
    @Produces({ MediaType.APPLICATION_JSON })
    Response getUsers();

    }

import javax.servlet.http.HttpServletRequest;

@Component
Public class UsersResourceImpl implements UserResource{

    @Autowired
    private HttpServletRequest httpRequest;

    public Response getPlan(String status){

    String status = httpRequest.getParameter(status)
        // some logic
    } 
}
'''

【问题讨论】:

  • 嘿戈帕尔!你最近问了这个问题,我把时间和精力放在answer 它上。我非常感谢您的feedback

标签: java rest


【解决方案1】:

好吧,老实说,鉴于您需要查询参数中的值,我没有看到任何避免使用 @QueryParam 注释的有吸引力的理由。

我能想到的使用@QueryParam的一些好处:

  • @QueryParam 注释将自动将查询参数的值绑定到资源方法参数、资源类字段或资源类 bean 属性。因此,一旦您遵守documentation 中描述的一些规则,您就不需要手动提取和解析参数:

    带注释的参数、字段或属性的类型T必须是:

    1. 成为原始类型
    2. 有一个接受单个字符串参数的构造函数
    3. 有一个名为 valueOffromString 的静态方法,它接受单个 String 参数(例如,参见 Integer.valueOf(String)
    4. 有一个ParamConverterProvider JAX-RS 扩展 SPI 的注册实现,它返回一个 ParamConverter 实例,该实例能够对该类型进行“来自字符串”的转换。 为List<T>Set<T>SortedSet<T>,其中T 满足上述2、3 或4。生成的集合是只读的。
  • @QueryParam 可以与@DefaultValue 结合使用,为参数定义一个默认值,以防请求中不存在该参数。

  • 如果多个端点支持相同的查询参数,您可以将它们聚合到一个类中,并以@BeanParameter 形式接收此类的实例。

【讨论】:

  • @GopalSinghania 所以请考虑投票并接受我的回答:)
【解决方案2】:

使用注释(即@QueryParam),这就是我们选择这样的框架的原因,记住约定优于配置

【讨论】:

    猜你喜欢
    • 2016-02-14
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2013-10-11
    • 1970-01-01
    • 2011-05-23
    • 2015-12-21
    相关资源
    最近更新 更多