【问题标题】:AWS Lambda: java.lang.ClassNotFoundException even if the full path is mentioned in the AWS Lambda functionAWS Lambda:java.lang.ClassNotFoundException 即使在 AWS Lambda 函数中提到了完整路径
【发布时间】:2023-02-14 04:42:24
【问题描述】:

我正在尝试测试 lambda 函数(Spring Boot 云应用程序),但得到 java.lang.ClassNotFoundException,即使在 runtime 设置下正确提到了流处理程序。

错误信息:

{
  "errorMessage": "Class not found: com.myexample.handler.ServiceHandler",
  "errorType": "java.lang.ClassNotFoundException"
}

这是流处理程序代码:

package com.myexample.handler;

@Slf4j
@Component
public class ServiceHandler implements RequestHandler<String,Object> {

    @Autowired
    MyService myService ;

    @Override
    public Object handleRequest(String s, Context context) {
            // myService.executeMethod();
    }

我在 build the jar with all dependencies 上使用 Maven Shade 插件:

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <configuration>
                    <createDependencyReducedPom>false</createDependencyReducedPom>
                    <shadedArtifactAttached>true</shadedArtifactAttached>
                    <shadedClassifierName>aws</shadedClassifierName>
                    <transformers>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                            <resource>META-INF/spring.handlers</resource>
                        </transformer>
                        <transformer implementation="org.springframework.boot.maven.PropertiesMergingResourceTransformer">
                            <resource>META-INF/spring.factories</resource>
                        </transformer>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                            <resource>META-INF/spring.schemas</resource>
                        </transformer>
                    </transformers>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

为此,在我的项目中添加了其他重要的 Maven 依赖项(除了常规的 Spring Boot 依赖项):

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-function-adapter-aws</artifactId>
            <version>3.2.5</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-core</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-events</artifactId>
            <version>3.11.0</version>
        </dependency>

这里需要注意的几件事是:我在 ServiceHandler 类中使用 @Component 注释。我必须这样做,因为我需要自动装配该服务。

我没有看到 lambda 端和代码有任何问题。这里出了什么问题?

【问题讨论】:

  • 您是否尝试使用 AWS Lambda Java Run time API 构建 Lambda 函数并尝试从 AWS Lambda 函数中使用 Spring BOOT API?根本不需要使用 Spring BOOT API 来使用 Java 构建 Lambda 函数,也不需要在 AWS Lambda 函数的逻辑中使用 @Component 这样的注释。

标签: spring amazon-web-services spring-boot maven aws-lambda


【解决方案1】:

正如我在评论中提到的,您似乎正在尝试将 Spring Framework 引入到使用 com.amazonaws.services.lambda.runtime API 编码的 Lambda 函数中。无需将 Spring Boot API 引入 Lambda 函数。

您可以通过使用 AWS Lambda Java 运行时 API 构建的 AWS Lambda 函数执行很多操作,例如从 Lambda 函数中使用 AWS SDK for Java V2 调用 AWS 服务。但是 - 尝试将 Lambda 函数转换为 Spring 托管组件不是其中之一。

学习如何使用AWS Lambda Java 运行时 API构建一个 AWS Lambda 函数,该函数可以使用适用于 Java V2 的 AWS 开发工具包,例如 Amazon S3 和 Amazon Rekognition(以及其他 AWS 服务),请参阅:

https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/usecases/creating_lambda_ppe

【讨论】:

  • 谢谢,让我将其修改为常规 Java 应用程序,并将在此处更新您的进展情况。
  • 看看上面的例子,因为它工作得很好
猜你喜欢
  • 2020-05-28
  • 1970-01-01
  • 2020-01-18
  • 2023-04-03
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
相关资源
最近更新 更多