java - Morphia 在保存到 DataStore 时给出 NoSuchMethodError

标签 java mongodb maven morphia

所以我尝试使用 Morphia 进行 MongoDB ORM。早些时候,我们总是直接使用 mongo-java-driver 来进行 CRUD,但 ORM 显然更有意义。

我们的 mongo-java-driver 版本是 3.1.0,我现在使用的是 morphia 以及当前版本 - 1.3.2。

我使用以下代码执行了一个简单的测试来启动并在测试项目中运行:

public class MorphiaTest {

  private Morphia morphia;
  private Datastore datastore;

  public MorphiaTest() {
    this.morphia = new Morphia();

    // should contain all the entity classes that we want to morphia to map
    morphia.mapPackage("com.test.entity");

    MongoClientOptions options = new MongoClientOptions.Builder().build();
    ServerAddress address = new ServerAddress("127.0.0.1", 27017);
    MongoClient client = new MongoClient(address, options);

    // configure morphia once and use different Datastore instances to connect to multiple databases
    this.datastore = morphia.createDatastore(client, "test");
  }

  public static void main(String[] args) {
    MorphiaTest morphia = new MorphiaTest();
    GroupProfile profile = new GroupProfile();
    profile.setName("First test group");
    profile.setDescription("Desc for first test group");
    profile.setTs(System.currentTimeMillis());
    profile.setType(0);
    morphia.datastore.save(profile);
  }

GroupProfile 是一个 Entity,我想将其写入 mongo 的 test 数据库中的集合,并且相当简单。

当我运行此程序时,出现以下错误:

INFO: Opened connection [connectionId{localValue:1, serverValue:2}] to 127.0.0.1:27017
Nov 07, 2017 2:48:50 PM com.mongodb.diagnostics.logging.JULLogger log
INFO: Monitor thread successfully connected to server with description ServerDescription{address=127.0.0.1:27017, type=STANDALONE, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 0, 15]}, minWireVersion=0, maxWireVersion=3, electionId=null, maxDocumentSize=16777216, roundTripTimeNanos=554323}
Exception in thread "main" java.lang.NoSuchMethodError: com.mongodb.InsertOptions.getBypassDocumentValidation()Ljava/lang/Boolean;
    at org.mongodb.morphia.InsertOptions.getBypassDocumentValidation(InsertOptions.java:93)
    at org.mongodb.morphia.InsertOptions.copy(InsertOptions.java:36)
    at org.mongodb.morphia.DatastoreImpl.enforceWriteConcern(DatastoreImpl.java:1245)
    at org.mongodb.morphia.DatastoreImpl.save(DatastoreImpl.java:775)
    at org.mongodb.morphia.DatastoreImpl.save(DatastoreImpl.java:758)

谁能告诉我哪里出错了?

这是我的 pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.bsb.test.morphia</groupId>
  <artifactId>morphiatest</artifactId>
  <version>0.1</version>
  <packaging>pom</packaging>
  <url>http://maven.apache.org</url>
  <name>${project.artifactId}-${project.version}</name>

  <dependencies>
    <dependency>
      <groupId>org.mongodb</groupId>
      <artifactId>mongo-java-driver</artifactId>
      <version>3.1.0</version>
    </dependency>
    <dependency>
      <groupId>org.mongodb.morphia</groupId>
      <artifactId>morphia</artifactId>
      <version>1.3.2</version>
      <exclusions>
        <exclusion>
          <groupId>org.mongodb</groupId>
          <artifactId>mongo-java-driver</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>versions-maven-plugin</artifactId>
        <version>2.3</version>
      </plugin>
      <plugin>
        <groupId>com.coveo</groupId>
        <artifactId>fmt-maven-plugin</artifactId>
        <version>1.8.0</version>
      </plugin>

    </plugins>
  </build>

</project> 

我可能搞乱了吗啡和 mongo-java-driver 之间的依赖关系,但似乎无法弄清楚。

最佳答案

Morphia 1.3.2 与 Mongo Java Driver 3.5.0 兼容。 Morphia 1.3.2 JAR 将传递该依赖性。您可以通过此排除来回避传递依赖:

<dependency>
  <groupId>org.mongodb.morphia</groupId>
  <artifactId>morphia</artifactId>
  <version>1.3.2</version>
  <exclusions>
    <exclusion>
      <groupId>org.mongodb</groupId>
      <artifactId>mongo-java-driver</artifactId>
    </exclusion>
  </exclusions>
</dependency>

相反,您应该删除此依赖项:

<dependency>
  <groupId>org.mongodb</groupId>
  <artifactId>mongo-java-driver</artifactId>
  <version>3.1.0</version>
</dependency>

...并接受 Morphia:1.3.2 兼容的 Mongo Java 驱动程序版本。

关于java - Morphia 在保存到 DataStore 时给出 NoSuchMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47154208/

相关文章:

java - Textview 不显示在 FrameLayout 中

Java如何将数组的一个元素与同一数组的所有其他元素进行比较

node.js - Mongoose不会更新子文档

java - 生成 WSDL 客户端时 Maven 构建期间出错 : "error: package com.ibm.ws.webservices.engine.encoding does not exist"

maven - 父 pom 是在其子代的相同 groupid 下还是在其自己/父代下创建的?

java - 我应该为每个查询创建一个新的数据库连接吗?

java - 测试 web 层 Spring Boot

c++ - MONGODB C++ DRIVER mongocxx 和 legacy 的区别

caching - 构建集合缓存是一个好习惯吗?

jsf - Maven JSF 版本