Fixes to get Spring Data REST to pass the TCK test suite.

This commit is contained in:
Jon Brisbin
2013-02-22 15:53:01 -06:00
committed by Jon Brisbin
parent f4f7427263
commit cfcb097007
3 changed files with 111 additions and 19 deletions

View File

@@ -27,6 +27,8 @@ public class RepositoryRestConfiguration {
private Map<Class<?>, Class<?>> typeMappings = Collections.emptyMap();
private MediaType defaultMediaType = MediaType.APPLICATION_JSON;
private boolean dumpErrors = true;
private boolean returnBodyOnCreate = false;
private boolean returnBodyOnUpdate = false;
private List<Class<?>> exposeIdsFor = new ArrayList<Class<?>>();
private ResourceMappingConfiguration domainMappings = new ResourceMappingConfiguration();
private ResourceMappingConfiguration repoMappings = new ResourceMappingConfiguration();
@@ -309,6 +311,49 @@ public class RepositoryRestConfiguration {
return this;
}
/**
* Whether to return a response body after creating an entity.
*
* @return {@literal true} to return a body on create, {@literal false} otherwise.
*/
public boolean isReturnBodyOnCreate() {
return returnBodyOnCreate;
}
/**
* Set whether to return a response body after creating an entity.
*
* @param returnBodyOnCreate
* {@literal true} to return a body on create, {@literal false} otherwise.
*
* @return {@literal this}
*/
public RepositoryRestConfiguration setReturnBodyOnCreate(boolean returnBodyOnCreate) {
this.returnBodyOnCreate = returnBodyOnCreate;
return this;
}
/**
* Whether to return a response body after updating an entity.
*
* @return {@literal true} to return a body on update, {@literal false} otherwise.
*/
public boolean isReturnBodyOnUpdate() {
return returnBodyOnUpdate;
}
/**
* Sets whether to return a response body after updating an entity.
*
* @param returnBodyOnUpdate
*
* @return
*/
public RepositoryRestConfiguration setReturnBodyOnUpdate(boolean returnBodyOnUpdate) {
this.returnBodyOnUpdate = returnBodyOnUpdate;
return this;
}
/**
* Start configuration a {@link ResourceMapping} for a specific domain type.
*
@@ -333,10 +378,23 @@ public class RepositoryRestConfiguration {
return domainMappings.getResourceMappingFor(domainType);
}
/**
* Whether there is a {@link ResourceMapping} for the given domain type.
*
* @param domainType
* The domain type to find a {@link ResourceMapping} for.
*
* @return {@literal true} if a {@link ResourceMapping} exists for this domain class, {@literal false} otherwise.
*/
public boolean hasResourceMappingForDomainType(Class<?> domainType) {
return domainMappings.hasResourceMappingFor(domainType);
}
/**
* Get the {@link ResourceMappingConfiguration} that is currently configured.
*
* @return
*/
public ResourceMappingConfiguration getDomainTypesResourceMappingConfiguration() {
return domainMappings;
}
@@ -365,6 +423,13 @@ public class RepositoryRestConfiguration {
return repoMappings.getResourceMappingFor(repositoryInterface);
}
/**
* Whether there is a {@link ResourceMapping} configured for this {@literal Repository} class.
*
* @param repositoryInterface
*
* @return
*/
public boolean hasResourceMappingForRepository(Class<?> repositoryInterface) {
return repoMappings.hasResourceMappingFor(repositoryInterface);
}

View File

@@ -178,12 +178,18 @@ public class RepositoryEntityController extends AbstractRepositoryRestController
HttpHeaders headers = new HttpHeaders();
headers.setLocation(URI.create(selfLink.getHref()));
return resourceResponse(headers,
new PersistentEntityResource<Object>(repoRequest.getPersistentEntity(),
obj,
selfLink)
.setBaseUri(repoRequest.getBaseUri()),
HttpStatus.CREATED);
if(config.isReturnBodyOnCreate()) {
return resourceResponse(headers,
new PersistentEntityResource<Object>(repoRequest.getPersistentEntity(),
obj,
selfLink)
.setBaseUri(repoRequest.getBaseUri()),
HttpStatus.CREATED);
} else {
return resourceResponse(headers,
null,
HttpStatus.CREATED);
}
}
@SuppressWarnings({"unchecked"})
@@ -207,7 +213,9 @@ public class RepositoryEntityController extends AbstractRepositoryRestController
value = "/{id}",
method = RequestMethod.GET,
produces = {
"application/json"
"application/json",
"application/x-spring-data-compact+json",
"text/uri-list"
}
)
@ResponseBody
@@ -290,13 +298,19 @@ public class RepositoryEntityController extends AbstractRepositoryRestController
Object obj = repoMethodInvoker.save(domainObj);
applicationContext.publishEvent(new AfterSaveEvent(obj));
PersistentEntityResource per = PersistentEntityResource.wrap(repoRequest.getPersistentEntity(),
obj,
repoRequest.getBaseUri());
per.add(repoRequest.buildEntitySelfLink(obj, conversionService));
return resourceResponse(null,
per,
HttpStatus.OK);
if(config.isReturnBodyOnUpdate()) {
PersistentEntityResource per = PersistentEntityResource.wrap(repoRequest.getPersistentEntity(),
obj,
repoRequest.getBaseUri());
per.add(repoRequest.buildEntitySelfLink(obj, conversionService));
return resourceResponse(null,
per,
HttpStatus.OK);
} else {
return resourceResponse(null,
null,
HttpStatus.NO_CONTENT);
}
}
@SuppressWarnings({"unchecked"})

