将 Spring boot/cloud 与 Amazon AWS lambda 结合使用不会注入值
我有一个 AWS lambda 类,它由 AWS 直接调用。最终,我需要让它与Spring Boot一起使用,因为我需要它能够从Spring Cloud配置服务器检索数据。RequestHandler
问题在于,如果我从自己的开发环境本地运行代码,但无法在 AWS 上部署时注入配置值,则代码可以正常工作。
@Configuration
@EnableAutoConfiguration
@ComponentScan("my.package")
public class MyClass implements com.amazonaws.services.lambda.runtime.RequestHandler<I, O> {
public O handleRequest(I input, Context context) {
ApplicationContext applicationContext = new SpringApplicationBuilder()
.main(getClass())
.showBanner(false)
.web(false)
.sources(getClass())
.addCommandLineProperties(false)
.build()
.run();
log.info(applicationContext.getBean(SomeConfigClass.class).foo);
// prints cloud-injected value when running from local dev env
//
// prints "${path.to.value}" literal when running from AWS
// even though Spring Boot starts successfully without errors
}
}
@Configuration
public class SomeConfigClass {
@Value("${path.to.value}")
public String foo;
}
src/main/resources/bootstrap.yml:
spring:
application:
name: my_service
cloud:
config:
uri: http://my.server
failFast: true
profile: localdev
我试过了什么:
- 使用常规的Spring MVC,但这没有与
@Value
注入/Spring Cloud集成。 - 使用 - 但发现它不支持.yml文件
@PropertySource
- 验证以确保配置服务器正在向任何IP地址提供请求(没有IP地址过滤)
- 运行以确保价值恢复
curl
- 验证以确保.jar实际上包含在罐根
bootstrap.yml
- 验证以确保.jar实际包含 Spring Boot 类。FWIW 我正在使用 Maven 阴影插件,它将项目打包成一个包含所有依赖项的胖.jar。
注意:AWS Lambda 不支持环境变量,因此我无法设置类似的东西 (既不作为环境变量也不作为参数)。我也无法控制实际启动的基础类 - 这对最终用户是完全透明的。我只是打包罐子并提供入口点(类名),其余的都照顾好了。spring.application.name
-D
MyClass
有什么我可以错过的吗?有什么方法可以更好地调试它吗?