我在制作全新的项目时遇到了麻烦。我用https://start.spring.io/生成了一个全新的Spring 2.0 MongoDB Maven项目,我希望有一个嵌入式MongoDB数据库用于我的集成测试。 spring初始化器为de.flapdoodle.embed.mongo添加了一个依赖项。
但每次我尝试运行" mvn clean package"时,我在测试期间收到以下错误:
Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'embeddedMongoServer' defined in class path resource
[org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.class]:
Invocation of init method failed; nested exception is java.io.IOException:
Could not start process: <EOF>
at de.flapdoodle.embed.mongo.AbstractMongoProcess.onAfterProcessStart(AbstractMongoProcess.java:79) ~[de.flapdoodle.embed.mongo-2.0.3.jar:na]
at de.flapdoodle.embed.process.runtime.AbstractProcess.<init>(AbstractProcess.java:116) ~[de.flapdoodle.embed.process-2.0.2.jar:na]
at de.flapdoodle.embed.mongo.AbstractMongoProcess.<init>(AbstractMongoProcess.java:53) ~[de.flapdoodle.embed.mongo-2.0.3.jar:na]
at de.flapdoodle.embed.mongo.MongodProcess.<init>(MongodProcess.java:50) ~[de.flapdoodle.embed.mongo-2.0.3.jar:na]
at de.flapdoodle.embed.mongo.MongodExecutable.start(MongodExecutable.java:44) ~[de.flapdoodle.embed.mongo-2.0.3.jar:na]
at de.flapdoodle.embed.mongo.MongodExecutable.start(MongodExecutable.java:34) ~[de.flapdoodle.embed.mongo-2.0.3.jar:na]
at de.flapdoodle.embed.process.runtime.Executable.start(Executable.java:108) ~[de.flapdoodle.embed.process-2.0.2.jar:na]
我错过了什么?
我的应用程序文件非常简单:
@SpringBootApplication
public class NewnewinternetApplication {
public static void main(String[] args) {
SpringApplication.run(NewnewinternetApplication.class, args);
}
}
我的配置文件非常简单:
@Configuration
@EnableMongoRepositories
@ComponentScan(basePackages = "com.snoop.dougg.newnewinternet")
public class AppConfig {
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/");
resolver.setSuffix(".html");
return resolver;
}
}
我现在有两个简单的控制器只返回静态输出。
我有一个小文件:
@Document(collection = "user")
public class User implements Serializable {
protected static final long serialVersionUID = -1L;
@Id
private String id;
private String username;
private String firstName;
private String lastName;
public User() {}
public User(String username, String firstName, String lastName) {
this.username = username;
this.firstName = firstName;
this.lastName = lastName;
}
//Getters, setters, and equals and hash code methods...
}
然后是一个愚蠢的小测试:
@RunWith(SpringRunner.class)
//@SpringBootTest -> Doesn't work either
@DataMongoTest
public class NewnewinternetApplicationTests {
@Autowired
private MongoTemplate mongoTemplate;
@Test
public void sillyLittleTest() {
mongoTemplate.save(new User("sdoug", "Snoop", "Dougg"));
Assert.notNull(
mongoTemplate.find(
new Query(Criteria.where("firstName").is("Snoop")), User.class),
"Couldn't find by first name!");
}
}
然后我的pom文件,我真的只是一个人留下来了:
<?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.snoop.dougg.newnewinternet</groupId>
<artifactId>NewNewInternet</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<name>NewNewInternet</name>
<description>A new new internet</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<azure.version>2.0.1</azure.version>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.M9</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-active-directory-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-keyvault-secrets-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-spring-boot</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-spring-boot-bom</artifactId>
<version>${azure.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
答案 0 :(得分:2)
在application.properties中注释以下各行并将它们放在其他配置文件中也可以工作。我找到了here
spring.data.mongodb.database=
spring.data.mongodb.host=
spring.data.mongodb.port=
答案 1 :(得分:1)
通常情况下,已经运行的mongodb实例是问题的根源。我将从检查是否有任何东西占用默认的mongodb端口-27017。
答案 2 :(得分:0)
机会是通过spring插件32下载的mongodb实例,而您正在64位Java上运行,反之亦然。请确认是否还有其他方法可以识别此修复程序。
答案 3 :(得分:0)
我的情况有点特殊,但这也许也可以帮助其他人解决这个问题。
如果有任何可能,您正在使用Win 10,并且已经有一个MongoDB作为服务运行(在我的情况下,它是一个较早的版本-v3.4-正在运行),则尝试停止该服务并运行然后进行测试。
答案 4 :(得分:0)
尝试将@DirtiesContext
添加到测试课程级别。
答案 5 :(得分:0)
我处在相同的情况下,可以使用@DirtiesContext这样解决:
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class CommoditiesApplicationTests {
}
答案 6 :(得分:0)
我在这里有相同的场景,并使用
解决了 <dependency>
<groupId>com.github.fakemongo</groupId>
<artifactId>fongo</artifactId>
<version>2.1.1</version>
<scope>test</scope>
</dependency>
代替de.flapdoodle.embed.mongo
答案 7 :(得分:0)
就我而言,套接字文件仍然存在。
要解决潜在的问题,我想要控制台日志输出,我在front:
environment:
- NEXT_PUBLIC_API=http://localhost:8080
的{{1}}子句中放置了一个断点(失败时会命中)。
在这里,您可以访问else
,并且可以在调试模式下运行AbstractMongoProcess::onAfterProcessStart
来退出mongo控制台。对于我的问题,输出显示为logWatch
建议尝试的命令System.out.println(logWatch.output.toString());
对我不起作用(我的情况中未列出任何内容)
我找到了另一个SO答案,据说可以运行SocketException: Address already in use
.sock文件在以前的运行中仍然存在(显然我已经中断了测试)
删除此文件即可解决问题。
答案 8 :(得分:0)
就我而言,下载的是 32 位 mongodb 客户端,而不是 64 位客户端。
Embedded.mongo 库使用 BitSize 类来确定操作系统架构。在我的系统中,System.getProperty("os.arch")
没有返回 if
语句中列出的值。
我通过在我的应用程序主程序中将 os.arch
系统属性设置为 x86_64
(BitSize
用于返回 B64
的值之一)解决了这个问题。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
System.setProperty("os.arch", "x86_64");
SpringApplication.run(Application.class, args);
}
}
注意:如果您使用 32 位 java 版本在 64 位系统上运行您的应用程序,System.getProperty("os.arch")
将返回错误的值!