I tried to create a simple connection to AWS DynamoDB, but unfortunately run into some issues with Spring. I setup the profile with my connection credentials from Amazon and configured this Profile as default. Now when I'm trying to start the application it always shows me the following errors. I guess its something with the class path, but I couldn't find a solution.
The goal of this exercise should be to post some Data on the database.
In Addition my classes:
package com.example.mfc;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DynamoDBConfig {
@Value("${amazon.access.key}")
private String awsAccessKey;
@Value("${amazon.access.secret-key}")
private String awsSecretKey;
@Value("${amazon.region}")
private String awsRegion;
@Value("${amazon.end-point.url}")
private String awsDynamoDBEndPoint;
@Bean
public DynamoDBMapper mapper(){
return new DynamoDBMapper(amazonDynamoDBConfig());
}
public AmazonDynamoDB amazonDynamoDBConfig(){
return AmazonDynamoDBClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(awsDynamoDBEndPoint, awsRegion))
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(awsAccessKey, awsSecretKey)))
.build();
}
}
package com.example.mfc;
import com.example.classes.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/dynamoDb")
public class DynamoDBController {
@Autowired
private DynamoDBRepository repository;
@PostMapping
public String insertUserIntoDynamoDb(@RequestBody User user){
repository.insertUserIntoDynamoDB(user);
return "User successfully inserted into DynamoDB table.";
}
@GetMapping
public ResponseEntity<User> getOneUserDetail(@RequestParam String UserID, @RequestParam String lastName){
User user = repository.getOneUserDetail(UserID, lastName);
return new ResponseEntity<User>(user, HttpStatus.OK);
}
@PutMapping
public void updateUserDetail(@RequestBody User user){
repository.updateUserDetail(user);
}
@DeleteMapping(value = "{userID}/{lastName}")
public void deleteUserDetail(@PathVariable("userID") String userID, @PathVariable("lastName") String lastName){
User user = new User();
user.setUserID(userID);
user.setLastName(lastName);
repository.deleteUserDetail(user);
}
}
package com.example.mfc;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBSaveExpression;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.ComparisonOperator;
import com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException;
import com.amazonaws.services.dynamodbv2.model.ExpectedAttributeValue;
import com.example.classes.User;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
@Repository
public class DynamoDBRepository {
private static final Logger LOGGER = (Logger) LoggerFactory.getLogger(DynamoDBRepository.class);
@Autowired
private DynamoDBMapper mapper;
public void insertUserIntoDynamoDB(User user){
mapper.save(user);
}
public User getOneUserDetail(String userID, String lastName){
return mapper.load(User.class, userID, lastName);
}
public void updateUserDetail(User user) {
try {
mapper.save(user, buildDynamoDBSaveExpression(user));
} catch (ConditionalCheckFailedException exception) {
LOGGER.info("invalid data. -" exception.getMessage());
}
}
public void deleteUserDetail(User user){
mapper.delete(user);
}
public DynamoDBSaveExpression buildDynamoDBSaveExpression(User user){
DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression();
Map<String, ExpectedAttributeValue> expected = new HashMap<>();
expected.put("userID", new ExpectedAttributeValue(new AttributeValue(user.getUserID()))
.withComparisonOperator(ComparisonOperator.EQ));
saveExpression.setExpected(expected);
return saveExpression;
}
}
package com.example.mfc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MfcApplication {
public static void main(String[] args) {
SpringApplication.run(MfcApplication.class, args);
}
}
package com.example.classes;
import com.amazonaws.services.dynamodbv2.datamodeling.*;
import java.io.Serializable;
@DynamoDBTable(tableName = "MFC")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String userID;
private String lastName;
private String email;
@DynamoDBHashKey(attributeName = "UserID")
@DynamoDBAutoGeneratedKey
public String getUserID() {
return userID;
}
public void setUserID(String userID) {
this.userID = userID;
}
@DynamoDBRangeKey
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@DynamoDBAttribute
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
2022-09-01 21:15:06.521 INFO 39924 --- [ main] com.example.mfc.MfcApplication : Starting MfcApplication using Java 14.0.2 on Andreass-MBP-2 with PID 39924 (/Users/andreas/Desktop/MFC/target/classes started by andreaspichler in /Users/andreas/Desktop/MFC)
2022-09-01 21:15:06.524 INFO 39924 --- [ main] com.example.mfc.MfcApplication : No active profile set, falling back to 1 default profile: "default"
2022-09-01 21:15:07.278 INFO 39924 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9001 (http)
2022-09-01 21:15:07.285 INFO 39924 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-09-01 21:15:07.286 INFO 39924 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.65]
2022-09-01 21:15:07.350 INFO 39924 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-09-01 21:15:07.350 INFO 39924 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 783 ms
2022-09-01 21:15:07.381 WARN 39924 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dynamoDBController': Unsatisfied dependency expressed through field 'repository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dynamoDBRepository' defined in file [/Users/andreas/Desktop/MFC/target/classes/com/example/mfc/DynamoDBRepository.class]: Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError
2022-09-01 21:15:07.382 INFO 39924 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2022-09-01 21:15:07.391 INFO 39924 --- [ main] ConditionEvaluationReportLoggingListener :
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-09-01 21:15:07.405 ERROR 39924 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dynamoDBController': Unsatisfied dependency expressed through field 'repository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dynamoDBRepository' defined in file [/Users/andreas/Desktop/MFC/target/classes/com/example/mfc/DynamoDBRepository.class]: Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:639) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.22.jar:5.3.22]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.22.jar:5.3.22]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.3.jar:2.7.3]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[spring-boot-2.7.3.jar:2.7.3]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.3.jar:2.7.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-2.7.3.jar:2.7.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.7.3.jar:2.7.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-2.7.3.jar:2.7.3]
at com.example.mfc.MfcApplication.main(MfcApplication.java:10) ~[classes/:na]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dynamoDBRepository' defined in file [/Users/andreas/Desktop/MFC/target/classes/com/example/mfc/DynamoDBRepository.class]: Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1334) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1232) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:656) ~[spring-beans-5.3.22.jar:5.3.22]
... 20 common frames omitted
Caused by: java.lang.ExceptionInInitializerError: null
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) ~[na:na]
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481) ~[na:na]
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:211) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87) ~[spring-beans-5.3.22.jar:5.3.22]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1326) ~[spring-beans-5.3.22.jar:5.3.22]
... 31 common frames omitted
Caused by: java.lang.ClassCastException: class ch.qos.logback.classic.Logger cannot be cast to class java.util.logging.Logger (ch.qos.logback.classic.Logger is in unnamed module of loader 'app'; java.util.logging.Logger is in module java.logging of loader 'bootstrap')
at com.example.mfc.DynamoDBRepository.<clinit>(DynamoDBRepository.java:21) ~[classes/:na]
... 39 common frames omitted
Disconnected from the target VM, address: '127.0.0.1:58138', transport: 'socket'
Process finished with exit code 1
CodePudding user response:
Caused by:
java.lang.ClassCastException: class ch.qos.logback.classic.Logger cannot be cast to class java.util.logging.Logger (ch.qos.logback.classic.Logger is in unnamed module of loader 'app'; java.util.logging.Logger is in module java.logging of loader 'bootstrap')
CodePudding user response:
Exception says:
ClassCastException : class ch.qos.logback.classic.Logger cannot be cast to class java.util.logging.Logger (ch.qos.logback.classic.Logger is in unnamed module of loader 'app'; java.util.logging.Logger is in module java.logging of loader 'bootstrap')
This is happening as in class DynamoDBRepository slf4j LoggerFactory is used to get Logger which is trying to cast into java.util.logging.Logger Replace java.util.logging.Logger with org.slf4j.Logger
CodePudding user response:
Thank you, noticed it already.