redisTemplate @Resource не работает с Spring Framework

1

Я создаю веб-приложение, которое использует Spring Framework 4.1.3 и использует Джерси для веб-службы RESTful.

Я хочу подключиться к серверу Redis, и я использую Spring Data Redis с драйвером Jedis.

Вот как выглядит мой файл Beans.xml:

<!-- Jedis ConnectionFactory -->
<bean id="jedisConnFactory"
    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
    p:host-name="server" p:port="6379" p:use-pool="true" 
/>

<!-- redis template definition -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
    p:connection-factory-ref="jedisConnFactory" 
/>

Это Servlet с доступом к серверу Redis:

import javax.annotation.Resource;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;

@Path("/")
public class RoutesServlet {

    @Autowired
    private RedisTemplate<String, String> template;


    // inject the template as ListOperations
    @Resource(name="redisTemplate")
    private ListOperations<String, String> listOps;

    @GET
    @Produces("text/plain")
    public String index() {

        listOps.leftPush("user", "name");
    ...

На данный момент я получаю исключение NullPointerException. Я предполагаю, что аннотация @Resource не работает должным образом по какой-то причине. Есть идеи?

ОБНОВИТЬ:

Это мой полный файл Beans.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    xmlns:p="http://www.springframework.org/schema/p"
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd ">

    <!-- Initialization for data source -->
    <!--bean id="dataSource" class="db.mysql.DBConn"> </bean -->

    <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/insider" />
        <property name="username" value="root" />
        <property name="password" value="" />
        <property name="jmxEnabled" value="true" />
        <property name="testWhileIdle" value="false" />
        <property name="testOnBorrow" value="true" />
        <property name="validationQuery" value="SELECT 1" />
        <property name="testOnReturn" value="false" />
        <property name="validationInterval" value="30000" />
        <property name="timeBetweenEvictionRunsMillis" value="30000" />
        <property name="maxActive" value="100" />
        <property name="initialSize" value="10" />
        <property name="maxWait" value="10000" />
        <property name="removeAbandonedTimeout" value="60" />
        <property name="minEvictableIdleTimeMillis" value="30000" />
        <property name="minIdle" value="10" />
        <property name="logAbandoned" value="true" />
        <property name="removeAbandoned" value="true" />
        <property name="jdbcInterceptors"
            value="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer" />
    </bean>

    <!-- Definition for categoryJDBCTemplate bean -->
    <bean id="categoryJDBCTemplate" class="db.mysql.CategoryJDBCTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- Definition for itemJDBCTemplate bean -->
    <bean id="itemJDBCTemplate" class="db.mysql.ItemJDBCTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- Definition for userJDBCTemplate bean -->
    <bean id="userJDBCTemplate" class="db.mysql.UserJDBCTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- Definition for reviewJDBCTemplate bean -->
    <bean id="reviewJDBCTemplate" class="db.mysql.ReviewJDBCTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- Jedis ConnectionFactory -->
    <bean id="jedisConnFactory"
        class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
        p:host-name="server" p:port="6379" p:use-pool="true" 
    />

    <!-- redis template definition -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
        p:connection-factory-ref="jedisConnFactory" 
    />

</beans>
  • 0
    Вы можете опубликовать свой файл Bean.xml ??
  • 0
    @ RE350 Я добавил файл Beans.xml. Спасибо :)
Показать ещё 4 комментария
Теги:
spring
redis
jedis
annotations

1 ответ

3
Лучший ответ

Я считаю, что это просто так, что bean с именем redisTemplate имеет тип RedisTemplate. Один из способов получить ListOperations - сделать следующее:

public class RedisExample {
    // Just use the RedisTemplate - don't inject the ListOperations
    private final RedisTemplate<String, String> redisTemplate;

    // Use constructor injection (preferred over field injection)
    @Autowired
    public RedisExample(final RedisTemplate<String, String> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void addLink(String userId, URL url) {
        // Here is the trick:
        // You can either retrieve the ListOperations this way
        ListOperations<String, String> listOps = redisTemplate.opsForList();
        listOps.leftPush(userId, url.toExternalForm());

        // or, you can retrieve it this way
        redisTemplate.boundListOps(userId).leftPush(url.toExternalForm());
    }
}

Пример показывает, что вы должны ввести компонент ListOperations с именем redisTemplate. Поскольку такого компонента нет, инъекция не проходит. Просто удалите аннотацию @Resource (и поле) и используйте код, как описано выше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню