Skip to content

DynamoDB Enhanced v. 2.15.41 putItem - getItem generates java.lang.NoClassDefFoundError #2198

@Max161

Description

@Max161

When using DynamoDB version 2.15.41, but even the older versions, with the play framewok 2.8 (java) it throws a NoClassDefFoundError when you set the Table Schema via annotated class or via bean.

Describe the bug

I'm trying to create a simple registration/login application with the support of DynamoDB and Play Framework with java.
I downloaded the last play java seed from the official site and added the dependencies for DynamoDb and DynamoDB enhanced v. 2.15.41.

I wrote some simple API's to call
Create - Put - Get for the items. But I'm not able to put or get items from the table

What I mean is that if I define a table as following it will throw a NoClassDefFound when used:

DynamoDbAsyncClient dynamoDbAsyncClient = DynamoDbAsyncClient
    .builder()
    .endpointOverride(URI.create("http://localhost:8000"))
    .build();

DynamoDbEnhancedAsyncClient enhancedAsyncClient = DynamoDbEnhancedAsyncClient
    .builder()
    .dynamoDbClient(dynamoDbAsyncClient)
    .build();

return enhancedAsyncClient.table("Customer", TableSchema.fromClass(Customer.class));
 @DynamoDbBean
    public static class Customer {

        private String  id;
        private String  name;
        private String  email;
        private Instant regDate;

        @DynamoDbPartitionKey
        public String getId() { return this.id; }
        @DynamoDbSortKey
        public String getCustName() { return this.name; }
        //Omitted the getters and setters for brevity
    }

Expected Behavior

I should be able to put and get items correctly.

Current Behavior

When you run this code it's going to throw the exception.

  Key key = Key.builder()
                .partitionValue("id103")
                .sortValue("Susan Blue")
                .build();

        // Get the item by using the key
        return table.getItem(r -> r.key(key))
