当前位置: 首页 > 知识库问答 >
问题:

我应该如何连接到ArangoDB使用SpringBoot

权承
2023-03-14

我试图创建一个简单的SpringBoot应用程序来连接和存储数据库中的一些数据,但是当我的代码试图提交一个新对象时,仍然会遇到401禁止消息。

我应该如何使用SpringBoot连接到ArangoDb,以便能够在数据库中保存节点?

我的系统上运行了ArangoDb,我可以在localhost登录到web控制台:http://localhost:8529

我有一个与下面的属性同名的数据库。我还尝试在运行应用程序之前通过Web界面创建集合(是的,我对DBs的图形不熟悉)。

尝试持久化实体时出错:

competitorRepository.save(competitor);

我知道这将是一件“显而易见的”事情,至少在我使用ArangoDb一段时间后会是这样!!

这个错误可能表明我的依赖项中有错误的驱动程序,但如果不是Gradle文件中的驱动程序(如下所示),则不知道应该是什么驱动程序。

一些代码:

application.properties:尝试使用根用户来避免用户权限问题。我可以与此用户登录到web界面。

spring.data.arangodb.hosts=localhost:8529
spring.data.arangodb.database=grading-data
spring.data.arangodb.user=root
spring.data.arangodb.password=theRightPasswordForRoot

Application.java

@SpringBootApplication
public class Application {

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}
}

java:不打算保留它,只是尝试在启动后运行一些代码

@Component
@Slf4j
public class PostConstruction {

private Environment environment;
private CompetitorRepository competitorRepository;
private ApplicationContext ctx;

@Autowired
public PostConstruction(Environment environment, CompetitorRepository competitorRepository, ApplicationContext ctx) {
    this.environment = environment;
    this.competitorRepository = competitorRepository;
    this.ctx = ctx;
}

@PostConstruct
public void stuffToDoOnceApplicationStartsUp() {

    var competitor = Competitor.builder()
            .clubName("a club")
            .firstName("name")
            .lastName("lastname")
            .build();
    var savedCompetitor = competitorRepository.save(competitor);
    System.out.println(savedCompetitor);
}
}

bean类。。。使用lombok注释(以前从未出现过问题),为简洁起见,字段(仅字符串和整数)未被写入:

@SuperBuilder
@Getter
@ToString
@Document("competitor")
@HashIndex(fields = { "licence" }, unique = true)
public class Competitor extends Person {

@Id
private String id;

}

存储库:

@Repository
public interface CompetitorRepository extends ArangoRepository<Competitor, String> {
}

项目渐变文件:

buildscript {
repositories {
    mavenCentral()
}
dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:2.2.0.RELEASE")
}
}

plugins {
id 'java'
id 'org.springframework.boot' version '2.2.2.RELEASE'
id 'io.spring.dependency-management' version '1.0.7.RELEASE'
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

bootJar {
manifest {
    attributes 'Start-Class': 'my.package.conf.Application'
}
launchScript()
}

repositories {
mavenCentral()
}

sourceCompatibility = 11
targetCompatibility = 11


dependencies {
compile "org.springframework.boot:spring-boot-starter-websocket"
compile "org.springframework.boot:spring-boot-starter-tomcat"
compile "org.springframework.boot:spring-boot-starter-test" // todo : test scope
compile 'org.springframework.boot:spring-boot-starter-actuator' //     /actuator/health

compile 'org.apache.httpcomponents:httpclient:4.5.1' // for arangodb ?

compile 'com.arangodb:arangodb-spring-boot-starter:1.0.2'
compile 'com.arangodb:arangodb-spring-data:3.2.3'
compile 'com.arangodb:arangodb-java-driver'


compile 'org.projectlombok:lombok:1.18.10'
annotationProcessor 'org.projectlombok:lombok:1.18.10'
}

堆栈痕迹的片段...看起来像401是因为没有驱动程序可供Hikari使用,但我以为我已经包括在Gradle配置上面。

2020-01-30 23:27:43.932调试14845---[main]o.s.boot.diagnostics.FailureAnalyzers:FailureAnalyzer org.springframework.boot.autoconfigure.jdbc。HikariDriverConfigurationFailureAnalyzer@372461a9失败

java.lang.TypeNotPresentException:java.base/sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:117)~[na:na]位于java.base/sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:125)~[na:na]在java.base/sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)~[na:na]在java.base/sun.reflect.generics.visitor.Reifier.reifyTypeArguments(Reifier.java:68)~[na:na]

2020-01-30 23:27:43.935错误14845---[main]o.s.boot.SpringApplication:应用程序运行失败

