/* * Copyright (c) 2015. Bearchoke */ package com.bearchoke.platform.server.common.web.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.bearchoke.platform.server.common.ApplicationMediaType; import com.bearchoke.platform.server.common.web.argumentresolver.DateTimeZoneHandlerMethodArgumentResolver; import com.bearchoke.platform.server.common.web.argumentresolver.LocationHandlerMethodArgumentResolver; import com.bearchoke.platform.server.common.web.interceptor.DateTimeZoneHandlerInterceptor; import com.bearchoke.platform.server.common.web.interceptor.UserLocationHandlerInterceptor; import lombok.extern.log4j.Log4j2; import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.ReloadableResourceBundleMessageSource; import org.springframework.format.FormatterRegistry; import org.springframework.format.datetime.standard.Jsr310DateTimeFormatAnnotationFormatterFactory; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; import org.springframework.validation.beanvalidation.MessageSourceResourceBundleLocator; import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.multipart.support.StandardServletMultipartResolver; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import javax.inject.Inject; import java.util.ArrayList; import java.util.List; /** * Created by Bjorn Harvold * <p> * Date: 1/3/14 * <p> * Time: 4:12 PM * <p> * Responsibility: */ @Configuration @EnableWebMvc @ComponentScan( basePackages = { "com.bearchoke.platform.server.**.web" } ) @Log4j2 public class WebMvcConfig extends WebMvcConfigurerAdapter { @Inject private ObjectMapper objectMapper; @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } /** * Messages to support internationalization/localization. */ @Bean(name = "messageSource") public MessageSource messageSource() { ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); messageSource.setBasename("/WEB-INF/i18n/messages"); messageSource.setUseCodeAsDefaultMessage(true); messageSource.setCacheSeconds(30); return messageSource; } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { log.info("Configuring http message converters..."); MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(); List<MediaType> types = new ArrayList<>(1); types.add(ApplicationMediaType.APPLICATION_JSON); types.add(ApplicationMediaType.APPLICATION_BEARCHOKE_V1_JSON); types.add(ApplicationMediaType.APPLICATION_BEARCHOKE_V2_JSON); jacksonConverter.setSupportedMediaTypes(types); jacksonConverter.setObjectMapper(objectMapper); converters.add(jacksonConverter); } @Override public void addFormatters(FormatterRegistry registry) { registry.addFormatterForFieldAnnotation(new Jsr310DateTimeFormatAnnotationFormatterFactory()); } @Bean(name = "methodValidationPostProcessor") public MethodValidationPostProcessor methodValidationPostProcessor() { MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor(); methodValidationPostProcessor.setValidator(localValidatorFactoryBean()); return methodValidationPostProcessor; } @Bean(name = "localValidatorFactoryBean") public LocalValidatorFactoryBean localValidatorFactoryBean() { LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean(); localValidatorFactoryBean.setMessageInterpolator( new ResourceBundleMessageInterpolator( new MessageSourceResourceBundleLocator(messageSource()) ) ); return localValidatorFactoryBean; } @Bean(name = "multipartResolver") public StandardServletMultipartResolver multipartResolver() { return new StandardServletMultipartResolver(); } @Override public void addInterceptors(InterceptorRegistry registry) { log.info("Adding interceptors..."); registry.addInterceptor(new DateTimeZoneHandlerInterceptor()); registry.addInterceptor(new UserLocationHandlerInterceptor()); } @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { log.info("Adding argument resolvers..."); argumentResolvers.add(new DateTimeZoneHandlerMethodArgumentResolver()); argumentResolvers.add(new LocationHandlerMethodArgumentResolver()); } }