From 0db1916ddeaab19cf9d5a60b8b2ad335db0fd14b Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 28 Feb 2013 22:50:07 +0100 Subject: [PATCH] #50 - Add HAL JSON Module to handler adapters. In case no ObjectMapper bean has been configured explicitly, the Spring MVC infrastructure registers HttpMessageConverters directly and does not declare them as Spring beans. Thus we now also inspect RequestMappingHandlerAdapter and AnnotationMethodHandlerAdapter instances for their HttpMessageConverters and transparently augment the ObjectMappers backing potentially registered Jackson converters. --- ...ermediaSupportBeanDefinitionRegistrar.java | 52 ++++++++++++++++++- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/hateoas/config/HypermediaSupportBeanDefinitionRegistrar.java b/src/main/java/org/springframework/hateoas/config/HypermediaSupportBeanDefinitionRegistrar.java index f4a612c0..13f84417 100644 --- a/src/main/java/org/springframework/hateoas/config/HypermediaSupportBeanDefinitionRegistrar.java +++ b/src/main/java/org/springframework/hateoas/config/HypermediaSupportBeanDefinitionRegistrar.java @@ -17,6 +17,7 @@ package org.springframework.hateoas.config; import static org.springframework.beans.factory.support.BeanDefinitionReaderUtils.*; +import java.util.List; import java.util.Map; import org.springframework.beans.BeansException; @@ -36,7 +37,12 @@ import org.springframework.hateoas.core.DefaultLinkDiscoverer; import org.springframework.hateoas.hal.HalLinkDiscoverer; import org.springframework.hateoas.hal.Jackson1HalModule; import org.springframework.hateoas.hal.Jackson2HalModule; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter; import org.springframework.util.ClassUtils; +import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import com.fasterxml.jackson.databind.ObjectMapper; @@ -133,12 +139,33 @@ class HypermediaSupportBeanDefinitionRegistrar implements ImportBeanDefinitionRe @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof RequestMappingHandlerAdapter) { + registerModule(((RequestMappingHandlerAdapter) bean).getMessageConverters()); + } + + if (bean instanceof AnnotationMethodHandlerAdapter) { + registerModule(((AnnotationMethodHandlerAdapter) bean).getMessageConverters()); + } + if (bean instanceof ObjectMapper) { - ((ObjectMapper) bean).registerModule(new Jackson2HalModule()); + registerModule(bean); } return bean; } + + private void registerModule(List> converters) { + + for (HttpMessageConverter converter : converters) { + if (converter instanceof MappingJackson2HttpMessageConverter) { + registerModule(((MappingJackson2HttpMessageConverter) converter).getObjectMapper()); + } + } + } + + private void registerModule(Object objectMapper) { + ((ObjectMapper) objectMapper).registerModule(new Jackson2HalModule()); + } } /** @@ -165,11 +192,32 @@ class HypermediaSupportBeanDefinitionRegistrar implements ImportBeanDefinitionRe @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof AnnotationMethodHandlerAdapter) { + registerModule(((AnnotationMethodHandlerAdapter) bean).getMessageConverters()); + } + + if (bean instanceof RequestMappingHandlerAdapter) { + registerModule(((RequestMappingHandlerAdapter) bean).getMessageConverters()); + } + if (bean instanceof org.codehaus.jackson.map.ObjectMapper) { - ((org.codehaus.jackson.map.ObjectMapper) bean).registerModule(new Jackson1HalModule()); + registerModule(bean); } return bean; } + + private void registerModule(List> converters) { + + for (HttpMessageConverter converter : converters) { + if (converter instanceof MappingJacksonHttpMessageConverter) { + registerModule(((MappingJacksonHttpMessageConverter) converter).getObjectMapper()); + } + } + } + + private void registerModule(Object mapper) { + ((org.codehaus.jackson.map.ObjectMapper) mapper).registerModule(new Jackson1HalModule()); + } } }