From c238fb441b0809502e24c8db99644a992efae3c2 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 8 May 2018 00:12:18 +0200 Subject: [PATCH] Polishing (cherry picked from commit 2da02cc) --- .../AnnotationDrivenBeanDefinitionParser.java | 94 ++++++++++--------- 1 file changed, 48 insertions(+), 46 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java index 7808f0996fc..e28d8b478b7 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java @@ -128,7 +128,8 @@ import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolv *
  • the {@link HandlerMapping} for ViewControllers *
  • and the {@link HandlerMapping} for serving resources * - * Note that those beans can be configured by using the {@code path-matching} MVC namespace element. + * Note that those beans can be configured by using the {@code path-matching} + * MVC namespace element. * *

    Both the {@link RequestMappingHandlerAdapter} and the * {@link ExceptionHandlerExceptionResolver} are configured with instances of @@ -138,7 +139,7 @@ import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolv *

  • A {@link DefaultFormattingConversionService} *
  • A {@link org.springframework.validation.beanvalidation.LocalValidatorFactoryBean} * if a JSR-303 implementation is available on the classpath - *
  • A range of {@link HttpMessageConverter}s depending on what 3rd party + *
  • A range of {@link HttpMessageConverter}s depending on which third-party * libraries are available on the classpath. * * @@ -158,6 +159,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { public static final String CONTENT_NEGOTIATION_MANAGER_BEAN_NAME = "mvcContentNegotiationManager"; + private static final boolean javaxValidationPresent = ClassUtils.isPresent("javax.validation.Validator", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); @@ -189,7 +191,8 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); private static final boolean gsonPresent = - ClassUtils.isPresent("com.google.gson.Gson", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); + ClassUtils.isPresent("com.google.gson.Gson", + AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); @Override @@ -269,39 +272,38 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { handlerAdapterDef.getPropertyValues().add("deferredResultInterceptors", deferredResultInterceptors); readerContext.getRegistry().registerBeanDefinition(HANDLER_ADAPTER_BEAN_NAME , handlerAdapterDef); - String uriCompContribName = MvcUriComponentsBuilder.MVC_URI_COMPONENTS_CONTRIBUTOR_BEAN_NAME; - RootBeanDefinition uriCompContribDef = new RootBeanDefinition(CompositeUriComponentsContributorFactoryBean.class); - uriCompContribDef.setSource(source); - uriCompContribDef.getPropertyValues().addPropertyValue("handlerAdapter", handlerAdapterDef); - uriCompContribDef.getPropertyValues().addPropertyValue("conversionService", conversionService); - readerContext.getRegistry().registerBeanDefinition(uriCompContribName, uriCompContribDef); + RootBeanDefinition uriContributorDef = + new RootBeanDefinition(CompositeUriComponentsContributorFactoryBean.class); + uriContributorDef.setSource(source); + uriContributorDef.getPropertyValues().addPropertyValue("handlerAdapter", handlerAdapterDef); + uriContributorDef.getPropertyValues().addPropertyValue("conversionService", conversionService); + String uriContributorName = MvcUriComponentsBuilder.MVC_URI_COMPONENTS_CONTRIBUTOR_BEAN_NAME; + readerContext.getRegistry().registerBeanDefinition(uriContributorName, uriContributorDef); RootBeanDefinition csInterceptorDef = new RootBeanDefinition(ConversionServiceExposingInterceptor.class); csInterceptorDef.setSource(source); csInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(0, conversionService); - RootBeanDefinition mappedCsInterceptorDef = new RootBeanDefinition(MappedInterceptor.class); - mappedCsInterceptorDef.setSource(source); - mappedCsInterceptorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - mappedCsInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(0, (Object) null); - mappedCsInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(1, csInterceptorDef); - String mappedInterceptorName = readerContext.registerWithGeneratedName(mappedCsInterceptorDef); - - RootBeanDefinition exceptionResolver = new RootBeanDefinition(ExceptionHandlerExceptionResolver.class); - exceptionResolver.setSource(source); - exceptionResolver.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - exceptionResolver.getPropertyValues().add("contentNegotiationManager", contentNegotiationManager); - exceptionResolver.getPropertyValues().add("messageConverters", messageConverters); - exceptionResolver.getPropertyValues().add("order", 0); - addResponseBodyAdvice(exceptionResolver); + RootBeanDefinition mappedInterceptorDef = new RootBeanDefinition(MappedInterceptor.class); + mappedInterceptorDef.setSource(source); + mappedInterceptorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(0, (Object) null); + mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(1, csInterceptorDef); + String mappedInterceptorName = readerContext.registerWithGeneratedName(mappedInterceptorDef); + RootBeanDefinition methodExceptionResolver = new RootBeanDefinition(ExceptionHandlerExceptionResolver.class); + methodExceptionResolver.setSource(source); + methodExceptionResolver.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + methodExceptionResolver.getPropertyValues().add("contentNegotiationManager", contentNegotiationManager); + methodExceptionResolver.getPropertyValues().add("messageConverters", messageConverters); + methodExceptionResolver.getPropertyValues().add("order", 0); + addResponseBodyAdvice(methodExceptionResolver); if (argumentResolvers != null) { - exceptionResolver.getPropertyValues().add("customArgumentResolvers", argumentResolvers); + methodExceptionResolver.getPropertyValues().add("customArgumentResolvers", argumentResolvers); } if (returnValueHandlers != null) { - exceptionResolver.getPropertyValues().add("customReturnValueHandlers", returnValueHandlers); + methodExceptionResolver.getPropertyValues().add("customReturnValueHandlers", returnValueHandlers); } - - String methodExceptionResolverName = readerContext.registerWithGeneratedName(exceptionResolver); + String methodExResolverName = readerContext.registerWithGeneratedName(methodExceptionResolver); RootBeanDefinition statusExceptionResolver = new RootBeanDefinition(ResponseStatusExceptionResolver.class); statusExceptionResolver.setSource(source); @@ -317,11 +319,11 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { parserContext.registerComponent(new BeanComponentDefinition(handlerMappingDef, HANDLER_MAPPING_BEAN_NAME)); parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, HANDLER_ADAPTER_BEAN_NAME)); - parserContext.registerComponent(new BeanComponentDefinition(uriCompContribDef, uriCompContribName)); - parserContext.registerComponent(new BeanComponentDefinition(exceptionResolver, methodExceptionResolverName)); + parserContext.registerComponent(new BeanComponentDefinition(uriContributorDef, uriContributorName)); + parserContext.registerComponent(new BeanComponentDefinition(mappedInterceptorDef, mappedInterceptorName)); + parserContext.registerComponent(new BeanComponentDefinition(methodExceptionResolver, methodExResolverName)); parserContext.registerComponent(new BeanComponentDefinition(statusExceptionResolver, statusExResolverName)); parserContext.registerComponent(new BeanComponentDefinition(defaultExceptionResolver, defaultExResolverName)); - parserContext.registerComponent(new BeanComponentDefinition(mappedCsInterceptorDef, mappedInterceptorName)); // Ensure BeanNameUrlHandlerMapping (SPR-8289) and default HandlerAdapters are not "turned off" MvcNamespaceUtils.registerDefaultComponents(parserContext, source); @@ -382,8 +384,8 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { } } - private RuntimeBeanReference getContentNegotiationManager(Element element, @Nullable Object source, - ParserContext parserContext) { + private RuntimeBeanReference getContentNegotiationManager( + Element element, @Nullable Object source, ParserContext parserContext) { RuntimeBeanReference beanRef; if (element.hasAttribute("content-negotiation-manager")) { @@ -395,7 +397,6 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { factoryBeanDef.setSource(source); factoryBeanDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); factoryBeanDef.getPropertyValues().add("mediaTypes", getDefaultMediaTypes()); - String name = CONTENT_NEGOTIATION_MANAGER_BEAN_NAME; parserContext.getReaderContext().getRegistry().registerBeanDefinition(name , factoryBeanDef); parserContext.registerComponent(new BeanComponentDefinition(factoryBeanDef, name)); @@ -404,12 +405,13 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { return beanRef; } - private void configurePathMatchingProperties(RootBeanDefinition handlerMappingDef, Element element, - ParserContext parserContext) { + private void configurePathMatchingProperties( + RootBeanDefinition handlerMappingDef, Element element, ParserContext parserContext) { Element pathMatchingElement = DomUtils.getChildElementByTagName(element, "path-matching"); if (pathMatchingElement != null) { Object source = parserContext.extractSource(element); + if (pathMatchingElement.hasAttribute("suffix-pattern")) { Boolean useSuffixPatternMatch = Boolean.valueOf(pathMatchingElement.getAttribute("suffix-pattern")); handlerMappingDef.getPropertyValues().add("useSuffixPatternMatch", useSuffixPatternMatch); @@ -422,6 +424,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { Boolean useRegisteredSuffixPatternMatch = Boolean.valueOf(pathMatchingElement.getAttribute("registered-suffixes-only")); handlerMappingDef.getPropertyValues().add("useRegisteredSuffixPatternMatch", useRegisteredSuffixPatternMatch); } + RuntimeBeanReference pathHelperRef = null; if (pathMatchingElement.hasAttribute("path-helper")) { pathHelperRef = new RuntimeBeanReference(pathMatchingElement.getAttribute("path-helper")); @@ -439,24 +442,24 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { } private Properties getDefaultMediaTypes() { - Properties props = new Properties(); + Properties defaultMediaTypes = new Properties(); if (romePresent) { - props.put("atom", MediaType.APPLICATION_ATOM_XML_VALUE); - props.put("rss", MediaType.APPLICATION_RSS_XML_VALUE); + defaultMediaTypes.put("atom", MediaType.APPLICATION_ATOM_XML_VALUE); + defaultMediaTypes.put("rss", MediaType.APPLICATION_RSS_XML_VALUE); } if (jaxb2Present || jackson2XmlPresent) { - props.put("xml", MediaType.APPLICATION_XML_VALUE); + defaultMediaTypes.put("xml", MediaType.APPLICATION_XML_VALUE); } if (jackson2Present || gsonPresent) { - props.put("json", MediaType.APPLICATION_JSON_VALUE); + defaultMediaTypes.put("json", MediaType.APPLICATION_JSON_VALUE); } if (jackson2SmilePresent) { - props.put("smile", "application/x-jackson-smile"); + defaultMediaTypes.put("smile", "application/x-jackson-smile"); } if (jackson2CborPresent) { - props.put("cbor", "application/cbor"); + defaultMediaTypes.put("cbor", "application/cbor"); } - return props; + return defaultMediaTypes; } @Nullable @@ -472,7 +475,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { @Nullable private String getAsyncTimeout(Element element) { Element asyncElement = DomUtils.getChildElementByTagName(element, "async-support"); - return (asyncElement != null) ? asyncElement.getAttribute("default-timeout") : null; + return (asyncElement != null ? asyncElement.getAttribute("default-timeout") : null); } @Nullable @@ -649,7 +652,6 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { return beanDefinition; } - private ManagedList extractBeanSubElements(Element parentElement, ParserContext parserContext) { ManagedList list = new ManagedList<>(); list.setSource(parserContext.extractSource(parentElement)); @@ -695,7 +697,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { @Override @Nullable - public CompositeUriComponentsContributor getObject() throws Exception { + public CompositeUriComponentsContributor getObject() { return this.uriComponentsContributor; }