ERROR akka.actor.ActorSystemImpl akka.actor.ActorSystemImpl(application) Uncaught error from thread [application-akka.actor.default-dispatcher-6]: controllers/HomeController$Customer, shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled for ActorSystem[application]
java.lang.NoClassDefFoundError: controllers/HomeController$Customer
	at software.amazon.awssdk.enhanced.dynamodb.internal.mapper.ResolvedImmutableAttribute.lambda$create$0(ResolvedImmutableAttribute.java:48)
	at software.amazon.awssdk.enhanced.dynamodb.mapper.StaticImmutableTableSchema.lambda$itemToMap$5(StaticImmutableTableSchema.java:491)
	at java.util.ArrayList.forEach(ArrayList.java:1259)
	at java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1082)
	at software.amazon.awssdk.enhanced.dynamodb.mapper.StaticImmutableTableSchema.itemToMap(StaticImmutableTableSchema.java:489)
	at software.amazon.awssdk.enhanced.dynamodb.mapper.WrappedTableSchema.itemToMap(WrappedTableSchema.java:59)
	at software.amazon.awssdk.enhanced.dynamodb.mapper.WrappedTableSchema.itemToMap(WrappedTableSchema.java:59)
	at software.amazon.awssdk.enhanced.dynamodb.internal.operations.PutItemOperation.generateRequest(PutItemOperation.java:71)
	at software.amazon.awssdk.enhanced.dynamodb.internal.operations.PutItemOperation.generateRequest(PutItemOperation.java:40)
	at software.amazon.awssdk.enhanced.dynamodb.internal.operations.CommonOperation.executeAsync(CommonOperation.java:139)
	at software.amazon.awssdk.enhanced.dynamodb.internal.operations.TableOperation.executeOnPrimaryIndexAsync(TableOperation.java:81)
	at software.amazon.awssdk.enhanced.dynamodb.internal.client.DefaultDynamoDbAsyncTable.putItem(DefaultDynamoDbAsyncTable.java:177)
	at software.amazon.awssdk.enhanced.dynamodb.internal.client.DefaultDynamoDbAsyncTable.putItem(DefaultDynamoDbAsyncTable.java:185)
	at software.amazon.awssdk.enhanced.dynamodb.internal.client.DefaultDynamoDbAsyncTable.putItem(DefaultDynamoDbAsyncTable.java:190)
	at controllers.HomeController.putItem(HomeController.java:92)
	at router.Routes$$anonfun$routes$1.$anonfun$applyOrElse$8(Routes.scala:169)
	at play.core.routing.HandlerInvokerFactory$$anon$7.resultCall(HandlerInvoker.scala:146)
	at play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$3$$anon$4$$anon$5.invocation(HandlerInvoker.scala:115)
	at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:119)
	at play.http.DefaultActionCreator$1.call(DefaultActionCreator.java:33)
	at play.core.j.JavaAction.$anonfun$apply$8(JavaAction.scala:175)
	at scala.concurrent.Future$.$anonfun$apply$1(Future.scala:671)
	at scala.concurrent.impl.Promise$Transformation.run(Promise.scala:430)
	at play.core.j.HttpExecutionContext.$anonfun$execute$1(HttpExecutionContext.scala:64)
	at play.api.libs.streams.Execution$trampoline$.execute(Execution.scala:70)
	at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:59)
	at scala.concurrent.impl.Promise$Transformation.submitWithValue(Promise.scala:392)
	at scala.concurrent.impl.Promise$DefaultPromise.submitWithValue(Promise.scala:302)
	at scala.concurrent.impl.Promise$DefaultPromise.dispatchOrAddCallbacks(Promise.scala:276)
	at scala.concurrent.impl.Promise$DefaultPromise.map(Promise.scala:146)
	at scala.concurrent.Future$.apply(Future.scala:671)
	at play.core.j.JavaAction.apply(JavaAction.scala:176)
	at play.api.mvc.Action.$anonfun$apply$4(Action.scala:82)
	at play.api.libs.streams.StrictAccumulator.$anonfun$mapFuture$4(Accumulator.scala:168)
	at scala.util.Try$.apply(Try.scala:210)
	at play.api.libs.streams.StrictAccumulator.$anonfun$mapFuture$3(Accumulator.scala:168)
	at scala.Function1.$anonfun$andThen$1(Function1.scala:85)
	at scala.Function1.$anonfun$andThen$1(Function1.scala:85)
	at scala.Function1.$anonfun$andThen$1(Function1.scala:85)
	at play.api.libs.streams.StrictAccumulator.run(Accumulator.scala:199)
	at play.core.server.AkkaHttpServer.$anonfun$runAction$4(AkkaHttpServer.scala:417)
	at akka.http.scaladsl.util.FastFuture$.strictTransform$1(FastFuture.scala:41)
	at akka.http.scaladsl.util.FastFuture$.$anonfun$transformWith$3(FastFuture.scala:51)
	at scala.concurrent.impl.Promise$Transformation.run(Promise.scala:447)
	at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:56)
	at akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run$1(BatchingExecutor.scala:93)
	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18)
	at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:94)
	at akka.dispatch.BatchingExecutor$BlockableBatch.run(BatchingExecutor.scala:93)
	at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:48)
	at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(ForkJoinExecutorConfigurator.scala:48)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:175)
Caused by: java.lang.ClassNotFoundException: controllers.HomeController$Customer
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	... 55 common frames omitted

Steps to Reproduce

A public repository with the code could be found here:
https://github.com/Max161/AWS_DynamoDB_ClassNotFound_Error

To run the code use sbt run command in the main folder.
Than you can use postman to call the API:
/createtable
/getItem
/putItem

Your Environment

  • AWS Java SDK version used: 2.15.41
  • JDK version used: Java 1.8.0_275
  • Operating System and version: Ubuntu 16.04 LTS - Mac Big Sur v 11.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugThis issue is a bug.closed-for-stalenessdynamodb-enhancedp3This is a minor priority issuethird-partyThis issue is related to third-party libraries or applications.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions