Commit Graph

470 Commits

Author SHA1 Message Date
Mathias Düsterhöft
518cab040f DATAREST-885 - PatchOperation now evaluates SpEL expression.
Original pull request: #223.
2016-09-12 11:01:48 +02:00
Oliver Gierke
3643e06b1f DATAREST-887 - Polishing.
Code formatting. Author tags. Assertions in Constructor. JavaDoc.

Original pull request: #224.
2016-09-12 10:47:50 +02:00
Mathias Düsterhöft
0a6dcc9825 DATAREST-887 - JsonPatchPatchHandler now uses external ObjectMapper.
The previously static ObjectMapper used by JsonPatchPatchHandler now has to be provided by clients instantiating the handler.

Original pull request: #224.
2016-09-12 10:47:13 +02:00
Oliver Gierke
31c894e880 DATAREST-607 - Register Jackson Hibernate 5 module automatically if present.
Just as we do for the Jackson Hibernate integration for Hibernate 4, we now register the module for Hibernate 5 as well.
2016-09-09 23:04:03 +02:00
Oliver Gierke
4cb0632518 DATAREST-880 - Prevent nested-entity-as-resource handling for unwrapped properties.
We now exclude properties that are marked as to be unwrapped from getting the nested-entity-as-resource behavour applied as it doesn't make any sense.
2016-08-29 19:26:07 +02:00
Oliver Gierke
72e4ef025d DATAREST-837 - DomainObjectMerger doesn't nullify read-only properties on PUT.
PUT requests are supposed to replace the state of the resource with the request payload. However, Spring Data REST already handles a couple of domain object propoerties in a special way as theri values map to dedicated HTTP features: identifiers (URIs), last-modified dates (header) etc.

For users, it might be worthwhile to exclude other properties from being set by applying the payload, like properties that are completely under the control of the server, e.g. creation user and date, last modifying user etc. So far, users didn't have any means to exclude those properties as the handling of PUT requests treated every missing property of the payload as null value.

DomainObjectMerger now checks whether a property is actually writable before applying the implicit null value. The application can be disabled by annotation a property with @ReadOnlyProperty.
2016-08-18 13:07:02 +02:00
Oliver Gierke
8d931ceb59 DATAREST-866 - Avoid premature initialization of RepositoryRestMvcConfiguration.
Previously, RepositoryRestMvcConfiguration declared a BeanPostProcessor instance in a non-static bean factory method. That required Spring to instantiate the configuration class and keeping it in uninitialized state, which could in turn cause issues downstream.

We now use a static method so that the container can obtain the bean instance without having to create an instance of the configuration class and thus deferring its initialization.
2016-08-08 12:08:43 +02:00
Oliver Gierke
344c3ac840 DATAREST-863 - Adapt to changes in Accept header lookup in Spring 4.3.
Spring 4.3's HeaderContentNegotiationStrategy switched from looking up the Accept header via the method returning a single (potentially comma separated) one to the method returning multiple headers in the first place. We now added an override of HttpServletRequestWrapper.getHeaders(…) to out custom adapter defaulting the media type to make sure the defaulting is visible and thus the right handler methods are looked up.

That previously missing caused the DelegatingHandlerMapping selecting the redirect to the HAL browser in case a request to the API root was sent without an accept header as the defaulting of the header to application/hal+json wasn't properly exposed anymore and the redirect to the browser — declaring a produces clause of text/html — was not causing any media type mismatch anymore.
2016-08-04 21:15:19 -07:00
Oliver Gierke
eb630ef273 DATAREST-803 - Prepare next development iteration. 2016-07-27 14:32:36 +02:00
Oliver Gierke
eaca77051a DATAREST-803 - Release version 2.6 M1 (Ingalls). 2016-07-27 13:52:12 +02:00
Oliver Gierke
0b6a0a0a8d DATAREST-847 - RepositoryEntityCotroller.saveAndReturn(…) now uses save result.
Previously we handed the original entity to the AfterSaveEvent. This should work in most cases but actually repositories are allowed to return a completely different instance so that we now hand over the instance returned by the repository interaction to avoid potentially occurring issues.
2016-07-01 14:44:40 +02:00
Oliver Gierke
cbbf21fcef DATAREST-849 - Remove obsolete reference to ConversionService from RepositoryEntityController. 2016-07-01 14:35:42 +02:00
Oliver Gierke
9e5fd30c68 DATAREST-837 - Move to ResourceProcessor invcation infrastructure in Spring HATEOAS.
Deprecated the ResourceProcessor invoking infrastructure in place here in favor of the types moved to Spring HATEOAS. Refactored our codebase to make use of these newly introduced types right away.

