在restful服务中使用BitSet作为查询参数

3

我天真地创建了一个使用 java.util.BitSet 作为 QueryParameter 的 restful 处理程序。

@QueryParam("selectedCodes") BitSet selectedCodes 

我觉得我不应该感到惊讶,因为我得到了以下错误:

Unable to find a constructor that 
takes a String param or a valueOf() or fromString() method ...

我希望将参数表示为 BitSet。有没有一个方便的、简单易用的代码,可以将 BitSet 转化为字符串?


给答案点个赞吧 :-) - user987339
2个回答

1
你需要自己实现缺失的方法。这应该是很简单的:
  class MyBitSet extends BitSet{

    public MyBitSet(String bits) throws IllegalArgumentException
    {
          super(bits.length());
          for(int i = 0; i < bits.length(); i++){
            if(bits.charAt(i) > '1' || bits.charAt(i) < '0') {
               throw new IllegalArgumentException("Wrong bit!");
            }
            if(bits.charAt(i) == '1'){
               this.flip(bits.length() - 1 - i);
            }

          }
    }

  }

我还没有测试代码,但用这种方式表达我的想法更容易。


0

BitSet#toString() 会生成形如 {n, m, ...} 的字符串,其中的数字是集合中每个位的索引。

如果这不符合您的需求,您可以编写自己的方法,这相当简单。您只需要定义对于应用程序而言,“将 BitSet 转换为字符串”的含义即可。

有多种方式可以处理这个问题,但关键在于决定如何编码位。您有以下几种选择:

  • 默认的 toString() 仅适用于比较短或非常稀疏的长位集。
  • 由 '0' 和 '1' 字符构成的字符串,代表该集合的值。这会导致信息密度很低,因为您需要一个整个字节来表示8个位。
  • 使用十六进制字符进行编码。这更有效率(8个编码位表示4个数据位),但如果它的长度不是4位数的倍数,您可能需要包括位字符串长度,以便在接收端正确地重建它。

由您选择。


嗨,感谢您提供这么详细的信息。我选择了上面的1和0的方法,因为这似乎是一种更加语言中立的解决方案。默认数组不适合作为URI参数,虽然十六进制方法很高效,但对于所有可能的RESTful API用户来说可能过于复杂。 - NicholasKarl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接