Search code examples
springaws-lambdacloudspring-cloud

Global Exception Handling in Spring Cloud Function on AWS Lambda Platform


I am using spring cloud function on AWS lambda. I am trying to achieve global exception handling like Spring Boot using @ExceptionHandler annotation. But this method is not getting executed and I am getting 500 for any type of exception.
Sample code is below-

@SpringBootApplication
public class App{
    public static void main( String[] args ){
       SpringApplication.run(App.class, args);
    }
    @Bean
    public Function<Message<User>, User> getUser(){
            return (message)->{
                    User u = message.getPayload();
                    if(u==null){
                          throw new ResponseStatusException(HttpStatus.BAD_REQUEST,"No user details provided");
                    } 
                 return u;
            }
      }
   @ExceptionHandler(ResponseStatusException.class)
   public APIGatewayProxyResponseEvent handleException(ResponseStatusException e){
      APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();
      response.setStatusCode(e.getRawStatusCode());
      response.setBody(e.getMessage());
     return response;
   }
}

I am getting 500 in response instead Bad Request. Is there any way to achieve this scenario ?


Solution

  • You can provide your custom exceptionHandler while building SpringBootLambdaContainerHandler.

    public class StreamLambdaHandler implements RequestStreamHandler {
    
      private static SpringBootLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler;
    
      static {
        handler = new SpringBootProxyHandlerBuilder<AwsProxyRequest>()
                .defaultProxy()
                .exceptionHandler(***your customer handler here***)
                // other methods are skipped
                .buildAndInitialize();  
      }
    
    }