DefaultHashOperations multiget的一个坑
生活随笔
收集整理的這篇文章主要介紹了
DefaultHashOperations multiget的一个坑
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
DefaultHashOperations的multiget如果沒有數據會返回java.util.Collections.EmptyList,這個List沒有重寫add方法。
?
List<Long> resultIds=redisTemplate.boundHashOps(“key”).multiGet(ids)?
resultIds在add一個新元素時,報了一下的錯: java.lang.UnsupportedOperationExceptionat java.util.AbstractList.add(AbstractList.java:148)at java.util.AbstractList.add(AbstractList.java:108)?
原因:
org.springframework.data.redis.core.RedisTemplate#boundHashOps
public List<HV> multiGet(Collection<HK> hashKeys) {return ops.multiGet(getKey(), hashKeys);}org.springframework.data.redis.core.DefaultHashOperations#multiGet
public List<HV> multiGet(K key, Collection<HK> fields) {if (fields.isEmpty()) {return Collections.emptyList();//這個list是java.util.Collections#emptyList中的java.util.Collections.EmptyList}final byte[] rawKey = rawKey(key);final byte[][] rawHashKeys = new byte[fields.size()][];int counter = 0;for (HK hashKey : fields) {rawHashKeys[counter++] = rawHashKey(hashKey);}List<byte[]> rawValues = execute(new RedisCallback<List<byte[]>>() {public List<byte[]> doInRedis(RedisConnection connection) {return connection.hMGet(rawKey, rawHashKeys);}}, true);return deserializeHashValues(rawValues);}?
這個java.util.Collections.EmptyList沒有重寫add方法:
private static class EmptyList<E>extends AbstractList<E>implements RandomAccess, Serializable {private static final long serialVersionUID = 8842843931221139166L;public Iterator<E> iterator() {return emptyIterator();}public ListIterator<E> listIterator() {return emptyListIterator();}public int size() {return 0;}public boolean isEmpty() {return true;}public boolean contains(Object obj) {return false;}public boolean containsAll(Collection<?> c) { return c.isEmpty(); }public Object[] toArray() { return new Object[0]; }public <T> T[] toArray(T[] a) {if (a.length > 0)a[0] = null;return a;}public E get(int index) {throw new IndexOutOfBoundsException("Index: "+index);}public boolean equals(Object o) {return (o instanceof List) && ((List<?>)o).isEmpty();}public int hashCode() { return 1; }@Overridepublic boolean removeIf(Predicate<? super E> filter) {Objects.requireNonNull(filter);return false;}@Overridepublic void replaceAll(UnaryOperator<E> operator) {Objects.requireNonNull(operator);}@Overridepublic void sort(Comparator<? super E> c) {}// Override default methods in Collection @Overridepublic void forEach(Consumer<? super E> action) {Objects.requireNonNull(action);}@Overridepublic Spliterator<E> spliterator() { return Spliterators.emptySpliterator(); }// Preserves singleton propertyprivate Object readResolve() {return EMPTY_LIST;}}?
總結
以上是生活随笔為你收集整理的DefaultHashOperations multiget的一个坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过帧中继验证OSPF支持的不同网络类型
- 下一篇: 图片点击放大并可点击旋转插件(1)-jq