每次尝试使用 Spring Data REST 和 MongoDB 创建项目都会遇到同样烦人的问题。每个尝试访问 REST 端点的测试都会产生
java.lang.IllegalArgumentException: PersistentEntity must not be null!
,由 PersistentEntityResource
构建器方法抛出。这意味着当应用程序上下文启动并初始化 RepositoryRestMvcConfiguration
时,PersistentEntities
bean 为空。一些示例代码:
@Document
public class Person {
@Id private String id;
private String name;
private Integer age;
// Getters and setters
}
@RepositoryRestResource(path = "persons", collectionResourceRel = "persons")
public interface PersonRepository extends MongoRepository<Person, String> {
}
@Configuration
@EnableMongoRepositories(basePackages = { "me.woemler.test" })
public class DataSourceConfig {
@Bean(destroyMethod = "close")
public Mongo mongo() throws IOException {
return new EmbeddedMongoBuilder().build();
}
@Bean
public MongoTemplate mongoTemplate(Mongo mongo){
return new MongoTemplate(mongo, "test-db");
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = {DataSourceConfig.class, RepositoryRestMvcConfiguration.class})
public class PersonTests {
@Autowired private PersonRepository personRepository;
@Autowired private WebApplicationContext context;
private MockMvc mockMvc;
@Before
public void setup(){
personRepository.deleteAll();
Person person = new Person();
person.setName("Joe");
person.setAge(33);
personRepository.save(person);
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
@Test
public void test() throws Exception{
mockMvc.perform(MockMvcRequestBuilders.get("/persons"))
.andExpect(MockMvcResultMatchers.status().isOk());
}
}
堆栈跟踪是:
Caused by: java.lang.IllegalArgumentException: PersistentEntity must not be null!
at org.springframework.util.Assert.notNull(Assert.java:134)
at org.springframework.data.rest.webmvc.PersistentEntityResource$Builder.<init>(PersistentEntityResource.java:140)
at org.springframework.data.rest.webmvc.PersistentEntityResource$Builder.<init>(PersistentEntityResource.java:123)
at org.springframework.data.rest.webmvc.PersistentEntityResource.build(PersistentEntityResource.java:115)
at org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler.wrap(PersistentEntityResourceAssembler.java:74)
at org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler.toResource(PersistentEntityResourceAssembler.java:55)
at org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler.toResource(PersistentEntityResourceAssembler.java:38)
at org.springframework.data.web.PagedResourcesAssembler.createResource(PagedResourcesAssembler.java:200)
at org.springframework.data.web.PagedResourcesAssembler.toResource(PagedResourcesAssembler.java:132)
at org.springframework.data.rest.webmvc.AbstractRepositoryRestController.entitiesToResources(AbstractRepositoryRestController.java:92)
at org.springframework.data.rest.webmvc.AbstractRepositoryRestController.toResources(AbstractRepositoryRestController.java:76)
at org.springframework.data.rest.webmvc.RepositoryEntityController.getCollectionResource(RepositoryEntityController.java:209)
我正在使用 Spring Boot、Spring Data MongoDB 和 Spring Data REST 以及最新的 Spring Platform 版本 (Brussels-SR1)。使用 Spring Boot 运行应用程序,我没有收到任何错误,只有在使用
SpringJUnit4ClassRunner
和 SpringRunner
进行测试时才会出现错误。我错过了什么?
有同样的问题,必须大量调试 spring 内部
错误原因 - MongoTemplate 中缺少 MappingConverter 对象。 当 Spring 自动创建 mongoTemplate bean 时,使用以下构造函数
public MongoTemplate(MongoDbFactory mongoDbFactory, MongoConverter mongoConverter)
要解决此问题,有两种选择:
1) 不要重新定义 MongoTemplate bean。可以使用application.properties来指定数据库
spring.data.mongodb.uri=mongodb://hostname:27017/dbName
2) 自动装配 mongoConverter 并用于创建 mongoTemplate
@Autowired
private MongoConverter mongoConverter;
public @Bean
MongoTemplate mongoTemplate() throws Exception {
MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(), mongoConverter);
return mongoTemplate;
}
希望这有帮助
我有同样的问题,我正在调用一个方法来从集合中读取值。
我传递了一个空白字符串(“”),因此它给了我提到的异常。
显式传递“null”后,错误消失了。
我不知道下划线代码有什么问题,但这就是我解决问题的方法。
谢谢, 阿图尔