You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:39:40