设置
我正在做一个Spring Boot
我们想使用的项目DynamoDB
。我们不想直接使用库,而是
使用JNOSQL;此 API 允许通过选择不同的驱动程序轻松切换数据库,我们将来可能想要这样做。AWS
在我们的项目中,我创建了一个小的独立配置类来测试库,按照本教程中的说明和官方文档Key-Value DB
(此处)进行操作。
文档显示,一旦配置了数据库,我应该能够@Produces
a BucketManager
,这将允许我在我@Inject
的KeyValueTemplate
数据库服务中写入数据库。
这些是 CDI 注释,我不太熟悉;这就是说,我知道这@Inject
是 Spring 理解的东西,而 可能不是这种情况@Produces
,它可以替换为@Bean
问题
通过简单地遵循文档,每当我尝试运行应用程序时,Spring 都会抱怨找不到KeyValueTemplate
bean:
Field template in com.max.backend.service.TestEntryService required a bean of type 'jakarta.nosql.mapping.keyvalue.KeyValueTemplate' that could not be found.
理所当然地:我声明一个 bean 为BucketManager
,而不是KeyValueTemplate
.
请注意,文档显示了一个创建 an 的示例应用程序,SeContainer
鉴于我正在使用 Spring,我认为我不需要它。
我的预感
我认为这可能与 CDI 与 Spring 有关,其中库以某种方式为KeyValueTemplate
我创建@Produces
了一个 bean BucketManager
,但 Spring 没有看到这个 bean。
理想情况下,我想要么完全使用 Spring,完全避免 CDI,要么找到一个全面且最小的解决方案来利用KeyValueTemplate
我很惊讶我在网上没有找到太多关于这个的信息,这是一个非常成熟且有用的库,我发现 Spring 中没有很多用法,这很奇怪。
如果您知道 Spring 的类似库,请告诉我!
我的代码
注意:可以在此处查看KeyValue db(不适用于 Spring)的 JNOSQL 演示的完整示例。
中的相关依赖build.gradle
// Spring
implementation 'org.springframework.boot:spring-boot-starter-web'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-validation', version: '2.3.5.RELEASE'
// JNOSQL
implementation group: 'org.eclipse.jnosql.artemis', name: 'artemis-key-value', version: '1.0.0-b1'
implementation group: 'org.eclipse.jnosql.diana', name: 'dynamodb-driver', version: '1.0.0-b1'
// JSON parsing
implementation group: 'javax.json.bind', name: 'javax.json.bind-api', version: '1.0'
implementation group: 'org.eclipse', name: 'yasson', version: '1.0.4'
implementation group: 'org.glassfish', name: 'javax.json', version: '1.1'
// For CDI (needed primarily for annotations)
implementation group: 'javax', name: 'javaee-web-api', version: '8.0'
配置 MaxDatabase.java
package com.max.backend.service.jnosql;
import jakarta.nosql.Settings;
import jakarta.nosql.keyvalue.BucketManager;
import org.eclipse.jnosql.diana.dynamodb.keyvalue.DynamoDBBucketManagerFactory;
import org.eclipse.jnosql.diana.dynamodb.keyvalue.DynamoDBKeyValueConfiguration;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Produces;
import java.util.HashMap;
import java.util.Map;
@Configuration
@ApplicationScoped
public class MyDatabase {
private DynamoDBKeyValueConfiguration configuration;
private DynamoDBBucketManagerFactory managerFactory;
@PostConstruct
public void initialize() {
// Set up the DB
configuration = new DynamoDBKeyValueConfiguration();
Map<String, Object> settings = new HashMap<>();
settings.put("dynamodb.endpoint", "http://localhost:8073");
settings.put("dynamodb.region", "eu-west-1");
settings.put("dynamodb.awsaccesskey", "myLocalKeyId");
settings.put("dynamodb.secretaccess", "myLocalSecretAccessKey");
managerFactory = configuration.get(Settings.of(settings));
}
@Produces // use @Bean instead?
public BucketManager getManager() {
return managerFactory.getBucketManager("initiatives");
}
}
服务
package com.max.backend.service;
import com.max.backend.model.TestEntry;
import jakarta.nosql.mapping.keyvalue.KeyValueTemplate;
import org.springframework.stereotype.Service;
import javax.inject.Inject;
import java.util.Optional;
@Service
public class TestEntryService {
@Inject
private KeyValueTemplate template;
public void put(TestEntry user) {
template.put(user);
}
public Optional<TestEntry> find(String id) {
return template.get(id, TestEntry.class);
}
}
(TestEntry
只是一个小POJO,与我在这里面临的问题无关)