java - Spring Boot中的Redis,保留redis模板
问题描述
我有一个项目的问题。我正在用spring和redis创建一个非常原始的聊天程序。
我将 redis 连接作为 Spring Bean:
private HashOperations hashOps;
@Autowired
public UserRepositoryImpl(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
@PostConstruct
private void init() {
hashOps = redisTemplate.opsForHash();
}
直到这里一切似乎都正常工作,并且 hashhops 被声明为模板。但现在我打电话
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 类)中是 Connected 的:
@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
参数传递,所以这当然是行不通的。
您需要使用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";
}
推荐阅读
- jwt - 如何在 FusionAuth 中生成签名和加密的 JWT 访问令牌
- kubernetes - 推出/重新启动我的应用程序时,kubernetes 服务是否可以更改 IP
- laravel - 当尝试运行 npm install 时显示此错误
- ios - 如何在 WebKit 中打开外部 URL?
- ruby-on-rails - 如何在 Rails 中的 ActiveRecord::Result 中对单个列(带有值)进行切片?
- python - 这个 Python 生成器示例到底是如何工作的?
- php - 'vcruntime140.dll' 14.0 与链接到 14.16 的 PHP 版本不兼容
- laravel - html选择选项的雄辩价值没有到达控制器对页面进行排序
- node.js - 如何在 ssh-exec 中使用 await/async?
- linux - 我们必须在哪里放置 linux 命令?