gpt4 book ai didi

java - Spring Boot 中的 Redis,保留 redis 模板

转载 作者:可可西里 更新时间:2023-11-01 11:14:31 25 4
gpt4 key购买 nike

我有一个项目的问题。我正在使用 spring 和 redis 创建一个非常原始的聊天程序。

我将 redis 连接作为 Spring Bean:

private HashOperations hashOps;

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

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

到这里一切似乎都正常,散列被声明为模板。但是现在我打电话

 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在主类(starter类)中连接:

@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);
}
}

现在的问题是,spring 在正常工作时如何实际保留 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";
}

最佳答案

此行正在实例化 UserRepositoryImpl 的新实例:

UserRepositoryImpl user = new UserRepositoryImpl(null);

您正在创建的这个实例没有以任何方式附加到 Spring。您甚至在这里明确地将 null 作为 redisTemplate 参数传递,所以这当然不会起作用。

您需要使用由 Spring 创建和管理的 UserRepositoryImpl 实例。为此,您需要指示 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";
}

关于java - Spring Boot 中的 Redis,保留 redis 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55995259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com