I have a Spring Boot application combined with MongoDB as the persistance layer. I have the following structure:
public class Resource { @Id public String Id; ... }
I also have a ResourceRepository:
@RepositoryRestResource(collectionResourceRel = "resources", path = "resources") public interface ResourceRepository extends MongoRepository<Resource, String> { Resource findById(@Param("Id")String Id); }
I found online that a way to have the id property returned in the JSON when you perform a GET request like http://localhost:8080/resources/ is to change the id property to Id (uppercase i). Indeed, if the property is lowercase, I don’t get back an id field but if I change it to uppercase then I get it. For a reason, I need to get back the id property so I used the uppercase i. So far, so good.
However, when I tried to execute the query findById included in my repository I get an exception:
org.springframework.data.mapping.context.InvalidPersistentPropertyPath: No property id found on app.model.Resource!
If I change the Id property to id (lowercase i) I can execute successfully the /resources/search/findById?id=… GET request.
I tried creating a custom controller with a query that finds and returns a Resource based on the id that is given:
@Controller @RequestMapping("/resource") public class ResourceController { @Autowired MongoOperations mongoOperations; @RequestMapping(value="/findById/{resourceId}/", method= RequestMethod.GET) @ResponseBody public Resource findByResourceId(@PathVariable("resourceId") String resourceId) { Resource resource = mongoOperations.findOne(query(Criteria.where("Id").is(resourceId)), Resource.class,"DOJ"); } }
but I receive the same error:
org.springframework.data.mapping.context.InvalidPersistentPropertyPath: No property id found on app.model.Resource!
Any idea on how to both have the id property displyed in the JSon and be able to findById?
Advertisement
Answer
Well, I found the answer myself. Switch back to lowercase id so findById works and add the following class to the project:
@Configuration public class SpringDataRestConfiguration extends RepositoryRestConfigurerAdapter { @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { config.exposeIdsFor(Resource.class); } }
As the name of the method suggests, this configuration makes Resource class objects to expose their ids in JSON.
UPDATE: If you are using the latest or relatively latest version of spring-boot, the RepositoryRestConfigurerAdapter
class has been deprecated, and the java-doc suggests to use the interface RepositoryRestConfigurer
directly.
So your code should look like this:
@Configuration public class SpringDataRestConfiguration implements RepositoryRestConfigurer ...