@@ -4,6 +4,8 @@ import com.amazonaws.services.lambda.runtime.Context
44import com.amazonaws.services.lambda.runtime.RequestHandler
55import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent
66import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent
7+ import com.fasterxml.jackson.core.JsonParseException
8+ import com.fasterxml.jackson.databind.exc.InvalidDefinitionException
79import com.fasterxml.jackson.databind.exc.InvalidFormatException
810import com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException
911import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
@@ -122,6 +124,8 @@ abstract class RequestHandler : RequestHandler<APIGatewayProxyRequestEvent, APIG
122124 */
123125 open fun createUnprocessableEntityErrorBody (errors : List <UnprocessableEntityError >): Any = errors
124126
127+ private fun createUnprocessableEntityErrorBody (error : UnprocessableEntityError ): Any = createUnprocessableEntityErrorBody(listOf (error))
128+
125129 open fun createApiExceptionErrorResponse (contentType : MediaType , input : APIGatewayProxyRequestEvent , ex : ApiException ): APIGatewayProxyResponseEvent =
126130 createErrorBody(ex.toApiError()).let {
127131 APIGatewayProxyResponseEvent ()
@@ -138,19 +142,39 @@ abstract class RequestHandler : RequestHandler<APIGatewayProxyRequestEvent, APIG
138142
139143 open fun createUnexpectedErrorResponse (contentType : MediaType , input : APIGatewayProxyRequestEvent , ex : Exception ): APIGatewayProxyResponseEvent =
140144 when (ex) {
145+ is JsonParseException -> createResponse(contentType, input,
146+ ResponseEntity (422 , createUnprocessableEntityErrorBody(
147+ UnprocessableEntityError (
148+ message = " INVALID_ENTITY" ,
149+ code = " ENTITY" ,
150+ path = " " ,
151+ details = mapOf (
152+ " payload" to ex.requestPayloadAsString.orEmpty(),
153+ " message" to ex.message.orEmpty()
154+ )))))
155+ is InvalidDefinitionException -> createResponse(contentType, input,
156+ ResponseEntity (422 , createUnprocessableEntityErrorBody(
157+ UnprocessableEntityError (
158+ message = " INVALID_FIELD_FORMAT" ,
159+ code = " FIELD" ,
160+ path = ex.path.last().fieldName.orEmpty(),
161+ details = mapOf (
162+ " cause" to ex.cause?.message.orEmpty(),
163+ " message" to ex.message.orEmpty()
164+ )))))
141165 is InvalidFormatException ->
142166 createResponse(contentType, input,
143- ResponseEntity (422 , createUnprocessableEntityErrorBody(listOf (
167+ ResponseEntity (422 , createUnprocessableEntityErrorBody(
144168 UnprocessableEntityError (
145169 message = " INVALID_FIELD_FORMAT" ,
146170 code = " FIELD" ,
147- path = ex.path.last().fieldName.orEmpty())))))
171+ path = ex.path.last().fieldName.orEmpty()))))
148172 is MissingKotlinParameterException ->
149173 createResponse(contentType, input,
150- ResponseEntity (422 , createUnprocessableEntityErrorBody(listOf ( UnprocessableEntityError (
174+ ResponseEntity (422 , createUnprocessableEntityErrorBody(UnprocessableEntityError (
151175 message = " MISSING_REQUIRED_FIELDS" ,
152176 code = " FIELD" ,
153- path = ex.parameter.name.orEmpty())))))
177+ path = ex.parameter.name.orEmpty()))))
154178 else -> createResponse(contentType, input,
155179 ResponseEntity (500 , createErrorBody(ApiError (ex.message.orEmpty(), " INTERNAL_SERVER_ERROR" ))))
156180 }
0 commit comments