woemler
woemler

Reputation: 7169

"PersistentEntity must not be null" Exception with MongoDB and Spring Data REST

Every attempt at creating a project with Spring Data REST and MongoDB has run into the same annoying issue. Every test that tries access a REST endpoint results in a java.lang.IllegalArgumentException: PersistentEntity must not be null!, thrown by the PersistentEntityResource builder method. This implies that when the application context is started and RepositoryRestMvcConfiguration is initialized, that the PersistentEntities bean is empty. Some example code:

@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());
  }

}

Stacktrace is:

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)

I am using Spring Boot, Spring Data MongoDB, and Spring Data REST with the latest Spring Platform version (Brussels-SR1). Running the application with Spring Boot, I don't receive any errors, it is only when testing, using both the SpringJUnit4ClassRunner and SpringRunner. What am I missing?

Upvotes: 3

Views: 3629

Answers (2)

Atul
Atul

Reputation: 3357

I have the same issue, where I am calling a method for read the values from the collection.

I was passing a blank string ("") and because of that it was giving me the exception mentioned.

After passing "null" explicitly the error was gone.

I don't know what the issue is with underline code but this is how I fix the issue.

Upvotes: 0

Ivan Fofanov
Ivan Fofanov

Reputation: 21

Had same issue and had to debug spring internals a lot

The reason of error - missing MappingConverter object in MongoTemplate. When mongoTemplate bean is automatically created by Spring following constructor is used

public MongoTemplate(MongoDbFactory mongoDbFactory, MongoConverter mongoConverter) 

To solve this issue there are two options:

1) don't redefine MongoTemplate bean. You can use application.properties to specify database

spring.data.mongodb.uri=mongodb://hostname:27017/dbName

2) Autowire mongoConverter and use in creation of mongoTemplate

@Autowired
private MongoConverter mongoConverter;

public @Bean
MongoTemplate mongoTemplate() throws Exception {
    MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(), mongoConverter);
    return mongoTemplate;
}

Hope this helps

Upvotes: 2

Related Questions