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
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