微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试建议后@Autowired 字段为空

如何解决尝试建议后@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;

见:

baeldung qualifier

如果您使用构造函数注入(强烈推荐),您可以添加 @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 举报,一经查实,本站将立刻删除。