在宁静的服务中使用BitSet作为查询参数

时间:2014-01-02 22:14:54

标签: java rest resteasy

我天真地创建了一个使用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

2 个答案:

答案 0 :(得分: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);
            }

          }
    }

  }

我没有测试过代码,但是我更容易以这种方式呈现这个想法。

答案 1 :(得分:0)

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

如果那不符合您的要求,您将不得不写一个,这应该非常简单。您只需要为您的应用程序定义“字符串化BitSet”意味着什么。

有几种方法可以解决这个问题,但问题归结为决定如何对这些位进行编码。你有几个选择

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

您的选择