Spring Boot部署AWS Lambda无法读取application.properties配置问题
问题描述
开发可访问数据库获取信息的功能,计划部署到AWS Lambda函数中,核心业务代码如下:
@Service public class TestConnection { @Autowired public DataSource dataSource; @Value("${spring.datasource.url}") private String dbUrl; public void CheckConnection() { try { System.out.println(dbUrl); System.out.println(this.dataSource.toString()); System.out.println(this.dataSource.getConnection()); System.out.println(this.dataSource.getConnection().getCatalog()); } catch (Exception ex) { System.out.println(ex); System.out.println(ex.getMessage()); } }
功能在本地环境运行完全正常,但打包为Jar文件部署到AWS Lambda函数后,无法读取application.properties中的任何配置值,运行输出日志如下:
START RequestId: e30a31c6-0ada-4c40-a038-9ffcd288d15f Version: $LATEST null java.lang.NullPointerException null END RequestId: e30a31c6-0ada-4c40-a038-9ffcd288d15f REPORT RequestId: e30a31c6-0ada-4c40-a038-9ffcd288d15f Duration: 4.95 ms
POM文件中构建Jar包的插件配置如下:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.7.1</version> <configuration> <classifier>exec</classifier> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
问题根因
从日志第一行输出null(对应dbUrl的打印)、紧接着调用dataSource就触发空指针的现象判断,核心问题不是配置文件读取失败,是Spring容器根本没有完成初始化,所有通过注解注入的属性和Bean都没有被赋值,结合现有配置可以定位到三个具体诱因:
- 插件配置冗余冲突:重复声明了两次
spring-boot-maven-plugin,同时叠加了未做适配配置的maven-shade-plugin,打包过程会破坏Spring Boot可执行Jar的标准结构,要么配置文件没有被打入Jar包类路径,要么Spring的SPI元数据被覆盖,导致容器无法正常启动。 - 上传了错误的Jar包:配置中第二个
spring-boot-maven-plugin指定了exec分类器,构建时会额外生成一个带exec后缀的可执行Jar,不带分类器的原始Jar是不含依赖、不含完整配置的普通包,上传到Lambda就会出现注入失败的问题。 - Lambda入口配置错误:如果直接将
TestConnection类指定为Lambda处理程序,Lambda运行时不会触发Spring上下文初始化流程,所有@Autowired、@Value标记的依赖都不会被注入,直接调用方法就会触发空指针。
修复步骤
- 清理冗余插件配置:删除重复声明的
spring-boot-maven-plugin,如果使用Spring Boot官方插件打可执行Jar,可以直接移除冗余的maven-shade-plugin,避免打包结构被破坏。如果必须使用shade插件打Lambda适配的Uber Jar,需要追加Spring相关的资源转换器配置,避免配置文件、SPI元数据被覆盖。 - 校验上传的Jar包:打包后到target目录下确认,要上传的是体积较大、包含所有依赖的Fat Jar,不要上传体积很小的原始普通Jar。可以解压Jar包做结构验证,确认
application.properties位于BOOT-INF/classes/路径下,META-INF目录下的Spring元数据文件完整无缺失。 - 修正Lambda入口配置:不要直接指向业务Service类作为Lambda处理程序,需要使用Spring Boot适配Lambda的入口类,比如继承
SpringBootRequestHandler实现启动入口,保证Lambda启动时会先初始化Spring容器,完成所有Bean和配置的注入后再执行业务逻辑。
内容的提问来源于stack exchange,提问作者hai pham
相关产品推荐
相关产品推荐

