Commit Graph

663 Commits

Author SHA1 Message Date
Oliver Drotbohm
ecba61662c Fix regression in PUT handling for empty nested documents.
The fix for #2174 introduced a bug for our PUT handling of nested documents in case the target object's field value is null as it would only apply the nested value if all Optionals were present. This is, of course not the case.

Fixes #2264.
2023-06-12 11:40:28 +02:00
Oliver Drotbohm
2fb1fa9289 Avoid manually handling additional primitive elements in collection merging for PATCHes.
Fixes #2261.
2023-06-12 11:40:08 +02:00
Oliver Drotbohm
9020e1d10d Upgrade optional Jackson/JPA integration to Hibernate 6.
Fixes #2234.
2023-05-03 23:01:57 +02:00
Will Fleury
816ca84e70 Populate custom ExceptionHandlerExceptionResolver with ApplicationContext.
Fixes #2245.
Original pull request #2246.
2023-05-03 17:05:52 +02:00
Oliver Drotbohm
e4bca534bf Support to receive aggregate references as request parameters.
We now support using AggregateReference as type to bind request parameters taking URIs pointing to related aggregates. The default resolution will try to resolve the entire URI via UriToEntityConverter but one can also provide a function that can extract any part of the URI to be then resolved into either an identifier, aggregate instance or jMolecules Association against the ConversionService.

Fixes #2239.
2023-03-19 23:56:39 +01:00
Oliver Drotbohm
6d0034f15f Support for query methods returning a Slice.
Built on the the just introduced RepresentationModelAssembler implementations based on Slice in Spring HATEOAS and Spring Data Commons we now support returning a SlicedModel from the controller backing search resources ultimately triggering repository query methods.

The introduction triggered the refactoring to introduce RepresentationModelAssemblers (RMA) to remove the need for controllers inheriting from AbstractRepositoryController to access RepresentationModel assembly functionality. RMA acts as a facade for both Paged-/SlicedResourceAssembler as well as PersistentEntityResourceAssembler.

Fixes #2235.
2023-03-02 17:20:09 +01:00
Oliver Drotbohm
fb1924286a Use FormattingConversionService in JSON Patch binding.
We no pipe the Spring MVC ConversionService into the JSON Patch path binding. That usually is a FormattingConversionService at runtime and also supports the conversion of dates.

The ConversionServices is configured into the BindContext(Factory) we use for binding. The context then exposes the EvaluationContext set up with it.

Fixes #2233.
2023-02-21 18:43:19 +01:00
Oliver Drotbohm
d02d1bb0c1 Support for returning response bodies on deletion of item resources.
RepositoryRestConfiguration now allows to configure to return a response body for the deletion of item resources. The controller implementation follows the same patter we have already established for creation and updates: unless explicitly enabled or disabled we now consider the presence of an accept header as indicator of whether a response body should be rendered.

This could be a "breaking" change for clients having explicitly expected 204 until now even for requests with an Accept header. If that's an issue, those should either explicitly disable the setting, do not submit an Accept header or loosen their expectations to expect either 200 or 2xx as indicator of success in general.

Fixes #2225.
2023-02-21 17:25:28 +01:00
Oliver Drotbohm
7c0fc837a3 Register MVC validator with Spring Data REST HandlerAdapter.
Fixes: #967.
Original pull request: 2108.
2023-02-21 15:46:08 +01:00
zhengchalei
890111f06f Fix doc link end label in ResourceStatus.
Fixes #2139
2023-02-21 14:19:46 +01:00
Oliver Drotbohm
6c4f57f31a Avoid obsolete inspection of DefaultedPageable.
The instance can never be null and thus we don't actually have to check for that.

Fixes #2222
2023-02-21 14:14:38 +01:00
Oliver Drotbohm
b65e0c9118 Adapt to renamed properties by using MappedProperties in association deserialization.
Revert the changes that employed manual annotation lookup as that would cause invalid associations of fields and accessor methods for properties shadow renamed. Instead, we now use MappedProperties that already contains a mapping between the Jackson field names and Sprign Data property names.

Fixes: #2165
2023-02-21 13:26:14 +01:00
Lars Vierbergen
5335fe61e9 Fix mapping URIs to @JsonProperty annotated associations
Normally, when creating and updating (POST/PUT) an entity via the REST endpoints, you can use the URL of the relation target. (e.g.: send `{"package": "/packages/1"}` when `package` is a JPA `@OneToOne` relation).

Now this also takes into account when the JPA relation is annotated with `@JsonProperty` to change the serialized name.

Add unit tests for linkable associations.

Issue: #2165
2023-02-21 13:26:08 +01:00
Oliver Drotbohm
f18491f722 Properly deep-merge nested documents on PUT.
This is needed to consider read-only properties within those objects as those would otherwise get overridden.

Fixes: #2174
2023-02-21 10:36:38 +01:00
Oliver Drotbohm
0db1adadd0 Register StdValueInstantiator._constructorArguments for reflection.
The field is looked up by reflection in ValueInstantiatorCustomizer.

