MongoDB 和 Spring Data REST 的“PersistentEntity 不得为 null”异常

问题描述 投票:0回答:2

每次尝试使用 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
进行测试时才会出现错误。我错过了什么?

java mongodb junit spring-data spring-data-rest
2个回答
2
投票

有同样的问题,必须大量调试 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;
}

希望这有帮助


0
投票

我有同样的问题,我正在调用一个方法来从集合中读取值。

我传递了一个空白字符串(“”),因此它给了我提到的异常。

显式传递“null”后,错误消失了。

我不知道下划线代码有什么问题,但这就是我解决问题的方法。

谢谢, 阿图尔

© www.soinside.com 2019 - 2024. All rights reserved.