目录

1. 详细的报错信息

2. 解决方案

3. 那为什么这样解决呢?

4. 补充BindException异常

4.1 什么是属性绑定?

4.2 为什么会出现BindException?

4.3 BindException的常见场景

4.4 如何解决BindException?


        由于昨晚写完一篇关于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.propertiesapplication.yml文件的配置)来设置应用程序的属性时。

4.1 什么是属性绑定?

在Spring应用程序中,属性绑定是指将外部配置源(如配置文件、环境变量等)中的值映射到Spring管理的JavaBean属性上的过程。Spring使用一套复杂的绑定机制来实现这一点,这包括类型转换、集合处理、SPA(Spring Expression Language)表达式解析等。

4.2 为什么会出现BindException?

当Spring尝试将配置值绑定到Java对象的属性上,但无法完成这一过程时,就会抛出BindException。这可能由以下原因引起:

  1. 类型不匹配:配置值的类型与目标属性的类型不匹配,且无法自动转换。
  2. 格式错误:配置值的格式不正确,例如,一个数字类型的属性被赋予了一个非数字的字符串。
  3. 缺少属性:配置中缺少了必需的属性值。
  4. 复杂的对象结构:当配置需要绑定到一个复杂对象或嵌套对象时,如果配置结构不正确或不完整,也可能导致绑定失败。
  5. 自定义验证失败:如果配置属性被注解为需要特定的验证(如@Valid@NotNull),而验证未通过,也会引发此异常。

4.3 BindException的常见场景

  • 数据库配置错误:如前所述,数据库密码(spring.datasource.password)配置错误是一个常见的场景。
  • 不合规的配置格式:例如,配置文件中的YAML格式不正确,导致Spring无法解析配置。
  • 环境特定的配置问题:在不同的部署环境中,配置属性可能需要特定的格式或值,如果这些要求没有被满足,也可能导致绑定异常。

4.4 如何解决BindException?

解决BindException通常涉及以下步骤:

  1. 检查配置文件:确保配置文件中的属性名正确,且所有必需的属性都已提供。
  2. 验证属性类型和格式:确保配置文件中的值与目标Java属性的类型兼容,并且格式正确。
  3. 查看错误信息BindException通常会提供详细的错误信息,包括失败的属性路径和原因。仔细阅读这些信息可以帮助定位问题。
  4. 使用Spring的诊断功能:运行应用程序时加上--debug-trace参数可以提供更详细的日志输出,有助于诊断问题。
  5. 单元测试:编写单元测试来验证配置属性的绑定是否按预期工作。
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