【问题标题】:NoClassDefFoundError with SpringBootRequestHandlerSpringBootRequestHandler 的 NoClassDefFoundError
【发布时间】:2021-08-05 10:24:51
【问题描述】:

我已经实现了一个带有 spring 云功能的简单 AWS lambda 应用程序。当我创建 labmda 函数并在 AWS 中发送请求时,抛出了以下错误。

{
  "errorMessage": "Error loading class com.benz.aws.lambda.api.handler.OrderHandler: org/springframework/cloud/function/adapter/aws/SpringBootRequestHandler",
  "errorType": "java.lang.NoClassDefFoundError"
}

功能包

 @Component
    public class OrderFunction implements ApplicationContextInitializer<GenericApplicationContext>
    {
    
        private OrderDao orderDao;
    
        @Autowired
        public OrderFunction(OrderDao orderDao)
        {
            this.orderDao=orderDao;
        }

    @Bean
    public Function<String,Object> getOrderByName()
    {
        return name-> {
            System.out.println("Hello Benz");
            return name;
        };
    }

    @Override
    public void initialize(GenericApplicationContext context) {
        context.registerBean("getOrderByName", FunctionRegistration.class,
                () -> new FunctionRegistration<Function<String,Object>>(getOrderByName())
                        .type(FunctionType.from(String.class).to(Object.class).getType()));
    }
}

处理程序包

public class OrderHandler extends SpringBootRequestHandler<String,Object> {

}

pom.xml

<dependencies>

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-function-adapter-aws</artifactId>
            <version>3.0.6.RELEASE</version>
        </dependency>


<dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-events</artifactId>
            <version>3.8.0</version>
        </dependency>

     <dependency>
                <groupId>com.amazonaws</groupId>
                <artifactId>aws-lambda-java-core</artifactId>
                <version>1.2.1</version>
            </dependency>
    
    </dependencies>
    
    <build>
            <plugins>
    
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </plugin>
    
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
    
                    <dependencies>
                        <dependency>
                            <groupId>org.springframework.boot.experimental</groupId>
                            <artifactId>spring-boot-thin-layout</artifactId>
                            <version>${wrapper.version}</version>
                        </dependency>
                    </dependencies>
    
                    <configuration>
                        <excludes>
                            <exclude>
                                <groupId>org.projectlombok</groupId>
                                <artifactId>lombok</artifactId>
                            </exclude>
                        </excludes>
                        <finalName>
                            boot-lambda
                        </finalName>
                    </configuration>
                </plugin>
    
                <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>
                    </configuration>
                </plugin>
    
            </plugins>
        </build>

在 AWS 中

我尝试了多种方式对其进行调试,但没有成功。如果有任何简单的方法可以在不扩展SpringBootRequestHandler类的情况下完成上述操作

【问题讨论】:

    标签: java amazon-web-services spring-boot aws-lambda spring-cloud-function


    【解决方案1】:

    您在 Spring 应用程序中使用适用于 Java 的 AWS 开发工具包时遇到问题。当您正确设置 POM 时,使用适用于 Java 的 AWS 开发工具包和 Spring Framework 可以正常工作。出现问题时,通常是因为 POM 文件中未正确设置所需的依赖项。

    有各种将 Spring 框架与 AWS SDK for Java V2 结合使用的示例(没有使用 V1 的示例,因为 Amazon 建议迁移到 V2)。例如。

    Creating your first AWS Java web application

    如果您遵循该示例,您将成功创建一个使用适用于 Java 的 AWS 开发工具包和 Spring 框架的示例应用程序。

    【讨论】:

      【解决方案2】:

      确实,它看起来像是一个打包问题,因为它似乎无法在 JAR 中找到您的类。

      另外,请记住,SpringBootRequestHandler 已被弃用,并将在适当的时候被删除。一个更简单(新)的方法在详细描述here

      您还可以获取here 提供的样本之一。那里实际上有 3 个,但 function-sample-aws 是最简单的一个,并且与您要执行的操作直接相关。

      【讨论】:

        猜你喜欢
        • 2016-06-05
        • 2017-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-19
        相关资源
        最近更新 更多