在springboot中使用Jasypt加密库的时候,按照官方文档的说法,如果要替换默认的加密器,只要手工注入一个名字为jasyptStringEncryptor的bean即可替换默认的StringEncryptor对象,但是我操作后,spring一直报“required a single bean, but 2 were found”,类型重复了。查阅了很多材料的,觉得自己的方法并没有错,但是就是不行,切换过springboot2和springboot3,JDK8 11 17,都是一样,以下是我的代码和报错信息,请参考:
有人说,要不换个id,不要叫jasyptStringEncryptor试下,结果还是一样!
感谢解答!
我查阅的主要文档有:
https://blog.terrynow.com/2022/12/09/springboot-jasypt-encrypt-and-decrypt-config/
https://github.com/ulisesbocchio/jasypt-spring-boot/issues/23
“Devil组”引证GPT后的撰写:
移除该方法上的static修饰符,并为该方法指定一个唯一的bean名称,例如:
@Configuration
public class JasyptConfig {
@Bean(name="myStringEncryptor")
public StringEncryptor stringEncryptor() {
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setPassword("passwd");
return encryptor;
}
}
然后,在需要使用该bean的地方,使用该名称进行注入,例如:
@Autowired
@Qualifier("myStringEncryptor")
private StringEncryptor stringEncryptor;
参考GPT和自己的思路,根据您提供的代码和错误信息,看起来您的问题在于bean的名称没有匹配。您在JasyptConfig类中定义了一个名为“jasyptstringEncryptor”的bean,但是错误信息中显示它找到了两个bean:一个是“jasyptstringEncryptor”,另一个是“lazyJasyptstringEncryptor”。因此,建议您检查一下bean的名称是否与您的代码中的名称匹配。
另外,您的代码中使用了static关键字来定义bean。这可能会导致Spring在创建bean时出现问题,因为它可能会尝试在没有类实例的情况下创建bean。建议您尝试去掉static关键字并将@Bean注解添加到方法上,以便Spring可以正确地创建bean。
下面是一个修正后的JasyptConfig类的示例代码:
@Configuration
public class JasyptConfig {
@Bean(name = "jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setPassword("passwd");
return encryptor;
}
}
请注意,这里的bean名称已更改为“jasyptStringEncryptor”,这应该与您的代码中使用的名称匹配。此外,我已经将@Bean注解添加到方法上,并删除了static关键字。
希望这能帮助您解决问题。