|
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.jsoncollection.Jackson2JsonCollectionModule; |
| 59 | +import org.springframework.hateoas.jsoncollection.JsonCollectionLinkDiscoverer; |
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;
|
|
75 | 77 | * activated as well).
|
76 | 78 | *
|
77 | 79 | * @author Oliver Gierke
|
| 80 | + * @author Greg Turnquist |
78 | 81 | */
|
79 | 82 | class HypermediaSupportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
|
80 | 83 |
|
81 | 84 | private static final String DELEGATING_REL_PROVIDER_BEAN_NAME = "_relProvider";
|
82 | 85 | private static final String LINK_DISCOVERER_REGISTRY_BEAN_NAME = "_linkDiscovererRegistry";
|
83 | 86 | private static final String HAL_OBJECT_MAPPER_BEAN_NAME = "_halObjectMapper";
|
| 87 | + private static final String JSON_COLLECTION_OBJECT_MAPPER_BEAN_NAME = "_jsonCollectionObjectMapper"; |
84 | 88 | private static final String MESSAGE_SOURCE_BEAN_NAME = "linkRelationMessageSource";
|
85 | 89 |
|
86 | 90 | private static final boolean JACKSON2_PRESENT = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper",
|
@@ -127,6 +131,21 @@ public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionR
|
127 | 131 | }
|
128 | 132 | }
|
129 | 133 |
|
| 134 | + if (types.contains(HypermediaType.JSON_COLLECTION)) { |
| 135 | + |
| 136 | + if (JACKSON2_PRESENT) { |
| 137 | + |
| 138 | + BeanDefinitionBuilder jsonCollectionQueryMapperBuilder = rootBeanDefinition(ObjectMapper.class); |
| 139 | + registerSourcedBeanDefinition(jsonCollectionQueryMapperBuilder, metadata, registry, JSON_COLLECTION_OBJECT_MAPPER_BEAN_NAME); |
| 140 | + |
| 141 | + BeanDefinitionBuilder customizerBeanDefinition = rootBeanDefinition(DefaultObjectMapperCustomizer.class); |
| 142 | + registerSourcedBeanDefinition(customizerBeanDefinition, metadata, registry); |
| 143 | + |
| 144 | + BeanDefinitionBuilder builder = rootBeanDefinition(Jackson2ModuleRegisteringBeanPostProcessor.class); |
| 145 | + registerSourcedBeanDefinition(builder, metadata, registry); |
| 146 | + } |
| 147 | + } |
| 148 | + |
130 | 149 | if (!types.isEmpty()) {
|
131 | 150 |
|
132 | 151 | BeanDefinitionBuilder linkDiscoverersRegistryBuilder = BeanDefinitionBuilder
|
@@ -188,6 +207,9 @@ private AbstractBeanDefinition getLinkDiscovererBeanDefinition(HypermediaType ty
|
188 | 207 | case HAL:
|
189 | 208 | definition = new RootBeanDefinition(HalLinkDiscoverer.class);
|
190 | 209 | break;
|
| 210 | + case JSON_COLLECTION: |
| 211 | + definition = new RootBeanDefinition(JsonCollectionLinkDiscoverer.class); |
| 212 | + break; |
191 | 213 | default:
|
192 | 214 | throw new IllegalStateException(String.format("Unsupported hypermedia type %s!", type));
|
193 | 215 | }
|
@@ -289,21 +311,43 @@ private List<HttpMessageConverter<?>> potentiallyRegisterModule(List<HttpMessage
|
289 | 311 |
|
290 | 312 | CurieProvider curieProvider = getCurieProvider(beanFactory);
|
291 | 313 | RelProvider relProvider = beanFactory.getBean(DELEGATING_REL_PROVIDER_BEAN_NAME, RelProvider.class);
|
292 |
| - ObjectMapper halObjectMapper = beanFactory.getBean(HAL_OBJECT_MAPPER_BEAN_NAME, ObjectMapper.class); |
293 |
| - MessageSourceAccessor linkRelationMessageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, |
294 |
| - MessageSourceAccessor.class); |
295 | 314 |
|
296 |
| - halObjectMapper.registerModule(new Jackson2HalModule()); |
297 |
| - halObjectMapper.setHandlerInstantiator(new Jackson2HalModule.HalHandlerInstantiator(relProvider, curieProvider, |
298 |
| - linkRelationMessageSource, beanFactory)); |
| 315 | + List<HttpMessageConverter<?>> result = new ArrayList<HttpMessageConverter<?>>(converters.size()); |
299 | 316 |
|
300 |
| - MappingJackson2HttpMessageConverter halConverter = new TypeConstrainedMappingJackson2HttpMessageConverter( |
301 |
| - ResourceSupport.class); |
302 |
| - halConverter.setSupportedMediaTypes(Arrays.asList(HAL_JSON)); |
303 |
| - halConverter.setObjectMapper(halObjectMapper); |
| 317 | + if (beanFactory.containsBean(HAL_OBJECT_MAPPER_BEAN_NAME)) { |
| 318 | + |
| 319 | + ObjectMapper halObjectMapper = beanFactory.getBean(HAL_OBJECT_MAPPER_BEAN_NAME, ObjectMapper.class); |
| 320 | + MessageSourceAccessor linkRelationMessageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, |
| 321 | + MessageSourceAccessor.class); |
| 322 | + |
| 323 | + halObjectMapper.registerModule(new Jackson2HalModule()); |
| 324 | + halObjectMapper.setHandlerInstantiator( |
| 325 | + new Jackson2HalModule.HalHandlerInstantiator(relProvider, curieProvider, linkRelationMessageSource, beanFactory)); |
| 326 | + |
| 327 | + MappingJackson2HttpMessageConverter halConverter = new TypeConstrainedMappingJackson2HttpMessageConverter( |
| 328 | + ResourceSupport.class); |
| 329 | + halConverter.setSupportedMediaTypes(Arrays.asList(HAL_JSON)); |
| 330 | + halConverter.setObjectMapper(halObjectMapper); |
| 331 | + result.add(halConverter); |
| 332 | + } |
| 333 | + |
| 334 | + if (beanFactory.containsBean(JSON_COLLECTION_OBJECT_MAPPER_BEAN_NAME)) { |
| 335 | + |
| 336 | + ObjectMapper jsonCollectionObjectMapper = beanFactory.getBean(JSON_COLLECTION_OBJECT_MAPPER_BEAN_NAME, ObjectMapper.class); |
| 337 | + MessageSourceAccessor linkRelationMessageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, |
| 338 | + MessageSourceAccessor.class); |
| 339 | + |
| 340 | + jsonCollectionObjectMapper.registerModule(new Jackson2JsonCollectionModule()); |
| 341 | + jsonCollectionObjectMapper.setHandlerInstantiator( |
| 342 | + new Jackson2JsonCollectionModule.JsonCollectionHandlerInstantiator(linkRelationMessageSource)); |
| 343 | + |
| 344 | + MappingJackson2HttpMessageConverter jsonCollectionConverter = new TypeConstrainedMappingJackson2HttpMessageConverter( |
| 345 | + ResourceSupport.class); |
| 346 | + jsonCollectionConverter.setSupportedMediaTypes(Arrays.asList(JSON_COLLECTION)); |
| 347 | + jsonCollectionConverter.setObjectMapper(jsonCollectionObjectMapper); |
| 348 | + result.add(jsonCollectionConverter); |
| 349 | + } |
304 | 350 |
|
305 |
| - List<HttpMessageConverter<?>> result = new ArrayList<HttpMessageConverter<?>>(converters.size()); |
306 |
| - result.add(halConverter); |
307 | 351 | result.addAll(converters);
|
308 | 352 | return result;
|
309 | 353 | }
|
|
0 commit comments