org.springframework.beans.factory.BeanCreationException:创建名为“postConstruction”的bean时出错:调用init方法失败;嵌套异常为org.springframework.dao.PermissionDeniedDataAccessException:响应:401,错误:401-未授权;嵌套的异常是com.arangodb.arangodbeception:Response:401,Error:401-org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:160)~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:416)~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1788)~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE]

共有2个答案

阎彬炳
2023-03-14

和以往一样,这种问题。。。用户错误。

我在一个application.properties中有属性,它定义了数据库的值,比如用户名/主机等

我还有:

@EnableArangoRepositories(basePackages = { "uk.co.deditech" })
public class ArangoGraphDbConfig implements ArangoConfiguration

在那里,我有一个方法arrango(),它将硬连线的值传递到bean创建中,这些硬连线的值是不正确的(这是由于篡改了一些在线教程/说明的结果)。

我删除了那个配置类,这一切似乎都开始了,包括我在@PostConstruct块中将文档插入到集合中。

濮阳
2023-03-14

请从build.gradle中删除编译com.arangodb: arangodb-java驱动程序,因为它将由Spring引导arangodb启动程序(arangodb-spum-boot-starter)解决。

当我尝试在spring boot应用程序中使用arangodb驱动程序时,我也遇到了这个问题。但现在我已经改为用户spring boot arangodb starter,现在它开始工作了。

您可以尝试使用arangodb spring boot starter来运行它。

build.gradle文件片段:

plugins {
    id 'org.springframework.boot' version '2.1.6.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'java'
    id 'eclipse'
}

和依赖项部分:

    dependencies {
       implementation 'org.springframework.boot:spring-boot-starter-web'
       implementation 'com.arangodb:arangodb-spring-boot-starter:1.0.2' 
    }
 类似资料:
  • 问题内容: 我想使用Java 7和NIO 2编写异步服务器。 但是我应该怎么用呢? 例如,如果我开始: 然后,当我这样做时,该程序 终止, 因为该调用是 异步的 。如果我将该代码置于无限循环中,则会抛出。 关于如何使用编写一个简单的异步服务器的任何建议? 这是我的完整示例(类似于JavaDoc中的示例): 问题答案: 您走在正确的轨道上,从完成的回调中调用accept()以便接受更多连接应该起作用

  • 问题内容: 我有一个要连接到MySQL数据库的应用程序。它在半夜断开连接,然后喷出有关连接的信息,并且JDBC在X秒内没有收到消息。 在进行任何需要与SQL Server通信的操作之前,我先打电话给我。 这是我的方法: 在该方法中,我将密码等信息放入字符串中,然后以标准JDBC方式创建连接。 然后我调用此方法: 我可以对这两种方法进行哪些更改以适应丢失的连接? 问题答案: 这不是检索连接的正确方法

  • 问题内容: 我不太清楚当我这样说时会做什么: 我可以稍微了解使用它的原因,因为它不浏览整个数据库表以更新字段,而是仅更新新添加的记录。如我错了请纠正我。 所以我想做的是使用这样创建索引: 一旦执行此操作,文档就根本不会上传到索引。我要去哪里错了? 任何帮助,不胜感激。 问题答案: 如果您的表中有一个时间戳列(例如),则最好使用它代替ID号。这样,当记录更新时,您也可以修改该时间戳,输入插件将提取记

  • 问题内容: 在Objective- C中,我调用该方法来记录异常。如何在Swift中调用它? 问题答案: 使用Swift 2,您可以将Swift函数和闭包作为C函数指针传递 原始答案 从Xcode 6 beta 6开始,您不能这样做。 Swift确实支持传递函数指针,但是它们几乎就像不透明指针一样被对待。您既不能定义指向Swift函数的C函数指针,也不能在Swift中调用C函数指针。 这意味着您从

  • 问题内容: 这个问题在很多地方都被问到,变化不尽。例如Java-getClassLoader()。getResource()不仅使我烦恼不已。)我仍然无法使其正常工作。 这是一个代码片段: 此作品-请注意,我硬编码的路径,包含剪辑文件,该文件的目录 是 有,而且 是 在同一目录作为我的.class文件。las,注释掉的代码仅返回url的空值。 其他大多数帖子似乎都涉及getResourceAsSt

  • 我试图创建一个图书馆管理系统,因为我创建了两个实体和这两个实体都是使用关系连接的,所以我使用了另一个联接表,在这里我存储了图书的Id和学生的Id,当学生从图书馆发出一本书时,但是当学生返回书时,联接表中包含这两个Id的行应该被删除,但是当我尝试这样做时,要么联接表中的所有数据都被删除,要么我的学生和图书在这里被删除了我的代码,请告诉我,我在这里做错了什么,什么应该是最好的实践 学生实体 图书实体