DefaultHashOperations multiget的一个坑

DefaultHashOperations的multiget如果没有数据会返回java.util.Collections.EmptyList,这个List没有重写add方法。

List<Long> resultIds=redisTemplate.boundHashOps(“key”).multiGet(ids)
resultIds在add一个新元素时,报了一下的错:
java.lang.UnsupportedOperationException
        at 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; }

        @Override
        public boolean removeIf(Predicate<? super E> filter) {
            Objects.requireNonNull(filter);
            return false;
        }
        @Override
        public void replaceAll(UnaryOperator<E> operator) {
            Objects.requireNonNull(operator);
        }
        @Override
        public void sort(Comparator<? super E> c) {
        }

        // Override default methods in Collection
        @Override
        public void forEach(Consumer<? super E> action) {
            Objects.requireNonNull(action);
        }

        @Override
        public Spliterator<E> spliterator() { return Spliterators.emptySpliterator(); }

        // Preserves singleton property
        private Object readResolve() {
            return EMPTY_LIST;
        }
    }
时间: 2024-10-18 08:50:10

DefaultHashOperations multiget的一个坑的相关文章

踩到Framework7 Photo Browser 的一个坑

最近在做的项目用了Framework7前端框架,功能确实比较强大!但这两天遇到一个坑,希望我的这点收获能给遇到这个问题的朋友一点帮助. 在使用Photo Browser 的时候,图片下方想放一个“点赞”的按钮,耐何就死活无法响应鼠标的点击事件(click tap都不行).怀疑被父级元素拦截了,反复各种折腾就是没效果! 最后都要放弃的时候,都准备移除“点赞”功能了,无意中发现.photo-browser-captions这个层有个样式是 pointer-events: none; 翻了一下CSS手

PHP中逻辑运算符and/or与||/&amp;&amp;的一个坑

我原来以为PHP中的and和&&是一样的, 只是写法上为了可读性和美观, 事实上我错了. 这里面深藏了一个坑! 看以下代码: $bA = true; $bB = false; $b1 = $bA and $bB; $b2 = $bA && $bB; var_dump($b1); // $b1 = true var_dump($b2); // $b2 = false $bA = false; $bB = true; $b3 = $bA or $bB; $b4 = $bA ||

Android 和Java API的一个坑:SimpleDateFormat

今天上班遇到这么一个意料之外的异常: 出问题的代码是这样的(已去除上下文信息): Log.i(LOG_TAG, new SimpleDateFormat("YYYY-MM-dd HH:mm:ss", Locale.CHINA) .format(System.currentTimeMillis())); 反复检查,感觉没有问题,于是新建一个Java Project,直接输出同样的代码: public class Main{ public static void main(String[]

关于UWP数据绑定的一个坑 x:bind修改为binding

<Page    x:Class="AlbumCoverMatchGame.MainPage"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    xmlns:local="using:AlbumCoverMatchGame&

【Java记录】try-with-resources的一个坑

[Java记录]try-with-resources的一个坑 今天处理 AsynchronousFileChannel 时候的一个问题,代码如下: public static void main(String[] args) throws Exception { String filePath = "/home/xe/git/osc/JavaNote/Lang/data/Test.java"; ExecutorService executorService = Executors.ne

openlayer关于feature中的一个坑

在Openlayer中使用Feature时候,有时候我们需要使用图片来做Maker,今天就讲我在这碰到的一个坑. 这一个除了黄色部分其他部分透明的png图片. 将其加入地图中后. 我们要注册一个Feature的Select事件. 结果,点击中间透明部分时,竟然没有信息提示,只有点击黄色部分时候才有提示!这不科学!!! 后来,为了证明是不是图片中间透明的原因.我请美工妹妹帮我弄了另一张图. 就是它了.替换图片后,结果是点击圆里都行!这不科学啊! 好了,这是一个坑,写下来纪念. 有关于openlay

记学习PHP掉进去的第一个坑

从前几天开始刚开是学习PHP,就经历了一个坑,让人确实挺郁闷的,主要是因为开发环境的问题. 直接切入正题. =================================================================================================== 实验环境:PHPStorm2016 + Xampp 在学习使用表单的post方法接受数据一节时,怎么也接受不到数据,不知道怎么回事.代码如下 <form name="form1"

MySQL JDBC的queryTimeout的一个坑

遇到一个MySQL JDBC的queryTimeout的坑,比较恶心,算是它的BUG,也可以不算,^_^,为啥这么说?看一下下面的解释: 现象: 用同一个Connection执行大批量SQL的时候,导致了OOM现象. 细节现象描述: 1.SQL是从某个存储设备上拿到的,不会直接占用大量的内存,每次只会取最多1千条数据过去,也会判定容量不超过多少M. 2.每一批SQL执行会单独创建Statement对象,执行一批SQL后,会将这个Statement关闭掉. 3.SQL语句中只有insert,没有其

bootstrap 中的静态模式的控制按钮上的一个坑

在使用modal时发现,代码:<button class="btn btn-danger" data-toggle="modal" data-target="#myModal">删除</button>,button按钮点击没有反映,经过与自带的实例对比,发现一个区别,就是type="button"没有加,真是一个坑啊 <button class="btn btn-danger"