Java 在restful服务中使用位集作为查询参数
我天真地创建了一个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 ... 我确实希望将参数表示为位集。是否有任何方便的
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用户来说,它可能太复杂了