使用redisson cache來實現一個緩存功能,緩存省市縣的名稱,key是區域編碼,integer,value是name。結果取的時候,怎么都取不出。
Map<Integer, String> regionsMap
regionsMap.get(110000) == null;
找了半天問題才發現regionsMap的key都是字符串。
for (Map.Entry<Integer, String> entry : regionsMap.entrySet()) {
int code = entry.getKey();
String name = entry.getValue();
String s = regionsMap.get(code);
System.out.println(s);
}
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
我加入緩存的時候明明是Integer做為key的,清空緩存直接調用沒問題,當從緩存取出來fan序列化后就變成了String key.
redisson采用JsonJacksonCodec反序列化時,是用Object作為對象decode.
private final Decoder<Object> decoder = new Decoder<Object>() {
@Override
public Object decode(ByteBuf buf, State state) throws IOException {
return mapObjectMapper.readValue((InputStream) new ByteBufInputStream(buf), Object.class);
}
};
這個會默認把key設置成string。
測試
@Test
public void testMap() throws IOException {
ObjectMapper mapper = new ObjectMapper();
HashMap<Integer, String> map = new HashMap<>();
map.put(1, "a");
map.put(2, "b");
String s = mapper.writeValueAsString(map);
//{"1":"a","2":"b"}
System.out.println(s);
HashMap o = (HashMap)mapper.readValue(s, Object.class);
assertEquals(o.get("1"), "a");
assertNotEquals(o.get(1), "a");
}
因此,不要用Integer做為key,如果你想使用Json序列化。
在使用json緩存的時候,同樣不要將Integer當作HashMap的key類型。