Related tickets: spring-projects/spring-hateoas#362.
2016-06-10 21:33:33 +02:00
Oliver Gierke
f21e150692 DATAREST-840 - HalHandlerInstantiator now gets BeanFactory forwarded.
We now forward the AutowireCapableBeanFactory contained in the ApplicationContext to the HalHandlerInstantiator to make sure Jackson components can use dependency injection to access Spring managed beans.

Upgraded to Spring HATEOAS 0.21 snapshots to see the changes necessary in HalHandlerInstantiator.

Related ticket: spring-projects/spring-hateoas#460.
2016-06-09 17:43:36 +02:00
Oliver Gierke
4bec3229b5 DATAREST-809 - Fixed application of explicit projections for excerpts.
A refactoring in the course of the 2.5 development dropped the application of explicit projection in case of excerpts being requested. This particularly applies to collection resources with explicit projection requests which need to get the explicit projection applied over the default excerpt projection potentially registered.

This is now fixed by the explicitly selected projection (if existing) always trumping the excerpt one.
2016-04-14 20:11:44 +02:00
Oliver Gierke
c8abdf0139 DATAREST-805 - ValidationError nor exposes rejected value as is.
Previously ValidationError captured the toString() variant of the rejected value. We now return the rejected value as is.
2016-04-14 20:11:40 +02:00
Oliver Gierke
e18fe00ea6 DATAREST-790 - Prepare next development iteration. 2016-04-06 16:36:59 +02:00
Oliver Gierke
c49a29a247 DATAREST-790 - Release version 2.5 GA (Hopper). 2016-04-06 16:35:59 +02:00
Oliver Gierke
b530cbe471 DATAREST-798 - Fixed invalid implementation of ValidationErrors.
Changed the implementation of ValidationErrors to be based on AbstractBeanPropertyBindingResult to consider the nesting implemented in superclasses and using a PersistentPropertyAccessor to lookup the property values.

ValidatingRepositoryEventListener now uses this implementation if a PersistentEntity can be obtained for the type under consideration, falling back to a DirectFieldBindingResult otherwise.
2016-04-04 15:12:33 +02:00
Oliver Gierke
47e89d9fec DATAREST-792 - Fixed handling of PUT request with customized entity lookups.
Until now, the controller handling a PUT request for an item resource defensively tried to set the identifier of the entity to update to guard against request payloads accidentally modifying the identifier of entities to be uploaded by using the raw identifier from the URI. Through the introduction of customized entity lookups this isn't necessarily the actual entity identifier anymore.

We now apply this defensive logic in the argument resolver for the incoming PersistentEntityResource where we have access to the object to update, can lookup the actual identifier directly and set it back after Jackson has applied the request body to the object to update.

Related tickets: DATAREST-724.
2016-04-01 11:31:10 +02:00
Oliver Gierke
ccdeae7bbd DATAREST-791 - Association resources now considers customized id lookup.
RepositoryPropertyReferenceController now uses a RepositoryInvoker instead of the ConversionService so that potentially applied customized entity lookups are considered during that lookup.

Extracted HttpHeadersPreparer to remove functionality and dependencies from the commons superclass of all Spring Data REST controllers in favor of a dedicated type.

Related tickets: DATAREST-724.
2016-04-01 10:42:18 +02:00
Oliver Gierke
05c723fe50 DATAREST-782 - Prepare next development iteration. 2016-03-18 11:15:51 +01:00
Oliver Gierke
03a720d1c0 DATAREST-782 - Release version 2.5 RC1 (Hopper). 2016-03-18 11:15:00 +01:00
Oliver Gierke
4430e78966 DATAREST-787 - Remove dependency to JSON Patch library.
Switched to own JSON Patch implementation built by Craig Walls for Spring Sync back in the days.
2016-03-18 09:47:27 +01:00
Oliver Gierke
6075f3052a DATAREST-782 - Fixed build after Spring 4.2.5 update.
Upgraded to JSONPath 1.1.0 as 0.9 is not supported with Spring 4.2 anymore. Tweaked integration tests due to changed semantics and internals of JSONPath >= 1.0.
2016-03-17 21:29:20 +01:00
Oliver Gierke
892409da2c DATAREST-774 - Separated integration tests from core project to avoid classpath overlap.
Extracted store specific tests into separate test modules to prevent classpath overlap between projects. Those tests are now executed in an "it" build profile to prevent the tests being packaged for distribution on release.