Fixes #2213.
2023-01-20 16:35:30 +01:00
Oliver Drotbohm
1bfa83cb73 Register per-repository pattern for observability purposes.
The standard Spring MVC observability integration registers the plain request pattern for observations. For our repository controllers that would result in one pattern registered for all individual repository resources (e.g. /{repository}/{id} etc.). However, the insights users would like to gain rather follows the individual repositories exposed. That's why we have so far exposed repository specific path pattern (/myrepo/{id}) via a custom request attribute. To adhere to the new observability integration of Spring Framework 6, we need to expose that particular pattern on the ServerRequestObservationContext, too.

Fixes #2212.
2023-01-09 15:31:57 +01:00
Mark Paluch
f0e86b9a17 Extend license header copyright years to 2023.
See #2211
2023-01-02 09:53:37 +01:00
Christoph Strobl
6f68fe814f Add Nullable annotation to parameter of overridden equals method.
Closes: #2196
Original pull request: #2197
2022-12-02 11:16:15 +01:00
Christoph Strobl
b3e8489085 Added AOT metadata.
We now register @BasePathAwareController instances for class proxy generation. Also, we scan the packages of repository definitions for projection interfaces to register reflective access for them.

Fixes #2183.
2022-10-27 11:50:57 +02:00
Oliver Drotbohm
5d0687d1a1 Improve JSON Patch implementation.
Refactor JSON Patch application implementation to improve the property detection for which values are supposed to be set.

Fixes #2177.
2022-09-19 10:21:19 +02:00
Oliver Drotbohm
23dfeafee4 Add explicit qualifier names to references to RepositoryInvokerFactory in RepositoryRestMvcConfiguration.
Fixes #2161.
2022-07-15 14:01:11 +02:00
Oliver Drotbohm
1205ef1eb8 Polish annotation attribute aliasing in RepositoryRestController.
Related ticket: #2157.
2022-07-14 17:45:26 +02:00
Oliver Drotbohm
753886fa2c Forward StringValueResolver to DelegatingHandlerMappings targets.
RepositoryRestMvcConfiguration now implements EmbeddedValueResolver to forward the StringValueResolver given to both BasePathAwareHandlerMapping and RepositoryRestHandlerMapping.

Related ticket: #2157.
2022-07-13 23:47:36 +02:00
Mark Paluch
070d284e69 Upgrade to Hibernate 6.
Introduce bytebuddy exclusions to avoid clashes with Mockito-provided byte buddy versions. Extend version range in Jackson Hibernate module registrar.

Closes #2158
2022-07-13 08:54:26 +02:00
Oliver Drotbohm
07ebc501cd Polishing.
Added test case and re-enabled the base URI to be prepended even in case a controller path prefix is configured. That functionality had been lost with the originally submitted changes.

Related ticket: #2157
Original pull request: #2088.
2022-07-06 17:26:07 +02:00
Yves Galante
8daacadb1e Add support for controller base path on BasePathAwareController / RepositoryRestController.
This commit introduces support for a common base path shared amongst all handler methods of a controller annotated with @BasePathAwareController / @RepositoryRestController.

