@autowired字段在尝试建议后为空

syqv5f0l  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(275)

我一直在尝试按照这里的教程加密密码https://www.baeldung.com/spring-security-registration-password-encoding-bcrypt. 我创建了bean,但有一个很常见的问题,即我的自动连接字段从未被注入。我已经尝试解决这个问题很长一段时间了,在这里遵循各种建议,比如下面的资源为什么我的spring@autowired字段是空的?但这些帮助似乎都不起作用,我真的不太确定我哪里出了问题。我甚至试着把bean放到xml中,尽管我也不能让它工作。
以下是我目前的代码:
用户类,其中autowired字段为空

@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() + "}";
    }
2guxujil

2guxujil1#

您正在尝试注入接口,spring不知道从哪个实现中选择。
要解决此问题,请添加以下内容:

@Bean("bCryptPasswordEncoder")
public PasswordEncoder encoder() { 
    return new BCryptPasswordEncoder();
}

@Autowired
@Qualifier("bCryptPasswordEncoder")
private PasswordEncoder encoder;

请参见:
baeldung限定符
如果您使用的是构造函数注入(强烈建议),那么可以在构造函数中的变量前面添加@qualifier(“bcryptpasswordencoder”),如下所示:

public User(@Qualifier("bCryptPasswordEncoder") PasswordEncoder encoder) {
    this.encoder = encoder;
}

附笔
为了将来的兼容性,我强烈建议使用spring5授权密码编码器
baeldung授权密码编码器示例
p、 p.s用户是一个数据成员,不应该持有密码编码器,在数据成员和业务逻辑(search-spring-layer架构)之间建立分离是一种很好的设计模式,
如果这是一个新项目,我会更进一步,看看洋葱架构:洋葱架构
p、 另外,我建议你看看Lombok山项目:)

相关问题