Jersey中单个值的多个@QueryParam键

ROM*_*eer 6 java jax-rs jersey query-parameters

是否可以在Jersey中为单个对象/变量允许多个 @QueryParam键?

在此输入图像描述

实际:

@POST
public Something getThings(@QueryParam("customer-number") Integer n) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

所以,如果我?customer-number=3在URL后添加它的工作原理.

预期:

如果我添加以下任何值,我想得到上面的行为:

  • ?customer-number=3
  • ?customerNumber=3
  • ?customerNo=3

OBS:

  1. QueryParam注释是这样的:

    ...
    public @interface QueryParam {
       String value();
    }
    
    Run Code Online (Sandbox Code Playgroud)

    所以,它不能接受多个String值(比如@Produces).

  2. 下面的方法允许用户同时使用具有相同含义的多个键(并且我希望它们之间具有"OR"条件):

    @POST
    public Something getThings(@QueryParam("customer-number") Integer n1,
                               @QueryParam("customerNumber") Integer n2,
                               @QueryParam("customerNo") Integer n3) {
        ...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 这样的东西不起作用:

    @POST
    public Something getThings(@QueryParam("customer-number|customerNumber|customerNo") Integer n) {
        ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

细节:

  • 泽西岛2.22.1
  • Java 8

nob*_*beh 1

也许最简单和最简单的方法是使用自定义@BeanParam

首先将合并所有查询参数的自定义 bean 定义为:

class MergedIntegerValue {

  private final Integer value;

  public MergedIntegerValue(
      @QueryParam("n1") Integer n1,
      @QueryParam("n2") Integer n2,
      @QueryParam("n3") Integer n3) {
    this.value = n1 != null ? n1 
        : n2 != null ? n2 
        : n3 != null ? n3 
        : null;
    // Throw an exception if value == null ?
  }

  public Integer getValue() {
    return value;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后@BeanParam在您的资源方法中使用它:

public Something getThings(
  @BeanParam MergedIntegerValue n) {

  // Use n.getValue() ...
}
Run Code Online (Sandbox Code Playgroud)

参考:https://jersey.java.net/documentation/latest/user-guide.html#d0e2403