如何解决尝试建议后@Autowired 字段为空
我一直在尝试按照 https://www.baeldung.com/spring-security-registration-password-encoding-bcrypt 处的教程对密码进行加密。我创建了我的 bean,但有一个很常见的问题,即我的自动装配字段从未被注入。我已经尝试解决这个问题一段时间了,遵循这里的各种建议,例如以下资源 Why is my Spring @Autowired field null? 但似乎没有任何帮助,而且我真的不太确定我要去哪里错误的。我什至尝试将 bean 放入 xml 中,尽管我也无法使其正常工作。
这是我目前的代码:
@Service
@Configurable
public class User {
@Id
private UUID id;
private long alias;
private String username;
private String password;
@Autowired
private PasswordEncoder passwordEncoder;
正在设置 bean 的配置类:
@Configuration
public class Config {
@Bean
public PasswordEncoder encoder() {
return new BCryptPasswordEncoder();
}
}
我对 spring 很陌生,所以如果这是一个非常明显的修复,我很抱歉,我只是不知道如何尝试让它工作。感谢您的帮助。
使用限定符更新代码:
配置类:
@Configuration
public class Config {
@Bean("bCryptPasswordEncoder")
public PasswordEncoder encoder() {
return new BCryptPasswordEncoder();
}
用户类别:
@Autowired
@Qualifier("bCryptPasswordEncoder")
private PasswordEncoder passwordEncoder;
用户是如何被实例化的:
@PostMapping("/users")
public String newUser(@RequestBody User newUser) {
if (repository.existsByUsername(newUser.getUsername())){
return new UserAlreadyExistsException(newUser.getUsername()).getMessage(newUser.getUsername(),repository);
}
User u = new User(getAlias(repository),newUser.getUsername(),newUser.getpassword());
repository.save(u);
return "{\"message\" : \"user\",\"user\" : " + u.toString() + "}";
}
解决方法
您正在尝试注入接口,spring 不知道从哪个实现中选择。
要解决此问题,请添加以下内容:
@Bean("bCryptPasswordEncoder")
public PasswordEncoder encoder() {
return new BCryptPasswordEncoder();
}
和
@Autowired
@Qualifier("bCryptPasswordEncoder")
private PasswordEncoder encoder;
见:
如果您使用构造函数注入(强烈推荐),您可以添加 @Qualifier("bCryptPasswordEncoder") 在变量之前的构造函数中,像这样:
public User(@Qualifier("bCryptPasswordEncoder") PasswordEncoder encoder) {
this.encoder = encoder;
}
附言
我强烈建议使用 Spring 5 委派密码编码器以实现未来的兼容性
baeldung delegating password encoder examples
P.P.S 用户是数据成员,不应该持有密码编码器,在数据成员和业务逻辑之间创建分离是一个很好的设计模式(搜索spring层架构), >
如果这是一个新项目,我会更进一步,看看 Onion 架构: Onion architecture
P.P.P.s 我也建议你看看 lombok 项目 :)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。