View File

@@ -1,6 +1,7 @@
package org.springframework.data.rest.webmvc;
import static org.springframework.data.rest.core.util.UriUtils.*;
import static org.springframework.data.rest.repository.support.ResourceMappingUtils.*;
import java.net.URI;
import java.util.ArrayList;
@@ -119,7 +120,9 @@ public class RepositoryPropertyReferenceController extends AbstractRepositoryRes
method = RequestMethod.GET,
produces = {
"application/json",
"application/x-spring-data-verbose+json"
"application/x-spring-data-verbose+json",
"application/x-spring-data-compact+json",
"text/uri-list"
}
)
@ResponseBody
@@ -141,7 +144,7 @@ public class RepositoryPropertyReferenceController extends AbstractRepositoryRes
Link selfLink = repoRequest.buildEntitySelfLink(obj, conversionService);
per.add(selfLink);
headers.set("Content-Location", selfLink.getHref());
return new Resource<Object>(per);
return per;
}
}
} else if(prop.property.isMap()) {
@@ -156,7 +159,7 @@ public class RepositoryPropertyReferenceController extends AbstractRepositoryRes
Link selfLink = repoRequest.buildEntitySelfLink(entry.getValue(), conversionService);
per.add(selfLink);
headers.set("Content-Location", selfLink.getHref());
return new Resource<Object>(per, selfLink);
return per;
}
}
} else {
@@ -192,8 +195,18 @@ public class RepositoryPropertyReferenceController extends AbstractRepositoryRes
ResourceMapping repoMapping = repoRequest.getRepositoryResourceMapping();
ResourceMapping entityMapping = repoRequest.getPersistentEntityResourceMapping();
String propName = entityMapping.getNameForPath(property);
ResourceMapping propMapping = entityMapping.getResourceMappingFor(entityMapping.getNameForPath(property));
String propRel = (null != propMapping ? propMapping.getRel() : property);
PersistentProperty persistentProp = repoRequest.getPersistentEntity().getPersistentProperty(propName);
Class<?> propType = (persistentProp.isCollectionLike() || persistentProp.isMap()
? persistentProp.getComponentType()
: persistentProp.getType());
ResourceMapping propRepoMapping = getResourceMapping(config, repositories.getRepositoryInformationFor(propType));
String propRel = String.format("%s.%s.%s.%s",
repoMapping.getRel(),
entityMapping.getRel(),
(null != propMapping ? propMapping.getRel() : property),
propRepoMapping.getRel());
Resource<?> resource = response.getBody();
@@ -330,7 +343,7 @@ public class RepositoryPropertyReferenceController extends AbstractRepositoryRes
id,
property,
handler);
return resourceResponse(null, EMPTY_RESOURCE, HttpStatus.NO_CONTENT);
return resourceResponse(null, EMPTY_RESOURCE, HttpStatus.CREATED);
}
@SuppressWarnings({"unchecked"})