目录
由于昨晚写完一篇关于SpringBoot集成jasypt对敏感信息进行加密的文章后,又踩到坑啦。今天就急忙给大家分享出来:
1. 详细的报错信息
Description:
Failed to bind properties under 'spring.datasource.password' to java.lang.String:
Reason: org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'spring.datasource.password' to java.lang.String
Action:
Update your application's configuration
这个错误信息表明Spring Boot在尝试将配置文件中的spring.datasource.password
属性绑定到一个java.lang.String
类型的字段时失败了。这种情况的话应该就是解密失败了。程序解密不出一个完整的字符串。
2. 解决方案
- 将版本从3.x降到2.x;
- 在配置文件中指定加密算法:
jasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator jasypt.encryptor.algorithm=PBEWithMD5AndDES
3. 那为什么这样解决呢?
这是因为官方在3.x版本以后就更改了加密算法,所以如果你不设置的话,使用它3.x版本中默认的加密算法(也就是昨晚的文章中提到的:PBEWITHHMACSHA512ANDAES_256),就会报错,这个报错的讲解在上一篇文章内可以找到哈。同样2.x和3.x版本的区别就在这里了。
4. 补充BindException异常
本篇文章中的异常类型属于BindException,那么我们来补充一下这个内容,BindException是Spring框架抛出的一个异常,它表明在绑定属性值到配置目标对象时出现了问题。这种异常通常发生在Spring Boot应用程序的上下文中,特别是当使用外部配置(如来自application.properties
或application.yml
文件的配置)来设置应用程序的属性时。
4.1 什么是属性绑定?
在Spring应用程序中,属性绑定是指将外部配置源(如配置文件、环境变量等)中的值映射到Spring管理的JavaBean属性上的过程。Spring使用一套复杂的绑定机制来实现这一点,这包括类型转换、集合处理、SPA(Spring Expression Language)表达式解析等。
4.2 为什么会出现BindException?
当Spring尝试将配置值绑定到Java对象的属性上,但无法完成这一过程时,就会抛出BindException
。这可能由以下原因引起:
- 类型不匹配:配置值的类型与目标属性的类型不匹配,且无法自动转换。
- 格式错误:配置值的格式不正确,例如,一个数字类型的属性被赋予了一个非数字的字符串。
- 缺少属性:配置中缺少了必需的属性值。
- 复杂的对象结构:当配置需要绑定到一个复杂对象或嵌套对象时,如果配置结构不正确或不完整,也可能导致绑定失败。
- 自定义验证失败:如果配置属性被注解为需要特定的验证(如
@Valid
或@NotNull
),而验证未通过,也会引发此异常。
4.3 BindException的常见场景
- 数据库配置错误:如前所述,数据库密码(
spring.datasource.password
)配置错误是一个常见的场景。 - 不合规的配置格式:例如,配置文件中的YAML格式不正确,导致Spring无法解析配置。
- 环境特定的配置问题:在不同的部署环境中,配置属性可能需要特定的格式或值,如果这些要求没有被满足,也可能导致绑定异常。
4.4 如何解决BindException?
解决BindException
通常涉及以下步骤:
- 检查配置文件:确保配置文件中的属性名正确,且所有必需的属性都已提供。
- 验证属性类型和格式:确保配置文件中的值与目标Java属性的类型兼容,并且格式正确。
- 查看错误信息:
BindException
通常会提供详细的错误信息,包括失败的属性路径和原因。仔细阅读这些信息可以帮助定位问题。 - 使用Spring的诊断功能:运行应用程序时加上
--debug
或-trace
参数可以提供更详细的日志输出,有助于诊断问题。 - 单元测试:编写单元测试来验证配置属性的绑定是否按预期工作。