55
55
import org .springframework .hateoas .hal .CurieProvider ;
56
56
import org .springframework .hateoas .hal .HalLinkDiscoverer ;
57
57
import org .springframework .hateoas .hal .Jackson2HalModule ;
58
+ import org .springframework .hateoas .hal .forms .HalFormsLinkDiscoverer ;
59
+ import org .springframework .hateoas .hal .forms .Jackson2HalFormsModule ;
58
60
import org .springframework .hateoas .mvc .TypeConstrainedMappingJackson2HttpMessageConverter ;
59
61
import org .springframework .http .converter .HttpMessageConverter ;
60
62
import org .springframework .http .converter .json .Jackson2ObjectMapperFactoryBean ;
@@ -81,6 +83,7 @@ class HypermediaSupportBeanDefinitionRegistrar implements ImportBeanDefinitionRe
81
83
private static final String DELEGATING_REL_PROVIDER_BEAN_NAME = "_relProvider" ;
82
84
private static final String LINK_DISCOVERER_REGISTRY_BEAN_NAME = "_linkDiscovererRegistry" ;
83
85
private static final String HAL_OBJECT_MAPPER_BEAN_NAME = "_halObjectMapper" ;
86
+ private static final String HAL_FORMS_OBJECT_MAPPER_BEAN_NAME = "_halFormsObjectMapper" ;
84
87
private static final String MESSAGE_SOURCE_BEAN_NAME = "linkRelationMessageSource" ;
85
88
86
89
private static final boolean JACKSON2_PRESENT = ClassUtils .isPresent ("com.fasterxml.jackson.databind.ObjectMapper" ,
@@ -113,18 +116,11 @@ public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionR
113
116
}
114
117
115
118
if (types .contains (HypermediaType .HAL )) {
119
+ registerHypermediaComponents (metadata , registry , HAL_OBJECT_MAPPER_BEAN_NAME );
120
+ }
116
121
117
- if (JACKSON2_PRESENT ) {
118
-
119
- BeanDefinitionBuilder halQueryMapperBuilder = rootBeanDefinition (ObjectMapper .class );
120
- registerSourcedBeanDefinition (halQueryMapperBuilder , metadata , registry , HAL_OBJECT_MAPPER_BEAN_NAME );
121
-
122
- BeanDefinitionBuilder customizerBeanDefinition = rootBeanDefinition (DefaultObjectMapperCustomizer .class );
123
- registerSourcedBeanDefinition (customizerBeanDefinition , metadata , registry );
124
-
125
- BeanDefinitionBuilder builder = rootBeanDefinition (Jackson2ModuleRegisteringBeanPostProcessor .class );
126
- registerSourcedBeanDefinition (builder , metadata , registry );
127
- }
122
+ if (types .contains (HypermediaType .HAL_FORMS )) {
123
+ registerHypermediaComponents (metadata , registry , HAL_FORMS_OBJECT_MAPPER_BEAN_NAME );
128
124
}
129
125
130
126
if (!types .isEmpty ()) {
@@ -143,6 +139,21 @@ public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionR
143
139
registerRelProviderPluginRegistryAndDelegate (registry );
144
140
}
145
141
142
+ private static void registerHypermediaComponents (AnnotationMetadata metadata , BeanDefinitionRegistry registry , String objectMapperBeanName ) {
143
+
144
+ if (JACKSON2_PRESENT ) {
145
+
146
+ BeanDefinitionBuilder queryMapperBuilder = rootBeanDefinition (ObjectMapper .class );
147
+ registerSourcedBeanDefinition (queryMapperBuilder , metadata , registry , objectMapperBeanName );
148
+
149
+ BeanDefinitionBuilder customizerBeanDefinition = rootBeanDefinition (DefaultObjectMapperCustomizer .class );
150
+ registerSourcedBeanDefinition (customizerBeanDefinition , metadata , registry );
151
+
152
+ BeanDefinitionBuilder builder = rootBeanDefinition (Jackson2ModuleRegisteringBeanPostProcessor .class );
153
+ registerSourcedBeanDefinition (builder , metadata , registry );
154
+ }
155
+ }
156
+
146
157
/**
147
158
* Registers bean definitions for a {@link PluginRegistry} to capture {@link RelProvider} instances. Wraps the
148
159
* registry into a {@link DelegatingRelProvider} bean definition backed by the registry.
@@ -188,6 +199,9 @@ private AbstractBeanDefinition getLinkDiscovererBeanDefinition(HypermediaType ty
188
199
case HAL :
189
200
definition = new RootBeanDefinition (HalLinkDiscoverer .class );
190
201
break ;
202
+ case HAL_FORMS :
203
+ definition = new RootBeanDefinition (HalFormsLinkDiscoverer .class );
204
+ break ;
191
205
default :
192
206
throw new IllegalStateException (String .format ("Unsupported hypermedia type %s!" , type ));
193
207
}
@@ -283,22 +297,45 @@ private List<HttpMessageConverter<?>> potentiallyRegisterModule(List<HttpMessage
283
297
284
298
CurieProvider curieProvider = getCurieProvider (beanFactory );
285
299
RelProvider relProvider = beanFactory .getBean (DELEGATING_REL_PROVIDER_BEAN_NAME , RelProvider .class );
286
- ObjectMapper halObjectMapper = beanFactory .getBean (HAL_OBJECT_MAPPER_BEAN_NAME , ObjectMapper .class );
287
- MessageSourceAccessor linkRelationMessageSource = beanFactory .getBean (MESSAGE_SOURCE_BEAN_NAME ,
300
+
301
+ List <HttpMessageConverter <?>> result = new ArrayList <HttpMessageConverter <?>>(converters .size ());
302
+
303
+ if (beanFactory .containsBean (HAL_OBJECT_MAPPER_BEAN_NAME )) {
304
+
305
+ ObjectMapper halObjectMapper = beanFactory .getBean (HAL_OBJECT_MAPPER_BEAN_NAME , ObjectMapper .class );
306
+ MessageSourceAccessor linkRelationMessageSource = beanFactory .getBean (MESSAGE_SOURCE_BEAN_NAME ,
288
307
MessageSourceAccessor .class );
289
308
290
- halObjectMapper .registerModule (new Jackson2HalModule ());
291
- halObjectMapper .setHandlerInstantiator (new Jackson2HalModule .HalHandlerInstantiator (relProvider , curieProvider ,
309
+ halObjectMapper .registerModule (new Jackson2HalModule ());
310
+ halObjectMapper .setHandlerInstantiator (new Jackson2HalModule .HalHandlerInstantiator (relProvider , curieProvider ,
292
311
linkRelationMessageSource , beanFactory ));
293
312
294
- MappingJackson2HttpMessageConverter halConverter = new TypeConstrainedMappingJackson2HttpMessageConverter (
313
+ MappingJackson2HttpMessageConverter halConverter = new TypeConstrainedMappingJackson2HttpMessageConverter (
295
314
ResourceSupport .class );
296
- halConverter .setSupportedMediaTypes (Arrays .asList (HAL_JSON ));
297
- halConverter .setObjectMapper (halObjectMapper );
315
+ halConverter .setSupportedMediaTypes (Arrays .asList (HAL_JSON ));
316
+ halConverter .setObjectMapper (halObjectMapper );
317
+ result .add (halConverter );
318
+ }
319
+
320
+ if (beanFactory .containsBean (HAL_FORMS_OBJECT_MAPPER_BEAN_NAME )) {
321
+
322
+ ObjectMapper halFormsObjectMapper = beanFactory .getBean (HAL_FORMS_OBJECT_MAPPER_BEAN_NAME , ObjectMapper .class );
323
+ MessageSourceAccessor linkRelationMessageSource = beanFactory .getBean (MESSAGE_SOURCE_BEAN_NAME ,
324
+ MessageSourceAccessor .class );
325
+
326
+ halFormsObjectMapper .registerModule (new Jackson2HalFormsModule ());
327
+ halFormsObjectMapper .setHandlerInstantiator (new Jackson2HalFormsModule .HalFormsHandlerInstantiator (relProvider , curieProvider ,
328
+ linkRelationMessageSource , true ));
329
+
330
+ MappingJackson2HttpMessageConverter halFormsConverter = new TypeConstrainedMappingJackson2HttpMessageConverter (
331
+ ResourceSupport .class );
332
+ halFormsConverter .setSupportedMediaTypes (Arrays .asList (HAL_FORMS_JSON ));
333
+ halFormsConverter .setObjectMapper (halFormsObjectMapper );
334
+ result .add (halFormsConverter );
335
+ }
298
336
299
- List <HttpMessageConverter <?>> result = new ArrayList <HttpMessageConverter <?>>(converters .size ());
300
- result .add (halConverter );
301
337
result .addAll (converters );
338
+
302
339
return result ;
303
340
}
304
341
@@ -327,14 +364,13 @@ private static class DefaultObjectMapperCustomizer implements BeanPostProcessor
327
364
@ Override
328
365
public Object postProcessAfterInitialization (Object bean , String beanName ) throws BeansException {
329
366
330
- if (!HAL_OBJECT_MAPPER_BEAN_NAME .equals (beanName )) {
331
- return bean ;
367
+ if (HAL_OBJECT_MAPPER_BEAN_NAME .equals (beanName ) || HAL_FORMS_OBJECT_MAPPER_BEAN_NAME .equals (beanName )) {
368
+ ObjectMapper mapper = (ObjectMapper ) bean ;
369
+ mapper .disable (DeserializationFeature .FAIL_ON_UNKNOWN_PROPERTIES );
370
+ return mapper ;
332
371
}
333
372
334
- ObjectMapper mapper = (ObjectMapper ) bean ;
335
- mapper .disable (DeserializationFeature .FAIL_ON_UNKNOWN_PROPERTIES );
336
-
337
- return mapper ;
373
+ return bean ;
338
374
}
339
375
340
376
/*
0 commit comments