java - spring:-boot、-core、data-mongodb、-data-commons 依赖项

标签 java spring mongodb spring-boot spring-mongo

GA 版本似乎

spring-core
spring-data-commons
spring-data-mongodb

以及最新的候选版本

spring-boot-starter-web
spring-boot-autoconfigure

不兼容。

这些工件的哪些版本相互兼容?

我有一个非常基本的 Application.java,它将两个对象放入 MongoDB 数据库中,然后将它们取出并打印到屏幕上。

import game.acorn.entities.Entity;
import game.acorn.mRepositoryInterfaces.EntityRepository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application implements CommandLineRunner{

    @Autowired
    private EntityRepository repository;

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

    public void run(String... args) throws Exception {

        repository.deleteAll();

        repository.save(new Entity("Jack", "Skellington"));
        repository.save(new Entity("Blake", "Yarbrough"));

        System.out.println("Entities found");
        for (Entity entity : repository.findAll()){
            System.out.println(entity);
        }

        System.out.println();
        System.out.println("Entity by first name 'Jack'");
        System.out.println(repository.findByFirstName("Jack"));

        System.out.println();
        System.out.println("Entity by first name 'Blake'");
        System.out.println(repository.findByFirstName("Blake"));
    }


}

当我使用

运行此应用程序时
spring-core               version 4.0.2.RELEASE
spring-data-commons       version 1.5.0.RELEASE
spring-boot-starter-web   version 1.0.0.RC4
spring-data-mongodb       version 1.4.1.RELEASE
spring-boot-autoconfigure version 1.0.0.RC3

我最终得到一个 java.lang.NoClassDefFoundError at

org.springframework.boot.autoconfigure.data.AbstractRepositoryConfigurationSourceSupport.registerBeanDefinitions

看起来像

public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
        final BeanDefinitionRegistry registry) {
    new RepositoryConfigurationDelegate(getConfigurationSource(), this.resourceLoader)
            .registerRepositoriesIn(registry, getRepositoryConfigurationExtension());
}

new RepositoryConfigurationDelegate(getConfigurationSource(), this.resourceLoader)

是第58行。看来我使用的版本和spring-boot的依赖之间存在差异。

所以我尝试将我的 spring-data-commons 版本升级到版本 1.7.0.RELEASE

然后该类变得可用,但我在

处收到 java.lang.NoSuchMethodError
org.springframework.boot.autoconfigure.data.AbstractRepositoryConfigurationSourceSupport$1.<init>(AbstractRepositoryConfigurationSourceSupport.java:66)

看起来像

private AnnotationRepositoryConfigurationSource getConfigurationSource() {
        StandardAnnotationMetadata metadata = new StandardAnnotationMetadata(
                getConfiguration(), true);
        return new AnnotationRepositoryConfigurationSource(metadata, getAnnotation(),
                this.environment) {
            @Override
            public java.lang.Iterable<String> getBasePackages() {
                return AbstractRepositoryConfigurationSourceSupport.this
                        .getBasePackages();
            };
        };
    }

return new AnnotationRepositoryConfigurationSource(metadata, getAnnotation(),
            this.environment) {

第 65-66 行。

当我结帐时

org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource

我发现构造函数

public AnnotationRepositoryConfigurationSource(AnnotationMetadata metadata, Class<? extends Annotation> annotation,
            ResourceLoader resourceLoader, Environment environment) {

        super(environment);

        Assert.notNull(metadata);
        Assert.notNull(annotation);
        Assert.notNull(resourceLoader);

        this.attributes = new AnnotationAttributes(metadata.getAnnotationAttributes(annotation.getName()));
        this.metadata = metadata;
        this.resourceLoader = resourceLoader;
    }

期望比 spring-boot-autoconfigure 中的 AbstractRepositoryConfigurationSourceSupport 多一个参数。

所以,我的问题是,什么版本

spring-core
spring-data-commons
spring-boot-starter-web
spring-data-mongodb
spring-boot-autoconfigure

相互兼容吗?

我的 pom 看起来像

<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>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.0.0.RC3</version>
    </parent>
  <groupId>Master-Project</groupId>
  <artifactId>Master-Project</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <description>Master Project for MongoDB and Spring</description>

  <modules>
  </modules>

  <dependencies>

    <!-- Spring Stuff -->  

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.0.2.RELEASE</version>
    </dependency>  
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-mongodb</artifactId>
        <version>1.4.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-commons</artifactId>
        <version>1.7.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>1.0.0.RC3</version>
    </dependency>



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

    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>3.1</version>      
    </dependency>

  </dependencies>
  <repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>http://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
    <!--
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.3</source>
          <target>1.1</target>
        </configuration>
      </plugin>
    -->
      <plugin>
        <groupId>org.apache.maven.plugin</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <version>2.9</version>
        <configuration>
            <downloadSources>true</downloadSources>
            <downloadJavadocs>true</downloadJavadocs>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

当我删除依赖项上的版本标签时,我得到相同的 no such method 异常。

最佳答案

如果您将 Spring Boot 依赖项 pom(或启动父级)与 1.0.0.RC5 或更高版本一起使用,则此问题已修复。

关于java - spring:-boot、-core、data-mongodb、-data-commons 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22491638/

相关文章:

java - 当使用 EMF 比较结构相等但根据 == 不同的对象时,如何获得正确的差异?

java - 将 char 类型的默认值 (0) 附加到 string

每一小时 Java 同步值

javascript - 如何将 Javascript 日期转换为 Spring @RequestParam 的 LocalDate?

node.js - 如何将此 Mongoose 插件移植到 Mongoose 5

java - 转换为递归有界类型

java - 使用 APPMK 创建 Android 杂志应用程序

java - Spring - 从现有的 BindingResult 和 Model 构建新的 modelAndView

java - MongoDB:使用 java 驱动程序 3.0.x 执行 mapreduce 和过滤

mongodb - Golang/MGO—— panic : no reachable servers