为了账号安全,请及时绑定邮箱和手机立即绑定

没有“org.springframework.security.crypto.bcrypt.

没有“org.springframework.security.crypto.bcrypt.

莫回无 2023-09-20 14:57:27
我正在使用 BCryptPasswordEncoder 来编码我的密码,但是当我使用它的编码函数在 UserService 类的保存函数中对密码进行编码时,它给了我这个错误:创建名称为“userController”的 bean 时出错:通过字段“userServiceInter”表达的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为“userService”的 bean 时出错:通过字段“crypt”表达的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有类型为“org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder”的合格 bean 可用:预计至少有 1 个有资格作为自动装配候选者的 bean。依赖注释:{@org.springframework.beans.factory.annotation.Autowired(required=true)}当我删除它时,它可以工作,但密码未编码。用户服务类:  @Service   public class UserService implements UserServiceInterface{@AutowiredUserRepository repo;@AutowiredBCryptPasswordEncoder crypt;@AutowiredRoleRepository roleRepo;public void save(User user) {        user.setPassword(crypt.encode(user.getPassword()));        Role role = roleRepo.findByRole("USER");        user.setRoles(new HashSet<Role>(Arrays.asList(role)));        repo.save(user);   }@Overridepublic User findByUsername(String userName) {    User user = repo.findByUserName(userName);    return user;}    }用户服务接口:   @Service    public interface UserServiceInterface {public void save(User user);public User findByUsername(String userName);    }
查看完整描述

3 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

改变


@Autowired

BCryptPasswordEncoder crypt;


@Autowired

PasswordEncoder crypt

或更改passwordEncoder方法


@Bean

BCryptPasswordEncoder passwordEncoder() {


    return new BCryptPasswordEncoder();

}


查看完整回答
反对 回复 2023-09-20
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

如果你想知道


“没有合格的 bean 类型”的含义

从下面的代码


@Bean

PasswordEncoder passwordEncoder() 

{

    return new BCryptPasswordEncoder();

}

绝对 bean 是使用type名称 创建的。passwordEncoder PasswordEncoder



@Autowired

BCryptPasswordEncoder crypt;

上面的代码要求 spring 容器注入类型为 的 bean BCryptPasswordEncoder。

(注意:passwordEncoder bean 可能是 BCryptPasswordEncoder 的实例,但 bean 的类型为PasswordEncoder,因此没有类型的 bean BCryptPasswordEncoder)


因此异常

没有类型为“org.springframework.security.crypto.bcrypt”的合格bean。BCryptPasswordEncoder '可用


因此,您可以将 name 的 bean 自动装配passwordEncoder到 type 的字段PasswordEncoder。

@Autowired

PasswordEncoder crypt;

passwordEncoder您还可以从应用程序上下文中按名称获取 bean

@Autowired

ApplicationContext context;


inYourMethod()

{

   PasswordEncoder crypt = context.getBean("passwordEncoder");

}



为了快速理解@Bean,@Autowired和@Qualifier简单的 6 个案例解释得很好

情况 1:创建的 bean 类型和 Autowired 字段的类型不同 - [这不起作用]

(没有可用的 BCryptPasswordEncoder 类型的合格 bean)


@Autowired

BCryptPasswordEncoder passwordEncoder;


@Bean

PasswordEncoder passwordEncoder() 

{

    return new BCryptPasswordEncoder();

}

情况 2:创建的 bean 类型和 Autowired 字段的类型相同 - [这不起作用]

@Autowired

PasswordEncoder passwordEncoder;


@Bean

PasswordEncoder passwordEncoder() 

{

    return new BCryptPasswordEncoder();

}

情况 3:自动装配字段的类型是创建的 bean 的超类型 - [这将起作用] 创建的 bean 是否属于 BCryptPasswordEncoder 类型 -

是 创建的 bean 是否属于 PasswordEncoder 类型 - 是

@Autowired

PasswordEncoder passwordEncoder;


@Bean

BCryptPasswordEncoder passwordEncoder() 

{

    return new BCryptPasswordEncoder();

}

情况 4:相同类型且没有 @Qualifier 的多个 bean - [这不起作用]

NoUniqueBeanDefinitionException:没有可用的“osscpPasswordEncoder”类型的合格 bean:预期有单个匹配 bean,但发现 2:bcryptPasswordEncoder、md4PasswordEncoder


@Autowired

PasswordEncoder bcrypt;


@Autowired

PasswordEncoder md4;


@Bean

public PasswordEncoder bcryptPasswordEncoder() 

{

    return new BCryptPasswordEncoder();

}


@Bean

public PasswordEncoder md4PasswordEncoder() 

{

    return new Md4PasswordEncoder();

}

案例 5:相同类型且带有 @Qualifier 的多个 bean - [这将起作用]

限定符有助于选择要注入的 bean

@Autowired

@Qualifier("bcryptPasswordEncoder")

PasswordEncoder bcrypt;


@Autowired

@Qualifier("md4PasswordEncoder")

PasswordEncoder md4;


@Bean

public PasswordEncoder bcryptPasswordEncoder() 

{

    return new BCryptPasswordEncoder();

}


@Bean

public PasswordEncoder md4PasswordEncoder() 

{

    return new Md4PasswordEncoder();

}

情况 6:相同类型的多个 bean,没有 @Qualifier,但字段名称与 bean 名称相同 - [这可行]

这里,字段名称充当限定符,当存在多个相同类型的 bean 时,它会有所帮助。


@Autowired

PasswordEncoder bcryptPasswordEncoder;


@Autowired

PasswordEncoder md4PasswordEncoder;


@Bean

public PasswordEncoder bcryptPasswordEncoder() 

{

    return new BCryptPasswordEncoder();

}


@Bean

public PasswordEncoder md4PasswordEncoder() 

{

    return new Md4PasswordEncoder();

}


查看完整回答
反对 回复 2023-09-20
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

在 applicationContext.xml 中添加此行,以便开发人员使用 xml。

<bean id="bcrypt" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></bean>



查看完整回答
反对 回复 2023-09-20
  • 3 回答
  • 0 关注
  • 164 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信