Aws Lambda with Spring Boot and Gradle not working. Class not found exception when AWS Lambda function is called

Viewed 390

I am using Spring Boot 2.4.8 and I have created sample demo for Aws Lambda. I am using build tool gradle. So When I was deployed my jar on Aws Lambda then I received class not found exception.

for reference please see the attach screen shot. enter image description here

Following is my build.gradle file

plugins {
    id 'org.springframework.boot' version '2.4.8'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    runtimeOnly 'com.h2database:h2'
    implementation 'org.springframework.cloud:spring-cloud-function-adapter-aws:2.0.1.RELEASE'
    implementation 'com.amazonaws:aws-lambda-java-core:1.2.1'
    implementation 'com.amazonaws:aws-lambda-java-events:2.2.9'
    implementation 'com.google.code.gson:gson:2.8.6'       
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

On Aws Lambda I have configured following value in the handler.

com.example.handler.NotificationHandler:handleRequest

Following is my package structure.

enter image description here

NotificationHandler.java file

package com.example.handler;

import java.util.HashMap;

import org.springframework.stereotype.Component;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

@Component
public class NotificationHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
    
    Gson gson = new GsonBuilder().setPrettyPrinting().create();

    @Override
    public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent event, Context context) {
        APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();
        response.setIsBase64Encoded(false);
        response.setStatusCode(200);
        HashMap<String, String> headers = new HashMap<String, String>();
        headers.put("Content-Type", "application/json");
        response.setHeaders(headers);
        response.setBody("{\n"
                + "  \"key1\": \"value1\",\n"
                + "  \"key2\": \"value2\",\n"
                + "  \"key3\": \"value3\"\n"
                + "}");
        // log execution details
        Util.logEnvironment(event, context, gson);
        return response;
    }
}

Any help or suggestion is more help to me.

1 Answers

The Lambda developer guide specifies specific packaging instructions for Gradle

task buildZip(type: Zip) {
    from compileJava
    from processResources
    into('lib') {
        from configurations.runtimeClasspath
    }
}
Related