QueryParam与jersey中的枚举绑定

Sal*_*ran 27 rest jersey

我有一个像http://www.localhost.com/service/resource?status=ACTIVE,PASSIVE这样的休息网址,我有这样的方法

@GET
public Resource resource(@QueryParam("status") Collection<STATUS> statusList){
}
Run Code Online (Sandbox Code Playgroud)

哪里STATUS是枚举?

public enum STATUS{
    ACTIVE,PASSIVE,DISABLED
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,有一种方法可以将查询参数状态自动转换为泽西中的枚举类型STATUS列表,还是我必须为此编写自己的提供程序?

Eug*_*vas 49

JSR 311 API中,带@QueryParam注释的类型必须:

  1. 是一种原始类型
  2. 有一个接受单个String参数的构造函数
  3. 有一个名为valueOffromString接受单个String参数的静态方法(例如,参见Integer.valueOf(String))
  4. List<T>,Set<T>或者SortedSet<T>,T满足2或3以上.生成的集合是只读的.

对于你的情况,我会通过将枚举包装在一个简单的类中来使用第二个选项:

public class StatusList {
  private List<STATUS> statusList;

  public StatusList(String toParse) {
    //code to split the parameter into a list of statuses 
  }

  public List<STATUS> getStatusList() {
    return this.statusList;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后将您的方法更改为:

@GET
public Resource resource(@QueryParam("status") StatusList statusList){
}
Run Code Online (Sandbox Code Playgroud)

  • 但Java中的每个枚举都有一个valueOf(String)方法.因此3实现了,所以他可以从Collection <STATUS>转到List <STATUS>,不需要包装.不是吗? (24认同)
  • 看来,如果您的枚举具有 fromValue(String) 方法,则它优先于默认的 valueOf(String) 方法。很高兴知道您是否需要一些自定义行为(就像我所做的那样)。 (2认同)

小智 6

试试这个:

http://www.localhost.com/service/resource?status=ACTIVE&status=PASSIVE
Run Code Online (Sandbox Code Playgroud)
@QueryParam("status") List<STATUS> statusList
Run Code Online (Sandbox Code Playgroud)


Bab*_*yan 5

将此方法添加到您的枚举中:

public static YourEnum fromString(final String s) {
    return YourEnum.valueOf(s);
}
Run Code Online (Sandbox Code Playgroud)

  • @BabkenVardanyan - 问题不在于 jax-rs 不能很好地与 valueOf 配合使用 - 就它而言,它运行良好。它只是远远不够。valueOf 需要字符串的大写精确匹配。当您自己编写fromString 时,您可以在调用valueOf 之前将混合大小写转换为大写。 (2认同)