为什么redis使用spring和default config通过JUnit运行NullPointerException?

时间:2014-05-29 21:19:08

标签: java spring redis

我正在使用Java 7,Spring 3.2,jedis 2.1.0,spring-data-redis 1.1.1开发OS X,尝试使用默认的redis配置设置最简单的redis。意思是我没有在redis.conf文件中添加任何内容。当我做的时候

redis-server

它表示已启动并已准备好接受端口6379上的连接。

最初,我使用Annotated Beans为RedisTemplate和JedisConnectionFactory尝试了这个,但是春天抱怨它无法创建或找到那些bean,所以我这样做了。也许这表明了一个更基本的问题。所以我使用下面稍长的版本来做到这一点,但这至少可以创建Redis和Jedis组件。

这是我的测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=AnnotationConfigContextLoader.class)
public class RedisTest {
    @Configuration
    static class ContextConfiguration {


    }

    RedisTemplate<String, String> template;

    private JedisConnectionFactory getJedisConnectionFactory() {
        JedisConnectionFactory factory = new JedisConnectionFactory();
        factory.setHostName("localhost");
        factory.setPort(6379);
        factory.setUsePool(true);
        return factory;
    }

    private RedisTemplate<String, String> getRedisTemplate() {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
        redisTemplate.setConnectionFactory(getJedisConnectionFactory());
        return redisTemplate;
    }

    @Test
    public void testRedis() {
        System.out.println("testing redis ");

        template = getRedisTemplate();

        template.opsForValue().set("Key", "Value");
        String value = template.opsForValue().get("Key");
        System.out.println("got value : " + value);
    }
}

并且错误堆栈跟踪的顶部是

java.lang.NullPointerException
java.lang.NullPointerException
    at org.springframework.data.redis.core.AbstractOperations.rawValue(AbstractOperations.java:110)
    at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:166)
    at com.mycompany.storage.RedisTest.testRedis(RedisTest.java:46)

1 个答案:

答案 0 :(得分:9)

问题是redisTemplate和jedisConnectionFactory都需要调用afterPropertiesSet()。通常这是由Spring配置调用的,但由于这对我来说不起作用,因此必须明确调用它。

此外,这些行

 factory.setHostName("localhost")
 factory.setPort(6379)
 factory.setUsePool(true)

是不必要的,因为它们是默认值。