Use Map-based repositories and mapping contexts for test in the Core and WebMvc module.

Slightly changed the configuration API for lookup types on RepositoryRestConfiguration.

Related ticket: DATAREST-776.
2016-02-29 19:40:10 +01:00
Oliver Gierke
897bc88d69 DATAREST-775 - Support for nested association links.
Tweaked custom Jackson serialization to make sure nested entities are rendered as resources so that links to related resources can be collected on nested levels as well.

Extracted EmbeddedResourcesAssembler from PersistentEntityResourceAssembler so that embedded resources can also be build for nested entities. Extracted a ResourceProcessorInvoker from ResourceProcessorHandlerMethodReturnValueHandler to allow ResourceSupport instances created for nested entities get the ResourceProcessor instance registered for them invoked as well.

ProjectionDefinitionRegistrar now also allows the domain type of a repository being registered as excerpt, too.

Related tickets: DATAREST-776.
2016-02-29 19:38:59 +01:00
Oliver Gierke
c74576b91e DATAREST-756 - Prepare next development iteration. 2016-02-12 15:43:39 +01:00
Oliver Gierke
1c850a5909 DATAREST-756 - Release version 2.5 M1 (Hopper). 2016-02-12 15:42:47 +01:00
Oliver Gierke
070f049edd DATAREST-765 - Polishing.
Removed solrconfig.xml. Minor formatting in solr.xml. Reduced nesting in shutdown handler in SolrInfrastructureConfig.

Original pull request: #209.
2016-02-10 11:10:42 +01:00
Christoph Strobl
598b276843 DATAREST-765 - Update Solr test configuration for Solr 5.
Added required solr.xml and moved core.properties to new location. Additionally registered a CloseHook to prevent SolrCore.close() failures.

Original pull request: #209.
2016-02-10 11:10:42 +01:00
Oliver Gierke
29153b6aae DATAREST-765 - Upgraded Solr dependency to 5.3.1. 2016-02-09 20:55:13 +01:00
Oliver Gierke
16306f6826 DATAREST-756 - Fix Querydsl test class generation.
We now configure a proper output directory for Querydsl generated test classes. Previously we used the folder that's automatically picked up by the main compilation step which breaks subsequent compile runs if they're not run with a previous clean.
2016-01-29 19:16:51 +01:00
Oliver Gierke
46df1279bf DATAREST-757 - Upgraded to Spring Data Solr 2.0.
Tweaked test configuration to use SolrClientFactory instead of SolrServerFactory.
2016-01-29 18:51:52 +01:00
Oliver Gierke
b25df0bcf1 DATAREST-756 - Reorganize dependencies to make sure they get pulled in in release profile. 2016-01-28 15:41:58 +01:00
Oliver Gierke
b866af762d DATAREST-754 - Polishing.
Upgraded to Groovy 2.4.4. Polished sample domain types and repositories. Removed obsolete format registration in test cases for schema creation. Keep inlined null checks to make sure the IDE doesn't create unnecessary can-be-null warnings.

Original pull request: #206.
2016-01-25 17:50:48 +01:00
Greg Turnquist
9fd62b5dbf DATAREST-753 - Added support for Groovy-based domain objects.
Groovy-based objects inherit from GroovyObject. This brings along attributes that Spring Data REST may try to parse when generating metadata like JSON Schema. Also verify ALPS is supported.

We now exclude those artificial properties from being exposed in the schema as well as causing issues.

Original pull request: #206.
2016-01-25 17:50:48 +01:00
Oliver Gierke
88c97a600d DATAREST-743 - Made ProjectionResourceContentSerializer immutable.
ProjectionResourceContentSerializer.unwrappingSerializer(…) now returns a new unwrapping instance instead of mutating the current instance to prevent the source one from answering subsequent calls to isUnwrappingSerializer() with true.

This allows the source instance to be reused and produce reliable results on multiple serialization attempts.

