All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.edgarespina.mwa.WebDefaults Maven / Gradle / Ivy

package com.github.edgarespina.mwa;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.inject.Inject;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.MethodParameter;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.method.support.ModelAndViewContainer;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.servlet.mvc.method.annotation.ViewNameMethodReturnValueHandler;
import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver;

import com.github.edgarespina.mwa.handler.BindHandlerExceptionResolver;
import com.github.edgarespina.mwa.handler.MessageConverterHandlerExceptionResolver;

/**
 * Apply sensible defaults Spring MVC options, like:
 * 
    *
  • Enable default servlet. *
  • Get HandlerExceptionResolver from the Spring Application Context. *
* * @author edgar.espina * @since 0.1 */ @Configuration class WebDefaults extends WebMvcConfigurationSupport { /** * Bind a method name to a view name. */ private static class MethodNameToViewNameMethodReturnHandler extends ViewNameMethodReturnValueHandler { /** * {@inheritDoc} */ @Override public boolean supportsReturnType(final MethodParameter returnType) { return void.class.equals(returnType.getParameterType()); } /** * {@inheritDoc} */ @Override public void handleReturnValue(final Object returnValue, final MethodParameter returnType, final ModelAndViewContainer mavContainer, final NativeWebRequest webRequest) throws Exception { if (returnValue == null) { String viewName = returnType.getMethod().getName(); mavContainer.setViewName(viewName); } super .handleReturnValue(returnValue, returnType, mavContainer, webRequest); } } /** * Get message converters. */ @Inject private RequestMappingHandlerAdapter requestMappingHandler; /** * Save the application context. */ @Inject private ApplicationContext applicationContext; /** * {@inheritDoc} */ @Override public void configureHandlerExceptionResolvers( final List exceptionResolvers) { for (HandlerExceptionResolver cer : customExceptionResolvers()) { if (cer instanceof MessageConverterHandlerExceptionResolver) { ((MessageConverterHandlerExceptionResolver) cer) .setMessageConverters(requestMappingHandler.getMessageConverters()); } exceptionResolvers.add(cer); } final DefaultHandlerExceptionResolver exceptionResolver = new DefaultHandlerExceptionResolver(); exceptionResolver.setWarnLogCategory(getClass().getPackage().getName()); exceptionResolvers.add(exceptionResolver); } /** * Look for {@link HandlerExceptionResolver} in the Application Context. * * @return All the {@link HandlerExceptionResolver} found in the Application * Context. */ private Iterable customExceptionResolvers() { Collection result = new ArrayList(); result.add(new BindHandlerExceptionResolver()); Collection customExceptionResolvers = applicationContext.getBeansOfType(HandlerExceptionResolver.class) .values(); if (customExceptionResolvers != null) { result.addAll(customExceptionResolvers); } return result; } /** * Enable the default servlet. {@inheritDoc} */ @Override public void configureDefaultServletHandling( final DefaultServletHandlerConfigurer configurer) { configurer.enable(); } /** * Complete configuration. */ @PostConstruct public void onStartup() { List returnValueHandlers = new ArrayList(requestMappingHandler .getReturnValueHandlers().getHandlers()); int index = -1; for (int i = 0; i < returnValueHandlers.size(); i++) { HandlerMethodReturnValueHandler current = returnValueHandlers.get(i); if (ViewNameMethodReturnValueHandler.class.isInstance(current)) { index = i; break; } } if (index >= 0) { returnValueHandlers.add(index, new MethodNameToViewNameMethodReturnHandler()); // Override requestMappingHandler.setReturnValueHandlers(returnValueHandlers); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy