我正在尝试将Lambda抛出的异常中的一些数据映射到API网关响应,但是遇到了问题。
例如,我有一个可以抛出异常的Lambda:
User some-user-id exists: java.lang.IllegalStateException
java.lang.IllegalStateException: User some-user-id exists
at u.c.c.e.s.lambda.user.handler.RegisterNewUserRequestHandler.handleRequest(RegisterNewUserRequestHandler.java:68)
Caused by: com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException: The conditional request failed (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ConditionalCheckFailedException; Request ID: UONMOKNKVSEIL8EI6T6NVPODOJVV4KQNSO5AEMVJF66Q9ASUAAJG)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1630)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1302)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1056)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:717)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667)
at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.doInvoke(AmazonDynamoDBClient.java:3082)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:3058)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.executeUpdateItem(AmazonDynamoDBClient.java:2778)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.updateItem(AmazonDynamoDBClient.java:2753)
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$SaveObjectHandler.doUpdateItem(DynamoDBMapper.java:854)
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$2.executeLowLevelRequest(DynamoDBMapper.java:594)
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$SaveObjectHandler.execute(DynamoDBMapper.java:733)
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.save(DynamoDBMapper.java:623)
at com.amazonaws.services.dynamodbv2.datamodeling.AbstractDynamoDBMapper.save(AbstractDynamoDBMapper.java:128)
at uk.co.claritysoftware.exam.slammr.lambda.user.handler.RegisterNewUserRequestHandler.saveNewUserIfNotExists(RegisterNewUserRequestHandler.java:97)
at uk.co.claritysoftware.exam.slammr.lambda.user.handler.RegisterNewUserRequestHandler.handleRequest(RegisterNewUserRequestHandler.java:63)
我写了一个正则表达式来匹配错误信息,但我想从错误中提取用户ID;我希望使用一个捕获组,然后在映射中引用它,如下所示:
但它不起作用 - $1
似乎被视为字符串文字。
作为解决方法,我使用此映射模板映射异常消息:
#set($inputRoot = $input.path('$'))
{
"message" : "$inputRoot.errorMessage"
}
但这是妥协,因为它映射了原生的Lambda消息,虽然在这种情况下足够接近,但感觉不对,因为我依赖Lambda抛出一个带有合理合理的异常消息的异常,并且感觉类似于将本机异常消息暴露给前端,我们知道这是不好的做法。
我有什么想法可以做到这一点吗?
回答评论中提出的问题: