Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在restful服务中使用位集作为查询参数_Java_Rest_Resteasy - Fatal编程技术网

Java 在restful服务中使用位集作为查询参数

Java 在restful服务中使用位集作为查询参数,java,rest,resteasy,Java,Rest,Resteasy,我天真地创建了一个restful处理程序,它使用java.util.BitSet作为QueryParameter @QueryParam("selectedCodes") BitSet selectedCodes 我想我不应该对我出现以下错误感到惊讶: Unable to find a constructor that takes a String param or a valueOf() or fromString() method ... 我确实希望将参数表示为位集。是否有任何方便的

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

@QueryParam("selectedCodes") BitSet selectedCodes 
我想我不应该对我出现以下错误感到惊讶:

Unable to find a constructor that 
takes a String param or a valueOf() or fromString() method ...
我确实希望将参数表示为
位集
。是否有任何方便的、漂亮的(还有什么?)代码段可以将
位集
字符串化?

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

如果这不符合你的要求,你就得写一个,应该很简单。您只需定义“字符串化位集”对您的应用程序意味着什么

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

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

您的选择

您应该自己实现缺少的方法。这应该是微不足道的:

  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);
            }

          }
    }

  }
类MyBitSet扩展了位集{
公共MyBitSet(字符串位)抛出IllegalArgumentException
{
super(bits.length());
对于(int i=0;i'1'| | bits.charAt(i)<'0'){
抛出新的IllegalArgumentException(“错误位!”);
}
if(位字符(i)='1'){
this.flip(bits.length()-1-i);
}
}
}
}

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

您好,谢谢您的详细介绍。我选择了上面的1和0方法,因为这似乎是一个更中性的语言解决方案。默认数组不是一个很好的URI参数,虽然十六进制方法很有效,但对于所有可能的RESTful API用户来说,它可能太复杂了