Redis in Spring Boot, сохраняя шаблон redis - PullRequest
0 голосов
/ 05 мая 2019

У меня проблема с проектом.Я создаю очень примитивную программу чата с spring и redis.

У меня есть подключение redis как Spring Bean:

private HashOperations hashOps;

@Autowired
public UserRepositoryImpl(RedisTemplate redisTemplate) {
    this.redisTemplate = redisTemplate;
}

@PostConstruct
private void init() {
    hashOps = redisTemplate.opsForHash();
}

Пока здесь все не работает, и hashopобъявлен как шаблон.Но теперь я звоню

 public boolean createUser(User user){
        if(user.getName().isEmpty() || user.getPassword().isEmpty()){
            return false;
        }
        user.setStatus("");
        if(hashOps.putIfAbsent(KEY, user.getName(), user)){
            List<String> following = null;
            hashOps.put("isFollowing", user.getName(),following);
            FollowListImpl fLI = new FollowListImpl(this.redisTemplate);
            fLI.follow("global", user);
            return true;
        }
        return false;
    }

, чтобы создать первые данные (пользователя) в redis.Этот метод находится в том же классе, что и объявление hashOps, но hasOps теперь равно NULL.Но когда я использую проект от кого-то другого, у которого есть подобное, решение hashOps сохраняет шаблон даже при вызовах методов.

Redis подключается в основном классе (начальный класс):

@SpringBootApplication
public class CommunicatorApplication {

@Bean
public JedisConnectionFactory getConnectionFactory() {
    JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
    jedisConnectionFactory.setPort(6379);
    jedisConnectionFactory.setHostName("localhost");
    jedisConnectionFactory.setPassword("");
    return jedisConnectionFactory;
}

@Bean
RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(getConnectionFactory());
    return template;
}

public static void main(String[] args) {
    SpringApplication.run(CommunicatorApplication.class, args);
}
}

Теперь вопрос в том, как пружина на самом деле сохраняет hashOps, когда она работает должным образом, и что я сделала неправильно, что она не сохраняет это в моем коде.

Я звоню createUser здесь:

  @Controller
public class LoginController {
     @RequestMapping(value = "/login", params = "btnRegister")
    public String loginRegister(@ModelAttribute Login login, Model model){
        model.addAttribute("login", login != null ? login : new Login());
        UserRepositoryImpl user = new UserRepositoryImpl(null);
        user.createUser(login.getName(),login.getPassword());
        System.out.println(user.findUser(login.getName()));
        return "login";
    }

1 Ответ

1 голос
/ 06 мая 2019

Эта строка создает новый экземпляр UserRepositoryImpl:

UserRepositoryImpl user = new UserRepositoryImpl(null);

Этот экземпляр, который вы создаете, никак не связан с Spring. Вы даже явно передаете null в качестве аргумента redisTemplate, поэтому, конечно, это не сработает.

Вам необходимо использовать экземпляр UserRepositoryImpl, созданный и управляемый Spring. Для этого вам нужно указать Spring подключить экземпляр к LoginController. Один из способов сделать это - использовать аннотацию @Autowired следующим образом:

@Controller
public class LoginController {
    @Autowired
    private UserRepositoryImpl userRepository;

    @RequestMapping(value = "/login", params = "btnRegister")
    public String loginRegister(@ModelAttribute Login login, Model model){
        model.addAttribute("login", login != null ? login : new Login());
        userRepository.createUser(login.getName(),login.getPassword());
        System.out.println(userRepository.findUser(login.getName()));
        return "login";
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...