Related tickets: DATAREST-716.
2016-01-07 21:46:26 +01:00
Oliver Gierke
3ce10774d8 DATAREST-741 - UriToEntityDeserializer now uses RepositoryInvoker directly.
UriToEntityDeserializer now uses the RepositoryInvokerFactory to resolve entity instances directly to make sure potentially registered EntityLookup instances are considered for the lookup.
2016-01-06 14:17:42 +01:00
Oliver Gierke
000f645543 DATAREST-740 - Removed Cassandra integration tests. 2016-01-05 12:47:48 +01:00
Oliver Gierke
482c78c925 DATAREST-724 - Fixed invocation of DELETE on item resource with entity lookup present.
Tweaked the RepositoryEntityController to lookup the identifier of the entity to be deleted from the entity obtained rather than forwarding the given id directly. This makes sure we use the real entity identifier on calls to delete in case the one to be used in URIs is customized via an EntityLookup.
2016-01-05 12:47:47 +01:00
Oliver Gierke
1b99111634 DATAREST-730 - Temporarily remove integration tests for Neo4j. 2015-12-16 16:45:41 +01:00
Oliver Gierke
e08dff846e DATAREST-702 - Tweaked ResourceProcessorHandlerMethodReturnValueHandler to handle potentially proxied ResourceProcessors. 2015-12-11 19:02:19 +01:00
Oliver Gierke
0757253846 DATAREST-726 - Moved ResourceProcessorHandlerMethodReturnValueHandler to ResolvableType.
Removed all usages of TypeInformation from ResourceProcessorHandlerMethodReturnValueHandler so that it's not tied to Spring Data (REST) APIs anymore.
2015-12-10 18:50:17 +01:00
Oliver Gierke
6709d1fd92 DATAREST-697 - Fixed unwrapping mode in ProjectionSerializer.
Projection serializer now only creates a nested JSON document if it's not in unwrapping mode. Switched to a completely immutable implementation as we were previously mutating state in the request for an unwrapping instance as we were assuming the instances not being reused.
2015-12-10 13:20:47 +01:00
Oliver Gierke
3a66bc75e2 DATAREST-724 - Added configuration API for entity lookup customizations.
RepositoryRestConfiguration now exposes a withCustomEntityLookup() returning an EntityLookupRegistrar that allows to define customizations as follows on Java 8:

config.withCustomEntityLookup()
  .forRepository(UserRepository.class)
  .withIdMapping(User::getUsername)
  .withLookup(UserRepository::findByUsername);

or even abbreviated to:

config.withCustomEntityLookup()
  .forRepository(UserRepository.class, User::getUsername, UserRepository::findByUsername);

The API basically takes two lambdas or method references to define the id mapping (User::getUsername in this case) as well as the lookup call based on the repository type with which the customization builder was set up in the first place (UserRepository::findByUsername in this case).
2015-12-09 16:00:32 +01:00
Oliver Gierke
44ab756873 DATAREST-724 - Added support for customizing the property to be used for URI generation.
Spring Data REST now exposes an EntityLookup interface that allows to customize the property of an entity that shall be used to create item resource URIs. By default this mechanism uses the backend identifier and uses the repository's findOne(…) method.

The EntityLookup now exposes one method to return the property value to be used for URI generation as well as one method to obtain the entity instance from the very same raw identifier value. The EntityLookups are registered with both the SelfLinkProvider (for link creation) and the RepositoryInvoker (to obtain the entity instance).
2015-12-09 12:42:15 +01:00
Oliver Gierke
dc36dfb67a DATAREST-473 - Introduced configuration option to control default exposure of repositories.
RepositoryRestConfiguration now exposes a setRepositoryDetectionStrategy(…) to define which repositories should be detected for exposure by default. The default value for that will consider the repository interfaces visibility but also take the exported flag of @(Repository)RestResource into account. See all other options in RepositoryDetectionStrategies.

Tweaked the auto-registration of excerpt projections to avoid a circular dependency between configuration and resource mappings and moved it onto a BeanPostProcessor implementation.
2015-11-25 13:40:26 +01:00
Oliver Gierke
b663b5ff73 DATAREST-712 - Fixed application of Querydsl bindings to only kick in for collection resources.
The Querydsl integration in RootResourceInformationHandlerMethodArgumentResolver now only kicks in if the controller method parameter is annotated with @QuerydslPredicate. This allows us to apply the QuerydslBindings for collection resources but make sure they aren't accidentally applied during executions of query methods etc.

Improved the type lookup for query method execution to make sure the correct mapping is looked up for collection parameters.
2015-11-24 15:35:39 +01:00
Oliver Gierke
8329fcf8f6 DATAREST-705 - DomainObjectReader now doesn't wipe identifier and version properties.
Identifier and version properties are handled in a special way by Spring Data REST (ids are derived from and exposed via the URI, versions make it into the ETag header) and are not contained in the response representation. That requires handling PUT request having to explicitly exclude them from being wiped to null so that the server side values are still preserved.
2015-11-20 16:53:18 +01:00