1

设置

我正在做一个Spring Boot我们想使用的项目DynamoDB。我们不想直接使用库,而是
使用JNOSQL;此 API 允许通过选择不同的驱动程序轻松切换数据库,我们将来可能想要这样做。AWS

在我们的项目中,我创建了一个小的独立配置类来测试库,按照本教程中的说明和官方文档Key-Value DB此处)进行操作。

文档显示,一旦配置了数据库,我应该能够@Producesa BucketManager,这将允许我在我@InjectKeyValueTemplate数据库服务中写入数据库。

这些是 CDI 注释,我不太熟悉;这就是说,我知道这@Inject是 Spring 理解的东西,而 可能不是这种情况@Produces,它可以替换为@Bean

问题

通过简单地遵循文档,每当我尝试运行应用程序时,Spring 都会抱怨找不到KeyValueTemplatebean:

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,与我在这里面临的问题无关)

4

2 回答 2

0

我相信错误说明了一切,您需要创建@BeanKeyValueTemplate。有关快速示例,请参阅https://docs.spring.io/spring-data/keyvalue/docs/current/reference/html/#key-value.template-configuration

如您所想,Spring 中不需要 SeContainer。它是 CDI 的 WildFly 实现。但是,不是 WildFly 的专家,我相信该示例显示了 CDI 配置是如何完成的KeyValueTemplate keyValueTemplate = container.select(KeyValueTemplate.class).get();(这与上面 URL 示例中的 @Beans 相同)

于 2021-08-02T23:58:10.677 回答
0

继续描述事件,我有一种感觉,你可能没有意识到你正在艰难地做事。

也就是说,您不需要为数据库编写 Java 代码。Spring Boot 提供的功能几乎与您尝试实现的功能完全相同。虽然我对 JNOSQL 的经验很少,但我曾经构建过 Android 应用程序,所以我对 gradle 语法非常熟悉。

出于这个原因,我可以自信地说,Spring Boot 的原生解决方案的工作量大致相同。

我可以告诉您,使用此处所示的 application.properties 文件将花费您每个数据库的四行代码,只要您保持基本配置即可。从那里开始,想法是根据需要添加指令,并由您自行决定,因为我确信它也在 JNOSQL 中。

看看上面的链接。我有一种感觉,一旦你意识到这个特性在 Spring 中可用,你就会决定使用它。

此处链接的前两个视频(和创作者)是该主题的优秀资源。

第二个其实是一个15视频的播放列表,显示了内置配置系统的实际深度。

而且这些文件不只是配置数据库。事实上,Spring Boot 目前在微服务领域如此受欢迎的原因之一是因为所有配置都可以在一个配置文件中列出。

于 2021-08-08T03:51:39.140 回答