我在自定义API网关域时遇到问题,我在AWS lambda上部署了我的restful app。自定义域,以这种方式工作,根据basePath,它选择不同的API,最终触及Lambda。例如:
api.mycustomdomain.com/view/ping
- >使用路径view
转到应用/view/ping
api.mycustomdomain.com/admin/ping
- >转到带有路径admin
/admin/ping
我使用此示例作为样板:https://github.com/awslabs/aws-serverless-java-container/tree/master/samples/spring/pet-store
我想要实现的是处理程序,它取决于Host
标题从请求路径中排除前缀。
我准备了以下application.yml文件:
server:
contextPath: "/view"
productionHost: "api.mycustomdomain.com"
问题/问题是。我现在如何将它们加载到我的Lambda函数中?这是我天真的尝试:
public class LambdaHandler implements RequestHandler<AwsProxyRequest, AwsProxyResponse> {
SpringLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler;
boolean isinitialized = false;
@Value("${server.contextPath}")
private String prefix;
@Value("${server.productionHost}")
private String productionHost;
public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) {
if(awsProxyRequest.getHeaders().get("Host").equals(productionHost))
awsProxyRequest.setPath(awsProxyRequest.getPath().substring(prefix.length()));
if (!isinitialized) {
isinitialized = true;
try {
handler = SpringLambdaContainerHandler.getAwsProxyHandler(PingPongApp.class);
} catch (ContainerInitializationException e) {
e.printStackTrace();
return null;
}
}
return handler.proxy(awsProxyRequest, context);
}
}
显然这不起作用,LambdaHandler正在使用Spring上下文。
任何想法我该如何处理?
答案 0 :(得分:0)
似乎你无法加载这些属性。请遵循以下两个选项中的任何一个。
1&GT;您可以在配置中添加以下bean,这样您就可以自动装配字符串并使用您已经使用的方式
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
return new PropertySourcesPlaceholderConfigurer();
}
2 - ;
public AwsProxyResponse..{
@Autowired
private Environment env;
..
public AwsProxyResponse handleRequest{
..
String contextPath = env.getRequiredProperty(“server.contextPath”));
...
}
}