diff --git a/spring-data-rest-core/pom.xml b/spring-data-rest-core/pom.xml
index 6c0ea1946..d6048e53e 100644
--- a/spring-data-rest-core/pom.xml
+++ b/spring-data-rest-core/pom.xml
@@ -16,7 +16,7 @@
- 0.12.0.RELEASE
+ 0.13.0.BUILD-SNAPSHOT
1.1.0.RELEASE
1.1
diff --git a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/annotation/RepositoryRestResource.java b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/annotation/RepositoryRestResource.java
index 1002294d7..0b3a70c65 100644
--- a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/annotation/RepositoryRestResource.java
+++ b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/annotation/RepositoryRestResource.java
@@ -72,4 +72,15 @@ public @interface RepositoryRestResource {
* @return
*/
Description itemResourceDescription() default @Description(value = "");
+
+ /**
+ * Configures the projection type to be used when embedding item resources into collections and related resources.
+ * Defaults to {@link None}, which indicates full rendering of the items in a collection resource and no inlining of
+ * related resources.
+ *
+ * @return
+ */
+ Class> excerptProjection() default None.class;
+
+ static class None {}
}
diff --git a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/mapping/CollectionResourceMapping.java b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/mapping/CollectionResourceMapping.java
index 57b88d91a..739edab2a 100644
--- a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/mapping/CollectionResourceMapping.java
+++ b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/mapping/CollectionResourceMapping.java
@@ -35,4 +35,12 @@ public interface CollectionResourceMapping extends ResourceMapping {
* @return
*/
ResourceDescription getItemResourceDescription();
+
+ /**
+ * Returns the projection type to be used when embedding item resources into collections and related resources. If
+ * {@literal null} is returned this will mean full rendering for collections and no rendering for related resources.
+ *
+ * @return
+ */
+ Class> getExcerptProjection();
}
diff --git a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/mapping/RepositoryAwareResourceInformation.java b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/mapping/RepositoryAwareResourceInformation.java
index c9ac344f9..eb67dea6a 100644
--- a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/mapping/RepositoryAwareResourceInformation.java
+++ b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/mapping/RepositoryAwareResourceInformation.java
@@ -169,6 +169,15 @@ class RepositoryAwareResourceInformation implements ResourceMetadata {
return mapping.getItemResourceDescription();
}
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.rest.core.mapping.CollectionResourceMapping#getExcerptProjection()
+ */
+ @Override
+ public Class> getExcerptProjection() {
+ return mapping.getExcerptProjection();
+ }
+
/*
* (non-Javadoc)
* @see org.springframework.data.rest.core.mapping.ResourceMetadata#getSearchResourceMappings()
diff --git a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/mapping/RepositoryCollectionResourceMapping.java b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/mapping/RepositoryCollectionResourceMapping.java
index 69f79a79e..d94442262 100644
--- a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/mapping/RepositoryCollectionResourceMapping.java
+++ b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/mapping/RepositoryCollectionResourceMapping.java
@@ -204,4 +204,20 @@ class RepositoryCollectionResourceMapping implements CollectionResourceMapping {
return fallback;
}
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.rest.core.mapping.CollectionResourceMapping#getExcerptProjection()
+ */
+ @Override
+ public Class> getExcerptProjection() {
+
+ if (repositoryAnnotation == null) {
+ return null;
+ }
+
+ Class> excerptProjection = repositoryAnnotation.excerptProjection();
+
+ return excerptProjection.equals(RepositoryRestResource.None.class) ? null : excerptProjection;
+ }
}
diff --git a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/mapping/TypeBasedCollectionResourceMapping.java b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/mapping/TypeBasedCollectionResourceMapping.java
index ae9236d45..d3972f686 100644
--- a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/mapping/TypeBasedCollectionResourceMapping.java
+++ b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/mapping/TypeBasedCollectionResourceMapping.java
@@ -150,6 +150,15 @@ class TypeBasedCollectionResourceMapping implements CollectionResourceMapping {
return fallback;
}
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.rest.core.mapping.CollectionResourceMapping#getExcerptProjection()
+ */
+ @Override
+ public Class> getExcerptProjection() {
+ return null;
+ }
+
/**
* Returns the default path to be used if the path is not configured manually.
*
diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/AbstractRepositoryRestController.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/AbstractRepositoryRestController.java
index 6d4d8ba9b..8d3047a58 100644
--- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/AbstractRepositoryRestController.java
+++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/AbstractRepositoryRestController.java
@@ -200,24 +200,25 @@ class AbstractRepositoryRestController implements MessageSourceAware {
}
@SuppressWarnings({ "unchecked" })
- protected Resources resultToResources(Object result, PersistentEntityResourceAssembler assembler) {
+ protected Resources resultToResources(Object result, PersistentEntityResourceAssembler assembler, Link baseLink) {
if (result instanceof Page) {
Page