我应该如何使用 Spring Boot 连接到 ArangoDB
How should I connect to ArangoDB using SpringBoot
我正在尝试创建一个简单的 SpringBoot 应用程序来连接数据库并将一些数据存储在数据库中,但是当我的代码尝试提交新对象时,总是出现 401 禁止消息。
我应该如何使用 SpringBoot 连接到 ArangoDb 才能在数据库中保存节点?
我的系统上安装了 ArangoDb 运行ning,我可以在本地主机上登录 Web 控制台:http://localhost:8529
我有一个与下面的 属性 同名的数据库。我还尝试在 运行 应用程序之前通过 Web 界面创建集合(是的,我是 DB 图表的新手)。
尝试保留实体时发生错误:
competitorRepository.save(competitor);
我知道这会是什么'obvious',至少在我使用 ArangoDb 一段时间后会是这样!!
该错误可能表明我的依赖项中有错误的驱动程序,但如果不是我的 Gradle 文件(如下)中的驱动程序,我不知道应该是什么。
一些代码:
application.properties:
尝试使用 root 用户以避免用户权限问题。我可以用这个用户登录到网络界面。
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);
}
}
PostConstruct.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 class... 使用 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> {
}
项目gradle文件:
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 DEBUG 14845 --- [ main] o.s.boot.diagnostics.FailureAnalyzers : FailureAnalyzer org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer@372461a9 failed
java.lang.TypeNotPresentException:类型 org.springframework.jdbc.CannotGetJdbcConnectionException 不存在
在 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 ERROR 14845 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.BeanCreationException:创建名称为 'postConstruction' 的 bean 时出错:调用 init 方法失败;嵌套异常是 org.springframework.dao.PermissionDeniedDataAccessException:响应:401,错误:401 - 未经授权;嵌套异常是 com.arangodb.ArangoDBException:响应:401,错误: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]
一如既往的这类问题...用户错误。
我在 application.properties 中有属性定义了数据库的值,例如 username/host 等
我也有:
@EnableArangoRepositories(basePackages = { "uk.co.deditech" })
public class ArangoGraphDbConfig implements ArangoConfiguration
在那里我有一个方法 arrango() 将硬连线值传递到 bean 创建中,那些硬连线值是不正确的(摆弄在线发现的几个 tutorials/instructions 的结果)。
我删除了该配置 class,一切似乎都启动了,包括我将文档插入到 @PostConstruct 块中的集合中。
请从 build.gradle 中删除编译 'com.arangodb:arangodb-java-driver' ,因为它将通过 spring boot arangodb starter(arangodb-spring-boot-starter) 解决。
当我尝试为 spring 启动应用程序使用 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'
}
我正在尝试创建一个简单的 SpringBoot 应用程序来连接数据库并将一些数据存储在数据库中,但是当我的代码尝试提交新对象时,总是出现 401 禁止消息。
我应该如何使用 SpringBoot 连接到 ArangoDb 才能在数据库中保存节点?
我的系统上安装了 ArangoDb 运行ning,我可以在本地主机上登录 Web 控制台:http://localhost:8529
我有一个与下面的 属性 同名的数据库。我还尝试在 运行 应用程序之前通过 Web 界面创建集合(是的,我是 DB 图表的新手)。
尝试保留实体时发生错误:
competitorRepository.save(competitor);
我知道这会是什么'obvious',至少在我使用 ArangoDb 一段时间后会是这样!!
该错误可能表明我的依赖项中有错误的驱动程序,但如果不是我的 Gradle 文件(如下)中的驱动程序,我不知道应该是什么。
一些代码:
application.properties: 尝试使用 root 用户以避免用户权限问题。我可以用这个用户登录到网络界面。
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);
}
}
PostConstruct.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 class... 使用 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> {
}
项目gradle文件:
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 DEBUG 14845 --- [ main] o.s.boot.diagnostics.FailureAnalyzers : FailureAnalyzer org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer@372461a9 failed
java.lang.TypeNotPresentException:类型 org.springframework.jdbc.CannotGetJdbcConnectionException 不存在 在 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 ERROR 14845 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.BeanCreationException:创建名称为 'postConstruction' 的 bean 时出错:调用 init 方法失败;嵌套异常是 org.springframework.dao.PermissionDeniedDataAccessException:响应:401,错误:401 - 未经授权;嵌套异常是 com.arangodb.ArangoDBException:响应:401,错误: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]
一如既往的这类问题...用户错误。
我在 application.properties 中有属性定义了数据库的值,例如 username/host 等
我也有:
@EnableArangoRepositories(basePackages = { "uk.co.deditech" })
public class ArangoGraphDbConfig implements ArangoConfiguration
在那里我有一个方法 arrango() 将硬连线值传递到 bean 创建中,那些硬连线值是不正确的(摆弄在线发现的几个 tutorials/instructions 的结果)。
我删除了该配置 class,一切似乎都启动了,包括我将文档插入到 @PostConstruct 块中的集合中。
请从 build.gradle 中删除编译 'com.arangodb:arangodb-java-driver' ,因为它将通过 spring boot arangodb starter(arangodb-spring-boot-starter) 解决。
当我尝试为 spring 启动应用程序使用 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'
}