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