package be.mentoringsystems.merke.config; import be.mentoringsystems.merke.presentation.locale.CustomLocaleResolver; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import java.nio.charset.Charset; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Locale; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.http.MediaType; import org.springframework.http.converter.ByteArrayHttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter; import org.springframework.web.multipart.support.StandardServletMultipartResolver; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; import org.springframework.web.servlet.config.annotation.CorsRegistry; 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.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.ViewResolverRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; /** * * @author anthonyarents */ @Configuration @EnableWebMvc public class MvcConfiguration implements WebMvcConfigurer { private static final int COOKIE_MAX_AGE = 4800; private static final int CACHEPERIOD_IMAGES = 2678400; private static final int CACHEPERIOD_JS = 604800; @Value("#{contextParameters.development}") private Boolean development; @Override public void configureDefaultServletHandling(final DefaultServletHandlerConfigurer configurer) { configurer.enable(); } @Override public void configureContentNegotiation(final ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(false).favorParameter(true); configurer.defaultContentType(MediaType.TEXT_PLAIN); configurer.useRegisteredExtensionsOnly(true); configurer.mediaType("txt", MediaType.TEXT_PLAIN); configurer.mediaType("json", MediaType.APPLICATION_JSON); configurer.mediaType("xml", MediaType.APPLICATION_XML); configurer.mediaType("html", MediaType.TEXT_HTML); } @Override public void configureMessageConverters(final List> converters) { final Hibernate5Module hibernate5Module = new Hibernate5Module(); hibernate5Module.configure(Hibernate5Module.Feature.FORCE_LAZY_LOADING, false); hibernate5Module.configure(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION, false); final JavaTimeModule javaTimeModule = new JavaTimeModule(); final DateTimeFormatter localDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(localDateTimeFormatter)); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(localDateTimeFormatter)); final Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); builder.indentOutput(true); builder.defaultViewInclusion(true); builder.modules(hibernate5Module, javaTimeModule); builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); converters.add(new MappingJackson2HttpMessageConverter(builder.build())); final StringHttpMessageConverter stringMessageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8")); stringMessageConverter.setWriteAcceptCharset(false); converters.add(stringMessageConverter); converters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build())); converters.add(new ByteArrayHttpMessageConverter()); } @Override public void addResourceHandlers(final ResourceHandlerRegistry registry) { // images registry.addResourceHandler("/static/favicon/**").addResourceLocations("/static/favicon/").setCachePeriod(CACHEPERIOD_IMAGES); registry.addResourceHandler("/static/**").addResourceLocations("/static/").setCachePeriod(604800); if (Boolean.TRUE.equals(development)) { // development registry.addResourceHandler("/static/Merke/**").addResourceLocations("/static/Merke/").setCachePeriod(CACHEPERIOD_JS); registry.addResourceHandler("/staticresources/**").addResourceLocations("/staticresources/").setCachePeriod(604800); registry.addResourceHandler("/build/classic/resources/**").addResourceLocations("/build/classic/resources/").setCachePeriod(604800); registry.addResourceHandler("/build/modern/resources/**").addResourceLocations("/build/modern/resources/").setCachePeriod(604800); registry.addResourceHandler("/build/resources/**").addResourceLocations("/build/resources/").setCachePeriod(604800); registry.addResourceHandler("/**").addResourceLocations("/static/Merke/").setCachePeriod(604800); } else { // production registry.addResourceHandler("/static/Merke/**").addResourceLocations("/static/Merke/").setCachePeriod(CACHEPERIOD_JS); registry.addResourceHandler("/staticresources/**").addResourceLocations("/staticresources/").setCachePeriod(604800); registry.addResourceHandler("/**").addResourceLocations("/build/").setCachePeriod(604800); } } @Override public void configureViewResolvers(final ViewResolverRegistry registry) { registry.jsp("/WEB-INF/jsp/", ".jsp"); } @Override public void addViewControllers(final ViewControllerRegistry registry) { registry.addViewController("/").setViewName("forward:/index.html"); registry.addViewController("/login").setViewName("redirect:/"); registry.addViewController("/favicon.ico").setViewName("forward:/static/favicon/favicon.ico"); registry.setOrder(Ordered.HIGHEST_PRECEDENCE); } @Bean public LocaleResolver localeResolver() { CustomLocaleResolver resolver = new CustomLocaleResolver(); resolver.setDefaultLocale(new Locale("nl")); resolver.setCookieName("myLocaleCookie"); resolver.setCookieMaxAge(COOKIE_MAX_AGE); return resolver; } @Bean public LocaleChangeInterceptor localeChangeInterceptor() { LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor(); interceptor.setParamName("mylocale"); return interceptor; } @Override public void addInterceptors(final InterceptorRegistry registry) { registry.addInterceptor(localeChangeInterceptor()); } @Bean(name = "multipartResolver") public StandardServletMultipartResolver multipartResolver() { return new StandardServletMultipartResolver(); } @Override public void addCorsMappings(final CorsRegistry registry) { registry.addMapping("/**"); } }