Spring-Data-Rest is a quite new project in the Spring family of pivotal. The intention of this project is to reduce the boilercode of controllers and services when you need only CRUD methods on an entity for your REST resources. – Quote from project page is “Spring-Data-Rest makes it easy to expose JPA based repositories as RESTful endpoints.”
One requirement I had was to expose the CRUD identifier and database primary key which is annotated with @Id. In my case that was needed because the field was functional required. For that I had to expose it because at the standard configuration the ID field is only visible on the resource path, but not on the JSON body.
To expose it you need to configure your RepositoryRestMvcConfiguration like that:
@Configuration public class MyCoolConfiguration extends RepositoryRestMvcConfiguration { @Override protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { config.exposeIdsFor(FooEntity.class); } }
The entity class could look like that:
@Entity public class FooEntity { @Id @GeneratedValue(strategy= GenerationType.AUTO) Long id; String name; }
With this configuration you will receive your entity id back.
{ "_links":{ "self":{ "href":"http://localhost:8081/api/fooentity/1" } }, "id":1, "name":"bar" }
Additional Comment from a Spring-Developer: URI stands for unique, resource, *identifier* – The URI *is* the id. What I expose here is a database internals.
I think this is among the such a lot vital info for me. And i’m happy reading your article. However wanna observation on few common issues, The website style is wonderful, the articles is in reality nice : D. Just right task, cheers
Hello, I have read your great article about how to expose the ID property when using the Spring Data Rest.
But unfortunately the ID property is still not exposed according to your settings. So could you kindly tell me the concrete configuration for the „MyCoolConfiguration“, I use @Component for the „MyCoolConfiguration“ and @ComponentScan for it, but unfortunately it did not work, Sorry to bother you ! Thanks very much
Hello RUIXIANG, thx that you like the article! I always enjoy if people tell me that my experience helps. – To your problem, do you have a sample project where it doesn’t work!? Maybe the best on Github (Gist), or drop the code here!
Sry for replying so late. Have a nice day …
Thanks Tommy, this was exactly what I needed. Spring Data REST is nice, but it is a pain to use when you dont want to use the HATEOAS approach, and then the id is needed.
I had to annotate the configuration class with „@Configuration“. Works great!
Yes Thomas, thanks you are right, every configuration class needs the „@Configuartion“ annotation of course.
This is a great article. I found that if you add the configuration class spring boot ignores your application.properties. The reason I noticed is because my base path was not set. „spring.data.rest.basePath“.
How did you go about resolving this problem in your project?
In my setup which is a bit bigger I wasn’t seeing that! Do you have the example as runnable maven project on github? Then I could have a look.
Happy coding, tommy
I ran into the same issue, it’s because Spring Boot is skipping it’s entire auto-configuration if you configure a RepositoryRestMvcConfiguration bean in the context. I borrowed a bit of magic from the auto-config class and added it into my own; I would have just extended their class but it was not public.
Long story short, I wound up with this:
@Configuration
@EnableConfigurationProperties(RepositoryRestProperties.class)
public class MyRepositoryConfig extends RepositoryRestMvcConfiguration {
@Autowired
private RepositoryRestProperties properties;
@Bean
@Override
public RepositoryRestConfiguration config() {
RepositoryRestConfiguration config = super.config();
this.properties.applyTo(config);
return config;
}
@Override
protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
config.exposeIdsFor(MyEntity.class);
}
}
Hope that helps!
This is old but guess someone will google to this page one every day.
Anyway, the method configureRepositoryRestConfiguration is now
DEPRECATED
Instead extend RepositoryRestConfigurerAdapter and override according to documentation:
http://docs.spring.io/spring-data/rest/docs/current/api/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.html
See documentation:
protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config)
Deprecated.
since 2.4, implement RepositoryRestConfigurer.configureRepositoryRestConfiguration(RepositoryRestConfiguration) either directly or extend RepositoryRestConfigurerAdapter and override the method.
With Spring Boot you simply list the classes that should expose the ID via RepositoryRestConfigurerAdapter:
@Component
public class SpringDataRestCustomization extends RepositoryRestConfigurerAdapter {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
config.exposeIdsFor(Account.class, Category.class, Transaction.class, User.class);
}
}
(see http://docs.spring.io/spring-data/rest/docs/2.5.1.RELEASE/reference/html/#customizing-sdr)