Как использовать группы захвата регулярных выражений в сопоставлении ответов API-шлюза - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь отобразить некоторые данные из исключения, выданного лямбда-выражением, в ответ шлюза API, но у меня возникли проблемы.

Например, у меня есть лямбда, которая может генерировать исключение, подобное этому:

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)

Я написал регулярное выражение для соответствия сообщению об ошибке, но я хотел бы извлечь идентификатор пользователя из ошибки; и я надеялся использовать группу захвата, а затем ссылаться на нее в сопоставлении, например:

enter image description here

Но это не работает - $1 выглядит как строковый литерал.

В качестве обходного пути я отображаю сообщение об исключении с помощью этого шаблона сопоставления:

#set($inputRoot = $input.path('$'))
{
  "message" : "$inputRoot.errorMessage"
}

Но это компромисс, поскольку он отображает нативное лямбда-сообщение, которое, хотя в этом случае достаточно близко, кажется неправильным, потому что я полагаюсь на то, что лямбда выдает исключение с достаточно разумным сообщением об исключении, и оно похоже на выставление собственных сообщений об исключениях переднему интерфейсу, что, как мы знаем, является плохой практикой.

Есть идеи, как мне это сделать?


редактирует

В ответ на вопросы, заданные в комментариях:

  1. Значок (i) показывает это, когда завис над: enter image description here
  2. Попытка избежать ссылки на группу с помощью \1 или \$1 приводит к тому, что \1 или \$1 возвращаются в ответ в виде строковых литералов.
...