SPR-8217 update MVC namespace to use HandlerMethod infrastructure

This commit is contained in:
Rossen Stoyanchev
2011-04-06 20:28:47 +00:00
parent ffec444434
commit 4c1f73ed83
13 changed files with 156 additions and 111 deletions

View File

@@ -40,10 +40,10 @@ import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;
import org.springframework.web.servlet.handler.ConversionServiceExposingInterceptor;
import org.springframework.web.servlet.handler.MappedInterceptor;
import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter;
import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver;
import org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping;
import org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMethodAdapter;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMethodExceptionResolver;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMethodMapping;
import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver;
/**
@@ -78,11 +78,11 @@ final class MvcAnnotationDrivenExecutor extends AbstractSpecificationExecutor<Mv
ComponentRegistrar registrar = specContext.getRegistrar();
Object source = spec.source();
RootBeanDefinition annMappingDef = new RootBeanDefinition(DefaultAnnotationHandlerMapping.class);
annMappingDef.setSource(source);
annMappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
annMappingDef.getPropertyValues().add("order", 0);
String annMappingName = registrar.registerWithGeneratedName(annMappingDef);
RootBeanDefinition methodMappingDef = new RootBeanDefinition(RequestMappingHandlerMethodMapping.class);
methodMappingDef.setSource(source);
methodMappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
methodMappingDef.getPropertyValues().add("order", 0);
String methodMappingName = registrar.registerWithGeneratedName(methodMappingDef);
Object conversionService = getConversionService(spec, registrar);
Object validator = getValidator(spec, registrar);
@@ -97,15 +97,15 @@ final class MvcAnnotationDrivenExecutor extends AbstractSpecificationExecutor<Mv
ManagedList<? super Object> messageConverters = getMessageConverters(spec, registrar);
RootBeanDefinition annAdapterDef = new RootBeanDefinition(AnnotationMethodHandlerAdapter.class);
annAdapterDef.setSource(source);
annAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
annAdapterDef.getPropertyValues().add("webBindingInitializer", bindingDef);
annAdapterDef.getPropertyValues().add("messageConverters", messageConverters);
RootBeanDefinition methodAdapterDef = new RootBeanDefinition(RequestMappingHandlerMethodAdapter.class);
methodAdapterDef.setSource(source);
methodAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
methodAdapterDef.getPropertyValues().add("webBindingInitializer", bindingDef);
methodAdapterDef.getPropertyValues().add("messageConverters", messageConverters);
if (!spec.argumentResolvers().isEmpty()) {
annAdapterDef.getPropertyValues().add("customArgumentResolvers", spec.argumentResolvers());
methodAdapterDef.getPropertyValues().add("customArgumentResolvers", spec.argumentResolvers());
}
String annAdapterName = registrar.registerWithGeneratedName(annAdapterDef);
String methodAdapterName = registrar.registerWithGeneratedName(methodAdapterDef);
RootBeanDefinition csInterceptorDef = new RootBeanDefinition(ConversionServiceExposingInterceptor.class);
csInterceptorDef.setSource(source);
@@ -117,12 +117,13 @@ final class MvcAnnotationDrivenExecutor extends AbstractSpecificationExecutor<Mv
mappedCsInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(1, csInterceptorDef);
String mappedInterceptorName = registrar.registerWithGeneratedName(mappedCsInterceptorDef);
RootBeanDefinition annExceptionResolver = new RootBeanDefinition(AnnotationMethodHandlerExceptionResolver.class);
annExceptionResolver.setSource(source);
annExceptionResolver.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
annExceptionResolver.getPropertyValues().add("messageConverters", messageConverters);
annExceptionResolver.getPropertyValues().add("order", 0);
String annExceptionResolverName = registrar.registerWithGeneratedName(annExceptionResolver);
RootBeanDefinition methodExceptionResolver = new RootBeanDefinition(
RequestMappingHandlerMethodExceptionResolver.class);
methodExceptionResolver.setSource(source);
methodExceptionResolver.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
methodExceptionResolver.getPropertyValues().add("messageConverters", messageConverters);
methodExceptionResolver.getPropertyValues().add("order", 0);
String methodExceptionResolverName = registrar.registerWithGeneratedName(methodExceptionResolver);
RootBeanDefinition responseStatusExceptionResolver = new RootBeanDefinition(
ResponseStatusExceptionResolver.class);
@@ -139,9 +140,9 @@ final class MvcAnnotationDrivenExecutor extends AbstractSpecificationExecutor<Mv
String defaultExceptionResolverName = registrar.registerWithGeneratedName(defaultExceptionResolver);
CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(spec.sourceName(), source);
compDefinition.addNestedComponent(new BeanComponentDefinition(annMappingDef, annMappingName));
compDefinition.addNestedComponent(new BeanComponentDefinition(annAdapterDef, annAdapterName));
compDefinition.addNestedComponent(new BeanComponentDefinition(annExceptionResolver, annExceptionResolverName));
compDefinition.addNestedComponent(new BeanComponentDefinition(methodMappingDef, methodMappingName));
compDefinition.addNestedComponent(new BeanComponentDefinition(methodAdapterDef, methodAdapterName));
compDefinition.addNestedComponent(new BeanComponentDefinition(methodExceptionResolver, methodExceptionResolverName));
compDefinition.addNestedComponent(new BeanComponentDefinition(responseStatusExceptionResolver,
responseStatusExceptionResolverName));
compDefinition.addNestedComponent(new BeanComponentDefinition(defaultExceptionResolver,

View File

@@ -85,6 +85,7 @@ import org.springframework.web.servlet.mvc.method.annotation.support.ServletCook
import org.springframework.web.servlet.mvc.method.annotation.support.ServletModelAttributeMethodProcessor;
import org.springframework.web.servlet.mvc.method.annotation.support.ServletRequestMethodArgumentResolver;
import org.springframework.web.servlet.mvc.method.annotation.support.ServletResponseMethodArgumentResolver;
import org.springframework.web.servlet.mvc.method.annotation.support.ServletWebArgumentResolverAdapter;
import org.springframework.web.servlet.mvc.method.annotation.support.ViewMethodReturnValueHandler;
import org.springframework.web.util.WebUtils;
@@ -185,6 +186,13 @@ public class RequestMappingHandlerMethodAdapter extends AbstractHandlerMethodAda
this.messageConverters = messageConverters;
}
/**
* Return the message body converters that this adapter has been configured with.
*/
public HttpMessageConverter<?>[] getMessageConverters() {
return messageConverters;
}
/**
* Specify a WebBindingInitializer which will apply pre-configured
* configuration to every DataBinder that this controller uses.
@@ -313,7 +321,7 @@ public class RequestMappingHandlerMethodAdapter extends AbstractHandlerMethodAda
if (customArgumentResolvers != null) {
for (WebArgumentResolver customResolver : customArgumentResolvers) {
argumentResolvers.registerArgumentResolver(new WebArgumentResolverAdapter(customResolver));
argumentResolvers.registerArgumentResolver(new ServletWebArgumentResolverAdapter(customResolver));
}
}
@@ -343,7 +351,7 @@ public class RequestMappingHandlerMethodAdapter extends AbstractHandlerMethodAda
if (customArgumentResolvers != null) {
for (WebArgumentResolver customResolver : customArgumentResolvers) {
initBinderArgumentResolvers.registerArgumentResolver(new WebArgumentResolverAdapter(customResolver));
initBinderArgumentResolvers.registerArgumentResolver(new ServletWebArgumentResolverAdapter(customResolver));
}
}

View File

@@ -43,7 +43,6 @@ import org.springframework.web.method.HandlerMethodSelector;
import org.springframework.web.method.annotation.ExceptionMethodMapping;
import org.springframework.web.method.annotation.support.ModelAttributeMethodProcessor;
import org.springframework.web.method.annotation.support.ModelMethodProcessor;
import org.springframework.web.method.annotation.support.WebArgumentResolverAdapter;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodArgumentResolverComposite;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
@@ -57,6 +56,7 @@ import org.springframework.web.servlet.mvc.method.annotation.support.ModelAndVie
import org.springframework.web.servlet.mvc.method.annotation.support.RequestResponseBodyMethodProcessor;
import org.springframework.web.servlet.mvc.method.annotation.support.ServletRequestMethodArgumentResolver;
import org.springframework.web.servlet.mvc.method.annotation.support.ServletResponseMethodArgumentResolver;
import org.springframework.web.servlet.mvc.method.annotation.support.ServletWebArgumentResolverAdapter;
import org.springframework.web.servlet.mvc.method.annotation.support.ViewMethodReturnValueHandler;
/**
@@ -185,7 +185,7 @@ public class RequestMappingHandlerMethodExceptionResolver extends AbstractHandle
if (customArgumentResolvers != null) {
for (WebArgumentResolver customResolver : customArgumentResolvers) {
argumentResolvers.registerArgumentResolver(new WebArgumentResolverAdapter(customResolver));
argumentResolvers.registerArgumentResolver(new ServletWebArgumentResolverAdapter(customResolver));
}
}
}

View File

@@ -42,10 +42,15 @@ public class ModelAndViewMethodReturnValueHandler implements HandlerMethodReturn
MethodParameter returnType,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest) throws Exception {
ModelAndView mav = (ModelAndView) returnValue;
mavContainer.setView(mav.getView());
mavContainer.setViewName(mav.getViewName());
mavContainer.addModelAttributes(mav.getModel());
if (returnValue != null) {
ModelAndView mav = (ModelAndView) returnValue;
mavContainer.setView(mav.getView());
mavContainer.setViewName(mav.getViewName());
mavContainer.addModelAttributes(mav.getModel());
}
else {
// TODO
}
}
}

View File

@@ -43,6 +43,9 @@ public class ViewMethodReturnValueHandler implements HandlerMethodReturnValueHan
MethodParameter returnType,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest) throws Exception {
if (returnValue == null) {
return;
}
if (returnValue instanceof String) {
mavContainer.setViewName((String) returnValue);
}