aerospike JUNIT Record Constructor无法正常工作

时间:2015-07-13 06:53:21

标签: java junit classcastexception aerospike

我正在为我的测试案例编写aeropsike junit测试用例。对于存储airospike垃圾箱,我正在使用ConcurrentHashMap。

// InMemory Map for storing AeroSpike Related Data...
ConcurrentMap<String, Bin[]> aerospike_keyBins = new ConcurrentHashMap<String, Bin[]>();

// InMemory Map for storing AeroSpike Related Data...
ConcurrentMap<String, Integer> aerospike_keyGen = new ConcurrentHashMap<String, Integer>();

存储垃圾箱和GenNumber相关信息的工作非常顺利。

但我在从地图获取记录时遇到问题(实际上将箱子值从Map转换为Aerospike Record)。

这是预期转换它的函数。

private Record binsToRecord(String stringKey, Bin... bins) {
    Map<String, Object> mapOfBins = new HashMap<String, Object>();
    for (Bin bin : bins) {
        mapOfBins.put(bin.name, bin.value);
    }
    return new Record(mapOfBins, aerospike_keyGen.get(stringKey), 1);
}

在该函数中调用new Record时,我收到以下错误消息。

java.lang.ClassCastException: com.aerospike.client.Value$StringValue cannot be cast to java.lang.String
    at com.aerospike.client.Record.getString(Record.java:66)

在调试此问题时,我在Aerospike的Record.class中找到了 以下功能给出错误。

/**
 * Get bin value as String.
 */
public String getString(String name) {
    return (String) getValue(name);
}

getValue返回正确的值,但(String) getValue(name)抛出错误。

有关我为什么会收到此错误的任何线索?

2 个答案:

答案 0 :(得分:1)

你的binsToRecord方法看起来很好。

/**
 * Get bin value as String.
 */
public String getString(String name) {
    return (String) getValue(name);
}

这里Bin BinValue是一个StringValue对象,所以你不能直接将它强制转换为String。 尝试

(getValue(name)).toString()
// StringValue object provide toString() method.

答案 1 :(得分:0)

实际上问题在于将值放到本地hashmap中。 我在本地hashmap中推送StringValues类型的值修复,以便使标准字符串修复问题。

这是新的binsToRecordfunction。

/*
 * Convert Bin Set to Record Object.
 */
private Record binsToRecord(String stringKey, Bin... bins) {
    Map<String, Object> mapOfBins = new HashMap<String, Object>();
    for (Bin bin : bins) {
        if (bin.value instanceof Value.StringValue)
            mapOfBins.put(bin.name, bin.value.toString());
        else if (bin.value instanceof Value.LongValue)
            mapOfBins.put(bin.name, bin.value.toLong());
        else if (bin.value instanceof Value.DoubleValue)
            mapOfBins.put(bin.name, bin.value.toLong());

    }
    return (new Record(mapOfBins, aerospike_keyGen.get(stringKey), 1));
}