From a16e8c34b275821196f27d825e6fb09b63b6fc36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Fri, 22 Mar 2024 17:44:35 +0100 Subject: [PATCH] Refine null-safety in spring-webmvc See gh-32475 --- .../web/servlet/config/ResourcesBeanDefinitionParser.java | 1 + .../web/servlet/config/ViewControllerBeanDefinitionParser.java | 1 + .../web/servlet/config/ViewResolversBeanDefinitionParser.java | 2 ++ .../servlet/config/annotation/WebMvcConfigurerComposite.java | 1 + .../web/servlet/function/AbstractServerResponse.java | 1 + .../web/servlet/function/DefaultEntityResponseBuilder.java | 3 +++ .../web/servlet/function/DefaultServerResponseBuilder.java | 2 ++ .../web/servlet/handler/AbstractHandlerMethodMapping.java | 2 ++ .../web/servlet/handler/HandlerMappingIntrospector.java | 2 ++ .../springframework/web/servlet/i18n/FixedLocaleResolver.java | 1 + .../web/servlet/mvc/ParameterizableViewController.java | 1 + .../web/servlet/mvc/ServletForwardingController.java | 1 + .../web/servlet/mvc/ServletWrappingController.java | 1 + .../mvc/annotation/ResponseStatusExceptionResolver.java | 2 +- .../servlet/mvc/method/RequestMappingInfoHandlerMapping.java | 2 ++ .../annotation/ContinuationHandlerMethodArgumentResolver.java | 1 + .../method/annotation/ExtendedServletRequestDataBinder.java | 1 + .../mvc/method/annotation/RequestMappingHandlerAdapter.java | 1 + .../mvc/method/annotation/RequestMappingHandlerMapping.java | 2 ++ .../method/annotation/RequestResponseBodyMethodProcessor.java | 2 ++ .../mvc/method/annotation/ServletInvocableHandlerMethod.java | 1 + .../annotation/ServletRequestMethodArgumentResolver.java | 1 + .../web/servlet/support/JspAwareRequestContext.java | 1 + .../java/org/springframework/web/servlet/tags/MessageTag.java | 1 + .../web/servlet/tags/form/AbstractMultiCheckedElementTag.java | 1 + .../org/springframework/web/servlet/tags/form/OptionTag.java | 1 + .../org/springframework/web/servlet/tags/form/OptionsTag.java | 1 + .../web/servlet/view/ResourceBundleViewResolver.java | 1 + .../springframework/web/servlet/view/UrlBasedViewResolver.java | 2 ++ .../org/springframework/web/servlet/view/XmlViewResolver.java | 1 + .../org/springframework/web/servlet/view/xslt/XsltView.java | 2 +- 31 files changed, 41 insertions(+), 2 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java index fa4c1e1730ab..8f85ba6efe49 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java @@ -86,6 +86,7 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser { @Override + @Nullable public BeanDefinition parse(Element element, ParserContext context) { Object source = context.extractSource(element); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ViewControllerBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ViewControllerBeanDefinitionParser.java index 118f723fcff8..8a39ed1a2832 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ViewControllerBeanDefinitionParser.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ViewControllerBeanDefinitionParser.java @@ -60,6 +60,7 @@ class ViewControllerBeanDefinitionParser implements BeanDefinitionParser { @Override + @Nullable @SuppressWarnings("unchecked") public BeanDefinition parse(Element element, ParserContext parserContext) { Object source = parserContext.extractSource(element); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ViewResolversBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ViewResolversBeanDefinitionParser.java index e6cd60308c8f..775107950e48 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ViewResolversBeanDefinitionParser.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ViewResolversBeanDefinitionParser.java @@ -29,6 +29,7 @@ import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.core.Ordered; +import org.springframework.lang.Nullable; import org.springframework.util.xml.DomUtils; import org.springframework.web.servlet.view.BeanNameViewResolver; import org.springframework.web.servlet.view.ContentNegotiatingViewResolver; @@ -68,6 +69,7 @@ public class ViewResolversBeanDefinitionParser implements BeanDefinitionParser { @Override + @Nullable public BeanDefinition parse(Element element, ParserContext context) { Object source = context.extractSource(element); context.pushContainingComponent(new CompositeComponentDefinition(element.getTagName(), source)); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurerComposite.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurerComposite.java index d8680e1578d4..a6623e2d8428 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurerComposite.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurerComposite.java @@ -160,6 +160,7 @@ public void extendHandlerExceptionResolvers(List excep } @Override + @Nullable public Validator getValidator() { Validator selected = null; for (WebMvcConfigurer configurer : this.delegates) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/AbstractServerResponse.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/AbstractServerResponse.java index bf6719d64cdb..704ae1798a79 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/AbstractServerResponse.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/AbstractServerResponse.java @@ -82,6 +82,7 @@ public MultiValueMap cookies() { } @Override + @Nullable public ModelAndView writeTo(HttpServletRequest request, HttpServletResponse response, Context context) throws ServletException, IOException { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultEntityResponseBuilder.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultEntityResponseBuilder.java index 846c3074ee78..2ab3f6e043fc 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultEntityResponseBuilder.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultEntityResponseBuilder.java @@ -264,6 +264,7 @@ public T entity() { } @Override + @Nullable protected ModelAndView writeToInternal(HttpServletRequest servletRequest, HttpServletResponse servletResponse, Context context) throws ServletException, IOException { @@ -363,6 +364,7 @@ public CompletionStageEntityResponse(HttpStatusCode statusCode, HttpHeaders head } @Override + @Nullable protected ModelAndView writeToInternal(HttpServletRequest servletRequest, HttpServletResponse servletResponse, Context context) throws ServletException, IOException { @@ -416,6 +418,7 @@ public PublisherEntityResponse(HttpStatusCode statusCode, HttpHeaders headers, } @Override + @Nullable protected ModelAndView writeToInternal(HttpServletRequest servletRequest, HttpServletResponse servletResponse, Context context) throws ServletException, IOException { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultServerResponseBuilder.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultServerResponseBuilder.java index 6642ab61330e..54f5e83ff3d3 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultServerResponseBuilder.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultServerResponseBuilder.java @@ -35,6 +35,7 @@ import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatusCode; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @@ -229,6 +230,7 @@ public WriteFunctionResponse(HttpStatusCode statusCode, HttpHeaders headers, Mul } @Override + @Nullable protected ModelAndView writeToInternal(HttpServletRequest request, HttpServletResponse response, Context context) throws Exception { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodMapping.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodMapping.java index c7198ffe923d..f1a58a16d4ff 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodMapping.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodMapping.java @@ -483,6 +483,7 @@ protected boolean hasCorsConfigurationSource(Object handler) { } @Override + @Nullable protected CorsConfiguration getCorsConfiguration(Object handler, HttpServletRequest request) { CorsConfiguration corsConfig = super.getCorsConfiguration(handler, request); if (handler instanceof HandlerMethod handlerMethod) { @@ -600,6 +601,7 @@ public List getMappingsByDirectPath(String urlPath) { /** * Return handler methods by mapping name. Thread-safe for concurrent use. */ + @Nullable public List getHandlerMethodsByMappingName(String mappingName) { return this.nameLookup.get(mappingName); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/HandlerMappingIntrospector.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/HandlerMappingIntrospector.java index e56d0561eb36..94825fc93b85 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/HandlerMappingIntrospector.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/HandlerMappingIntrospector.java @@ -500,6 +500,7 @@ public void setAttribute(String name, Object value) { } @Override + @Nullable public Object getAttribute(String name) { return this.attributes.get(name); } @@ -532,6 +533,7 @@ private static class LookupPathMatchableHandlerMapping implements MatchableHandl } @Override + @Nullable public PathPatternParser getPatternParser() { return this.delegate.getPatternParser(); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/FixedLocaleResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/FixedLocaleResolver.java index ada77bdcd365..04931167889e 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/FixedLocaleResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/FixedLocaleResolver.java @@ -88,6 +88,7 @@ public Locale getLocale() { return getDefaultLocale(); } @Override + @Nullable public TimeZone getTimeZone() { return getDefaultTimeZone(); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/ParameterizableViewController.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/ParameterizableViewController.java index 33dbf0deffff..63d0843a05c6 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/ParameterizableViewController.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/ParameterizableViewController.java @@ -149,6 +149,7 @@ public boolean isStatusOnly() { * @see #getViewName() */ @Override + @Nullable protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/ServletForwardingController.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/ServletForwardingController.java index fe1d2fb81d1d..00ffb2fbabc8 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/ServletForwardingController.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/ServletForwardingController.java @@ -119,6 +119,7 @@ public void setBeanName(String name) { @Override + @Nullable protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/ServletWrappingController.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/ServletWrappingController.java index 315e2cf711bb..61bb77b856ba 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/ServletWrappingController.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/ServletWrappingController.java @@ -159,6 +159,7 @@ public void afterPropertiesSet() throws Exception { * @see jakarta.servlet.Servlet#service(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse) */ @Override + @Nullable protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolver.java index 86f2ff658daa..a0d42280a4d1 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolver.java @@ -61,7 +61,7 @@ public class ResponseStatusExceptionResolver extends AbstractHandlerExceptionRes @Override - public void setMessageSource(MessageSource messageSource) { + public void setMessageSource(@Nullable MessageSource messageSource) { this.messageSource = messageSource; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMapping.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMapping.java index ea3d01849ced..9d9c61386641 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMapping.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMapping.java @@ -106,6 +106,7 @@ protected Set getDirectPaths(RequestMappingInfo info) { * @return an info in case of a match; or {@code null} otherwise. */ @Override + @Nullable protected RequestMappingInfo getMatchingMapping(RequestMappingInfo info, HttpServletRequest request) { return info.getMatchingCondition(request); } @@ -243,6 +244,7 @@ private Map> extractMatrixVariables( * but not by consumable/producible media types */ @Override + @Nullable protected HandlerMethod handleNoMatch( Set infos, String lookupPath, HttpServletRequest request) throws ServletException { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ContinuationHandlerMethodArgumentResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ContinuationHandlerMethodArgumentResolver.java index 3bd40859886a..cc1536040e04 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ContinuationHandlerMethodArgumentResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ContinuationHandlerMethodArgumentResolver.java @@ -37,6 +37,7 @@ public boolean supportsParameter(MethodParameter parameter) { } @Override + @Nullable public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinder.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinder.java index cd19b10eba75..12491972c268 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinder.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinder.java @@ -112,6 +112,7 @@ private static class ExtendedServletRequestValueResolver extends ServletRequestV } @Override + @Nullable protected Object getRequestParameter(String name, Class type) { Object value = super.getRequestParameter(name, type); if (value == null) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java index 17776f3fe97b..e51e14e92e2a 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java @@ -805,6 +805,7 @@ protected boolean supportsInternal(HandlerMethod handlerMethod) { } @Override + @Nullable protected ModelAndView handleInternal(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMapping.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMapping.java index 02bfe40ee0b1..07d26aa77c89 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMapping.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMapping.java @@ -523,6 +523,7 @@ private void updateConsumesCondition(RequestMappingInfo info, Method method) { } @Override + @Nullable public RequestMatchResult match(HttpServletRequest request, String pattern) { Assert.state(getPatternParser() == null, "This HandlerMapping uses PathPatterns."); RequestMappingInfo info = RequestMappingInfo.paths(pattern).options(this.config).build(); @@ -535,6 +536,7 @@ public RequestMatchResult match(HttpServletRequest request, String pattern) { } @Override + @Nullable protected CorsConfiguration initCorsConfiguration(Object handler, Method method, RequestMappingInfo mappingInfo) { HandlerMethod handlerMethod = createHandlerMethod(handler, method); Class beanType = handlerMethod.getBeanType(); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessor.java index 064c7cb3215c..aa04f5337da5 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessor.java @@ -127,6 +127,7 @@ public boolean supportsReturnType(MethodParameter returnType) { * converter to read the content with. */ @Override + @Nullable public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception { @@ -152,6 +153,7 @@ public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewC } @Override + @Nullable protected Object readWithMessageConverters(NativeWebRequest webRequest, MethodParameter parameter, Type paramType) throws IOException, HttpMediaTypeNotSupportedException, HttpMessageNotReadableException { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethod.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethod.java index 5e9b1f74b166..4e44175032a6 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethod.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethod.java @@ -253,6 +253,7 @@ public MethodParameter getReturnValueType(@Nullable Object returnValue) { * Bridge to controller method-level annotations. */ @Override + @Nullable public A getMethodAnnotation(Class annotationType) { return ServletInvocableHandlerMethod.this.getMethodAnnotation(annotationType); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletRequestMethodArgumentResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletRequestMethodArgumentResolver.java index ba38ca86a463..5784d707b5ce 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletRequestMethodArgumentResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletRequestMethodArgumentResolver.java @@ -85,6 +85,7 @@ public boolean supportsParameter(MethodParameter parameter) { } @Override + @Nullable public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/JspAwareRequestContext.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/JspAwareRequestContext.java index b0f3e2bd04a6..7287685a309e 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/JspAwareRequestContext.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/JspAwareRequestContext.java @@ -95,6 +95,7 @@ protected Locale getFallbackLocale() { * request, session or application scope; if not found, returns {@code null}. */ @Override + @Nullable protected TimeZone getFallbackTimeZone() { if (jstlPresent) { TimeZone timeZone = JstlPageLocaleResolver.getJstlTimeZone(getPageContext()); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/MessageTag.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/MessageTag.java index 726244872705..3744ce0f8ce3 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/MessageTag.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/MessageTag.java @@ -395,6 +395,7 @@ protected MessageSource getMessageSource() { /** * Return default exception message. */ + @Nullable protected String getNoSuchMessageExceptionDescription(NoSuchMessageException ex) { return ex.getMessage(); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/AbstractMultiCheckedElementTag.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/AbstractMultiCheckedElementTag.java index 21981acb3c41..3547f810cf87 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/AbstractMultiCheckedElementTag.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/AbstractMultiCheckedElementTag.java @@ -180,6 +180,7 @@ public String getElement() { * since we're dealing with multiple HTML elements. */ @Override + @Nullable protected String resolveId() throws JspException { Object id = evaluate("id", getId()); if (id != null) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/OptionTag.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/OptionTag.java index 26f7853074f0..0be2e11481e1 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/OptionTag.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/OptionTag.java @@ -364,6 +364,7 @@ private void renderOption(Object value, String label, TagWriter tagWriter) throw } @Override + @Nullable protected String autogenerateId() throws JspException { return null; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/OptionsTag.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/OptionsTag.java index ae6ede65e70c..ec1091fbafa7 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/OptionsTag.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/OptionsTag.java @@ -323,6 +323,7 @@ protected int writeTagContent(TagWriter tagWriter) throws JspException { * since we're dealing with multiple HTML elements. */ @Override + @Nullable protected String resolveId() throws JspException { Object id = evaluate("id", getId()); if (id != null) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ResourceBundleViewResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ResourceBundleViewResolver.java index 84486456eb84..ac7db809333a 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ResourceBundleViewResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ResourceBundleViewResolver.java @@ -200,6 +200,7 @@ public void afterPropertiesSet() throws BeansException { @Override + @Nullable protected View loadView(String viewName, Locale locale) throws Exception { BeanFactory factory = initFactory(locale); try { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/UrlBasedViewResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/UrlBasedViewResolver.java index a7276242f4cb..b5ffaaaef88c 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/UrlBasedViewResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/UrlBasedViewResolver.java @@ -461,6 +461,7 @@ protected Object getCacheKey(String viewName, Locale locale) { * @see #requiredViewClass */ @Override + @Nullable protected View createView(String viewName, Locale locale) throws Exception { // If this resolver is not supposed to handle the given view, // return null to pass on to the next resolver in the chain. @@ -545,6 +546,7 @@ protected AbstractUrlBasedView instantiateView() { * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet */ @Override + @Nullable protected View loadView(String viewName, Locale locale) throws Exception { AbstractUrlBasedView view = buildView(viewName); View result = applyLifecycleMethods(viewName, view); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/XmlViewResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/XmlViewResolver.java index 2167badac6d7..e33ffa881296 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/XmlViewResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/XmlViewResolver.java @@ -119,6 +119,7 @@ protected Object getCacheKey(String viewName, Locale locale) { } @Override + @Nullable protected View loadView(String viewName, Locale locale) throws BeansException { BeanFactory factory = initFactory(); try { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xslt/XsltView.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xslt/XsltView.java index e80d827832b0..d889ad7873cb 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xslt/XsltView.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xslt/XsltView.java @@ -306,7 +306,7 @@ protected Class[] getSourceTypes() { * @return the adapted XSLT Source * @throws IllegalArgumentException if the given Object is not of a supported type */ - protected Source convertSource(Object sourceObject) throws Exception { + protected Source convertSource(@Nullable Object sourceObject) throws Exception { if (sourceObject instanceof Source source) { return source; }