View Javadoc
1   package pl.matsuo.core.web.mvc;
2   
3   import com.fasterxml.jackson.databind.ObjectMapper;
4   import com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module;
5   import org.springframework.beans.BeansException;
6   import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
7   import org.springframework.context.ApplicationListener;
8   import org.springframework.context.annotation.Bean;
9   import org.springframework.context.annotation.Configuration;
10  import org.springframework.context.event.ContextRefreshedEvent;
11  import org.springframework.http.converter.HttpMessageConverter;
12  import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
13  import org.springframework.web.method.support.HandlerMethodArgumentResolver;
14  import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
15  import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
16  import pl.matsuo.core.conf.ClassesAddingBeanFactoryPostProcessor;
17  import pl.matsuo.core.web.annotation.WebConfiguration;
18  import pl.matsuo.core.web.view.BootstrapRenderer;
19  
20  import java.util.ArrayList;
21  import java.util.List;
22  
23  import static com.fasterxml.jackson.annotation.JsonInclude.Include.*;
24  import static com.fasterxml.jackson.databind.DeserializationFeature.*;
25  
26  
27  @WebConfiguration
28  @Configuration
29  public class MvcConfig extends WebMvcConfigurationSupport implements ApplicationListener<ContextRefreshedEvent> {
30  
31  
32    @Override
33    public void onApplicationEvent(ContextRefreshedEvent event) {
34      RequestMappingHandlerAdapter adapter = event.getApplicationContext().getBean(RequestMappingHandlerAdapter.class);
35  
36      try {
37        FacadeBuilderHandlerMethodArgumentResolver facadeBuilderHandlerMethodArgumentResolver =
38            event.getApplicationContext().getBean(FacadeBuilderHandlerMethodArgumentResolver.class);
39  
40        List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList<>(adapter.getArgumentResolvers());
41        List<HandlerMethodArgumentResolver> customResolvers = adapter.getCustomArgumentResolvers();
42        argumentResolvers.remove(facadeBuilderHandlerMethodArgumentResolver);
43        argumentResolvers.add(0, facadeBuilderHandlerMethodArgumentResolver);
44        adapter.setArgumentResolvers(argumentResolvers);
45      } catch (BeansException e) {
46        //e.printStackTrace();
47      }
48    }
49  
50  
51    @Override
52    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
53      converters.add(converter());
54      addDefaultHttpMessageConverters(converters);
55    }
56  
57  
58    @Bean
59    public ObjectMapper objectMapper(MappingJackson2HttpMessageConverter converter) {
60      return converter.getObjectMapper();
61    }
62  
63  
64    @Bean
65    public MappingJackson2HttpMessageConverter converter() {
66      MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
67      ObjectMapper objectMapper = converter.getObjectMapper();
68  
69      objectMapper.setDateFormat(new CustomDateFormat());
70  
71      objectMapper.registerModule(new CustomJacksonModule());
72      objectMapper.registerModule(new Hibernate4Module());
73      objectMapper.setSerializationInclusion(NON_NULL);
74      objectMapper.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
75  
76      return converter;
77    }
78  
79  
80    @Bean
81    public BeanFactoryPostProcessor mvcServices() {
82      return new ClassesAddingBeanFactoryPostProcessor(BootstrapRenderer.class,
83          FacadeBuilderHandlerMethodArgumentResolver.class);
84    }
85  }
86