Related ticket: #2157
Original pull request: #2088.
2022-07-06 17:26:07 +02:00
Oliver Drotbohm
4bff95a180 Remove obsolete test case from RepositoryRestHandlerMappingUnitTests.
The test started to fail when Spring Framework 6 disabled trailing slash path matching (see spring-projects/spring-framework#28552 for details). If adapted to the non-trailing version, it basically duplicates another test already present in the test class.
2022-07-06 17:26:07 +02:00
John Blum
29b7305d71 Remove punctuation in Exception messages.
Closes #2152.
2022-06-08 16:08:03 -07:00
Oliver Drotbohm
adcd7e74ef Fix PUT merge handling for polymorphic properties.
We now replace the original value of polymorphic properties with the newly deserialized one if the type of the new one is different from the old one. We still copy all JSON ignored properties to the new instance to make sure that non-exposed, server-side state is retained. We apply the same handling for explicitly immutable source and/or target types.

Fixes #2130.
2022-04-04 14:53:15 +02:00
Oliver Drotbohm
ed822390d8 Fix potential NullPointerException in HalFormsAdaptingResponseBodyAdvice.
Fixes #2123.
2022-03-28 16:50:34 +02:00
Oliver Drotbohm
b7d6b2b78c Update copyright years to 2022. 2022-02-07 10:26:46 +01:00
Jens Schauder
ee317f1b91 Remove Eclipse Non-Javadoc comments.
Closes #2093
2022-01-05 13:40:05 +01:00
Oliver Drotbohm
e912907ec0 Adapt to changes in Spring Framework's HttpMethod. 2021-11-30 18:56:54 +01:00
Oliver Drotbohm
0efd1502d0 Further steps towards JakartaEE.
Remove temporary version placeholders and obsolete version declarations for modules we do not test against anymore.

Tweaked the JPA integration and the Jackson Hibernate 5 one in particular to work with the new Jakarta variants. Re-enabled JPA tests. Removed support for Jackson Hibernate 4 integration and JodaTime.
2021-11-30 18:56:54 +01:00
Oliver Drotbohm
ede294967f Upgrade to Spring Framework 6. 2021-11-30 18:56:53 +01:00
Oliver Drotbohm
a40aec5deb Consider @CrossOrigin(originPatterns = …).
RepositoryRestHandlerMapping's RepositoryCorsConfigurationAccessor now also evaluates @CrossOrigin's originPatterns into the CorsConfiguration.

Fixes #2077.
2021-10-19 10:32:48 +02:00
Patrik Mihalcin
358bd3578a Fix typo in RepositoryRestController's JavaDoc
Fixes #2061.
2021-10-13 16:02:18 +02:00
Oliver Drotbohm
4434d32fae Prevent using NestedEntitySerializer if target serializer does not support unwrapping.
We now verify that the serializer registered for the type that's supposed to be handled by the NestedEntitySerializer actually supports unwrapping as the serialization in EntityModel (MapSuppressingUnwrappingSerializer) requires that to work properly.

Fixes #2056.
2021-10-13 11:59:53 +02:00
Oliver Drotbohm
1828a6a2a7 Switch to JUnit 5.
Issue #2075.
2021-10-12 22:29:45 +02:00
Oliver Drotbohm
18b39cb321 Reduce general runtime exception logging to debug.
Issue #2074.
2021-10-12 16:21:12 +02:00
Oliver Drotbohm
46dc6e03fc Prevent duplicate controller registrations through class-level @RequestMapping.
When we detected @BasePathAwareController and @RepositoryRestController instances, we now reject types that use @RequestMapping on the class level as doing so causes an inevitable registration of the controller with Spring MVC.

Fixes #1342, #1628, #1686, #1946.
2021-10-06 12:13:37 +02:00
Oliver Drotbohm
c6b77e3dd9 Polish Javadoc to prepare builds with JDK 17.
Issue #2068.
2021-09-21 16:36:26 +02:00
Oliver Drotbohm
1dae476040 Adapt Content-Type header for HAL FORMS requests based on affordances.
Whenever HAL FORMS is supposed to be rendered, we now adapt the `Content-Type` header depending on whether affordances (and thus `_templates`) are present. If none can be found, we either adapt the header to either `application/hal+json` or even `application/json` depending on the `Accept` header arrangement given. If none match, we reject the request with `406 Not Acceptable`.

Had to reintroduce a dependency on Lombok to use @SneakyThrows as otherwise we cannot throw HttpMediaTypeNotAcceptableException from a ResponseBodyAdvice. A manual implementation of the pattern does not compile on Java 8 (at least on MacOS).

Fixes #2060.
2021-09-14 22:49:05 +02:00
Oliver Drotbohm
2aca2b24e0 Avoid reflection in RepositoryRestMvcConfiguration.
We now completely avoid reflection in RepositoryRestMvcConfiguration by delaying all bean lookups that were previously declared through autowired fields.

Fixes #2057.
2021-08-26 15:38:47 +02:00
Oliver Drotbohm
9cd9e1cef9 Avoid eager reference to BackendIdConverter beans.
Switched to bean method parameter reference to all BackendIdConverter instances.

Fixes #2055.
2021-08-19 23:19:08 +02:00
Oliver Drotbohm
8a1d147009 Remove 3.x deprecations.
Removed all deprecations that have accumulated in the 3.x timeline so far.
2021-07-15 08:20:11 +02:00
Oliver Drotbohm
161a3a9499 Allow customization of LinkCollector.
LinkCollector is now an interface. The actual implementation has been moved to DefaultLinkCollector. RepositoryRestConfigurer now has a customizeLinkCollector(…) callback method to tweak or even completely replace the LinkCollector instance.

Fixes #2042.
2021-07-15 08:15:20 +02:00
Oliver Drotbohm
0c24113484 Dedicated customization callback for AuditableBeanWrapperFactory.
Introduced RepositoryRestConfigurer.customizeAuditableBeanWrapperFactory(…) so that implementations can customize the default instance provided by RepositoryRestMvcConfiguration.

Fixes #2040.
2021-07-14 19:01:11 +02:00
Oliver Drotbohm
e1dd82c927 Prevent NullPointerException in AggregateReferenceDeserializerModifier.
In AggregateReferenceDeserializerModifier we now look up the original property name on the Jackson metadata before trying to resolve the property target type. We also explicitly guard against null values returned from that lookup and opt out of the customization in those cases.
2021-07-13 09:25:57 +02:00
Oliver Drotbohm
e2f8d2f2c4 Avoid using Guava's Charset.
Replaced with Java's StandardCharset. Fixes #2026.
2021-06-17 21:16:14 +02:00