From 87598f48e41d483745aba56cbf4e998c6f6d680c Mon Sep 17 00:00:00 2001 From: Sebastien Deleuze Date: Sat, 27 May 2017 08:14:59 +0200 Subject: [PATCH] Introduce null-safety of Spring Framework API This commit introduces 2 new @Nullable and @NonNullApi annotations that leverage JSR 305 (dormant but available via Findbugs jsr305 dependency and already used by libraries like OkHttp) meta-annotations to specify explicitly null-safety of Spring Framework parameters and return values. In order to avoid adding too much annotations, the default is set at package level with @NonNullApi and @Nullable annotations are added when needed at parameter or return value level. These annotations are intended to be used on Spring Framework itself but also by other Spring projects. @Nullable annotations have been introduced based on Javadoc and search of patterns like "return null;". It is expected that nullability of Spring Framework API will be polished with complementary commits. In practice, this will make the whole Spring Framework API null-safe for Kotlin projects (when KT-10942 will be fixed) since Kotlin will be able to leverage these annotations to know if a parameter or a return value is nullable or not. But this is also useful for Java developers as well since IntelliJ IDEA, for example, also understands these annotations to generate warnings when unsafe nullable usages are detected. Issue: SPR-15540 --- build.gradle | 1 + .../org/aopalliance/aop/AspectException.java | 4 +- .../intercept/MethodInterceptor.java | 3 + .../aop/AfterReturningAdvice.java | 4 +- .../aop/IntroductionAwareMethodMatcher.java | 4 +- .../aop/MethodBeforeAdvice.java | 4 +- .../springframework/aop/MethodMatcher.java | 6 +- .../aop/ProxyMethodInvocation.java | 5 +- .../springframework/aop/TargetClassAware.java | 3 + .../org/springframework/aop/TargetSource.java | 3 + .../aop/aspectj/AbstractAspectJAdvice.java | 5 +- .../AspectJAdviceParameterNameDiscoverer.java | 2 + .../aspectj/AspectJAfterReturningAdvice.java | 5 +- .../aop/aspectj/AspectJAopUtils.java | 2 + .../aspectj/AspectJExpressionPointcut.java | 2 + .../MethodInvocationProceedingJoinPoint.java | 2 + .../AbstractAspectJAdvisorFactory.java | 3 + .../annotation/AspectJAdvisorFactory.java | 3 + .../MetadataAwareAspectInstanceFactory.java | 2 + .../ReflectiveAspectJAdvisorFactory.java | 5 +- .../aop/aspectj/annotation/package-info.java | 3 + .../aop/aspectj/autoproxy/package-info.java | 3 + .../aop/aspectj/package-info.java | 3 + .../aop/config/AopConfigUtils.java | 3 +- .../config/ConfigBeanDefinitionParser.java | 2 + .../aop/config/package-info.java | 3 + .../aop/framework/AdvisorChainFactory.java | 4 +- .../aop/framework/AopContext.java | 4 +- .../aop/framework/AopProxy.java | 4 +- .../aop/framework/AopProxyUtils.java | 2 + .../aop/framework/CglibAopProxy.java | 4 +- .../aop/framework/ProxyFactory.java | 3 +- .../aop/framework/adapter/package-info.java | 3 + .../autoproxy/AbstractAutoProxyCreator.java | 6 +- .../framework/autoproxy/AutoProxyUtils.java | 2 + .../autoproxy/ProxyCreationContext.java | 4 +- .../autoproxy/TargetSourceCreator.java | 2 + .../aop/framework/autoproxy/package-info.java | 3 + ...ctBeanFactoryBasedTargetSourceCreator.java | 2 + .../framework/autoproxy/target/package.html | 7 -- .../aop/framework/package-info.java | 3 + .../AsyncExecutionAspectSupport.java | 6 ++ .../CustomizableTraceInterceptor.java | 5 +- .../aop/interceptor/package-info.java | 3 + .../org/springframework/aop/package-info.java | 3 + .../aop/scope/package-info.java | 3 + .../AbstractBeanFactoryPointcutAdvisor.java | 2 + .../support/AbstractExpressionPointcut.java | 3 + .../springframework/aop/support/AopUtils.java | 4 +- .../aop/support/ControlFlowPointcut.java | 3 +- .../support/DefaultIntroductionAdvisor.java | 3 +- .../aop/support/MethodMatchers.java | 3 +- .../support/RegexpMethodPointcutAdvisor.java | 2 + .../AnnotationMatchingPointcut.java | 3 +- .../aop/support/annotation/package-info.java | 3 + .../aop/support/package-info.java | 3 + .../aop/target/EmptyTargetSource.java | 7 +- .../aop/target/dynamic/package.html | 7 -- .../AbstractNestablePropertyAccessor.java | 4 ++ .../beans/BeanInfoFactory.java | 3 + .../beans/BeanInstantiationException.java | 4 ++ .../beans/BeanMetadataAttributeAccessor.java | 2 + .../beans/BeanMetadataElement.java | 3 + .../org/springframework/beans/BeanUtils.java | 11 +++ .../springframework/beans/BeanWrapper.java | 4 ++ .../beans/ConfigurablePropertyAccessor.java | 2 + .../ConversionNotSupportedException.java | 6 +- .../beans/ExtendedBeanInfo.java | 2 + .../org/springframework/beans/Mergeable.java | 4 +- .../beans/MutablePropertyValues.java | 2 + .../beans/NotWritablePropertyException.java | 3 + .../beans/PropertyAccessException.java | 4 ++ .../beans/PropertyAccessor.java | 3 + .../beans/PropertyBatchUpdateException.java | 2 + .../beans/PropertyEditorRegistry.java | 7 +- .../beans/PropertyEditorRegistrySupport.java | 11 ++- .../springframework/beans/PropertyValues.java | 3 + .../springframework/beans/TypeConverter.java | 7 +- .../beans/TypeConverterDelegate.java | 16 +++-- .../beans/TypeMismatchException.java | 8 ++- .../beans/annotation/AnnotationBeanUtils.java | 5 +- .../beans/annotation/package-info.java | 3 + .../beans/factory/BeanClassLoaderAware.java | 4 +- .../beans/factory/BeanCreationException.java | 4 ++ .../factory/BeanDefinitionStoreException.java | 9 ++- .../beans/factory/BeanFactory.java | 4 +- .../beans/factory/FactoryBean.java | 4 ++ .../factory/HierarchicalBeanFactory.java | 3 + .../beans/factory/InjectionPoint.java | 4 ++ .../beans/factory/ListableBeanFactory.java | 12 ++-- .../NoUniqueBeanDefinitionException.java | 2 + .../beans/factory/ObjectProvider.java | 3 + .../annotation/AnnotatedBeanDefinition.java | 2 + .../AutowiredAnnotationBeanPostProcessor.java | 3 + .../factory/annotation/InjectionMetadata.java | 2 + ...erAnnotationAutowireCandidateResolver.java | 2 + .../factory/annotation/package-info.java | 3 + .../factory/config/AbstractFactoryBean.java | 2 + .../config/AutowireCapableBeanFactory.java | 3 + .../beans/factory/config/BeanDefinition.java | 9 ++- .../factory/config/BeanDefinitionHolder.java | 4 +- .../factory/config/BeanExpressionContext.java | 2 + .../factory/config/BeanPostProcessor.java | 3 + .../config/ConfigurableBeanFactory.java | 7 +- .../config/ConstructorArgumentValues.java | 17 +++-- .../factory/config/DependencyDescriptor.java | 5 +- .../InstantiationAwareBeanPostProcessor.java | 3 + .../beans/factory/config/NamedBeanHolder.java | 2 + .../config/PlaceholderConfigurerSupport.java | 3 +- .../PreferencesPlaceholderConfigurer.java | 2 + .../config/PropertyPlaceholderConfigurer.java | 3 + .../beans/factory/config/Scope.java | 4 ++ .../factory/config/SingletonBeanRegistry.java | 3 + ...rtInstantiationAwareBeanPostProcessor.java | 3 + .../factory/config/TypedStringValue.java | 5 +- .../beans/factory/config/package-info.java | 3 + .../beans/factory/package-info.java | 3 + .../factory/parsing/AliasDefinition.java | 3 +- .../parsing/BeanComponentDefinition.java | 3 +- .../parsing/FailFastProblemReporter.java | 4 +- .../factory/parsing/ImportDefinition.java | 5 +- .../beans/factory/parsing/Location.java | 4 +- .../beans/factory/parsing/ParseState.java | 3 + .../beans/factory/parsing/Problem.java | 5 +- .../factory/parsing/SourceExtractor.java | 4 +- .../beans/factory/parsing/package-info.java | 3 + .../factory/serviceloader/package-info.java | 3 + .../AbstractAutowireCapableBeanFactory.java | 20 ++++-- .../support/AbstractBeanDefinition.java | 5 ++ .../support/AbstractBeanDefinitionReader.java | 5 +- .../factory/support/AbstractBeanFactory.java | 11 ++- .../support/AutowireCandidateResolver.java | 3 + .../factory/support/BeanDefinitionReader.java | 2 + .../support/BeanDefinitionReaderUtils.java | 3 +- .../support/BeanDefinitionValueResolver.java | 4 +- ...CglibSubclassingInstantiationStrategy.java | 3 +- .../factory/support/ConstructorResolver.java | 7 +- .../support/DefaultListableBeanFactory.java | 10 +++ .../support/DefaultSingletonBeanRegistry.java | 2 + .../support/DisposableBeanAdapter.java | 2 + .../support/FactoryBeanRegistrySupport.java | 3 + ...ricTypeAwareAutowireCandidateResolver.java | 3 + .../support/InstantiationStrategy.java | 9 +-- .../beans/factory/support/LookupOverride.java | 5 +- .../factory/support/MethodOverrides.java | 3 + .../PropertiesBeanDefinitionReader.java | 11 +-- .../factory/support/RootBeanDefinition.java | 4 ++ .../support/SimpleInstantiationStrategy.java | 2 + .../SimpleSecurityContextProvider.java | 4 +- .../beans/factory/support/package-info.java | 3 + .../factory/wiring/BeanConfigurerSupport.java | 4 +- .../beans/factory/wiring/BeanWiringInfo.java | 2 + .../wiring/BeanWiringInfoResolver.java | 3 + .../beans/factory/wiring/package-info.java | 3 + .../AbstractSingleBeanDefinitionParser.java | 4 ++ .../factory/xml/BeanDefinitionParser.java | 2 + .../xml/BeanDefinitionParserDelegate.java | 12 +++- .../beans/factory/xml/BeansDtdResolver.java | 2 + .../xml/DefaultNamespaceHandlerResolver.java | 5 +- .../factory/xml/DelegatingEntityResolver.java | 4 +- .../beans/factory/xml/NamespaceHandler.java | 2 + .../factory/xml/NamespaceHandlerResolver.java | 3 + .../factory/xml/PluggableSchemaResolver.java | 6 +- .../factory/xml/XmlBeanDefinitionReader.java | 4 +- .../beans/factory/xml/package-info.java | 3 + .../springframework/beans/package-info.java | 3 + .../propertyeditors/ClassArrayEditor.java | 3 +- .../beans/propertyeditors/ClassEditor.java | 3 +- .../CustomCollectionEditor.java | 2 + .../propertyeditors/CustomMapEditor.java | 2 + .../propertyeditors/InputStreamEditor.java | 2 + .../beans/propertyeditors/ReaderEditor.java | 2 + .../beans/propertyeditors/URIEditor.java | 5 +- .../beans/propertyeditors/package-info.java | 3 + .../ArgumentConvertingMethodInvoker.java | 2 + .../beans/support/PropertyComparator.java | 2 + .../beans/support/package-info.java | 3 + .../cache/caffeine/CaffeineCacheManager.java | 3 +- .../cache/caffeine/package-info.java | 3 + .../cache/ehcache/package-info.java | 3 + .../jcache/JCacheManagerFactoryBean.java | 5 +- .../interceptor/AbstractCacheInterceptor.java | 2 + ...AbstractFallbackJCacheOperationSource.java | 3 + .../AnnotationJCacheOperationSource.java | 2 + .../interceptor/CacheResultInterceptor.java | 2 + .../interceptor/CacheResultOperation.java | 2 + .../DefaultJCacheOperationSource.java | 5 ++ .../interceptor/JCacheOperationSource.java | 5 +- .../JCacheOperationSourcePointcut.java | 2 + .../cache/jcache/package-info.java | 3 + .../cache/transaction/package-info.java | 3 + .../javamail/ConfigurableMimeFileTypeMap.java | 3 +- .../mail/javamail/JavaMailSenderImpl.java | 5 ++ .../mail/javamail/MimeMessageHelper.java | 5 +- .../mail/javamail/SmartMimeMessage.java | 6 +- .../mail/javamail/package-info.java | 3 + .../springframework/mail/package-info.java | 3 + .../commonj/TimerManagerTaskScheduler.java | 2 + .../scheduling/commonj/package-info.java | 3 + .../quartz/ResourceLoaderClassLoadHelper.java | 3 + .../quartz/SpringBeanJobFactory.java | 3 +- .../scheduling/quartz/package-info.java | 3 + .../FreeMarkerConfigurationFactory.java | 2 + .../ui/freemarker/package-info.java | 3 + .../java/org/springframework/cache/Cache.java | 23 ++++--- .../springframework/cache/CacheManager.java | 3 + .../AnnotationCacheOperationSource.java | 3 + .../annotation/CacheAnnotationParser.java | 3 + .../cache/annotation/CachingConfigurer.java | 5 ++ .../cache/annotation/package-info.java | 3 + .../cache/concurrent/ConcurrentMapCache.java | 3 +- .../concurrent/ConcurrentMapCacheManager.java | 3 +- .../cache/concurrent/package-info.java | 3 + .../cache/config/CacheAdviceParser.java | 2 + .../cache/config/package-info.java | 3 + .../interceptor/AbstractCacheInvoker.java | 2 + .../interceptor/AbstractCacheResolver.java | 2 + .../AbstractFallbackCacheOperationSource.java | 6 +- .../cache/interceptor/CacheAspectSupport.java | 4 ++ .../CacheOperationExpressionEvaluator.java | 3 +- .../interceptor/CacheOperationSource.java | 5 +- .../CacheOperationSourcePointcut.java | 2 + .../cache/interceptor/package-info.java | 3 + .../springframework/cache/package-info.java | 3 + .../cache/support/AbstractCacheManager.java | 3 + .../support/AbstractValueAdaptingCache.java | 6 +- .../cache/support/SimpleValueWrapper.java | 3 +- .../cache/support/package-info.java | 3 + .../context/ApplicationContext.java | 3 + .../ConfigurableApplicationContext.java | 3 +- .../context/HierarchicalMessageSource.java | 5 +- .../context/MessageSource.java | 6 +- .../context/MessageSourceResolvable.java | 4 ++ .../annotation/AdviceModeImportSelector.java | 4 +- .../AnnotatedBeanDefinitionReader.java | 9 +-- .../AnnotationBeanNameGenerator.java | 4 ++ .../AnnotationConfigApplicationContext.java | 5 +- .../annotation/AnnotationConfigUtils.java | 4 +- ...athScanningCandidateComponentProvider.java | 3 + .../context/annotation/ConditionContext.java | 6 ++ .../annotation/ConditionEvaluator.java | 4 ++ .../annotation/ConfigurationClass.java | 5 +- .../ConfigurationClassEnhancer.java | 2 + .../annotation/ConfigurationClassParser.java | 2 + .../annotation/MBeanExportConfiguration.java | 2 + .../context/annotation/package-info.java | 3 + .../MBeanServerBeanDefinitionParser.java | 2 + .../context/config/package-info.java | 3 + .../event/ApplicationEventMulticaster.java | 3 +- .../ApplicationListenerMethodAdapter.java | 4 +- .../GenericApplicationListenerAdapter.java | 3 +- .../context/event/package-info.java | 3 + .../context/expression/package-info.java | 3 + .../context/i18n/LocaleContext.java | 3 + .../context/i18n/LocaleContextHolder.java | 18 ++--- .../i18n/TimeZoneAwareLocaleContext.java | 3 + .../context/i18n/package-info.java | 3 + .../index/CandidateComponentsIndexLoader.java | 5 +- .../context/index/package-info.java | 3 + .../springframework/context/package-info.java | 3 + .../support/AbstractMessageSource.java | 8 +++ ...ctRefreshableConfigApplicationContext.java | 3 + .../AbstractResourceBasedMessageSource.java | 2 + .../AbstractXmlApplicationContext.java | 2 + .../support/GenericApplicationContext.java | 5 +- .../context/support/LiveBeansView.java | 2 + .../support/MessageSourceAccessor.java | 9 +-- .../support/MessageSourceResourceBundle.java | 2 + .../context/support/MessageSourceSupport.java | 3 +- ...ReloadableResourceBundleMessageSource.java | 5 +- .../support/ResourceBundleMessageSource.java | 4 ++ .../context/support/package-info.java | 3 + .../weaving/AspectJWeavingEnabler.java | 3 +- .../weaving/DefaultContextLoadTimeWeaver.java | 2 + .../weaving/LoadTimeWeaverAwareProcessor.java | 3 +- .../context/weaving/package-info.java | 3 + .../AbstractRemoteSlsbInvokerInterceptor.java | 3 + .../AbstractSlsbInvokerInterceptor.java | 3 + .../ejb/access/package-info.java | 3 + .../ejb/config/package-info.java | 3 + .../format/annotation/package-info.java | 3 + .../joda/DateTimeFormatterFactory.java | 3 +- .../format/datetime/joda/JodaTimeContext.java | 3 + .../datetime/joda/JodaTimeContextHolder.java | 6 +- .../format/datetime/joda/package-info.java | 3 + .../format/datetime/package-info.java | 3 + .../datetime/standard/DateTimeContext.java | 3 + .../standard/DateTimeContextHolder.java | 6 +- .../standard/DateTimeFormatterFactory.java | 4 +- .../datetime/standard/package-info.java | 3 + .../format/number/money/package-info.java | 3 + .../format/number/package-info.java | 3 + .../springframework/format/package-info.java | 3 + .../format/support/package-info.java | 3 + .../InstrumentationLoadTimeWeaver.java | 3 + .../classloading/glassfish/package-info.java | 3 + .../classloading/jboss/package-info.java | 3 + .../instrument/classloading/package-info.java | 3 + .../classloading/tomcat/package-info.java | 3 + .../classloading/weblogic/package-info.java | 3 + .../classloading/websphere/package-info.java | 3 + .../jmx/access/ConnectorDelegate.java | 3 +- .../jmx/access/MBeanClientInterceptor.java | 6 +- .../jmx/access/package-info.java | 3 + .../jmx/export/MBeanExporter.java | 3 + .../jmx/export/annotation/package-info.java | 3 + .../AbstractReflectiveMBeanInfoAssembler.java | 3 + .../jmx/export/assembler/package-info.java | 3 + .../export/metadata/JmxAttributeSource.java | 6 ++ .../jmx/export/metadata/package-info.java | 3 + .../jmx/export/naming/package-info.java | 3 + .../jmx/export/notification/package-info.java | 3 + .../jmx/export/package-info.java | 3 + .../org/springframework/jmx/package-info.java | 3 + .../springframework/jmx/support/JmxUtils.java | 5 +- .../jmx/support/MBeanServerFactoryBean.java | 5 +- .../support/NotificationListenerHolder.java | 7 +- .../jmx/support/package-info.java | 3 + .../springframework/jndi/JndiCallback.java | 3 + .../jndi/JndiObjectLocator.java | 2 + .../springframework/jndi/JndiTemplate.java | 7 +- .../springframework/jndi/package-info.java | 3 + .../jndi/support/package-info.java | 3 + .../remoting/package-info.java | 3 + .../rmi/CodebaseAwareObjectInputStream.java | 5 +- .../rmi/JndiRmiClientInterceptor.java | 3 + .../remoting/rmi/RmiClientInterceptor.java | 5 ++ .../rmi/RmiClientInterceptorUtils.java | 2 + .../remoting/rmi/RmiInvocationHandler.java | 3 + .../remoting/rmi/RmiRegistryFactoryBean.java | 7 +- .../remoting/rmi/RmiServiceExporter.java | 7 +- .../remoting/support/RemoteInvocation.java | 3 + .../support/RemoteInvocationResult.java | 5 ++ .../remoting/support/RemotingSupport.java | 4 +- .../scheduling/TaskScheduler.java | 3 + .../springframework/scheduling/Trigger.java | 3 + .../scheduling/TriggerContext.java | 5 ++ .../annotation/AsyncAnnotationAdvisor.java | 4 +- .../scheduling/annotation/package-info.java | 3 + .../concurrent/ReschedulingRunnable.java | 2 + .../scheduling/concurrent/package-info.java | 3 + .../config/ScheduledTaskRegistrar.java | 5 ++ .../scheduling/config/package-info.java | 3 + .../scheduling/package-info.java | 3 + .../scheduling/support/TaskUtils.java | 3 +- .../scheduling/support/package-info.java | 3 + .../scripting/ScriptCompilationException.java | 2 + .../scripting/ScriptEvaluator.java | 6 +- .../scripting/ScriptFactory.java | 6 +- .../scripting/ScriptSource.java | 3 + .../scripting/bsh/BshScriptFactory.java | 3 +- .../scripting/bsh/BshScriptUtils.java | 9 ++- .../scripting/bsh/package-info.java | 3 + .../config/ScriptBeanDefinitionParser.java | 2 + .../scripting/config/package-info.java | 3 + .../scripting/groovy/GroovyScriptFactory.java | 5 +- .../scripting/groovy/package-info.java | 3 + .../scripting/package-info.java | 3 + .../support/ResourceScriptSource.java | 3 +- .../support/ScriptFactoryPostProcessor.java | 3 +- .../scripting/support/StaticScriptSource.java | 3 +- .../scripting/support/package-info.java | 3 + .../stereotype/package-info.java | 3 + .../springframework/ui/ConcurrentModel.java | 3 +- .../java/org/springframework/ui/Model.java | 6 +- .../java/org/springframework/ui/ModelMap.java | 3 +- .../ui/context/HierarchicalThemeSource.java | 5 +- .../ui/context/ThemeSource.java | 3 + .../ui/context/package-info.java | 3 + .../ui/context/support/package-info.java | 3 + .../org/springframework/ui/package-info.java | 3 + .../AbstractPropertyBindingResult.java | 2 + .../validation/BindingResult.java | 6 +- .../validation/BindingResultUtils.java | 2 + .../validation/DataBinder.java | 9 ++- .../springframework/validation/Errors.java | 18 +++-- .../validation/MessageCodesResolver.java | 4 +- .../validation/SmartValidator.java | 4 +- .../validation/ValidationUtils.java | 9 +-- .../springframework/validation/Validator.java | 4 +- .../validation/annotation/package-info.java | 3 + .../beanvalidation/package-info.java | 3 + .../validation/package-info.java | 3 + .../validation/support/package-info.java | 3 + .../core/AttributeAccessor.java | 6 +- .../core/BridgeMethodResolver.java | 6 +- .../core/CollectionFactory.java | 9 +-- .../core/ConfigurableObjectInputStream.java | 2 + .../org/springframework/core/Constants.java | 13 ++-- .../org/springframework/core/Conventions.java | 5 +- .../core/GenericTypeResolver.java | 5 ++ .../springframework/core/MethodClassKey.java | 3 +- .../core/MethodIntrospector.java | 4 +- .../springframework/core/MethodParameter.java | 8 +++ .../core/NestedCheckedException.java | 3 + .../core/NestedExceptionUtils.java | 3 + .../core/NestedRuntimeException.java | 3 + .../springframework/core/OrderComparator.java | 4 ++ .../core/OverridingClassLoader.java | 3 + .../core/ParameterNameDiscoverer.java | 4 ++ .../core/ReactiveAdapterRegistry.java | 4 +- .../springframework/core/ResolvableType.java | 25 ++++--- .../core/ResolvableTypeProvider.java | 3 + .../core/SerializableTypeWrapper.java | 2 + .../core/SpringProperties.java | 5 +- .../springframework/core/SpringVersion.java | 3 + ...liasAwareAnnotationAttributeExtractor.java | 3 +- .../annotation/AnnotatedElementUtils.java | 40 ++++++++--- .../AnnotationAttributeExtractor.java | 3 + .../core/annotation/AnnotationAttributes.java | 4 +- .../core/annotation/AnnotationUtils.java | 68 ++++++++++++++----- .../DefaultAnnotationAttributeExtractor.java | 3 +- .../MapAnnotationAttributeExtractor.java | 3 +- .../core/annotation/OrderUtils.java | 3 + .../core/annotation/package-info.java | 3 + .../core/codec/CodecException.java | 3 +- .../springframework/core/codec/Decoder.java | 7 +- .../core/codec/DecodingException.java | 4 +- .../springframework/core/codec/Encoder.java | 5 +- .../core/codec/EncodingException.java | 4 +- .../core/codec/package-info.java | 3 + .../core/convert/ConversionService.java | 10 +-- .../core/convert/Property.java | 4 ++ .../core/convert/TypeDescriptor.java | 26 +++++-- .../core/convert/converter/Converter.java | 3 + .../convert/converter/GenericConverter.java | 5 +- .../core/convert/converter/package-info.java | 3 + .../core/convert/package-info.java | 3 + .../support/GenericConversionService.java | 14 +++- .../convert/support/IdToEntityConverter.java | 3 +- .../core/convert/support/package-info.java | 3 + .../core/env/AbstractPropertyResolver.java | 2 + .../core/env/CommandLineArgs.java | 5 +- .../core/env/CommandLinePropertySource.java | 2 + .../env/ConfigurablePropertyResolver.java | 3 +- .../core/env/EnvironmentCapable.java | 3 + .../core/env/MutablePropertySources.java | 2 + .../core/env/PropertyResolver.java | 4 ++ .../core/env/PropertySource.java | 2 + .../core/env/PropertySources.java | 3 + .../env/PropertySourcesPropertyResolver.java | 3 + .../env/SystemEnvironmentPropertySource.java | 2 + .../core/env/package-info.java | 3 + .../core/io/ClassPathResource.java | 8 ++- .../core/io/DefaultResourceLoader.java | 5 +- .../core/io/ProtocolResolver.java | 3 + .../org/springframework/core/io/Resource.java | 3 + .../core/io/ResourceEditor.java | 2 + .../core/io/ResourceLoader.java | 2 + .../core/io/buffer/package-info.java | 3 + .../springframework/core/io/package-info.java | 3 + .../core/io/support/EncodedResource.java | 3 + .../io/support/LocalizedResourceHelper.java | 3 +- .../PathMatchingResourcePatternResolver.java | 4 +- .../io/support/PropertiesLoaderUtils.java | 3 +- .../core/io/support/ResourcePatternUtils.java | 3 +- .../io/support/SpringFactoriesLoader.java | 5 +- .../core/io/support/package-info.java | 3 + .../springframework/core/package-info.java | 3 + .../core/serializer/package-info.java | 3 + .../core/serializer/support/package-info.java | 3 + .../core/style/ValueStyler.java | 4 +- .../core/style/package-info.java | 3 + .../core/task/SimpleAsyncTaskExecutor.java | 2 + .../core/task/package-info.java | 3 + .../task/support/TaskExecutorAdapter.java | 3 +- .../core/task/support/package-info.java | 3 + .../core/type/AnnotatedTypeMetadata.java | 5 ++ .../core/type/ClassMetadata.java | 4 ++ .../AnnotationReadingVisitorUtils.java | 2 + .../core/type/classreading/package-info.java | 3 + ...AbstractTypeHierarchyTraversingFilter.java | 3 + .../type/filter/AnnotationTypeFilter.java | 2 + .../type/filter/AssignableTypeFilter.java | 2 + .../core/type/filter/package-info.java | 3 + .../core/type/package-info.java | 3 + .../org/springframework/lang/NonNullApi.java | 29 ++++++++ .../org/springframework/lang/Nullable.java | 28 ++++++++ .../springframework/lang/package-info.java | 2 + .../java/org/springframework/util/Assert.java | 56 +++++++-------- .../org/springframework/util/Base64Utils.java | 26 ++++--- .../org/springframework/util/ClassUtils.java | 39 +++++++---- .../springframework/util/CollectionUtils.java | 16 +++-- .../util/ConcurrentReferenceHashMap.java | 21 ++++-- .../util/CustomizableThreadCreator.java | 3 + .../springframework/util/FileCopyUtils.java | 6 +- .../springframework/util/InstanceFilter.java | 4 +- .../util/LinkedCaseInsensitiveMap.java | 4 ++ .../springframework/util/MethodInvoker.java | 4 ++ .../org/springframework/util/MimeType.java | 8 ++- .../springframework/util/MultiValueMap.java | 3 + .../org/springframework/util/ObjectUtils.java | 61 +++++++++-------- .../util/PropertyPlaceholderHelper.java | 5 +- .../springframework/util/ReflectionUtils.java | 21 ++++-- .../org/springframework/util/StopWatch.java | 3 + .../org/springframework/util/StreamUtils.java | 6 +- .../org/springframework/util/StringUtils.java | 59 ++++++++++------ .../util/StringValueResolver.java | 5 +- .../util/backoff/package-info.java | 3 + .../util/comparator/package-info.java | 3 + .../util/concurrent/package-info.java | 3 + .../springframework/util/package-info.java | 3 + .../util/xml/AbstractXMLEventReader.java | 2 + .../util/xml/AbstractXMLStreamReader.java | 2 + .../springframework/util/xml/DomUtils.java | 3 + .../util/xml/ListBasedXMLEventReader.java | 2 + .../springframework/util/xml/StaxResult.java | 4 ++ .../springframework/util/xml/StaxSource.java | 4 ++ .../util/xml/XMLEventStreamReader.java | 5 ++ .../util/xml/package-info.java | 3 + .../expression/ConstructorResolver.java | 2 + .../expression/MethodResolver.java | 2 + .../expression/PropertyAccessor.java | 3 + .../expression/TypeConverter.java | 2 + .../expression/common/package-info.java | 3 + .../expression/package-info.java | 3 + .../expression/spel/CodeFlow.java | 6 +- .../expression/spel/ExpressionState.java | 2 + .../expression/spel/SpelNode.java | 2 + .../spel/ast/ConstructorReference.java | 2 + .../expression/spel/ast/MethodReference.java | 2 + .../expression/spel/ast/Operator.java | 2 + .../expression/spel/ast/package-info.java | 3 + .../expression/spel/package-info.java | 3 + .../InternalSpelExpressionParser.java | 8 +++ .../spel/standard/SpelCompiler.java | 3 + .../spel/standard/package-info.java | 3 + .../spel/support/ReflectionHelper.java | 6 +- .../support/ReflectiveMethodExecutor.java | 2 + .../support/ReflectivePropertyAccessor.java | 3 + .../expression/spel/support/package-info.java | 3 + .../config/DatabasePopulatorConfigUtils.java | 2 + .../jdbc/config/package-info.java | 3 + .../jdbc/core/BeanPropertyRowMapper.java | 6 +- .../jdbc/core/CallableStatementCallback.java | 2 + .../core/CallableStatementCreatorFactory.java | 3 +- .../jdbc/core/ConnectionCallback.java | 2 + .../jdbc/core/JdbcOperations.java | 38 +++++++---- .../jdbc/core/JdbcTemplate.java | 6 +- .../jdbc/core/ParameterMapper.java | 3 + .../jdbc/core/PreparedStatementCallback.java | 2 + .../core/PreparedStatementCreatorFactory.java | 11 +-- .../jdbc/core/ResultSetExtractor.java | 2 + .../core/ResultSetSupportingSqlParameter.java | 5 ++ .../jdbc/core/SingleColumnRowMapper.java | 3 +- .../jdbc/core/SqlOutParameter.java | 3 + .../jdbc/core/SqlParameter.java | 4 ++ .../jdbc/core/SqlProvider.java | 3 + .../jdbc/core/StatementCallback.java | 2 + .../jdbc/core/StatementCreatorUtils.java | 6 +- .../core/metadata/CallMetaDataProvider.java | 8 ++- .../core/metadata/TableMetaDataProvider.java | 5 +- .../jdbc/core/metadata/package-info.java | 3 + .../namedparam/MapSqlParameterSource.java | 5 +- .../NamedParameterJdbcOperations.java | 6 ++ .../core/namedparam/NamedParameterUtils.java | 4 +- .../core/namedparam/SqlParameterSource.java | 2 + .../jdbc/core/namedparam/package-info.java | 3 + .../jdbc/core/package-info.java | 3 + .../jdbc/core/simple/package-info.java | 3 + .../jdbc/core/support/package-info.java | 3 + .../AbstractDriverBasedDataSource.java | 6 +- .../jdbc/datasource/ConnectionHolder.java | 3 +- .../jdbc/datasource/DataSourceUtils.java | 11 +-- .../IsolationLevelDataSourceAdapter.java | 3 + .../LazyConnectionDataSourceProxy.java | 2 + .../SingleConnectionDataSource.java | 2 + .../TransactionAwareDataSourceProxy.java | 2 + .../WebSphereDataSourceAdapter.java | 4 +- .../embedded/EmbeddedDatabaseFactory.java | 3 + .../datasource/embedded/package-info.java | 3 + .../init/ResourceDatabasePopulator.java | 6 +- .../jdbc/datasource/init/package-info.java | 3 + .../lookup/MapDataSourceLookup.java | 4 +- .../jdbc/datasource/lookup/package-info.java | 3 + .../jdbc/datasource/package-info.java | 3 + .../object/MappingSqlQueryWithParameters.java | 4 +- .../jdbc/object/RdbmsOperation.java | 6 +- .../springframework/jdbc/object/SqlCall.java | 4 +- .../jdbc/object/SqlOperation.java | 7 +- .../springframework/jdbc/object/SqlQuery.java | 5 +- .../jdbc/object/StoredProcedure.java | 8 ++- .../jdbc/object/UpdatableSqlQuery.java | 4 +- .../jdbc/object/package-info.java | 3 + .../springframework/jdbc/package-info.java | 3 + ...bstractFallbackSQLExceptionTranslator.java | 7 +- .../CustomSQLExceptionTranslatorRegistry.java | 3 + .../jdbc/support/JdbcUtils.java | 10 +-- .../jdbc/support/KeyHolder.java | 3 + .../SQLErrorCodeSQLExceptionTranslator.java | 6 +- .../jdbc/support/SQLErrorCodesFactory.java | 4 ++ .../jdbc/support/SQLExceptionTranslator.java | 4 +- .../jdbc/support/lob/LobCreator.java | 12 ++-- .../jdbc/support/lob/LobHandler.java | 10 +++ .../jdbc/support/lob/package-info.java | 3 + .../jdbc/support/package-info.java | 3 + .../jdbc/support/rowset/package-info.java | 3 + .../jdbc/support/xml/SqlXmlHandler.java | 11 +++ .../xml/SqlXmlObjectMappingHandler.java | 4 ++ .../jdbc/support/xml/package-info.java | 3 + .../jdbc/core/JdbcOperationsExtensions.kt | 14 ++-- .../core/JdbcOperationsExtensionsTests.kt | 6 +- .../org/springframework/jms/JmsException.java | 2 + .../jms/annotation/package-info.java | 3 + .../config/AbstractJmsListenerEndpoint.java | 5 ++ .../AbstractListenerContainerParser.java | 3 + .../config/JmsListenerEndpointRegistrar.java | 5 +- .../config/JmsListenerEndpointRegistry.java | 2 + .../jms/config/MethodJmsListenerEndpoint.java | 4 +- .../jms/config/package-info.java | 3 + .../connection/CachingConnectionFactory.java | 2 + .../connection/ConnectionFactoryUtils.java | 16 +++-- .../jms/connection/JmsResourceHolder.java | 6 +- .../connection/SingleConnectionFactory.java | 6 ++ .../jms/connection/package-info.java | 3 + .../jms/core/BrowserCallback.java | 3 + .../jms/core/JmsMessageOperations.java | 9 +++ .../jms/core/JmsOperations.java | 16 +++++ .../springframework/jms/core/JmsTemplate.java | 16 +++-- .../jms/core/ProducerCallback.java | 3 + .../jms/core/SessionCallback.java | 3 + .../jms/core/package-info.java | 3 + .../jms/core/support/package-info.java | 3 + .../AbstractJmsListeningContainer.java | 3 + .../AbstractMessageListenerContainer.java | 16 ++++- ...stractPollingMessageListenerContainer.java | 5 +- .../listener/MessageListenerContainer.java | 4 ++ .../AbstractAdaptableMessageListener.java | 7 +- .../jms/listener/adapter/JmsResponse.java | 2 + .../jms/listener/adapter/package-info.java | 3 + .../endpoint/JmsActivationSpecConfig.java | 2 + .../endpoint/JmsMessageEndpointManager.java | 2 + .../StandardJmsActivationSpecFactory.java | 3 + .../jms/listener/endpoint/package-info.java | 3 + .../jms/listener/package-info.java | 3 + .../org/springframework/jms/package-info.java | 3 + .../remoting/JmsInvokerServiceExporter.java | 3 + .../jms/remoting/package-info.java | 3 + .../springframework/jms/support/JmsUtils.java | 15 ++-- .../MappingJackson2MessageConverter.java | 3 + .../converter/MessageConversionException.java | 3 +- .../support/converter/MessageConverter.java | 3 + .../converter/SmartMessageConverter.java | 4 +- .../jms/support/converter/package-info.java | 3 + .../DestinationResolutionException.java | 3 +- .../destination/DestinationResolver.java | 4 +- .../destination/JmsDestinationAccessor.java | 2 + .../jms/support/destination/package-info.java | 3 + .../jms/support/package-info.java | 3 + .../messaging/MessageHeaders.java | 7 ++ .../messaging/PollableChannel.java | 4 ++ .../converter/AbstractMessageConverter.java | 8 ++- .../converter/ContentTypeResolver.java | 4 +- .../MappingJackson2MessageConverter.java | 2 + .../messaging/converter/MessageConverter.java | 5 +- .../converter/SmartMessageConverter.java | 7 +- .../messaging/converter/package-info.java | 3 + .../AbstractMessageReceivingTemplate.java | 3 + .../core/AbstractMessageSendingTemplate.java | 4 +- ...esolvingMessageRequestReplyOperations.java | 6 ++ .../core/MessageReceivingOperations.java | 5 ++ .../core/MessageRequestReplyOperations.java | 9 +++ .../messaging/core/package-info.java | 3 + .../messaging/handler/MessageCondition.java | 2 + .../handler/annotation/package-info.java | 3 + ...tractNamedValueMethodArgumentResolver.java | 6 +- .../support/HeaderMethodArgumentResolver.java | 2 + .../MessageMethodArgumentResolver.java | 5 +- .../MethodArgumentNotValidException.java | 2 + .../support/PayloadArgumentResolver.java | 3 +- ...bstractExceptionHandlerMethodResolver.java | 4 ++ .../AbstractMethodMessageHandler.java | 5 ++ .../AsyncHandlerMethodReturnValueHandler.java | 2 + .../HandlerMethodArgumentResolver.java | 2 + ...dlerMethodReturnValueHandlerComposite.java | 2 + .../invocation/InvocableHandlerMethod.java | 2 + .../handler/invocation/package-info.java | 3 + .../messaging/handler/package-info.java | 3 + .../messaging/package-info.java | 3 + .../messaging/simp/SimpAttributes.java | 2 + .../simp/SimpAttributesContextHolder.java | 2 + .../simp/SimpMessageSendingOperations.java | 5 +- .../simp/annotation/package-info.java | 3 + .../SendToMethodReturnValueHandler.java | 3 + .../simp/annotation/support/package-info.java | 3 + .../broker/DefaultSubscriptionRegistry.java | 3 + .../messaging/simp/broker/package-info.java | 3 + .../AbstractMessageBrokerConfiguration.java | 2 + .../simp/config/MessageBrokerRegistry.java | 3 + .../messaging/simp/config/package-info.java | 3 + .../messaging/simp/package-info.java | 3 + .../messaging/simp/stomp/StompDecoder.java | 4 ++ .../simp/stomp/StompFrameHandler.java | 4 +- .../simp/stomp/StompHeaderAccessor.java | 6 ++ .../messaging/simp/stomp/StompSession.java | 3 + .../messaging/simp/stomp/package-info.java | 3 + .../user/DefaultUserDestinationResolver.java | 5 +- .../messaging/simp/user/SimpUser.java | 5 +- .../messaging/simp/user/SimpUserRegistry.java | 3 + .../user/UserDestinationMessageHandler.java | 2 + .../simp/user/UserDestinationResolver.java | 2 + .../simp/user/UserDestinationResult.java | 2 + .../messaging/simp/user/package-info.java | 3 + .../support/AbstractHeaderMapper.java | 2 + .../support/AbstractMessageChannel.java | 3 + .../messaging/support/ChannelInterceptor.java | 2 + .../support/ExecutorChannelInterceptor.java | 2 + .../support/ExecutorSubscribableChannel.java | 4 +- .../IdTimestampMessageHeaderInitializer.java | 2 + .../messaging/support/MessageBuilder.java | 5 +- .../support/MessageHeaderAccessor.java | 11 ++- .../support/NativeMessageHeaderAccessor.java | 9 ++- .../messaging/support/package-info.java | 3 + .../messaging/tcp/ReconnectStrategy.java | 3 + .../messaging/tcp/package-info.java | 3 + .../messaging/tcp/reactor/package-info.java | 3 + .../orm/hibernate5/HibernateCallback.java | 3 + .../orm/hibernate5/HibernateOperations.java | 6 ++ .../orm/hibernate5/HibernateTemplate.java | 5 ++ .../HibernateTransactionManager.java | 3 + .../LocalSessionFactoryBuilder.java | 10 +-- .../orm/hibernate5/SessionFactoryUtils.java | 5 +- .../orm/hibernate5/package-info.java | 3 + .../orm/hibernate5/support/package-info.java | 3 + .../jpa/AbstractEntityManagerFactoryBean.java | 4 ++ .../orm/jpa/EntityManagerFactoryAccessor.java | 6 +- .../orm/jpa/EntityManagerFactoryInfo.java | 8 +++ .../orm/jpa/EntityManagerFactoryUtils.java | 16 +++-- .../orm/jpa/ExtendedEntityManagerCreator.java | 11 +-- .../springframework/orm/jpa/JpaDialect.java | 7 +- .../orm/jpa/JpaTransactionManager.java | 6 +- .../orm/jpa/JpaVendorAdapter.java | 6 ++ .../orm/jpa/SharedEntityManagerCreator.java | 11 +-- .../springframework/orm/jpa/package-info.java | 3 + .../ClassFileTransformerAdapter.java | 2 + .../DefaultPersistenceUnitManager.java | 5 ++ .../PersistenceUnitReader.java | 2 + .../orm/jpa/persistenceunit/package-info.java | 3 + .../OpenEntityManagerInViewFilter.java | 2 + ...ersistenceAnnotationBeanPostProcessor.java | 8 ++- .../orm/jpa/support/package-info.java | 3 + .../vendor/EclipseLinkJpaVendorAdapter.java | 4 ++ .../orm/jpa/vendor/HibernateJpaDialect.java | 2 + .../jpa/vendor/HibernateJpaVendorAdapter.java | 4 ++ .../orm/jpa/vendor/package-info.java | 3 + .../org/springframework/orm/package-info.java | 3 + .../oxm/castor/package-info.java | 3 + .../oxm/config/package-info.java | 3 + .../oxm/jaxb/package-info.java | 3 + .../oxm/jibx/package-info.java | 3 + .../oxm/mime/MimeContainer.java | 3 + .../oxm/mime/package-info.java | 3 + .../org/springframework/oxm/package-info.java | 3 + .../oxm/support/AbstractMarshaller.java | 5 +- .../oxm/support/SaxResourceUtils.java | 2 + .../oxm/support/package-info.java | 3 + .../oxm/xstream/package-info.java | 3 + .../mock/env/package-info.java | 3 + .../mock/http/client/package-info.java | 3 + .../http/client/reactive/package-info.java | 3 + .../mock/http/package-info.java | 3 + .../http/server/reactive/package-info.java | 3 + .../mock/jndi/SimpleNamingContextBuilder.java | 3 + .../mock/jndi/package-info.java | 3 + .../mock/web/HeaderValueHolder.java | 2 + .../mock/web/MockHttpServletRequest.java | 10 ++- .../mock/web/MockHttpServletResponse.java | 4 ++ .../web/MockMultipartHttpServletRequest.java | 4 +- .../mock/web/MockServletContext.java | 8 ++- .../mock/web/package-info.java | 3 + .../test/annotation/ProfileValueSource.java | 3 + .../test/annotation/ProfileValueUtils.java | 3 +- .../test/annotation/package-info.java | 3 + .../test/context/BootstrapUtils.java | 2 + .../CacheAwareContextLoaderDelegate.java | 3 +- .../ContextConfigurationAttributes.java | 4 ++ .../context/ContextCustomizerFactory.java | 3 + .../test/context/ContextLoader.java | 3 +- .../context/MergedContextConfiguration.java | 28 ++++---- .../test/context/TestContext.java | 8 ++- .../test/context/TestContextManager.java | 5 +- .../test/context/cache/ContextCache.java | 4 +- .../test/context/cache/package-info.java | 3 + .../test/context/jdbc/package-info.java | 3 + .../junit/jupiter/ParameterAutowireUtils.java | 2 + .../context/junit/jupiter/package-info.java | 3 + .../junit/jupiter/web/package-info.java | 3 + .../junit4/SpringJUnit4ClassRunner.java | 2 + .../test/context/junit4/package-info.java | 3 + .../context/junit4/rules/package-info.java | 3 + .../statements/ProfileValueChecker.java | 3 +- .../junit4/statements/package-info.java | 3 + .../test/context/package-info.java | 3 + .../support/AbstractContextLoader.java | 3 +- ...ctDirtiesContextTestExecutionListener.java | 3 +- .../AbstractTestContextBootstrapper.java | 4 +- .../support/TestPropertySourceAttributes.java | 3 + .../test/context/support/package-info.java | 3 + .../AbstractTestNGSpringContextTests.java | 2 + .../test/context/testng/package-info.java | 3 + .../TestContextTransactionUtils.java | 8 ++- .../context/transaction/package-info.java | 3 + .../test/context/util/package-info.java | 3 + .../web/WebMergedContextConfiguration.java | 19 +++--- .../test/context/web/package-info.java | 3 + .../test/context/web/socket/package-info.java | 3 + .../test/jdbc/package-info.java | 3 + .../test/util/MetaAnnotationUtils.java | 5 ++ .../test/util/ReflectionTestUtils.java | 12 ++-- .../test/util/XpathExpectationsHelper.java | 4 +- .../test/util/package-info.java | 3 + .../AbstractRequestExpectationManager.java | 2 + .../client/match/XpathRequestMatchers.java | 4 +- .../test/web/client/match/package-info.java | 3 + .../test/web/client/package-info.java | 3 + .../response/MockRestResponseCreators.java | 7 +- .../web/client/response/package-info.java | 3 + .../reactive/server/DefaultWebTestClient.java | 2 + .../web/reactive/server/package-info.java | 3 + .../test/web/servlet/MvcResult.java | 5 ++ .../htmlunit/HtmlUnitRequestBuilder.java | 3 +- .../htmlunit/MockMvcWebConnection.java | 5 +- .../MockMvcWebConnectionBuilderSupport.java | 3 +- .../web/servlet/htmlunit/package-info.java | 5 +- .../htmlunit/webdriver/package-info.java | 5 +- .../test/web/servlet/package-info.java | 3 + .../MockHttpServletRequestBuilder.java | 4 +- .../web/servlet/request/package-info.java | 3 + .../servlet/result/XpathResultMatchers.java | 4 +- .../test/web/servlet/result/package-info.java | 3 + .../test/web/servlet/setup/package-info.java | 3 + .../dao/annotation/package-info.java | 3 + .../org/springframework/dao/package-info.java | 3 + .../dao/support/DataAccessUtils.java | 15 ++-- .../PersistenceExceptionTranslator.java | 2 + .../dao/support/package-info.java | 3 + .../connection/ConnectionFactoryUtils.java | 9 +-- .../jca/cci/connection/package-info.java | 3 + .../jca/cci/core/CciOperations.java | 3 + .../jca/cci/core/CciTemplate.java | 8 ++- .../jca/cci/core/ConnectionCallback.java | 3 + .../jca/cci/core/InteractionCallback.java | 3 + .../jca/cci/core/RecordExtractor.java | 3 + .../jca/cci/core/package-info.java | 3 + .../jca/cci/core/support/package-info.java | 3 + .../jca/cci/object/package-info.java | 3 + .../springframework/jca/cci/package-info.java | 3 + .../context/SpringContextResourceAdapter.java | 2 + .../jca/context/package-info.java | 3 + .../AbstractMessageEndpointFactory.java | 3 + .../jca/endpoint/package-info.java | 3 + .../jca/support/SimpleBootstrapContext.java | 11 +-- .../jca/support/package-info.java | 3 + .../jca/work/WorkManagerTaskExecutor.java | 3 +- .../jca/work/package-info.java | 3 + .../PlatformTransactionManager.java | 4 +- .../transaction/TransactionDefinition.java | 3 + .../TransactionSystemException.java | 3 + .../AnnotationTransactionAttributeSource.java | 2 + .../TransactionAnnotationParser.java | 2 + .../transaction/annotation/package-info.java | 3 + .../transaction/config/package-info.java | 3 + .../transaction/event/package-info.java | 3 + ...actFallbackTransactionAttributeSource.java | 8 ++- .../DefaultTransactionAttribute.java | 2 + .../interceptor/TransactionAspectSupport.java | 11 ++- .../TransactionAttributeSource.java | 5 +- .../TransactionAttributeSourcePointcut.java | 2 + .../transaction/interceptor/package-info.java | 3 + .../jta/JtaTransactionManager.java | 10 +++ .../transaction/jta/TransactionFactory.java | 4 +- .../transaction/jta/package-info.java | 3 + .../transaction/package-info.java | 3 + .../AbstractPlatformTransactionManager.java | 6 +- .../support/AbstractTransactionStatus.java | 2 + ...kPreferringPlatformTransactionManager.java | 2 + .../support/DefaultTransactionStatus.java | 4 +- .../support/TransactionCallback.java | 2 + .../support/TransactionOperations.java | 2 + .../TransactionSynchronizationManager.java | 11 ++- .../transaction/support/package-info.java | 3 + .../springframework/http/CacheControl.java | 2 + .../http/ContentDisposition.java | 6 ++ .../org/springframework/http/HttpHeaders.java | 9 ++- .../org/springframework/http/HttpMethod.java | 3 + .../org/springframework/http/HttpRequest.java | 3 + .../org/springframework/http/MediaType.java | 5 +- .../http/MediaTypeFactory.java | 7 +- .../springframework/http/RequestEntity.java | 2 + .../springframework/http/ResponseCookie.java | 3 + ...ttpComponentsClientHttpRequestFactory.java | 6 +- .../InterceptingClientHttpRequestFactory.java | 3 +- .../SimpleClientHttpRequestFactory.java | 3 +- .../http/client/package-info.java | 3 + .../reactive/AbstractClientHttpRequest.java | 3 +- .../http/client/reactive/package-info.java | 3 + .../http/client/support/package-info.java | 3 + .../http/codec/HttpMessageReader.java | 3 +- .../http/codec/HttpMessageWriter.java | 5 +- .../http/codec/ServerSentEvent.java | 6 ++ .../ServerSentEventHttpMessageWriter.java | 2 + .../http/codec/json/package-info.java | 3 + .../http/codec/multipart/package-info.java | 7 ++ .../http/codec/package-info.java | 3 + .../http/codec/xml/package-info.java | 3 + .../AbstractGenericHttpMessageConverter.java | 3 +- .../AbstractHttpMessageConverter.java | 10 ++- .../converter/FormHttpMessageConverter.java | 3 + .../GenericHttpMessageConverter.java | 9 +-- .../HttpMessageConversionException.java | 3 +- .../http/converter/HttpMessageConverter.java | 7 +- .../HttpMessageNotReadableException.java | 4 +- .../HttpMessageNotWritableException.java | 4 +- .../http/converter/cbor/package-info.java | 3 + .../http/converter/feed/package-info.java | 3 + .../AbstractJackson2HttpMessageConverter.java | 3 +- .../AbstractJsonHttpMessageConverter.java | 3 +- .../http/converter/json/package-info.java | 3 + .../http/converter/package-info.java | 3 + .../http/converter/protobuf/package-info.java | 3 + .../http/converter/smile/package-info.java | 3 + .../http/converter/support/package-info.java | 3 + .../http/converter/xml/package-info.java | 3 + .../springframework/http/package-info.java | 3 + .../http/server/package-info.java | 3 + .../AbstractListenerReadPublisher.java | 2 + .../reactive/AbstractServerHttpResponse.java | 3 +- .../server/reactive/ServerHttpRequest.java | 2 + .../server/reactive/ServerHttpResponse.java | 2 + .../reactive/ServletHttpHandlerAdapter.java | 2 + .../reactive/ServletServerHttpRequest.java | 2 + .../http/server/reactive/package-info.java | 3 + .../remoting/caucho/package-info.java | 3 + .../AbstractHttpInvokerRequestExecutor.java | 3 +- ...pComponentsHttpInvokerRequestExecutor.java | 2 + .../HttpInvokerClientConfiguration.java | 3 + .../HttpInvokerClientInterceptor.java | 2 + .../remoting/httpinvoker/package-info.java | 3 + .../jaxws/JaxWsPortClientInterceptor.java | 4 ++ .../remoting/jaxws/package-info.java | 3 + ...ttpRequestMethodNotSupportedException.java | 8 ++- .../web/HttpSessionRequiredException.java | 3 + ...ractMappingContentNegotiationStrategy.java | 3 + .../web/accept/ContentNegotiationManager.java | 2 + ...MappingMediaTypeFileExtensionResolver.java | 2 + ...thExtensionContentNegotiationStrategy.java | 3 + ...thExtensionContentNegotiationStrategy.java | 1 + .../web/accept/package-info.java | 3 + .../web/bind/ServletRequestDataBinder.java | 5 +- .../web/bind/ServletRequestUtils.java | 8 +++ .../web/bind/WebDataBinder.java | 8 ++- .../web/bind/annotation/package-info.java | 3 + .../web/bind/package-info.java | 3 + .../ConfigurableWebBindingInitializer.java | 6 ++ .../support/DefaultDataBinderFactory.java | 5 +- .../bind/support/SessionAttributeStore.java | 2 + .../bind/support/WebDataBinderFactory.java | 3 +- .../bind/support/WebExchangeDataBinder.java | 5 +- .../bind/support/WebRequestDataBinder.java | 6 +- .../web/bind/support/package-info.java | 3 + .../web/client/AsyncRestOperations.java | 31 +++++---- .../web/client/AsyncRestTemplate.java | 5 +- .../client/DefaultResponseErrorHandler.java | 2 + .../web/client/HttpClientErrorException.java | 5 +- .../web/client/HttpServerErrorException.java | 5 +- .../web/client/HttpStatusCodeException.java | 5 +- .../web/client/ResponseExtractor.java | 2 + .../client/RestClientResponseException.java | 3 +- .../web/client/RestOperations.java | 55 +++++++++------ .../web/client/RestTemplate.java | 6 +- .../UnknownHttpStatusCodeException.java | 3 +- .../web/client/package-info.java | 3 + .../web/client/support/package-info.java | 3 + .../AbstractContextLoaderInitializer.java | 3 + .../ConfigurableWebApplicationContext.java | 4 ++ .../context/ConfigurableWebEnvironment.java | 3 +- .../web/context/ContextLoader.java | 4 ++ .../web/context/annotation/package-info.java | 3 + .../web/context/package-info.java | 3 + .../web/context/request/NativeWebRequest.java | 4 ++ .../context/request/RequestAttributes.java | 6 ++ .../context/request/RequestContextHolder.java | 4 +- .../request/ServletRequestAttributes.java | 2 + .../web/context/request/WebRequest.java | 8 +++ .../request/WebRequestInterceptor.java | 5 +- .../request/async/AsyncWebRequest.java | 3 +- .../context/request/async/DeferredResult.java | 4 +- .../request/async/WebAsyncManager.java | 4 ++ .../context/request/async/WebAsyncTask.java | 7 +- .../web/context/request/package-info.java | 3 + ...AnnotationConfigWebApplicationContext.java | 3 + .../context/support/RequestHandledEvent.java | 8 ++- .../support/ServletContextAwareProcessor.java | 5 +- .../support/ServletContextResource.java | 1 + .../support/ServletRequestHandledEvent.java | 12 ++-- .../support/WebApplicationContextUtils.java | 7 +- .../support/WebApplicationObjectSupport.java | 3 + .../web/context/support/package-info.java | 3 + .../web/cors/CorsConfiguration.java | 11 +++ .../web/cors/CorsConfigurationSource.java | 3 + .../web/cors/CorsProcessor.java | 5 +- .../web/cors/package-info.java | 3 + .../reactive/CorsConfigurationSource.java | 2 + .../web/cors/reactive/CorsProcessor.java | 3 +- .../UrlBasedCorsConfigurationSource.java | 1 - .../web/cors/reactive/package-info.java | 8 +++ .../web/filter/DelegatingFilterProxy.java | 5 +- .../web/filter/GenericFilterBean.java | 5 ++ .../web/filter/package-info.java | 3 + .../web/filter/reactive/package-info.java | 3 + .../web/jsf/DecoratingNavigationHandler.java | 7 +- .../web/jsf/FacesContextUtils.java | 3 + .../WebApplicationContextFacesELResolver.java | 6 ++ .../web/jsf/el/package-info.java | 3 + .../springframework/web/jsf/package-info.java | 3 + .../web/method/HandlerMethod.java | 4 ++ ...ractCookieValueMethodArgumentResolver.java | 3 +- ...tractNamedValueMethodArgumentResolver.java | 9 ++- .../AbstractWebArgumentResolverAdapter.java | 2 + .../ExceptionHandlerMethodResolver.java | 5 ++ ...ExpressionValueMethodArgumentResolver.java | 3 +- .../InitBinderDataBinderFactory.java | 3 +- .../RequestHeaderMethodArgumentResolver.java | 3 +- .../RequestParamMethodArgumentResolver.java | 4 +- .../annotation/SessionAttributesHandler.java | 4 +- .../web/method/annotation/package-info.java | 3 + .../web/method/package-info.java | 3 + .../CompositeUriComponentsContributor.java | 3 +- .../HandlerMethodArgumentResolver.java | 2 + ...dlerMethodReturnValueHandlerComposite.java | 3 + .../support/InvocableHandlerMethod.java | 2 + .../method/support/ModelAndViewContainer.java | 4 ++ .../web/method/support/package-info.java | 3 + .../web/multipart/MultipartFile.java | 3 + .../MultipartHttpServletRequest.java | 2 + .../web/multipart/MultipartRequest.java | 3 + .../web/multipart/commons/package-info.java | 3 + .../web/multipart/package-info.java | 3 + .../multipart/support/MultipartFilter.java | 3 + .../support/MultipartResolutionDelegate.java | 3 + .../StandardMultipartHttpServletRequest.java | 3 + .../web/multipart/support/package-info.java | 3 + .../org/springframework/web/package-info.java | 3 + .../web/server/ResponseStatusException.java | 6 +- .../web/server/ServerErrorException.java | 2 + .../web/server/ServerWebInputException.java | 2 + .../UnsupportedMediaTypeStatusException.java | 2 + .../web/server/adapter/package-info.java | 3 + .../web/server/handler/package-info.java | 3 + .../web/server/package-info.java | 3 + .../web/server/session/package-info.java | 3 + .../web/server/support/package-info.java | 3 + .../web/util/CookieGenerator.java | 2 + .../web/util/HierarchicalUriComponents.java | 7 +- .../util/HtmlCharacterEntityReferences.java | 3 + .../springframework/web/util/UriBuilder.java | 15 ++-- .../web/util/UriComponents.java | 11 ++- .../web/util/UriComponentsBuilder.java | 17 +++-- .../springframework/web/util/UriUtils.java | 2 + .../web/util/UrlPathHelper.java | 2 + .../springframework/web/util/WebUtils.java | 12 ++++ .../web/util/package-info.java | 3 + .../web/util/pattern/PathPattern.java | 2 + .../web/util/pattern/package-info.java | 3 + .../web/reactive/BindingContext.java | 3 +- .../web/reactive/HandlerResult.java | 6 +- .../AbstractMappingContentTypeResolver.java | 4 ++ .../accept/CompositeContentTypeResolver.java | 2 + .../PathExtensionContentTypeResolver.java | 2 + .../web/reactive/accept/package-info.java | 3 + .../config/ResourceHandlerRegistry.java | 2 + .../config/WebFluxConfigurationSupport.java | 3 + .../reactive/config/WebFluxConfigurer.java | 3 + .../config/WebFluxConfigurerComposite.java | 2 + .../web/reactive/config/package-info.java | 3 + .../UnsupportedMediaTypeException.java | 3 +- .../function/client/DefaultWebClient.java | 3 + .../function/client/package-info.java | 3 + .../web/reactive/function/package-info.java | 5 +- .../function/server/RenderingResponse.java | 3 +- .../function/server/package-info.java | 5 +- .../function/server/support/package-info.java | 5 +- .../handler/AbstractHandlerMapping.java | 2 + .../handler/AbstractUrlHandlerMapping.java | 2 + .../web/reactive/handler/package-info.java | 3 + .../web/reactive/package-info.java | 3 + .../DefaultResourceResolverChain.java | 2 + .../DefaultResourceTransformerChain.java | 2 + .../resource/PathResourceResolver.java | 2 +- .../resource/ResourceTransformer.java | 2 +- .../resource/ResourceTransformerChain.java | 2 +- .../resource/ResourceTransformerSupport.java | 2 +- .../resource/ResourceUrlProvider.java | 4 +- .../reactive/resource/ResourceWebHandler.java | 2 + .../resource/VersionPathStrategy.java | 3 + .../resource/VersionResourceResolver.java | 2 + .../reactive/resource/VersionStrategy.java | 2 + .../resource/WebJarsResourceResolver.java | 2 + .../web/reactive/resource/package-info.java | 3 + .../result/HandlerResultHandlerSupport.java | 3 + .../condition/CompositeRequestCondition.java | 3 +- .../result/condition/RequestCondition.java | 2 + .../condition/RequestConditionHolder.java | 4 +- .../method/AbstractHandlerMethodMapping.java | 7 ++ .../result/method/RequestMappingInfo.java | 3 + ...AbstractMessageReaderArgumentResolver.java | 2 + .../AbstractNamedValueArgumentResolver.java | 7 +- ...bstractNamedValueSyncArgumentResolver.java | 3 +- .../CookieValueMethodArgumentResolver.java | 3 +- ...ExpressionValueMethodArgumentResolver.java | 3 +- .../PathVariableMethodArgumentResolver.java | 3 +- ...equestAttributeMethodArgumentResolver.java | 3 +- .../RequestHeaderMethodArgumentResolver.java | 3 +- .../RequestMappingHandlerAdapter.java | 2 + .../RequestMappingHandlerMapping.java | 3 + .../RequestParamMethodArgumentResolver.java | 3 +- .../method/annotation/package-info.java | 3 + .../reactive/result/method/package-info.java | 3 + .../web/reactive/result/package-info.java | 3 + .../reactive/result/view/AbstractView.java | 3 + .../web/reactive/result/view/BindStatus.java | 9 +++ .../result/view/HttpMessageWriterView.java | 2 + .../web/reactive/result/view/Rendering.java | 3 + .../reactive/result/view/RequestContext.java | 18 +++-- .../view/RequestDataValueProcessor.java | 2 + .../result/view/UrlBasedViewResolver.java | 2 + .../web/reactive/result/view/View.java | 3 +- .../result/view/freemarker/package-info.java | 3 + .../reactive/result/view/package-info.java | 3 + .../view/script/ScriptTemplateView.java | 2 + .../result/view/script/package-info.java | 3 + .../web/reactive/socket/CloseStatus.java | 2 + .../web/reactive/socket/HandshakeInfo.java | 2 + .../reactive/socket/adapter/package-info.java | 3 + .../reactive/socket/client/package-info.java | 3 + .../web/reactive/socket/package-info.java | 3 + .../socket/server/RequestUpgradeStrategy.java | 3 +- .../reactive/socket/server/package-info.java | 3 + .../support/HandshakeWebSocketService.java | 2 + .../socket/server/support/package-info.java | 3 + .../socket/server/upgrade/package-info.java | 3 + .../web/reactive/support/package-info.java | 5 +- .../web/servlet/DispatcherServlet.java | 10 ++- .../springframework/web/servlet/FlashMap.java | 2 + .../web/servlet/FlashMapManager.java | 3 + .../web/servlet/FrameworkServlet.java | 12 +++- .../web/servlet/HandlerAdapter.java | 3 + .../web/servlet/HandlerExceptionResolver.java | 5 +- .../web/servlet/HandlerExecutionChain.java | 4 ++ .../web/servlet/HandlerInterceptor.java | 3 +- .../web/servlet/HandlerMapping.java | 3 + .../web/servlet/HttpServletBean.java | 4 ++ .../web/servlet/LocaleContextResolver.java | 4 +- .../web/servlet/LocaleResolver.java | 5 +- .../web/servlet/ModelAndView.java | 11 ++- .../servlet/RequestToViewNameTranslator.java | 3 + .../web/servlet/ResourceServlet.java | 2 + .../org/springframework/web/servlet/View.java | 5 +- .../web/servlet/ViewResolver.java | 3 + .../AnnotationDrivenBeanDefinitionParser.java | 5 ++ .../web/servlet/config/MvcNamespaceUtils.java | 2 + .../DefaultServletHandlerConfigurer.java | 3 + .../annotation/ResourceHandlerRegistry.java | 3 + .../annotation/ViewControllerRegistry.java | 2 + .../WebMvcConfigurationSupport.java | 4 ++ .../config/annotation/WebMvcConfigurer.java | 3 + .../config/annotation/package-info.java | 3 + .../web/servlet/config/package-info.java | 3 + .../AbstractDetectingUrlHandlerMapping.java | 2 + .../AbstractHandlerExceptionResolver.java | 6 +- .../handler/AbstractHandlerMapping.java | 10 ++- ...bstractHandlerMethodExceptionResolver.java | 4 +- .../handler/AbstractHandlerMethodMapping.java | 9 +++ .../handler/AbstractUrlHandlerMapping.java | 7 +- .../handler/HandlerMappingIntrospector.java | 3 + .../servlet/handler/MappedInterceptor.java | 10 +-- .../handler/MatchableHandlerMapping.java | 2 + .../SimpleMappingExceptionResolver.java | 7 +- .../web/servlet/handler/package-info.java | 3 + .../i18n/AbstractLocaleContextResolver.java | 2 + .../servlet/i18n/AbstractLocaleResolver.java | 2 + .../i18n/AcceptHeaderLocaleResolver.java | 3 + .../servlet/i18n/CookieLocaleResolver.java | 6 ++ .../servlet/i18n/SessionLocaleResolver.java | 3 + .../web/servlet/i18n/package-info.java | 3 + .../web/servlet/mvc/AbstractController.java | 2 + .../web/servlet/mvc/Controller.java | 2 + .../mvc/ParameterizableViewController.java | 4 ++ .../servlet/mvc/WebContentInterceptor.java | 3 + .../ResponseStatusExceptionResolver.java | 8 ++- .../servlet/mvc/annotation/package-info.java | 3 + .../condition/CompositeRequestCondition.java | 4 +- .../condition/ConsumesRequestCondition.java | 1 + .../mvc/condition/RequestCondition.java | 3 + .../mvc/condition/RequestConditionHolder.java | 6 +- .../servlet/mvc/condition/package-info.java | 3 + .../method/AbstractHandlerMethodAdapter.java | 2 + .../mvc/method/RequestMappingInfo.java | 7 ++ ...essageConverterMethodArgumentResolver.java | 7 +- .../ExceptionHandlerExceptionResolver.java | 9 ++- .../ExtendedServletRequestDataBinder.java | 6 +- .../annotation/HttpEntityMethodProcessor.java | 2 + .../ModelAndViewMethodReturnValueHandler.java | 2 + .../annotation/MvcUriComponentsBuilder.java | 2 + .../annotation/ReactiveTypeHandler.java | 2 + .../method/annotation/RequestBodyAdvice.java | 4 +- .../RequestMappingHandlerAdapter.java | 12 ++++ .../RequestMappingHandlerMapping.java | 4 ++ .../annotation/ResponseBodyEmitter.java | 2 + .../ResponseEntityExceptionHandler.java | 2 + .../ServletModelAttributeMethodProcessor.java | 6 +- .../ViewNameMethodReturnValueHandler.java | 2 + .../mvc/method/annotation/package-info.java | 3 + .../web/servlet/mvc/method/package-info.java | 3 + .../web/servlet/mvc/package-info.java | 3 + .../DefaultHandlerExceptionResolver.java | 8 ++- .../mvc/support/RedirectAttributes.java | 3 +- .../web/servlet/mvc/support/package-info.java | 3 + .../web/servlet/package-info.java | 3 + .../resource/AbstractResourceResolver.java | 2 + .../DefaultResourceTransformerChain.java | 2 + .../resource/PathResourceResolver.java | 4 ++ .../resource/ResourceHttpRequestHandler.java | 4 ++ .../servlet/resource/ResourceResolver.java | 4 ++ .../resource/ResourceResolverChain.java | 4 ++ .../resource/ResourceTransformerSupport.java | 2 + .../servlet/resource/ResourceUrlProvider.java | 3 + .../servlet/resource/VersionPathStrategy.java | 3 + .../resource/VersionResourceResolver.java | 2 + .../resource/WebJarsResourceResolver.java | 2 + .../web/servlet/resource/package-info.java | 3 + ...ionConfigDispatcherServletInitializer.java | 4 ++ .../AbstractDispatcherServletInitializer.java | 4 ++ .../support/AbstractFlashMapManager.java | 4 ++ .../web/servlet/support/BindStatus.java | 9 +++ .../support/JspAwareRequestContext.java | 7 +- .../web/servlet/support/JstlUtils.java | 4 +- .../web/servlet/support/RequestContext.java | 41 ++++++----- .../servlet/support/RequestContextUtils.java | 9 +++ .../support/RequestDataValueProcessor.java | 4 ++ .../support/ServletUriComponentsBuilder.java | 3 + .../web/servlet/support/package-info.java | 3 + .../web/servlet/tags/BindTag.java | 4 ++ .../web/servlet/tags/EditorAwareTag.java | 4 ++ .../web/servlet/tags/MessageTag.java | 2 + .../form/AbstractDataBoundFormElementTag.java | 6 ++ .../servlet/tags/form/AbstractFormTag.java | 4 +- .../web/servlet/tags/form/ErrorsTag.java | 1 + .../web/servlet/tags/form/TagWriter.java | 4 +- .../web/servlet/tags/package-info.java | 3 + .../web/servlet/theme/package-info.java | 3 + .../view/AbstractCachingViewResolver.java | 4 ++ .../web/servlet/view/AbstractView.java | 2 + .../view/ContentNegotiatingViewResolver.java | 3 + .../servlet/view/UrlBasedViewResolver.java | 6 +- .../servlet/view/document/package-info.java | 3 + .../web/servlet/view/feed/package-info.java | 3 + .../view/freemarker/FreeMarkerView.java | 2 + .../servlet/view/freemarker/package-info.java | 3 + .../web/servlet/view/groovy/package-info.java | 3 + .../view/json/MappingJackson2JsonView.java | 2 + .../web/servlet/view/json/package-info.java | 3 + .../web/servlet/view/package-info.java | 3 + .../view/script/ScriptTemplateView.java | 2 + .../web/servlet/view/script/package-info.java | 3 + .../web/servlet/view/tiles3/package-info.java | 3 + .../web/servlet/view/xml/MarshallingView.java | 3 + .../web/servlet/view/xml/package-info.java | 3 + .../web/servlet/view/xslt/XsltView.java | 7 +- .../web/servlet/view/xslt/package-info.java | 3 + .../web/socket/CloseStatus.java | 2 + .../web/socket/WebSocketSession.java | 3 + .../adapter/NativeWebSocketSession.java | 3 + .../adapter/jetty/JettyWebSocketSession.java | 3 +- .../socket/adapter/jetty/package-info.java | 3 + .../web/socket/adapter/package-info.java | 3 + .../ConvertingEncoderDecoderSupport.java | 3 + .../standard/StandardWebSocketSession.java | 4 +- .../socket/adapter/standard/package-info.java | 3 + .../client/jetty/JettyWebSocketClient.java | 4 +- .../web/socket/client/jetty/package-info.java | 3 + .../web/socket/client/package-info.java | 3 + .../standard/StandardWebSocketClient.java | 5 +- .../socket/client/standard/package-info.java | 3 + .../MessageBrokerBeanDefinitionParser.java | 3 + .../config/WebSocketMessageBrokerStats.java | 3 + .../config/WebSocketNamespaceUtils.java | 2 + .../AbstractWebSocketHandlerRegistration.java | 2 + .../WebMvcStompEndpointRegistry.java | 2 + .../config/annotation/package-info.java | 3 + .../web/socket/config/package-info.java | 3 + .../web/socket/handler/package-info.java | 3 + .../messaging/StompSubProtocolHandler.java | 2 + .../messaging/SubProtocolErrorHandler.java | 5 +- .../socket/messaging/SubProtocolHandler.java | 2 + .../web/socket/messaging/package-info.java | 3 + .../web/socket/package-info.java | 3 + .../socket/server/RequestUpgradeStrategy.java | 3 +- .../web/socket/server/package-info.java | 3 + .../socket/server/standard/package-info.java | 3 + .../support/AbstractHandshakeHandler.java | 3 + .../HttpSessionHandshakeInterceptor.java | 2 + .../socket/server/support/package-info.java | 3 + .../socket/sockjs/client/SockJsClient.java | 2 + .../sockjs/client/TransportRequest.java | 2 + .../socket/sockjs/client/package-info.java | 3 + .../web/socket/sockjs/frame/SockJsFrame.java | 2 + .../sockjs/frame/SockJsMessageCodec.java | 4 ++ .../web/socket/sockjs/frame/package-info.java | 3 + .../web/socket/sockjs/package-info.java | 3 + .../socket/sockjs/support/package-info.java | 3 + .../AbstractHttpSendingTransportHandler.java | 2 + .../transport/handler/package-info.java | 3 + .../socket/sockjs/transport/package-info.java | 3 + .../transport/session/package-info.java | 3 + 1315 files changed, 4831 insertions(+), 963 deletions(-) delete mode 100644 spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/target/package.html delete mode 100644 spring-aop/src/main/java/org/springframework/aop/target/dynamic/package.html create mode 100644 spring-core/src/main/java/org/springframework/lang/NonNullApi.java create mode 100644 spring-core/src/main/java/org/springframework/lang/Nullable.java create mode 100644 spring-web/src/main/java/org/springframework/http/codec/multipart/package-info.java create mode 100644 spring-web/src/main/java/org/springframework/web/cors/reactive/package-info.java diff --git a/build.gradle b/build.gradle index a997ee1705b..010391093a1 100644 --- a/build.gradle +++ b/build.gradle @@ -177,6 +177,7 @@ configure(allprojects) { project -> } dependencies { + provided("com.google.code.findbugs:jsr305:3.0.2") testCompile("junit:junit:${junitVersion}") { exclude group:'org.hamcrest', module:'hamcrest-core' } diff --git a/spring-aop/src/main/java/org/aopalliance/aop/AspectException.java b/spring-aop/src/main/java/org/aopalliance/aop/AspectException.java index c634d51a06a..3dd556656e6 100644 --- a/spring-aop/src/main/java/org/aopalliance/aop/AspectException.java +++ b/spring-aop/src/main/java/org/aopalliance/aop/AspectException.java @@ -16,6 +16,8 @@ package org.aopalliance.aop; +import org.springframework.lang.Nullable; + /** * Superclass for all AOP infrastructure exceptions. * Unchecked, as such exceptions are fatal and end user @@ -41,7 +43,7 @@ public class AspectException extends RuntimeException { * @param message the exception message * @param cause the root cause, if any */ - public AspectException(String message, Throwable cause) { + public AspectException(String message, @Nullable Throwable cause) { super(message, cause); } diff --git a/spring-aop/src/main/java/org/aopalliance/intercept/MethodInterceptor.java b/spring-aop/src/main/java/org/aopalliance/intercept/MethodInterceptor.java index 8239b0e63b7..a0b2be2a4d0 100644 --- a/spring-aop/src/main/java/org/aopalliance/intercept/MethodInterceptor.java +++ b/spring-aop/src/main/java/org/aopalliance/intercept/MethodInterceptor.java @@ -16,6 +16,8 @@ package org.aopalliance.intercept; +import org.springframework.lang.Nullable; + /** * Intercepts calls on an interface on its way to the target. These * are nested "on top" of the target. @@ -52,6 +54,7 @@ public interface MethodInterceptor extends Interceptor { * @throws Throwable if the interceptors or the target object * throws an exception */ + @Nullable Object invoke(MethodInvocation invocation) throws Throwable; } diff --git a/spring-aop/src/main/java/org/springframework/aop/AfterReturningAdvice.java b/spring-aop/src/main/java/org/springframework/aop/AfterReturningAdvice.java index 46362c2b132..271e8267118 100644 --- a/spring-aop/src/main/java/org/springframework/aop/AfterReturningAdvice.java +++ b/spring-aop/src/main/java/org/springframework/aop/AfterReturningAdvice.java @@ -18,6 +18,8 @@ package org.springframework.aop; import java.lang.reflect.Method; +import org.springframework.lang.Nullable; + /** * After returning advice is invoked only on normal method return, not if an * exception is thrown. Such advice can see the return value, but cannot change it. @@ -39,6 +41,6 @@ public interface AfterReturningAdvice extends AfterAdvice { * allowed by the method signature. Otherwise the exception * will be wrapped as a runtime exception. */ - void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable; + void afterReturning(@Nullable Object returnValue, Method method, Object[] args, @Nullable Object target) throws Throwable; } diff --git a/spring-aop/src/main/java/org/springframework/aop/IntroductionAwareMethodMatcher.java b/spring-aop/src/main/java/org/springframework/aop/IntroductionAwareMethodMatcher.java index ed228bfa20f..eceac03ea29 100644 --- a/spring-aop/src/main/java/org/springframework/aop/IntroductionAwareMethodMatcher.java +++ b/spring-aop/src/main/java/org/springframework/aop/IntroductionAwareMethodMatcher.java @@ -18,6 +18,8 @@ package org.springframework.aop; import java.lang.reflect.Method; +import org.springframework.lang.Nullable; + /** * A specialized type of {@link MethodMatcher} that takes into account introductions * when matching methods. If there are no introductions on the target class, @@ -39,6 +41,6 @@ public interface IntroductionAwareMethodMatcher extends MethodMatcher { * asking is the subject on one or more introductions; {@code false} otherwise * @return whether or not this method matches statically */ - boolean matches(Method method, Class targetClass, boolean hasIntroductions); + boolean matches(Method method, @Nullable Class targetClass, boolean hasIntroductions); } diff --git a/spring-aop/src/main/java/org/springframework/aop/MethodBeforeAdvice.java b/spring-aop/src/main/java/org/springframework/aop/MethodBeforeAdvice.java index fb8b08e220c..cb6f8da209a 100644 --- a/spring-aop/src/main/java/org/springframework/aop/MethodBeforeAdvice.java +++ b/spring-aop/src/main/java/org/springframework/aop/MethodBeforeAdvice.java @@ -18,6 +18,8 @@ package org.springframework.aop; import java.lang.reflect.Method; +import org.springframework.lang.Nullable; + /** * Advice invoked before a method is invoked. Such advices cannot * prevent the method call proceeding, unless they throw a Throwable. @@ -39,6 +41,6 @@ public interface MethodBeforeAdvice extends BeforeAdvice { * allowed by the method signature. Otherwise the exception * will be wrapped as a runtime exception. */ - void before(Method method, Object[] args, Object target) throws Throwable; + void before(Method method, Object[] args, @Nullable Object target) throws Throwable; } diff --git a/spring-aop/src/main/java/org/springframework/aop/MethodMatcher.java b/spring-aop/src/main/java/org/springframework/aop/MethodMatcher.java index 7cba7648cf4..7b863b07123 100644 --- a/spring-aop/src/main/java/org/springframework/aop/MethodMatcher.java +++ b/spring-aop/src/main/java/org/springframework/aop/MethodMatcher.java @@ -18,6 +18,8 @@ package org.springframework.aop; import java.lang.reflect.Method; +import org.springframework.lang.Nullable; + /** * Part of a {@link Pointcut}: Checks whether the target method is eligible for advice. * @@ -57,7 +59,7 @@ public interface MethodMatcher { * the candidate class must be taken to be the method's declaring class) * @return whether or not this method matches statically */ - boolean matches(Method method, Class targetClass); + boolean matches(Method method, @Nullable Class targetClass); /** * Is this MethodMatcher dynamic, that is, must a final call be made on the @@ -86,7 +88,7 @@ public interface MethodMatcher { * @return whether there's a runtime match * @see MethodMatcher#matches(Method, Class) */ - boolean matches(Method method, Class targetClass, Object... args); + boolean matches(Method method, @Nullable Class targetClass, Object... args); /** diff --git a/spring-aop/src/main/java/org/springframework/aop/ProxyMethodInvocation.java b/spring-aop/src/main/java/org/springframework/aop/ProxyMethodInvocation.java index bee81925679..4c8ebeec2f4 100644 --- a/spring-aop/src/main/java/org/springframework/aop/ProxyMethodInvocation.java +++ b/spring-aop/src/main/java/org/springframework/aop/ProxyMethodInvocation.java @@ -18,6 +18,8 @@ package org.springframework.aop; import org.aopalliance.intercept.MethodInvocation; +import org.springframework.lang.Nullable; + /** * Extension of the AOP Alliance {@link org.aopalliance.intercept.MethodInvocation} * interface, allowing access to the proxy that the method invocation was made through. @@ -73,7 +75,7 @@ public interface ProxyMethodInvocation extends MethodInvocation { * @param key the name of the attribute * @param value the value of the attribute, or {@code null} to reset it */ - void setUserAttribute(String key, Object value); + void setUserAttribute(String key, @Nullable Object value); /** * Return the value of the specified user attribute. @@ -81,6 +83,7 @@ public interface ProxyMethodInvocation extends MethodInvocation { * @return the value of the attribute, or {@code null} if not set * @see #setUserAttribute */ + @Nullable Object getUserAttribute(String key); } diff --git a/spring-aop/src/main/java/org/springframework/aop/TargetClassAware.java b/spring-aop/src/main/java/org/springframework/aop/TargetClassAware.java index 924437466bf..28853700f27 100644 --- a/spring-aop/src/main/java/org/springframework/aop/TargetClassAware.java +++ b/spring-aop/src/main/java/org/springframework/aop/TargetClassAware.java @@ -16,6 +16,8 @@ package org.springframework.aop; +import org.springframework.lang.Nullable; + /** * Minimal interface for exposing the target class behind a proxy. * @@ -34,6 +36,7 @@ public interface TargetClassAware { * (typically a proxy configuration or an actual proxy). * @return the target Class, or {@code null} if not known */ + @Nullable Class getTargetClass(); } diff --git a/spring-aop/src/main/java/org/springframework/aop/TargetSource.java b/spring-aop/src/main/java/org/springframework/aop/TargetSource.java index 8e5ccc1fa6c..b46eb197177 100644 --- a/spring-aop/src/main/java/org/springframework/aop/TargetSource.java +++ b/spring-aop/src/main/java/org/springframework/aop/TargetSource.java @@ -16,6 +16,8 @@ package org.springframework.aop; +import org.springframework.lang.Nullable; + /** * A {@code TargetSource} is used to obtain the current "target" of * an AOP invocation, which will be invoked via reflection if no around @@ -58,6 +60,7 @@ public interface TargetSource extends TargetClassAware { * @return the target object, which contains the joinpoint * @throws Exception if the target object can't be resolved */ + @Nullable Object getTarget() throws Exception; /** diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/AbstractAspectJAdvice.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/AbstractAspectJAdvice.java index 7020a051247..6240294239a 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/AbstractAspectJAdvice.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/AbstractAspectJAdvice.java @@ -42,6 +42,7 @@ import org.springframework.aop.support.MethodMatchers; import org.springframework.aop.support.StaticMethodMatcher; import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; @@ -548,7 +549,7 @@ public abstract class AbstractAspectJAdvice implements Advice, AspectJPrecedence * @param ex the exception thrown by the method execution (may be null) * @return the empty array if there are no arguments */ - protected Object[] argBinding(JoinPoint jp, JoinPointMatch jpMatch, Object returnValue, Throwable ex) { + protected Object[] argBinding(JoinPoint jp, JoinPointMatch jpMatch, @Nullable Object returnValue, @Nullable Throwable ex) { calculateArgumentBindings(); // AMC start @@ -607,7 +608,7 @@ public abstract class AbstractAspectJAdvice implements Advice, AspectJPrecedence * @return the invocation result * @throws Throwable in case of invocation failure */ - protected Object invokeAdviceMethod(JoinPointMatch jpMatch, Object returnValue, Throwable ex) throws Throwable { + protected Object invokeAdviceMethod(JoinPointMatch jpMatch, @Nullable Object returnValue, @Nullable Throwable ex) throws Throwable { return invokeAdviceMethodWithGivenArgs(argBinding(getJoinPoint(), jpMatch, returnValue, ex)); } diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAdviceParameterNameDiscoverer.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAdviceParameterNameDiscoverer.java index fbb8febba98..aba3617cd7e 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAdviceParameterNameDiscoverer.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAdviceParameterNameDiscoverer.java @@ -30,6 +30,7 @@ import org.aspectj.weaver.tools.PointcutParser; import org.aspectj.weaver.tools.PointcutPrimitive; import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -473,6 +474,7 @@ public class AspectJAdviceParameterNameDiscoverer implements ParameterNameDiscov /* * If the token starts meets Java identifier conventions, it's in. */ + @Nullable private String maybeExtractVariableName(String candidateToken) { if (candidateToken == null || candidateToken.equals("")) { return null; diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAfterReturningAdvice.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAfterReturningAdvice.java index 92f9cb4ad92..f3dbb60630f 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAfterReturningAdvice.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAfterReturningAdvice.java @@ -22,6 +22,7 @@ import java.lang.reflect.Type; import org.springframework.aop.AfterAdvice; import org.springframework.aop.AfterReturningAdvice; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.TypeUtils; @@ -75,7 +76,7 @@ public class AspectJAfterReturningAdvice extends AbstractAspectJAdvice * @param returnValue the return value of the target method * @return whether to invoke the advice method for the given return value */ - private boolean shouldInvokeOnReturnValueOf(Method method, Object returnValue) { + private boolean shouldInvokeOnReturnValueOf(Method method, @Nullable Object returnValue) { Class type = getDiscoveredReturningType(); Type genericType = getDiscoveredReturningGenericType(); // If we aren't dealing with a raw type, check if generic parameters are assignable. @@ -94,7 +95,7 @@ public class AspectJAfterReturningAdvice extends AbstractAspectJAdvice * @param returnValue the return value of the target method * @return whether to invoke the advice method for the given return value and type */ - private boolean matchesReturnValue(Class type, Method method, Object returnValue) { + private boolean matchesReturnValue(Class type, Method method, @Nullable Object returnValue) { if (returnValue != null) { return ClassUtils.isAssignableValue(type, returnValue); } diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAopUtils.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAopUtils.java index 2155c81cd54..d14b25e6297 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAopUtils.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAopUtils.java @@ -21,6 +21,7 @@ import org.aopalliance.aop.Advice; import org.springframework.aop.Advisor; import org.springframework.aop.AfterAdvice; import org.springframework.aop.BeforeAdvice; +import org.springframework.lang.Nullable; /** * Utility methods for dealing with AspectJ advisors. @@ -58,6 +59,7 @@ public abstract class AspectJAopUtils { * If neither the advisor nor the advice have precedence information, this method * will return {@code null}. */ + @Nullable public static AspectJPrecedenceInformation getAspectJPrecedenceInformationFor(Advisor anAdvisor) { if (anAdvisor instanceof AspectJPrecedenceInformation) { return (AspectJPrecedenceInformation) anAdvisor; diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJExpressionPointcut.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJExpressionPointcut.java index 5a805052d6e..2e21602fc88 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJExpressionPointcut.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJExpressionPointcut.java @@ -56,6 +56,7 @@ import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.annotation.BeanFactoryAnnotationUtils; import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -382,6 +383,7 @@ public class AspectJExpressionPointcut extends AbstractExpressionPointcut /** * Get a new pointcut expression based on a target class's loader rather than the default. */ + @Nullable private PointcutExpression getFallbackPointcutExpression(Class targetClass) { try { ClassLoader classLoader = targetClass.getClassLoader(); diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint.java index d6e43ec1fd1..941047bbfe3 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint.java @@ -29,6 +29,7 @@ import org.aspectj.runtime.internal.AroundClosure; import org.springframework.aop.ProxyMethodInvocation; import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -109,6 +110,7 @@ public class MethodInvocationProceedingJoinPoint implements ProceedingJoinPoint, * Returns the Spring AOP target. May be {@code null} if there is no target. */ @Override + @Nullable public Object getTarget() { return this.methodInvocation.getThis(); } diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactory.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactory.java index 853657891c2..2f4b7d67bd8 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactory.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactory.java @@ -41,6 +41,7 @@ import org.aspectj.lang.reflect.PerClauseKind; import org.springframework.aop.framework.AopConfigException; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -125,6 +126,7 @@ public abstract class AbstractAspectJAdvisorFactory implements AspectJAdvisorFac * (there should only be one anyway...) */ @SuppressWarnings("unchecked") + @Nullable protected static AspectJAnnotation findAspectJAnnotationOnMethod(Method method) { Class[] classesToLookFor = new Class[] { Before.class, Around.class, After.class, AfterReturning.class, AfterThrowing.class, Pointcut.class}; @@ -137,6 +139,7 @@ public abstract class AbstractAspectJAdvisorFactory implements AspectJAdvisorFac return null; } + @Nullable private static AspectJAnnotation findAnnotation(Method method, Class toLookFor) { A result = AnnotationUtils.findAnnotation(method, toLookFor); if (result != null) { diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AspectJAdvisorFactory.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AspectJAdvisorFactory.java index 7eba0606d5c..fa37957a740 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AspectJAdvisorFactory.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AspectJAdvisorFactory.java @@ -24,6 +24,7 @@ import org.aopalliance.aop.Advice; import org.springframework.aop.Advisor; import org.springframework.aop.aspectj.AspectJExpressionPointcut; import org.springframework.aop.framework.AopConfigException; +import org.springframework.lang.Nullable; /** * Interface for factories that can create Spring AOP Advisors from classes @@ -79,6 +80,7 @@ public interface AspectJAdvisorFactory { * or if it is a pointcut that will be used by other advice but will not * create a Spring advice in its own right */ + @Nullable Advisor getAdvisor(Method candidateAdviceMethod, MetadataAwareAspectInstanceFactory aspectInstanceFactory, int declarationOrder, String aspectName); @@ -98,6 +100,7 @@ public interface AspectJAdvisorFactory { * @see org.springframework.aop.aspectj.AspectJAfterReturningAdvice * @see org.springframework.aop.aspectj.AspectJAfterThrowingAdvice */ + @Nullable Advice getAdvice(Method candidateAdviceMethod, AspectJExpressionPointcut expressionPointcut, MetadataAwareAspectInstanceFactory aspectInstanceFactory, int declarationOrder, String aspectName); diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/MetadataAwareAspectInstanceFactory.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/MetadataAwareAspectInstanceFactory.java index 5f89f007c12..edf16993aab 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/MetadataAwareAspectInstanceFactory.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/MetadataAwareAspectInstanceFactory.java @@ -17,6 +17,7 @@ package org.springframework.aop.aspectj.annotation; import org.springframework.aop.aspectj.AspectInstanceFactory; +import org.springframework.lang.Nullable; /** * Subinterface of {@link org.springframework.aop.aspectj.AspectInstanceFactory} @@ -44,6 +45,7 @@ public interface MetadataAwareAspectInstanceFactory extends AspectInstanceFactor * @return the mutex object (may be {@code null} for no mutex to use) * @since 4.3 */ + @Nullable Object getAspectCreationMutex(); } diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/ReflectiveAspectJAdvisorFactory.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/ReflectiveAspectJAdvisorFactory.java index 010b8eec8ba..c386a411c68 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/ReflectiveAspectJAdvisorFactory.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/ReflectiveAspectJAdvisorFactory.java @@ -50,6 +50,7 @@ import org.springframework.beans.factory.BeanFactory; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.ConvertingComparator; +import org.springframework.lang.Nullable; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; import org.springframework.util.comparator.InstanceComparator; @@ -113,7 +114,7 @@ public class ReflectiveAspectJAdvisorFactory extends AbstractAspectJAdvisorFacto * @see AspectJExpressionPointcut#setBeanFactory * @see org.springframework.beans.factory.config.ConfigurableBeanFactory#getBeanClassLoader() */ - public ReflectiveAspectJAdvisorFactory(BeanFactory beanFactory) { + public ReflectiveAspectJAdvisorFactory(@Nullable BeanFactory beanFactory) { this.beanFactory = beanFactory; } @@ -176,6 +177,7 @@ public class ReflectiveAspectJAdvisorFactory extends AbstractAspectJAdvisorFacto * @param introductionField the field to introspect * @return {@code null} if not an Advisor */ + @Nullable private Advisor getDeclareParentsAdvisor(Field introductionField) { DeclareParents declareParents = introductionField.getAnnotation(DeclareParents.class); if (declareParents == null) { @@ -208,6 +210,7 @@ public class ReflectiveAspectJAdvisorFactory extends AbstractAspectJAdvisorFacto this, aspectInstanceFactory, declarationOrderInAspect, aspectName); } + @Nullable private AspectJExpressionPointcut getPointcut(Method candidateAdviceMethod, Class candidateAspectClass) { AspectJAnnotation aspectJAnnotation = AbstractAspectJAdvisorFactory.findAspectJAnnotationOnMethod(candidateAdviceMethod); diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/package-info.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/package-info.java index 3c5ed99325f..3a745025f0d 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/package-info.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/package-info.java @@ -3,4 +3,7 @@ * *

Normally to be used through an AspectJAutoProxyCreator rather than directly. */ +@NonNullApi package org.springframework.aop.aspectj.annotation; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/autoproxy/package-info.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/autoproxy/package-info.java index 4ac96700ca4..b9bb0d36f98 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/autoproxy/package-info.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/autoproxy/package-info.java @@ -2,4 +2,7 @@ * Base classes enabling auto-proxying based on AspectJ. * Support for AspectJ annotation aspects resides in the "aspectj.annotation" package. */ +@NonNullApi package org.springframework.aop.aspectj.autoproxy; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/package-info.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/package-info.java index d6415a15a39..3dcadb4e882 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/package-info.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/package-info.java @@ -8,4 +8,7 @@ * or AspectJ load-time weaver. It is intended to enable the use of a valuable subset of AspectJ * functionality, with consistent semantics, with the proxy-based Spring AOP framework. */ +@NonNullApi package org.springframework.aop.aspectj; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-aop/src/main/java/org/springframework/aop/config/AopConfigUtils.java b/spring-aop/src/main/java/org/springframework/aop/config/AopConfigUtils.java index 2088ada2b48..40ce417d839 100644 --- a/spring-aop/src/main/java/org/springframework/aop/config/AopConfigUtils.java +++ b/spring-aop/src/main/java/org/springframework/aop/config/AopConfigUtils.java @@ -26,6 +26,7 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.core.Ordered; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -104,7 +105,7 @@ public abstract class AopConfigUtils { } } - + @Nullable private static BeanDefinition registerOrEscalateApcAsRequired(Class cls, BeanDefinitionRegistry registry, Object source) { Assert.notNull(registry, "BeanDefinitionRegistry must not be null"); if (registry.containsBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME)) { diff --git a/spring-aop/src/main/java/org/springframework/aop/config/ConfigBeanDefinitionParser.java b/spring-aop/src/main/java/org/springframework/aop/config/ConfigBeanDefinitionParser.java index b929d9f4a9c..08c8a2591e2 100644 --- a/spring-aop/src/main/java/org/springframework/aop/config/ConfigBeanDefinitionParser.java +++ b/spring-aop/src/main/java/org/springframework/aop/config/ConfigBeanDefinitionParser.java @@ -45,6 +45,7 @@ import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; @@ -466,6 +467,7 @@ class ConfigBeanDefinitionParser implements BeanDefinitionParser { * {@link org.springframework.beans.factory.config.BeanDefinition} for the pointcut if necessary * and returns its bean name, otherwise returns the bean name of the referred pointcut. */ + @Nullable private Object parsePointcutProperty(Element element, ParserContext parserContext) { if (element.hasAttribute(POINTCUT) && element.hasAttribute(POINTCUT_REF)) { parserContext.getReaderContext().error( diff --git a/spring-aop/src/main/java/org/springframework/aop/config/package-info.java b/spring-aop/src/main/java/org/springframework/aop/config/package-info.java index bb218b7e498..b5733f7f212 100644 --- a/spring-aop/src/main/java/org/springframework/aop/config/package-info.java +++ b/spring-aop/src/main/java/org/springframework/aop/config/package-info.java @@ -2,4 +2,7 @@ * Support package for declarative AOP configuration, * with XML schema being the primary configuration format. */ +@NonNullApi package org.springframework.aop.config; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/AdvisorChainFactory.java b/spring-aop/src/main/java/org/springframework/aop/framework/AdvisorChainFactory.java index a8774fa7bed..87c0a810eeb 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/AdvisorChainFactory.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/AdvisorChainFactory.java @@ -19,6 +19,8 @@ package org.springframework.aop.framework; import java.lang.reflect.Method; import java.util.List; +import org.springframework.lang.Nullable; + /** * Factory interface for advisor chains. * @@ -36,6 +38,6 @@ public interface AdvisorChainFactory { * target object, in which case the method's declaring class is the next best option) * @return List of MethodInterceptors (may also include InterceptorAndDynamicMethodMatchers) */ - List getInterceptorsAndDynamicInterceptionAdvice(Advised config, Method method, Class targetClass); + List getInterceptorsAndDynamicInterceptionAdvice(Advised config, Method method, @Nullable Class targetClass); } diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/AopContext.java b/spring-aop/src/main/java/org/springframework/aop/framework/AopContext.java index 06884dbd2f7..d37f7a958d1 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/AopContext.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/AopContext.java @@ -17,6 +17,7 @@ package org.springframework.aop.framework; import org.springframework.core.NamedThreadLocal; +import org.springframework.lang.Nullable; /** * Class containing static methods used to obtain information about the current AOP invocation. @@ -74,7 +75,8 @@ public abstract class AopContext { * @return the old proxy, which may be {@code null} if none was bound * @see #currentProxy() */ - static Object setCurrentProxy(Object proxy) { + @Nullable + static Object setCurrentProxy(@Nullable Object proxy) { Object old = currentProxy.get(); if (proxy != null) { currentProxy.set(proxy); diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/AopProxy.java b/spring-aop/src/main/java/org/springframework/aop/framework/AopProxy.java index 80c66905643..c25b4e61c73 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/AopProxy.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/AopProxy.java @@ -16,6 +16,8 @@ package org.springframework.aop.framework; +import org.springframework.lang.Nullable; + /** * Delegate interface for a configured AOP proxy, allowing for the creation * of actual proxy objects. @@ -48,6 +50,6 @@ public interface AopProxy { * (or {@code null} for the low-level proxy facility's default) * @return the new proxy object (never {@code null}) */ - Object getProxy(ClassLoader classLoader); + Object getProxy(@Nullable ClassLoader classLoader); } diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/AopProxyUtils.java b/spring-aop/src/main/java/org/springframework/aop/framework/AopProxyUtils.java index 7c611bad313..05c39b01d8b 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/AopProxyUtils.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/AopProxyUtils.java @@ -27,6 +27,7 @@ import org.springframework.aop.TargetSource; import org.springframework.aop.support.AopUtils; import org.springframework.aop.target.SingletonTargetSource; import org.springframework.core.DecoratingProxy; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -52,6 +53,7 @@ public abstract class AopProxyUtils { * @see Advised#getTargetSource() * @see SingletonTargetSource#getTarget() */ + @Nullable public static Object getSingletonTarget(Object candidate) { if (candidate instanceof Advised) { TargetSource targetSource = ((Advised) candidate).getTargetSource(); diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java b/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java index 14cfcfb9064..a21c64494ba 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java @@ -50,6 +50,7 @@ import org.springframework.cglib.proxy.MethodProxy; import org.springframework.cglib.proxy.NoOp; import org.springframework.cglib.transform.impl.UndeclaredThrowableStrategy; import org.springframework.core.SmartClassLoader; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; @@ -372,7 +373,8 @@ class CglibAopProxy implements AopProxy, Serializable { * Process a return value. Wraps a return of {@code this} if necessary to be the * {@code proxy} and also verifies that {@code null} is not returned as a primitive. */ - private static Object processReturnType(Object proxy, Object target, Method method, Object retVal) { + @Nullable + private static Object processReturnType(Object proxy, Object target, Method method, @Nullable Object retVal) { // Massage return value if necessary if (retVal != null && retVal == target && !RawTargetAccess.class.isAssignableFrom(method.getDeclaringClass())) { diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/ProxyFactory.java b/spring-aop/src/main/java/org/springframework/aop/framework/ProxyFactory.java index 854f9122f65..4da126ec44e 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/ProxyFactory.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/ProxyFactory.java @@ -19,6 +19,7 @@ package org.springframework.aop.framework; import org.aopalliance.intercept.Interceptor; import org.springframework.aop.TargetSource; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -105,7 +106,7 @@ public class ProxyFactory extends ProxyCreatorSupport { * (or {@code null} for the low-level proxy facility's default) * @return the proxy object */ - public Object getProxy(ClassLoader classLoader) { + public Object getProxy(@Nullable ClassLoader classLoader) { return createAopProxy().getProxy(classLoader); } diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/adapter/package-info.java b/spring-aop/src/main/java/org/springframework/aop/framework/adapter/package-info.java index 8074a56ae3c..a00663c252e 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/adapter/package-info.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/adapter/package-info.java @@ -9,4 +9,7 @@ * *

These adapters do not depend on any other Spring framework classes to allow such usage. */ +@NonNullApi package org.springframework.aop.framework.adapter; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AbstractAutoProxyCreator.java b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AbstractAutoProxyCreator.java index 18abf346eef..04400dd33b5 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AbstractAutoProxyCreator.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AbstractAutoProxyCreator.java @@ -47,6 +47,7 @@ import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -207,6 +208,7 @@ public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport * Return the owning {@link BeanFactory}. * May be {@code null}, as this post-processor doesn't need to belong to a bean factory. */ + @Nullable protected BeanFactory getBeanFactory() { return this.beanFactory; } @@ -400,6 +402,7 @@ public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport * @return a TargetSource for this bean * @see #setCustomTargetSourceCreators */ + @Nullable protected TargetSource getCustomTargetSource(Class beanClass, String beanName) { // We can't create fancy target sources for directly registered singletons. if (this.customTargetSourceCreators != null && @@ -578,7 +581,8 @@ public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport * @see #DO_NOT_PROXY * @see #PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS */ + @Nullable protected abstract Object[] getAdvicesAndAdvisorsForBean( - Class beanClass, String beanName, TargetSource customTargetSource) throws BeansException; + Class beanClass, String beanName, @Nullable TargetSource customTargetSource) throws BeansException; } diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AutoProxyUtils.java b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AutoProxyUtils.java index af39672c6c4..21e135a3f64 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AutoProxyUtils.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AutoProxyUtils.java @@ -19,6 +19,7 @@ package org.springframework.aop.framework.autoproxy; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.core.Conventions; +import org.springframework.lang.Nullable; /** * Utilities for auto-proxy aware components. @@ -79,6 +80,7 @@ public abstract class AutoProxyUtils { * @since 4.2.3 * @see org.springframework.beans.factory.BeanFactory#getType(String) */ + @Nullable public static Class determineTargetClass(ConfigurableListableBeanFactory beanFactory, String beanName) { if (beanName == null) { return null; diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/ProxyCreationContext.java b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/ProxyCreationContext.java index 0ba7a1ac45f..cc7f6c3275b 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/ProxyCreationContext.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/ProxyCreationContext.java @@ -17,6 +17,7 @@ package org.springframework.aop.framework.autoproxy; import org.springframework.core.NamedThreadLocal; +import org.springframework.lang.Nullable; /** * Holder for the current proxy creation context, as exposed by auto-proxy creators @@ -37,6 +38,7 @@ public class ProxyCreationContext { * Return the name of the currently proxied bean instance. * @return the name of the bean, or {@code null} if none available */ + @Nullable public static String getCurrentProxiedBeanName() { return currentProxiedBeanName.get(); } @@ -45,7 +47,7 @@ public class ProxyCreationContext { * Set the name of the currently proxied bean instance. * @param beanName the name of the bean, or {@code null} to reset it */ - static void setCurrentProxiedBeanName(String beanName) { + static void setCurrentProxiedBeanName(@Nullable String beanName) { if (beanName != null) { currentProxiedBeanName.set(beanName); } diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/TargetSourceCreator.java b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/TargetSourceCreator.java index a962c3518b9..d06933f5507 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/TargetSourceCreator.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/TargetSourceCreator.java @@ -17,6 +17,7 @@ package org.springframework.aop.framework.autoproxy; import org.springframework.aop.TargetSource; +import org.springframework.lang.Nullable; /** * Implementations can create special target sources, such as pooling target @@ -39,6 +40,7 @@ public interface TargetSourceCreator { * @return a special TargetSource or {@code null} if this TargetSourceCreator isn't * interested in the particular bean */ + @Nullable TargetSource getTargetSource(Class beanClass, String beanName); } diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/package-info.java b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/package-info.java index 376fc165ca3..986c60f19da 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/package-info.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/package-info.java @@ -9,4 +9,7 @@ * as post-processors beans are only automatically detected in application contexts. * Post-processors can be explicitly registered on a ConfigurableBeanFactory instead. */ +@NonNullApi package org.springframework.aop.framework.autoproxy; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/target/AbstractBeanFactoryBasedTargetSourceCreator.java b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/target/AbstractBeanFactoryBasedTargetSourceCreator.java index 48fd1c738cc..09c2bff44d8 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/target/AbstractBeanFactoryBasedTargetSourceCreator.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/target/AbstractBeanFactoryBasedTargetSourceCreator.java @@ -35,6 +35,7 @@ import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.GenericBeanDefinition; +import org.springframework.lang.Nullable; /** * Convenient superclass for @@ -196,6 +197,7 @@ public abstract class AbstractBeanFactoryBasedTargetSourceCreator * @param beanName the name of the bean * @return the AbstractPrototypeBasedTargetSource, or {@code null} if we don't match this */ + @Nullable protected abstract AbstractBeanFactoryBasedTargetSource createBeanFactoryBasedTargetSource( Class beanClass, String beanName); diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/target/package.html b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/target/package.html deleted file mode 100644 index 264fe4aa56c..00000000000 --- a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/target/package.html +++ /dev/null @@ -1,7 +0,0 @@ - - - -Generic support classes for target source creation. - - - diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/package-info.java b/spring-aop/src/main/java/org/springframework/aop/framework/package-info.java index 31f8391c437..722fe85c55a 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/package-info.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/package-info.java @@ -12,4 +12,7 @@ * or ApplicationContext. However, proxies can be created programmatically using the * ProxyFactory class. */ +@NonNullApi package org.springframework.aop.framework; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java b/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java index f120147fe91..7ad3b28b1b2 100644 --- a/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java +++ b/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java @@ -38,6 +38,7 @@ import org.springframework.core.task.AsyncListenableTaskExecutor; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.core.task.TaskExecutor; import org.springframework.core.task.support.TaskExecutorAdapter; +import org.springframework.lang.Nullable; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; import org.springframework.util.concurrent.ListenableFuture; @@ -143,6 +144,7 @@ public abstract class AsyncExecutionAspectSupport implements BeanFactoryAware { * Should preferably return an {@link AsyncListenableTaskExecutor} implementation. * @return the executor to use (or {@code null}, but just if no default executor is available) */ + @Nullable protected AsyncTaskExecutor determineAsyncExecutor(Method method) { AsyncTaskExecutor executor = this.executors.get(method); if (executor == null) { @@ -183,6 +185,7 @@ public abstract class AsyncExecutionAspectSupport implements BeanFactoryAware { * @see #determineAsyncExecutor(Method) * @see #findQualifiedExecutor(BeanFactory, String) */ + @Nullable protected abstract String getExecutorQualifier(Method method); /** @@ -192,6 +195,7 @@ public abstract class AsyncExecutionAspectSupport implements BeanFactoryAware { * @since 4.2.6 * @see #getExecutorQualifier(Method) */ + @Nullable protected Executor findQualifiedExecutor(BeanFactory beanFactory, String qualifier) { if (beanFactory == null) { throw new IllegalStateException("BeanFactory must be set on " + getClass().getSimpleName() + @@ -212,6 +216,7 @@ public abstract class AsyncExecutionAspectSupport implements BeanFactoryAware { * @see #findQualifiedExecutor(BeanFactory, String) * @see #DEFAULT_TASK_EXECUTOR_BEAN_NAME */ + @Nullable protected Executor getDefaultExecutor(BeanFactory beanFactory) { if (beanFactory != null) { try { @@ -256,6 +261,7 @@ public abstract class AsyncExecutionAspectSupport implements BeanFactoryAware { * @param returnType the declared return type (potentially a {@link Future} variant) * @return the execution result (potentially a corresponding {@link Future} handle) */ + @Nullable protected Object doSubmit(Callable task, AsyncTaskExecutor executor, Class returnType) { if (CompletableFuture.class.isAssignableFrom(returnType)) { return CompletableFuture.supplyAsync(new Supplier() { diff --git a/spring-aop/src/main/java/org/springframework/aop/interceptor/CustomizableTraceInterceptor.java b/spring-aop/src/main/java/org/springframework/aop/interceptor/CustomizableTraceInterceptor.java index 4fbf04a0c2f..c3e40f35409 100644 --- a/spring-aop/src/main/java/org/springframework/aop/interceptor/CustomizableTraceInterceptor.java +++ b/spring-aop/src/main/java/org/springframework/aop/interceptor/CustomizableTraceInterceptor.java @@ -24,6 +24,7 @@ import org.aopalliance.intercept.MethodInvocation; import org.apache.commons.logging.Log; import org.springframework.core.Constants; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.StopWatch; @@ -317,7 +318,7 @@ public class CustomizableTraceInterceptor extends AbstractTraceInterceptor { * @return the formatted output to write to the log */ protected String replacePlaceholders(String message, MethodInvocation methodInvocation, - Object returnValue, Throwable throwable, long invocationTime) { + @Nullable Object returnValue, @Nullable Throwable throwable, long invocationTime) { Matcher matcher = PATTERN.matcher(message); @@ -371,7 +372,7 @@ public class CustomizableTraceInterceptor extends AbstractTraceInterceptor { * @param returnValue the value returned by the method invocation. */ private void appendReturnValue( - MethodInvocation methodInvocation, Matcher matcher, StringBuffer output, Object returnValue) { + MethodInvocation methodInvocation, Matcher matcher, StringBuffer output, @Nullable Object returnValue) { if (methodInvocation.getMethod().getReturnType() == void.class) { matcher.appendReplacement(output, "void"); diff --git a/spring-aop/src/main/java/org/springframework/aop/interceptor/package-info.java b/spring-aop/src/main/java/org/springframework/aop/interceptor/package-info.java index dc57a3e9655..7ec37824e58 100644 --- a/spring-aop/src/main/java/org/springframework/aop/interceptor/package-info.java +++ b/spring-aop/src/main/java/org/springframework/aop/interceptor/package-info.java @@ -3,4 +3,7 @@ * More specific interceptors can be found in corresponding * functionality packages, like "transaction" and "orm". */ +@NonNullApi package org.springframework.aop.interceptor; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-aop/src/main/java/org/springframework/aop/package-info.java b/spring-aop/src/main/java/org/springframework/aop/package-info.java index aaa6126598b..7cdcbf66fcb 100644 --- a/spring-aop/src/main/java/org/springframework/aop/package-info.java +++ b/spring-aop/src/main/java/org/springframework/aop/package-info.java @@ -17,4 +17,7 @@ *

Spring AOP can be used programmatically or (preferably) * integrated with the Spring IoC container. */ +@NonNullApi package org.springframework.aop; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-aop/src/main/java/org/springframework/aop/scope/package-info.java b/spring-aop/src/main/java/org/springframework/aop/scope/package-info.java index 5f4404db450..d48a870cf10 100644 --- a/spring-aop/src/main/java/org/springframework/aop/scope/package-info.java +++ b/spring-aop/src/main/java/org/springframework/aop/scope/package-info.java @@ -1,4 +1,7 @@ /** * Support for AOP-based scoping of target objects, with configurable backend. */ +@NonNullApi package org.springframework.aop.scope; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-aop/src/main/java/org/springframework/aop/support/AbstractBeanFactoryPointcutAdvisor.java b/spring-aop/src/main/java/org/springframework/aop/support/AbstractBeanFactoryPointcutAdvisor.java index 5401bb96a79..35f4e7362f4 100644 --- a/spring-aop/src/main/java/org/springframework/aop/support/AbstractBeanFactoryPointcutAdvisor.java +++ b/spring-aop/src/main/java/org/springframework/aop/support/AbstractBeanFactoryPointcutAdvisor.java @@ -24,6 +24,7 @@ import org.aopalliance.aop.Advice; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -66,6 +67,7 @@ public abstract class AbstractBeanFactoryPointcutAdvisor extends AbstractPointcu /** * Return the name of the advice bean that this advisor refers to, if any. */ + @Nullable public String getAdviceBeanName() { return this.adviceBeanName; } diff --git a/spring-aop/src/main/java/org/springframework/aop/support/AbstractExpressionPointcut.java b/spring-aop/src/main/java/org/springframework/aop/support/AbstractExpressionPointcut.java index 535b70a1e6c..44c76043516 100644 --- a/spring-aop/src/main/java/org/springframework/aop/support/AbstractExpressionPointcut.java +++ b/spring-aop/src/main/java/org/springframework/aop/support/AbstractExpressionPointcut.java @@ -18,6 +18,8 @@ package org.springframework.aop.support; import java.io.Serializable; +import org.springframework.lang.Nullable; + /** * Abstract superclass for expression pointcuts, * offering location and expression properties. @@ -49,6 +51,7 @@ public abstract class AbstractExpressionPointcut implements ExpressionPointcut, * @return location information as a human-readable String, * or {@code null} if none is available */ + @Nullable public String getLocation() { return this.location; } diff --git a/spring-aop/src/main/java/org/springframework/aop/support/AopUtils.java b/spring-aop/src/main/java/org/springframework/aop/support/AopUtils.java index 518901f3fae..69178a4ac0f 100644 --- a/spring-aop/src/main/java/org/springframework/aop/support/AopUtils.java +++ b/spring-aop/src/main/java/org/springframework/aop/support/AopUtils.java @@ -36,6 +36,7 @@ import org.springframework.aop.SpringProxy; import org.springframework.aop.TargetClassAware; import org.springframework.core.BridgeMethodResolver; import org.springframework.core.MethodIntrospector; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; @@ -187,7 +188,7 @@ public abstract class AopUtils { * {@code targetClass} doesn't implement it or is {@code null} * @see org.springframework.util.ClassUtils#getMostSpecificMethod */ - public static Method getMostSpecificMethod(Method method, Class targetClass) { + public static Method getMostSpecificMethod(Method method, @Nullable Class targetClass) { Method resolvedMethod = ClassUtils.getMostSpecificMethod(method, targetClass); // If we are dealing with method with generic parameters, find the original method. return BridgeMethodResolver.findBridgedMethod(resolvedMethod); @@ -324,6 +325,7 @@ public abstract class AopUtils { * @throws Throwable if thrown by the target method * @throws org.springframework.aop.AopInvocationException in case of a reflection error */ + @Nullable public static Object invokeJoinpointUsingReflection(Object target, Method method, Object[] args) throws Throwable { diff --git a/spring-aop/src/main/java/org/springframework/aop/support/ControlFlowPointcut.java b/spring-aop/src/main/java/org/springframework/aop/support/ControlFlowPointcut.java index 47d201cfcd0..1c339c0b66f 100644 --- a/spring-aop/src/main/java/org/springframework/aop/support/ControlFlowPointcut.java +++ b/spring-aop/src/main/java/org/springframework/aop/support/ControlFlowPointcut.java @@ -22,6 +22,7 @@ import java.lang.reflect.Method; import org.springframework.aop.ClassFilter; import org.springframework.aop.MethodMatcher; import org.springframework.aop.Pointcut; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -59,7 +60,7 @@ public class ControlFlowPointcut implements Pointcut, ClassFilter, MethodMatcher * @param clazz the clazz * @param methodName the name of the method (may be {@code null}) */ - public ControlFlowPointcut(Class clazz, String methodName) { + public ControlFlowPointcut(Class clazz, @Nullable String methodName) { Assert.notNull(clazz, "Class must not be null"); this.clazz = clazz; this.methodName = methodName; diff --git a/spring-aop/src/main/java/org/springframework/aop/support/DefaultIntroductionAdvisor.java b/spring-aop/src/main/java/org/springframework/aop/support/DefaultIntroductionAdvisor.java index bb192d4b5da..980bac49c1c 100644 --- a/spring-aop/src/main/java/org/springframework/aop/support/DefaultIntroductionAdvisor.java +++ b/spring-aop/src/main/java/org/springframework/aop/support/DefaultIntroductionAdvisor.java @@ -27,6 +27,7 @@ import org.springframework.aop.DynamicIntroductionAdvice; import org.springframework.aop.IntroductionAdvisor; import org.springframework.aop.IntroductionInfo; import org.springframework.core.Ordered; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -64,7 +65,7 @@ public class DefaultIntroductionAdvisor implements IntroductionAdvisor, ClassFil * @param introductionInfo the IntroductionInfo that describes * the interface to introduce (may be {@code null}) */ - public DefaultIntroductionAdvisor(Advice advice, IntroductionInfo introductionInfo) { + public DefaultIntroductionAdvisor(Advice advice, @Nullable IntroductionInfo introductionInfo) { Assert.notNull(advice, "Advice must not be null"); this.advice = advice; if (introductionInfo != null) { diff --git a/spring-aop/src/main/java/org/springframework/aop/support/MethodMatchers.java b/spring-aop/src/main/java/org/springframework/aop/support/MethodMatchers.java index 9a64d074315..9fac123ee8c 100644 --- a/spring-aop/src/main/java/org/springframework/aop/support/MethodMatchers.java +++ b/spring-aop/src/main/java/org/springframework/aop/support/MethodMatchers.java @@ -22,6 +22,7 @@ import java.lang.reflect.Method; import org.springframework.aop.ClassFilter; import org.springframework.aop.IntroductionAwareMethodMatcher; import org.springframework.aop.MethodMatcher; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -87,7 +88,7 @@ public abstract class MethodMatchers { * asking is the subject on one or more introductions; {@code false} otherwise * @return whether or not this method matches statically */ - public static boolean matches(MethodMatcher mm, Method method, Class targetClass, boolean hasIntroductions) { + public static boolean matches(MethodMatcher mm, Method method, @Nullable Class targetClass, boolean hasIntroductions) { Assert.notNull(mm, "MethodMatcher must not be null"); return ((mm instanceof IntroductionAwareMethodMatcher && ((IntroductionAwareMethodMatcher) mm).matches(method, targetClass, hasIntroductions)) || diff --git a/spring-aop/src/main/java/org/springframework/aop/support/RegexpMethodPointcutAdvisor.java b/spring-aop/src/main/java/org/springframework/aop/support/RegexpMethodPointcutAdvisor.java index 2d88b45c75e..0fab429471f 100644 --- a/spring-aop/src/main/java/org/springframework/aop/support/RegexpMethodPointcutAdvisor.java +++ b/spring-aop/src/main/java/org/springframework/aop/support/RegexpMethodPointcutAdvisor.java @@ -21,6 +21,7 @@ import java.io.Serializable; import org.aopalliance.aop.Advice; import org.springframework.aop.Pointcut; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -132,6 +133,7 @@ public class RegexpMethodPointcutAdvisor extends AbstractGenericPointcutAdvisor * will be used. * @return the Pointcut instance (never {@code null}) */ + @Nullable protected AbstractRegexpMethodPointcut createPointcut() { return new JdkRegexpMethodPointcut(); } diff --git a/spring-aop/src/main/java/org/springframework/aop/support/annotation/AnnotationMatchingPointcut.java b/spring-aop/src/main/java/org/springframework/aop/support/annotation/AnnotationMatchingPointcut.java index 68a77c8503f..156e30e34f9 100644 --- a/spring-aop/src/main/java/org/springframework/aop/support/annotation/AnnotationMatchingPointcut.java +++ b/spring-aop/src/main/java/org/springframework/aop/support/annotation/AnnotationMatchingPointcut.java @@ -21,6 +21,7 @@ import java.lang.annotation.Annotation; import org.springframework.aop.ClassFilter; import org.springframework.aop.MethodMatcher; import org.springframework.aop.Pointcut; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -69,7 +70,7 @@ public class AnnotationMatchingPointcut implements Pointcut { * (can be {@code null}) */ public AnnotationMatchingPointcut( - Class classAnnotationType, Class methodAnnotationType) { + @Nullable Class classAnnotationType, @Nullable Class methodAnnotationType) { this(classAnnotationType, methodAnnotationType, false); } diff --git a/spring-aop/src/main/java/org/springframework/aop/support/annotation/package-info.java b/spring-aop/src/main/java/org/springframework/aop/support/annotation/package-info.java index a91142c9723..0d65448e9ce 100644 --- a/spring-aop/src/main/java/org/springframework/aop/support/annotation/package-info.java +++ b/spring-aop/src/main/java/org/springframework/aop/support/annotation/package-info.java @@ -1,4 +1,7 @@ /** * Annotation support for AOP pointcuts. */ +@NonNullApi package org.springframework.aop.support.annotation; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-aop/src/main/java/org/springframework/aop/support/package-info.java b/spring-aop/src/main/java/org/springframework/aop/support/package-info.java index 88a441ed854..6e422763071 100644 --- a/spring-aop/src/main/java/org/springframework/aop/support/package-info.java +++ b/spring-aop/src/main/java/org/springframework/aop/support/package-info.java @@ -1,4 +1,7 @@ /** * Convenience classes for using Spring's AOP API. */ +@NonNullApi package org.springframework.aop.support; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-aop/src/main/java/org/springframework/aop/target/EmptyTargetSource.java b/spring-aop/src/main/java/org/springframework/aop/target/EmptyTargetSource.java index 0e9ef50057c..9f4936cb129 100644 --- a/spring-aop/src/main/java/org/springframework/aop/target/EmptyTargetSource.java +++ b/spring-aop/src/main/java/org/springframework/aop/target/EmptyTargetSource.java @@ -19,6 +19,7 @@ package org.springframework.aop.target; import java.io.Serializable; import org.springframework.aop.TargetSource; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -50,7 +51,7 @@ public class EmptyTargetSource implements TargetSource, Serializable { * @param targetClass the target Class (may be {@code null}) * @see #getTargetClass() */ - public static EmptyTargetSource forClass(Class targetClass) { + public static EmptyTargetSource forClass(@Nullable Class targetClass) { return forClass(targetClass, true); } @@ -60,7 +61,7 @@ public class EmptyTargetSource implements TargetSource, Serializable { * @param isStatic whether the TargetSource should be marked as static * @see #getTargetClass() */ - public static EmptyTargetSource forClass(Class targetClass, boolean isStatic) { + public static EmptyTargetSource forClass(@Nullable Class targetClass, boolean isStatic) { return (targetClass == null && isStatic ? INSTANCE : new EmptyTargetSource(targetClass, isStatic)); } @@ -81,7 +82,7 @@ public class EmptyTargetSource implements TargetSource, Serializable { * @param targetClass the target class to expose (may be {@code null}) * @param isStatic whether the TargetSource is marked as static */ - private EmptyTargetSource(Class targetClass, boolean isStatic) { + private EmptyTargetSource(@Nullable Class targetClass, boolean isStatic) { this.targetClass = targetClass; this.isStatic = isStatic; } diff --git a/spring-aop/src/main/java/org/springframework/aop/target/dynamic/package.html b/spring-aop/src/main/java/org/springframework/aop/target/dynamic/package.html deleted file mode 100644 index bbbc9a55dfe..00000000000 --- a/spring-aop/src/main/java/org/springframework/aop/target/dynamic/package.html +++ /dev/null @@ -1,7 +0,0 @@ - - - -Support for AOP-based refreshing of target objects. - - - diff --git a/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java b/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java index ee869724a5a..3275e59f9f9 100644 --- a/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java @@ -40,6 +40,7 @@ import org.springframework.core.ResolvableType; import org.springframework.core.convert.ConversionException; import org.springframework.core.convert.ConverterNotFoundException; import org.springframework.core.convert.TypeDescriptor; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -715,6 +716,7 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA * or {@code null} if not found * @throws BeansException in case of introspection failure */ + @Nullable protected PropertyHandler getPropertyHandler(String propertyName) throws BeansException { Assert.notNull(propertyName, "Property name must not be null"); AbstractNestablePropertyAccessor nestedPa = getPropertyAccessorForPropertyPath(propertyName); @@ -727,6 +729,7 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA * @param propertyName the name of a local property * @return the handler for that property or {@code null} if it has not been found */ + @Nullable protected abstract PropertyHandler getLocalPropertyHandler(String propertyName); /** @@ -1016,6 +1019,7 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA public abstract TypeDescriptor nested(int level); + @Nullable public abstract Object getValue() throws Exception; public abstract void setValue(Object object, Object value) throws Exception; diff --git a/spring-beans/src/main/java/org/springframework/beans/BeanInfoFactory.java b/spring-beans/src/main/java/org/springframework/beans/BeanInfoFactory.java index 4c5fd27cdc8..52c73e47857 100644 --- a/spring-beans/src/main/java/org/springframework/beans/BeanInfoFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/BeanInfoFactory.java @@ -19,6 +19,8 @@ package org.springframework.beans; import java.beans.BeanInfo; import java.beans.IntrospectionException; +import org.springframework.lang.Nullable; + /** * Strategy interface for creating {@link BeanInfo} instances for Spring beans. * Can be used to plug in custom bean property resolution strategies (e.g. for other @@ -52,6 +54,7 @@ public interface BeanInfoFactory { * @return the BeanInfo, or {@code null} if the given class is not supported * @throws IntrospectionException in case of exceptions */ + @Nullable BeanInfo getBeanInfo(Class beanClass) throws IntrospectionException; } diff --git a/spring-beans/src/main/java/org/springframework/beans/BeanInstantiationException.java b/spring-beans/src/main/java/org/springframework/beans/BeanInstantiationException.java index d8f7d246091..976230f9df7 100644 --- a/spring-beans/src/main/java/org/springframework/beans/BeanInstantiationException.java +++ b/spring-beans/src/main/java/org/springframework/beans/BeanInstantiationException.java @@ -19,6 +19,8 @@ package org.springframework.beans; import java.lang.reflect.Constructor; import java.lang.reflect.Method; +import org.springframework.lang.Nullable; + /** * Exception thrown when instantiation of a bean failed. * Carries the offending bean class. @@ -98,6 +100,7 @@ public class BeanInstantiationException extends FatalBeanException { * factory method or in case of default instantiation * @since 4.3 */ + @Nullable public Constructor getConstructor() { return this.constructor; } @@ -108,6 +111,7 @@ public class BeanInstantiationException extends FatalBeanException { * or {@code null} in case of constructor-based instantiation * @since 4.3 */ + @Nullable public Method getConstructingMethod() { return this.constructingMethod; } diff --git a/spring-beans/src/main/java/org/springframework/beans/BeanMetadataAttributeAccessor.java b/spring-beans/src/main/java/org/springframework/beans/BeanMetadataAttributeAccessor.java index d08a8fa3413..9f75cfef3cf 100644 --- a/spring-beans/src/main/java/org/springframework/beans/BeanMetadataAttributeAccessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/BeanMetadataAttributeAccessor.java @@ -17,6 +17,7 @@ package org.springframework.beans; import org.springframework.core.AttributeAccessorSupport; +import org.springframework.lang.Nullable; /** * Extension of {@link org.springframework.core.AttributeAccessorSupport}, @@ -60,6 +61,7 @@ public class BeanMetadataAttributeAccessor extends AttributeAccessorSupport impl * @return the corresponding BeanMetadataAttribute object, * or {@code null} if no such attribute defined */ + @Nullable public BeanMetadataAttribute getMetadataAttribute(String name) { return (BeanMetadataAttribute) super.getAttribute(name); } diff --git a/spring-beans/src/main/java/org/springframework/beans/BeanMetadataElement.java b/spring-beans/src/main/java/org/springframework/beans/BeanMetadataElement.java index 6b6229d4165..6fc10ba9ee4 100644 --- a/spring-beans/src/main/java/org/springframework/beans/BeanMetadataElement.java +++ b/spring-beans/src/main/java/org/springframework/beans/BeanMetadataElement.java @@ -16,6 +16,8 @@ package org.springframework.beans; +import org.springframework.lang.Nullable; + /** * Interface to be implemented by bean metadata elements * that carry a configuration source object. @@ -29,6 +31,7 @@ public interface BeanMetadataElement { * Return the configuration source {@code Object} for this metadata element * (may be {@code null}). */ + @Nullable Object getSource(); } diff --git a/spring-beans/src/main/java/org/springframework/beans/BeanUtils.java b/spring-beans/src/main/java/org/springframework/beans/BeanUtils.java index aacf3e2b656..0a73d0893a1 100644 --- a/spring-beans/src/main/java/org/springframework/beans/BeanUtils.java +++ b/spring-beans/src/main/java/org/springframework/beans/BeanUtils.java @@ -35,6 +35,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ConcurrentReferenceHashMap; @@ -172,6 +173,7 @@ public abstract class BeanUtils { * @see Class#getMethod * @see #findDeclaredMethod */ + @Nullable public static Method findMethod(Class clazz, String methodName, Class... paramTypes) { try { return clazz.getMethod(methodName, paramTypes); @@ -192,6 +194,7 @@ public abstract class BeanUtils { * @return the Method object, or {@code null} if not found * @see Class#getDeclaredMethod */ + @Nullable public static Method findDeclaredMethod(Class clazz, String methodName, Class... paramTypes) { try { return clazz.getDeclaredMethod(methodName, paramTypes); @@ -219,6 +222,7 @@ public abstract class BeanUtils { * @see Class#getMethods * @see #findDeclaredMethodWithMinimalParameters */ + @Nullable public static Method findMethodWithMinimalParameters(Class clazz, String methodName) throws IllegalArgumentException { @@ -241,6 +245,7 @@ public abstract class BeanUtils { * could not be resolved to a unique method with minimal parameters * @see Class#getDeclaredMethods */ + @Nullable public static Method findDeclaredMethodWithMinimalParameters(Class clazz, String methodName) throws IllegalArgumentException { @@ -260,6 +265,7 @@ public abstract class BeanUtils { * @throws IllegalArgumentException if methods of the given name were found but * could not be resolved to a unique method with minimal parameters */ + @Nullable public static Method findMethodWithMinimalParameters(Method[] methods, String methodName) throws IllegalArgumentException { @@ -311,6 +317,7 @@ public abstract class BeanUtils { * @see #findMethod * @see #findMethodWithMinimalParameters */ + @Nullable public static Method resolveSignature(String signature, Class clazz) { Assert.hasText(signature, "'signature' must not be empty"); Assert.notNull(clazz, "Class must not be null"); @@ -365,6 +372,7 @@ public abstract class BeanUtils { * @return the corresponding PropertyDescriptor, or {@code null} if none * @throws BeansException if PropertyDescriptor lookup fails */ + @Nullable public static PropertyDescriptor getPropertyDescriptor(Class clazz, String propertyName) throws BeansException { @@ -381,6 +389,7 @@ public abstract class BeanUtils { * @return the corresponding PropertyDescriptor, or {@code null} if none * @throws BeansException if PropertyDescriptor lookup fails */ + @Nullable public static PropertyDescriptor findPropertyForMethod(Method method) throws BeansException { return findPropertyForMethod(method, method.getDeclaringClass()); } @@ -395,6 +404,7 @@ public abstract class BeanUtils { * @throws BeansException if PropertyDescriptor lookup fails * @since 3.2.13 */ + @Nullable public static PropertyDescriptor findPropertyForMethod(Method method, Class clazz) throws BeansException { Assert.notNull(method, "Method must not be null"); PropertyDescriptor[] pds = getPropertyDescriptors(clazz); @@ -415,6 +425,7 @@ public abstract class BeanUtils { * @param targetType the type to find an editor for * @return the corresponding editor, or {@code null} if none found */ + @Nullable public static PropertyEditor findEditorByConvention(Class targetType) { if (targetType == null || targetType.isArray() || unknownEditorTypes.contains(targetType)) { return null; diff --git a/spring-beans/src/main/java/org/springframework/beans/BeanWrapper.java b/spring-beans/src/main/java/org/springframework/beans/BeanWrapper.java index 437a450c614..1aa32d37337 100644 --- a/spring-beans/src/main/java/org/springframework/beans/BeanWrapper.java +++ b/spring-beans/src/main/java/org/springframework/beans/BeanWrapper.java @@ -18,6 +18,8 @@ package org.springframework.beans; import java.beans.PropertyDescriptor; +import org.springframework.lang.Nullable; + /** * The central interface of Spring's low-level JavaBeans infrastructure. * @@ -65,6 +67,7 @@ public interface BeanWrapper extends ConfigurablePropertyAccessor { * Return the bean instance wrapped by this object, if any. * @return the bean instance, or {@code null} if none set */ + @Nullable Object getWrappedInstance(); /** @@ -72,6 +75,7 @@ public interface BeanWrapper extends ConfigurablePropertyAccessor { * @return the type of the wrapped bean instance, * or {@code null} if no wrapped object has been set */ + @Nullable Class getWrappedClass(); /** diff --git a/spring-beans/src/main/java/org/springframework/beans/ConfigurablePropertyAccessor.java b/spring-beans/src/main/java/org/springframework/beans/ConfigurablePropertyAccessor.java index efa3c58c315..77fb0ee6d2a 100644 --- a/spring-beans/src/main/java/org/springframework/beans/ConfigurablePropertyAccessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/ConfigurablePropertyAccessor.java @@ -17,6 +17,7 @@ package org.springframework.beans; import org.springframework.core.convert.ConversionService; +import org.springframework.lang.Nullable; /** * Interface that encapsulates configuration methods for a PropertyAccessor. @@ -41,6 +42,7 @@ public interface ConfigurablePropertyAccessor extends PropertyAccessor, Property /** * Return the associated ConversionService, if any. */ + @Nullable ConversionService getConversionService(); /** diff --git a/spring-beans/src/main/java/org/springframework/beans/ConversionNotSupportedException.java b/spring-beans/src/main/java/org/springframework/beans/ConversionNotSupportedException.java index 26a8db336b5..3c17ec53d07 100644 --- a/spring-beans/src/main/java/org/springframework/beans/ConversionNotSupportedException.java +++ b/spring-beans/src/main/java/org/springframework/beans/ConversionNotSupportedException.java @@ -18,6 +18,8 @@ package org.springframework.beans; import java.beans.PropertyChangeEvent; +import org.springframework.lang.Nullable; + /** * Exception thrown when no suitable editor or converter can be found for a bean property. * @@ -35,7 +37,7 @@ public class ConversionNotSupportedException extends TypeMismatchException { * @param cause the root cause (may be {@code null}) */ public ConversionNotSupportedException(PropertyChangeEvent propertyChangeEvent, - Class requiredType, Throwable cause) { + @Nullable Class requiredType, @Nullable Throwable cause) { super(propertyChangeEvent, requiredType, cause); } @@ -45,7 +47,7 @@ public class ConversionNotSupportedException extends TypeMismatchException { * @param requiredType the required target type (or {@code null} if not known) * @param cause the root cause (may be {@code null}) */ - public ConversionNotSupportedException(Object value, Class requiredType, Throwable cause) { + public ConversionNotSupportedException(@Nullable Object value, @Nullable Class requiredType, @Nullable Throwable cause) { super(value, requiredType, cause); } diff --git a/spring-beans/src/main/java/org/springframework/beans/ExtendedBeanInfo.java b/spring-beans/src/main/java/org/springframework/beans/ExtendedBeanInfo.java index 3d1cfa5610f..9bd39e28b1a 100644 --- a/spring-beans/src/main/java/org/springframework/beans/ExtendedBeanInfo.java +++ b/spring-beans/src/main/java/org/springframework/beans/ExtendedBeanInfo.java @@ -37,6 +37,7 @@ import java.util.TreeSet; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -188,6 +189,7 @@ class ExtendedBeanInfo implements BeanInfo { } } + @Nullable private PropertyDescriptor findExistingPropertyDescriptor(String propertyName, Class propertyType) { for (PropertyDescriptor pd : this.propertyDescriptors) { final Class candidateType; diff --git a/spring-beans/src/main/java/org/springframework/beans/Mergeable.java b/spring-beans/src/main/java/org/springframework/beans/Mergeable.java index cba64d94f89..cde059bb843 100644 --- a/spring-beans/src/main/java/org/springframework/beans/Mergeable.java +++ b/spring-beans/src/main/java/org/springframework/beans/Mergeable.java @@ -16,6 +16,8 @@ package org.springframework.beans; +import org.springframework.lang.Nullable; + /** * Interface representing an object whose value set can be merged with * that of a parent object. @@ -44,6 +46,6 @@ public interface Mergeable { * @exception IllegalStateException if merging is not enabled for this instance * (i.e. {@code mergeEnabled} equals {@code false}). */ - Object merge(Object parent); + Object merge(@Nullable Object parent); } diff --git a/spring-beans/src/main/java/org/springframework/beans/MutablePropertyValues.java b/spring-beans/src/main/java/org/springframework/beans/MutablePropertyValues.java index 43136433d80..8adc4e9d0bf 100644 --- a/spring-beans/src/main/java/org/springframework/beans/MutablePropertyValues.java +++ b/spring-beans/src/main/java/org/springframework/beans/MutablePropertyValues.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -267,6 +268,7 @@ public class MutablePropertyValues implements PropertyValues, Serializable { * @see #getPropertyValue(String) * @see PropertyValue#getValue() */ + @Nullable public Object get(String propertyName) { PropertyValue pv = getPropertyValue(propertyName); return (pv != null ? pv.getValue() : null); diff --git a/spring-beans/src/main/java/org/springframework/beans/NotWritablePropertyException.java b/spring-beans/src/main/java/org/springframework/beans/NotWritablePropertyException.java index b1a05a14a1a..cac0a15d907 100644 --- a/spring-beans/src/main/java/org/springframework/beans/NotWritablePropertyException.java +++ b/spring-beans/src/main/java/org/springframework/beans/NotWritablePropertyException.java @@ -16,6 +16,8 @@ package org.springframework.beans; +import org.springframework.lang.Nullable; + /** * Exception thrown on an attempt to set the value of a property that * is not writable (typically because there is no setter method). @@ -80,6 +82,7 @@ public class NotWritablePropertyException extends InvalidPropertyException { * Return suggestions for actual bean property names that closely match * the invalid property name, if any. */ + @Nullable public String[] getPossibleMatches() { return this.possibleMatches; } diff --git a/spring-beans/src/main/java/org/springframework/beans/PropertyAccessException.java b/spring-beans/src/main/java/org/springframework/beans/PropertyAccessException.java index 07cbb3d5bcf..1bb6c4ff31d 100644 --- a/spring-beans/src/main/java/org/springframework/beans/PropertyAccessException.java +++ b/spring-beans/src/main/java/org/springframework/beans/PropertyAccessException.java @@ -18,6 +18,8 @@ package org.springframework.beans; import java.beans.PropertyChangeEvent; +import org.springframework.lang.Nullable; + /** * Superclass for exceptions related to a property access, * such as type mismatch or invocation target exception. @@ -57,6 +59,7 @@ public abstract class PropertyAccessException extends BeansException { *

May be {@code null}; only available if an actual bean property * was affected. */ + @Nullable public PropertyChangeEvent getPropertyChangeEvent() { return this.propertyChangeEvent; } @@ -71,6 +74,7 @@ public abstract class PropertyAccessException extends BeansException { /** * Return the affected value that was about to be set, if any. */ + @Nullable public Object getValue() { return (this.propertyChangeEvent != null ? this.propertyChangeEvent.getNewValue() : null); } diff --git a/spring-beans/src/main/java/org/springframework/beans/PropertyAccessor.java b/spring-beans/src/main/java/org/springframework/beans/PropertyAccessor.java index c7faf35524e..2693b7c781e 100644 --- a/spring-beans/src/main/java/org/springframework/beans/PropertyAccessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/PropertyAccessor.java @@ -19,6 +19,7 @@ package org.springframework.beans; import java.util.Map; import org.springframework.core.convert.TypeDescriptor; +import org.springframework.lang.Nullable; /** * Common interface for classes that can access named properties @@ -86,6 +87,7 @@ public interface PropertyAccessor { * @throws PropertyAccessException if the property was valid but the * accessor method failed */ + @Nullable Class getPropertyType(String propertyName) throws BeansException; /** @@ -98,6 +100,7 @@ public interface PropertyAccessor { * @throws InvalidPropertyException if there is no such property or * if the property isn't readable */ + @Nullable TypeDescriptor getPropertyTypeDescriptor(String propertyName) throws BeansException; /** diff --git a/spring-beans/src/main/java/org/springframework/beans/PropertyBatchUpdateException.java b/spring-beans/src/main/java/org/springframework/beans/PropertyBatchUpdateException.java index bfa54687bb7..64b7ca3b8c9 100644 --- a/spring-beans/src/main/java/org/springframework/beans/PropertyBatchUpdateException.java +++ b/spring-beans/src/main/java/org/springframework/beans/PropertyBatchUpdateException.java @@ -19,6 +19,7 @@ package org.springframework.beans; import java.io.PrintStream; import java.io.PrintWriter; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -71,6 +72,7 @@ public class PropertyBatchUpdateException extends BeansException { /** * Return the exception for this field, or {@code null} if there isn't any. */ + @Nullable public PropertyAccessException getPropertyAccessException(String propertyName) { for (PropertyAccessException pae : this.propertyAccessExceptions) { if (ObjectUtils.nullSafeEquals(propertyName, pae.getPropertyName())) { diff --git a/spring-beans/src/main/java/org/springframework/beans/PropertyEditorRegistry.java b/spring-beans/src/main/java/org/springframework/beans/PropertyEditorRegistry.java index f76df2a2d84..1bd83a254fd 100644 --- a/spring-beans/src/main/java/org/springframework/beans/PropertyEditorRegistry.java +++ b/spring-beans/src/main/java/org/springframework/beans/PropertyEditorRegistry.java @@ -18,6 +18,8 @@ package org.springframework.beans; import java.beans.PropertyEditor; +import org.springframework.lang.Nullable; + /** * Encapsulates methods for registering JavaBeans {@link PropertyEditor PropertyEditors}. * This is the central interface that a {@link PropertyEditorRegistrar} operates on. @@ -64,7 +66,7 @@ public interface PropertyEditorRegistry { * {@code null} if registering an editor for all properties of the given type * @param propertyEditor editor to register */ - void registerCustomEditor(Class requiredType, String propertyPath, PropertyEditor propertyEditor); + void registerCustomEditor(@Nullable Class requiredType, @Nullable String propertyPath, PropertyEditor propertyEditor); /** * Find a custom property editor for the given type and property. @@ -74,6 +76,7 @@ public interface PropertyEditorRegistry { * {@code null} if looking for an editor for all properties of the given type * @return the registered editor, or {@code null} if none */ - PropertyEditor findCustomEditor(Class requiredType, String propertyPath); + @Nullable + PropertyEditor findCustomEditor(@Nullable Class requiredType, @Nullable String propertyPath); } diff --git a/spring-beans/src/main/java/org/springframework/beans/PropertyEditorRegistrySupport.java b/spring-beans/src/main/java/org/springframework/beans/PropertyEditorRegistrySupport.java index c28a2cf2699..ef70b224f32 100644 --- a/spring-beans/src/main/java/org/springframework/beans/PropertyEditorRegistrySupport.java +++ b/spring-beans/src/main/java/org/springframework/beans/PropertyEditorRegistrySupport.java @@ -74,6 +74,7 @@ import org.springframework.beans.propertyeditors.ZoneIdEditor; import org.springframework.core.convert.ConversionService; import org.springframework.core.io.Resource; import org.springframework.core.io.support.ResourceArrayPropertyEditor; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -118,6 +119,7 @@ public class PropertyEditorRegistrySupport implements PropertyEditorRegistry { /** * Return the associated ConversionService, if any. */ + @Nullable public ConversionService getConversionService() { return this.conversionService; } @@ -169,6 +171,7 @@ public class PropertyEditorRegistrySupport implements PropertyEditorRegistry { * @return the default editor, or {@code null} if none found * @see #registerDefaultEditors */ + @Nullable public PropertyEditor getDefaultEditor(Class requiredType) { if (!this.defaultEditorsActive) { return null; @@ -336,7 +339,7 @@ public class PropertyEditorRegistrySupport implements PropertyEditorRegistry { * can be {@code null} if not known) * @return whether a matching custom editor has been found */ - public boolean hasCustomEditorForElement(Class elementType, String propertyPath) { + public boolean hasCustomEditorForElement(@Nullable Class elementType, @Nullable String propertyPath) { if (propertyPath != null && this.customEditorsForPath != null) { for (Map.Entry entry : this.customEditorsForPath.entrySet()) { if (PropertyAccessorUtils.matchesProperty(entry.getKey(), propertyPath)) { @@ -361,6 +364,7 @@ public class PropertyEditorRegistrySupport implements PropertyEditorRegistry { * @return the type of the property, or {@code null} if not determinable * @see BeanWrapper#getPropertyType(String) */ + @Nullable protected Class getPropertyType(String propertyPath) { return null; } @@ -371,6 +375,7 @@ public class PropertyEditorRegistrySupport implements PropertyEditorRegistry { * @param requiredType the type to look for * @return the custom editor, or {@code null} if none specific for this property */ + @Nullable private PropertyEditor getCustomEditor(String propertyName, Class requiredType) { CustomEditorHolder holder = this.customEditorsForPath.get(propertyName); return (holder != null ? holder.getPropertyEditor(requiredType) : null); @@ -384,6 +389,7 @@ public class PropertyEditorRegistrySupport implements PropertyEditorRegistry { * @return the custom editor, or {@code null} if none found for this type * @see java.beans.PropertyEditor#getAsText() */ + @Nullable private PropertyEditor getCustomEditor(Class requiredType) { if (requiredType == null || this.customEditors == null) { return null; @@ -420,6 +426,7 @@ public class PropertyEditorRegistrySupport implements PropertyEditorRegistry { * @param propertyName the name of the property * @return the property type, or {@code null} if not determinable */ + @Nullable protected Class guessPropertyTypeFromEditors(String propertyName) { if (this.customEditorsForPath != null) { CustomEditorHolder editorHolder = this.customEditorsForPath.get(propertyName); @@ -445,7 +452,7 @@ public class PropertyEditorRegistrySupport implements PropertyEditorRegistry { * If this is non-null, only editors registered for a path below this nested property * will be copied. If this is null, all editors will be copied. */ - protected void copyCustomEditorsTo(PropertyEditorRegistry target, String nestedProperty) { + protected void copyCustomEditorsTo(PropertyEditorRegistry target, @Nullable String nestedProperty) { String actualPropertyName = (nestedProperty != null ? PropertyAccessorUtils.getPropertyName(nestedProperty) : null); if (this.customEditors != null) { diff --git a/spring-beans/src/main/java/org/springframework/beans/PropertyValues.java b/spring-beans/src/main/java/org/springframework/beans/PropertyValues.java index 8af2c77ff79..cb2ac6cb172 100644 --- a/spring-beans/src/main/java/org/springframework/beans/PropertyValues.java +++ b/spring-beans/src/main/java/org/springframework/beans/PropertyValues.java @@ -16,6 +16,8 @@ package org.springframework.beans; +import org.springframework.lang.Nullable; + /** * Holder containing one or more {@link PropertyValue} objects, * typically comprising one update for a specific target bean. @@ -37,6 +39,7 @@ public interface PropertyValues { * @param propertyName the name to search for * @return the property value, or {@code null} */ + @Nullable PropertyValue getPropertyValue(String propertyName); /** diff --git a/spring-beans/src/main/java/org/springframework/beans/TypeConverter.java b/spring-beans/src/main/java/org/springframework/beans/TypeConverter.java index 6d69a63ce69..3cb9f6a5b1f 100644 --- a/spring-beans/src/main/java/org/springframework/beans/TypeConverter.java +++ b/spring-beans/src/main/java/org/springframework/beans/TypeConverter.java @@ -19,6 +19,7 @@ package org.springframework.beans; import java.lang.reflect.Field; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; /** * Interface that defines type conversion methods. Typically (but not necessarily) @@ -49,7 +50,7 @@ public interface TypeConverter { * @see org.springframework.core.convert.ConversionService * @see org.springframework.core.convert.converter.Converter */ - T convertIfNecessary(Object value, Class requiredType) throws TypeMismatchException; + T convertIfNecessary(Object value, @Nullable Class requiredType) throws TypeMismatchException; /** * Convert the value to the required type (if necessary from a String). @@ -67,7 +68,7 @@ public interface TypeConverter { * @see org.springframework.core.convert.ConversionService * @see org.springframework.core.convert.converter.Converter */ - T convertIfNecessary(Object value, Class requiredType, MethodParameter methodParam) + T convertIfNecessary(Object value, @Nullable Class requiredType, @Nullable MethodParameter methodParam) throws TypeMismatchException; /** @@ -86,7 +87,7 @@ public interface TypeConverter { * @see org.springframework.core.convert.ConversionService * @see org.springframework.core.convert.converter.Converter */ - T convertIfNecessary(Object value, Class requiredType, Field field) + T convertIfNecessary(Object value, @Nullable Class requiredType, @Nullable Field field) throws TypeMismatchException; } diff --git a/spring-beans/src/main/java/org/springframework/beans/TypeConverterDelegate.java b/spring-beans/src/main/java/org/springframework/beans/TypeConverterDelegate.java index 9080d93f743..730f2689100 100644 --- a/spring-beans/src/main/java/org/springframework/beans/TypeConverterDelegate.java +++ b/spring-beans/src/main/java/org/springframework/beans/TypeConverterDelegate.java @@ -34,6 +34,7 @@ import org.springframework.core.MethodParameter; import org.springframework.core.convert.ConversionFailedException; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.NumberUtils; import org.springframework.util.ReflectionUtils; @@ -90,7 +91,7 @@ class TypeConverterDelegate { * @return the new value, possibly the result of type conversion * @throws IllegalArgumentException if type conversion failed */ - public T convertIfNecessary(Object newValue, Class requiredType, MethodParameter methodParam) + public T convertIfNecessary(Object newValue, @Nullable Class requiredType, @Nullable MethodParameter methodParam) throws IllegalArgumentException { return convertIfNecessary(null, null, newValue, requiredType, @@ -107,7 +108,7 @@ class TypeConverterDelegate { * @return the new value, possibly the result of type conversion * @throws IllegalArgumentException if type conversion failed */ - public T convertIfNecessary(Object newValue, Class requiredType, Field field) + public T convertIfNecessary(Object newValue, @Nullable Class requiredType, @Nullable Field field) throws IllegalArgumentException { return convertIfNecessary(null, null, newValue, requiredType, @@ -125,7 +126,7 @@ class TypeConverterDelegate { * @throws IllegalArgumentException if type conversion failed */ public T convertIfNecessary( - String propertyName, Object oldValue, Object newValue, Class requiredType) + String propertyName, @Nullable Object oldValue, Object newValue, @Nullable Class requiredType) throws IllegalArgumentException { return convertIfNecessary(propertyName, oldValue, newValue, requiredType, TypeDescriptor.valueOf(requiredType)); @@ -144,8 +145,8 @@ class TypeConverterDelegate { * @throws IllegalArgumentException if type conversion failed */ @SuppressWarnings("unchecked") - public T convertIfNecessary(String propertyName, Object oldValue, Object newValue, - Class requiredType, TypeDescriptor typeDescriptor) throws IllegalArgumentException { + public T convertIfNecessary(String propertyName, @Nullable Object oldValue, Object newValue, + @Nullable Class requiredType, TypeDescriptor typeDescriptor) throws IllegalArgumentException { // Custom editor for this type? PropertyEditor editor = this.propertyEditorRegistry.findCustomEditor(requiredType, propertyName); @@ -357,6 +358,7 @@ class TypeConverterDelegate { * @param requiredType the type to find an editor for * @return the corresponding editor, or {@code null} if none */ + @Nullable private PropertyEditor findDefaultEditor(Class requiredType) { PropertyEditor editor = null; if (requiredType != null) { @@ -381,7 +383,7 @@ class TypeConverterDelegate { * @return the new value, possibly the result of type conversion * @throws IllegalArgumentException if type conversion failed */ - private Object doConvertValue(Object oldValue, Object newValue, Class requiredType, PropertyEditor editor) { + private Object doConvertValue(@Nullable Object oldValue, Object newValue, @Nullable Class requiredType, PropertyEditor editor) { Object convertedValue = newValue; if (editor != null && !(convertedValue instanceof String)) { @@ -443,7 +445,7 @@ class TypeConverterDelegate { * @param editor the PropertyEditor to use * @return the converted value */ - private Object doConvertTextValue(Object oldValue, String newTextValue, PropertyEditor editor) { + private Object doConvertTextValue(@Nullable Object oldValue, String newTextValue, PropertyEditor editor) { try { editor.setValue(oldValue); } diff --git a/spring-beans/src/main/java/org/springframework/beans/TypeMismatchException.java b/spring-beans/src/main/java/org/springframework/beans/TypeMismatchException.java index 2f81b70a418..2fe07446aba 100644 --- a/spring-beans/src/main/java/org/springframework/beans/TypeMismatchException.java +++ b/spring-beans/src/main/java/org/springframework/beans/TypeMismatchException.java @@ -18,6 +18,7 @@ package org.springframework.beans; import java.beans.PropertyChangeEvent; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -55,7 +56,7 @@ public class TypeMismatchException extends PropertyAccessException { * @param requiredType the required target type (or {@code null} if not known) * @param cause the root cause (may be {@code null}) */ - public TypeMismatchException(PropertyChangeEvent propertyChangeEvent, Class requiredType, Throwable cause) { + public TypeMismatchException(PropertyChangeEvent propertyChangeEvent, @Nullable Class requiredType, @Nullable Throwable cause) { super(propertyChangeEvent, "Failed to convert property value of type '" + ClassUtils.getDescriptiveType(propertyChangeEvent.getNewValue()) + "'" + @@ -73,7 +74,7 @@ public class TypeMismatchException extends PropertyAccessException { * @param value the offending value that couldn't be converted (may be {@code null}) * @param requiredType the required target type (or {@code null} if not known) */ - public TypeMismatchException(Object value, Class requiredType) { + public TypeMismatchException(@Nullable Object value, @Nullable Class requiredType) { this(value, requiredType, null); } @@ -83,7 +84,7 @@ public class TypeMismatchException extends PropertyAccessException { * @param requiredType the required target type (or {@code null} if not known) * @param cause the root cause (may be {@code null}) */ - public TypeMismatchException(Object value, Class requiredType, Throwable cause) { + public TypeMismatchException(@Nullable Object value, @Nullable Class requiredType, @Nullable Throwable cause) { super("Failed to convert value of type '" + ClassUtils.getDescriptiveType(value) + "'" + (requiredType != null ? " to required type '" + ClassUtils.getQualifiedName(requiredType) + "'" : ""), cause); @@ -103,6 +104,7 @@ public class TypeMismatchException extends PropertyAccessException { /** * Return the required target type, if any. */ + @Nullable public Class getRequiredType() { return this.requiredType; } diff --git a/spring-beans/src/main/java/org/springframework/beans/annotation/AnnotationBeanUtils.java b/spring-beans/src/main/java/org/springframework/beans/annotation/AnnotationBeanUtils.java index 55dca06c302..6f5a198b7dd 100644 --- a/spring-beans/src/main/java/org/springframework/beans/annotation/AnnotationBeanUtils.java +++ b/spring-beans/src/main/java/org/springframework/beans/annotation/AnnotationBeanUtils.java @@ -24,6 +24,7 @@ import java.util.Set; import org.springframework.beans.BeanWrapper; import org.springframework.beans.PropertyAccessorFactory; +import org.springframework.lang.Nullable; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringValueResolver; @@ -44,7 +45,7 @@ public abstract class AnnotationBeanUtils { * @param excludedProperties the names of excluded properties, if any * @see org.springframework.beans.BeanWrapper */ - public static void copyPropertiesToBean(Annotation ann, Object bean, String... excludedProperties) { + public static void copyPropertiesToBean(Annotation ann, Object bean, @Nullable String... excludedProperties) { copyPropertiesToBean(ann, bean, null, excludedProperties); } @@ -58,7 +59,7 @@ public abstract class AnnotationBeanUtils { * @param excludedProperties the names of excluded properties, if any * @see org.springframework.beans.BeanWrapper */ - public static void copyPropertiesToBean(Annotation ann, Object bean, StringValueResolver valueResolver, String... excludedProperties) { + public static void copyPropertiesToBean(Annotation ann, Object bean, @Nullable StringValueResolver valueResolver, @Nullable String... excludedProperties) { Set excluded = new HashSet<>(Arrays.asList(excludedProperties)); Method[] annotationProperties = ann.annotationType().getDeclaredMethods(); BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(bean); diff --git a/spring-beans/src/main/java/org/springframework/beans/annotation/package-info.java b/spring-beans/src/main/java/org/springframework/beans/annotation/package-info.java index 004728944be..113e56cfb67 100644 --- a/spring-beans/src/main/java/org/springframework/beans/annotation/package-info.java +++ b/spring-beans/src/main/java/org/springframework/beans/annotation/package-info.java @@ -1,4 +1,7 @@ /** * Support package for beans-style handling of Java 5 annotations. */ +@NonNullApi package org.springframework.beans.annotation; + +import org.springframework.lang.NonNullApi; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/BeanClassLoaderAware.java b/spring-beans/src/main/java/org/springframework/beans/factory/BeanClassLoaderAware.java index e207fdb3c82..5249a93e4cd 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/BeanClassLoaderAware.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/BeanClassLoaderAware.java @@ -16,6 +16,8 @@ package org.springframework.beans.factory; +import org.springframework.lang.Nullable; + /** * Callback that allows a bean to be aware of the bean * {@link ClassLoader class loader}; that is, the class loader used by the @@ -50,6 +52,6 @@ public interface BeanClassLoaderAware extends Aware { * the {@code ClassLoader} obtained via * {@link org.springframework.util.ClassUtils#getDefaultClassLoader()} */ - void setBeanClassLoader(ClassLoader classLoader); + void setBeanClassLoader(@Nullable ClassLoader classLoader); } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/BeanCreationException.java b/spring-beans/src/main/java/org/springframework/beans/factory/BeanCreationException.java index 9a746f2ff27..16b2966c7fa 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/BeanCreationException.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/BeanCreationException.java @@ -23,6 +23,7 @@ import java.util.List; import org.springframework.beans.FatalBeanException; import org.springframework.core.NestedRuntimeException; +import org.springframework.lang.Nullable; /** * Exception thrown when a BeanFactory encounters an error when @@ -109,6 +110,7 @@ public class BeanCreationException extends FatalBeanException { /** * Return the name of the bean requested, if any. */ + @Nullable public String getBeanName() { return this.beanName; } @@ -117,6 +119,7 @@ public class BeanCreationException extends FatalBeanException { * Return the description of the resource that the bean * definition came from, if any. */ + @Nullable public String getResourceDescription() { return this.resourceDescription; } @@ -138,6 +141,7 @@ public class BeanCreationException extends FatalBeanException { * Return the related causes, if any. * @return the array of related causes, or {@code null} if none */ + @Nullable public Throwable[] getRelatedCauses() { if (this.relatedCauses == null) { return null; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/BeanDefinitionStoreException.java b/spring-beans/src/main/java/org/springframework/beans/factory/BeanDefinitionStoreException.java index 47a2ec8c14b..a8702775000 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/BeanDefinitionStoreException.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/BeanDefinitionStoreException.java @@ -17,6 +17,7 @@ package org.springframework.beans.factory; import org.springframework.beans.FatalBeanException; +import org.springframework.lang.Nullable; /** * Exception thrown when a BeanFactory encounters an invalid bean definition: @@ -47,7 +48,7 @@ public class BeanDefinitionStoreException extends FatalBeanException { * @param msg the detail message (used as exception message as-is) * @param cause the root cause (may be {@code null}) */ - public BeanDefinitionStoreException(String msg, Throwable cause) { + public BeanDefinitionStoreException(String msg, @Nullable Throwable cause) { super(msg, cause); } @@ -67,7 +68,7 @@ public class BeanDefinitionStoreException extends FatalBeanException { * @param msg the detail message (used as exception message as-is) * @param cause the root cause (may be {@code null}) */ - public BeanDefinitionStoreException(String resourceDescription, String msg, Throwable cause) { + public BeanDefinitionStoreException(String resourceDescription, String msg, @Nullable Throwable cause) { super(msg, cause); this.resourceDescription = resourceDescription; } @@ -91,7 +92,7 @@ public class BeanDefinitionStoreException extends FatalBeanException { * the resource and the name of the bean) * @param cause the root cause (may be {@code null}) */ - public BeanDefinitionStoreException(String resourceDescription, String beanName, String msg, Throwable cause) { + public BeanDefinitionStoreException(String resourceDescription, String beanName, String msg, @Nullable Throwable cause) { super("Invalid bean definition with name '" + beanName + "' defined in " + resourceDescription + ": " + msg, cause); this.resourceDescription = resourceDescription; this.beanName = beanName; @@ -102,6 +103,7 @@ public class BeanDefinitionStoreException extends FatalBeanException { * Return the description of the resource that the bean * definition came from, if any. */ + @Nullable public String getResourceDescription() { return this.resourceDescription; } @@ -109,6 +111,7 @@ public class BeanDefinitionStoreException extends FatalBeanException { /** * Return the name of the bean requested, if any. */ + @Nullable public String getBeanName() { return this.beanName; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/BeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/BeanFactory.java index f3e418abb23..c0837c6dcc6 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/BeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/BeanFactory.java @@ -18,6 +18,7 @@ package org.springframework.beans.factory; import org.springframework.beans.BeansException; import org.springframework.core.ResolvableType; +import org.springframework.lang.Nullable; /** * The root interface for accessing a Spring bean container. @@ -156,7 +157,7 @@ public interface BeanFactory { * @throws BeanNotOfRequiredTypeException if the bean is not of the required type * @throws BeansException if the bean could not be created */ - T getBean(String name, Class requiredType) throws BeansException; + T getBean(String name, @Nullable Class requiredType) throws BeansException; /** * Return the bean instance that uniquely matches the given object type, if any. @@ -313,6 +314,7 @@ public interface BeanFactory { * @see #getBean * @see #isTypeMatch */ + @Nullable Class getType(String name) throws NoSuchBeanDefinitionException; /** diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/FactoryBean.java b/spring-beans/src/main/java/org/springframework/beans/factory/FactoryBean.java index 1f45088ec91..78c008c2977 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/FactoryBean.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/FactoryBean.java @@ -16,6 +16,8 @@ package org.springframework.beans.factory; +import org.springframework.lang.Nullable; + /** * Interface to be implemented by objects used within a {@link BeanFactory} which * are themselves factories for individual objects. If a bean implements this @@ -72,6 +74,7 @@ public interface FactoryBean { * @throws Exception in case of creation errors * @see FactoryBeanNotInitializedException */ + @Nullable T getObject() throws Exception; /** @@ -93,6 +96,7 @@ public interface FactoryBean { * or {@code null} if not known at the time of the call * @see ListableBeanFactory#getBeansOfType */ + @Nullable Class getObjectType(); /** diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/HierarchicalBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/HierarchicalBeanFactory.java index 7e6a347afc2..2860411b75e 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/HierarchicalBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/HierarchicalBeanFactory.java @@ -16,6 +16,8 @@ package org.springframework.beans.factory; +import org.springframework.lang.Nullable; + /** * Sub-interface implemented by bean factories that can be part * of a hierarchy. @@ -34,6 +36,7 @@ public interface HierarchicalBeanFactory extends BeanFactory { /** * Return the parent bean factory, or {@code null} if there is none. */ + @Nullable BeanFactory getParentBeanFactory(); /** diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/InjectionPoint.java b/spring-beans/src/main/java/org/springframework/beans/factory/InjectionPoint.java index 38ace23fd40..f1295770522 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/InjectionPoint.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/InjectionPoint.java @@ -22,6 +22,7 @@ import java.lang.reflect.Field; import java.lang.reflect.Member; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -83,6 +84,7 @@ public class InjectionPoint { *

Note: Either MethodParameter or Field is available. * @return the MethodParameter, or {@code null} if none */ + @Nullable public MethodParameter getMethodParameter() { return this.methodParameter; } @@ -92,6 +94,7 @@ public class InjectionPoint { *

Note: Either MethodParameter or Field is available. * @return the Field, or {@code null} if none */ + @Nullable public Field getField() { return this.field; } @@ -117,6 +120,7 @@ public class InjectionPoint { * @return the annotation instance, or {@code null} if none found * @since 4.3.9 */ + @Nullable public A getAnnotation(Class annotationType) { return (this.field != null ? this.field.getAnnotation(annotationType) : this.methodParameter.getParameterAnnotation(annotationType)); diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/ListableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/ListableBeanFactory.java index e8be3322896..4b7dea51cdd 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/ListableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/ListableBeanFactory.java @@ -21,6 +21,7 @@ import java.util.Map; import org.springframework.beans.BeansException; import org.springframework.core.ResolvableType; +import org.springframework.lang.Nullable; /** * Extension of the {@link BeanFactory} interface to be implemented by bean factories @@ -113,7 +114,7 @@ public interface ListableBeanFactory extends BeanFactory { * @see FactoryBean#getObjectType * @see BeanFactoryUtils#beanNamesForTypeIncludingAncestors(ListableBeanFactory, ResolvableType) */ - String[] getBeanNamesForType(ResolvableType type); + String[] getBeanNamesForType(@Nullable ResolvableType type); /** * Return the names of beans matching the given type (including subclasses), @@ -140,7 +141,7 @@ public interface ListableBeanFactory extends BeanFactory { * @see FactoryBean#getObjectType * @see BeanFactoryUtils#beanNamesForTypeIncludingAncestors(ListableBeanFactory, Class) */ - String[] getBeanNamesForType(Class type); + String[] getBeanNamesForType(@Nullable Class type); /** * Return the names of beans matching the given type (including subclasses), @@ -173,7 +174,7 @@ public interface ListableBeanFactory extends BeanFactory { * @see FactoryBean#getObjectType * @see BeanFactoryUtils#beanNamesForTypeIncludingAncestors(ListableBeanFactory, Class, boolean, boolean) */ - String[] getBeanNamesForType(Class type, boolean includeNonSingletons, boolean allowEagerInit); + String[] getBeanNamesForType(@Nullable Class type, boolean includeNonSingletons, boolean allowEagerInit); /** * Return the bean instances that match the given object type (including @@ -203,7 +204,7 @@ public interface ListableBeanFactory extends BeanFactory { * @see FactoryBean#getObjectType * @see BeanFactoryUtils#beansOfTypeIncludingAncestors(ListableBeanFactory, Class) */ - Map getBeansOfType(Class type) throws BeansException; + Map getBeansOfType(@Nullable Class type) throws BeansException; /** * Return the bean instances that match the given object type (including @@ -238,7 +239,7 @@ public interface ListableBeanFactory extends BeanFactory { * @see FactoryBean#getObjectType * @see BeanFactoryUtils#beansOfTypeIncludingAncestors(ListableBeanFactory, Class, boolean, boolean) */ - Map getBeansOfType(Class type, boolean includeNonSingletons, boolean allowEagerInit) + Map getBeansOfType(@Nullable Class type, boolean includeNonSingletons, boolean allowEagerInit) throws BeansException; /** @@ -271,6 +272,7 @@ public interface ListableBeanFactory extends BeanFactory { * @throws NoSuchBeanDefinitionException if there is no bean with the given name * @since 3.0 */ + @Nullable A findAnnotationOnBean(String beanName, Class annotationType) throws NoSuchBeanDefinitionException; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/NoUniqueBeanDefinitionException.java b/spring-beans/src/main/java/org/springframework/beans/factory/NoUniqueBeanDefinitionException.java index 6bb4f6dbc05..02617c8fe99 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/NoUniqueBeanDefinitionException.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/NoUniqueBeanDefinitionException.java @@ -19,6 +19,7 @@ package org.springframework.beans.factory; import java.util.Arrays; import java.util.Collection; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -85,6 +86,7 @@ public class NoUniqueBeanDefinitionException extends NoSuchBeanDefinitionExcepti * @since 4.3 * @see #getBeanType() */ + @Nullable public Collection getBeanNamesFound() { return this.beanNamesFound; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/ObjectProvider.java b/spring-beans/src/main/java/org/springframework/beans/factory/ObjectProvider.java index 7bc61f87f77..de71971894d 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/ObjectProvider.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/ObjectProvider.java @@ -19,6 +19,7 @@ package org.springframework.beans.factory; import java.util.function.Supplier; import org.springframework.beans.BeansException; +import org.springframework.lang.Nullable; /** * A variant of {@link ObjectFactory} designed specifically for injection points, @@ -48,6 +49,7 @@ public interface ObjectProvider extends ObjectFactory { * @throws BeansException in case of creation errors * @see #getObject() */ + @Nullable T getIfAvailable() throws BeansException; /** @@ -74,6 +76,7 @@ public interface ObjectProvider extends ObjectFactory { * @throws BeansException in case of creation errors * @see #getObject() */ + @Nullable T getIfUnique() throws BeansException; /** diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AnnotatedBeanDefinition.java b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AnnotatedBeanDefinition.java index befb4118601..dd59fbc6a5d 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AnnotatedBeanDefinition.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AnnotatedBeanDefinition.java @@ -19,6 +19,7 @@ package org.springframework.beans.factory.annotation; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.MethodMetadata; +import org.springframework.lang.Nullable; /** * Extended {@link org.springframework.beans.factory.config.BeanDefinition} @@ -44,6 +45,7 @@ public interface AnnotatedBeanDefinition extends BeanDefinition { * @return the factory method metadata, or {@code null} if none * @since 4.1.1 */ + @Nullable MethodMetadata getFactoryMethodMetadata(); } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java index de10ab87264..f763aad22c8 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java @@ -60,6 +60,7 @@ import org.springframework.core.Ordered; import org.springframework.core.PriorityOrdered; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.AnnotationAttributes; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; @@ -468,6 +469,7 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean return new InjectionMetadata(clazz, elements); } + @Nullable private AnnotationAttributes findAutowiredAnnotation(AccessibleObject ao) { if (ao.getAnnotations().length > 0) { for (Class type : this.autowiredAnnotationTypes) { @@ -691,6 +693,7 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean } } + @Nullable private Object[] resolveCachedArguments(String beanName) { if (this.cachedMethodArguments == null) { return null; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/InjectionMetadata.java b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/InjectionMetadata.java index f60e7e6f2df..7021f8c3abe 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/InjectionMetadata.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/InjectionMetadata.java @@ -31,6 +31,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.PropertyValues; import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.lang.Nullable; import org.springframework.util.ReflectionUtils; /** @@ -232,6 +233,7 @@ public class InjectionMetadata { /** * Either this or {@link #inject} needs to be overridden. */ + @Nullable protected Object getResourceToInject(Object target, String requestingBeanName) { return null; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/QualifierAnnotationAutowireCandidateResolver.java b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/QualifierAnnotationAutowireCandidateResolver.java index 46c42853c10..e33fd4c8890 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/QualifierAnnotationAutowireCandidateResolver.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/QualifierAnnotationAutowireCandidateResolver.java @@ -36,6 +36,7 @@ import org.springframework.core.MethodParameter; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; @@ -341,6 +342,7 @@ public class QualifierAnnotationAutowireCandidateResolver extends GenericTypeAwa /** * Determine a suggested value from any of the given candidate annotations. */ + @Nullable protected Object findValue(Annotation[] annotationsToSearch) { AnnotationAttributes attr = AnnotatedElementUtils.getMergedAnnotationAttributes( AnnotatedElementUtils.forAnnotations(annotationsToSearch), this.valueAnnotationType); diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/package-info.java b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/package-info.java index 19c01c942e3..aada302b815 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/package-info.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/package-info.java @@ -1,4 +1,7 @@ /** * Support package for annotation-driven bean configuration. */ +@NonNullApi package org.springframework.beans.factory.annotation; + +import org.springframework.lang.NonNullApi; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/AbstractFactoryBean.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/AbstractFactoryBean.java index 85faab006b0..625bb2cd5f7 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/AbstractFactoryBean.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/AbstractFactoryBean.java @@ -33,6 +33,7 @@ import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.FactoryBeanNotInitializedException; import org.springframework.beans.factory.InitializingBean; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.ReflectionUtils; @@ -225,6 +226,7 @@ public abstract class AbstractFactoryBean * or {@code null} to indicate a FactoryBeanNotInitializedException * @see org.springframework.beans.factory.FactoryBeanNotInitializedException */ + @Nullable protected Class[] getEarlySingletonInterfaces() { Class type = getObjectType(); return (type != null && type.isInterface() ? new Class[] {type} : null); diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/AutowireCapableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/AutowireCapableBeanFactory.java index 61b52407702..fed381c4014 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/AutowireCapableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/AutowireCapableBeanFactory.java @@ -23,6 +23,7 @@ import org.springframework.beans.TypeConverter; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.NoUniqueBeanDefinitionException; +import org.springframework.lang.Nullable; /** * Extension of the {@link org.springframework.beans.factory.BeanFactory} @@ -337,6 +338,7 @@ public interface AutowireCapableBeanFactory extends BeanFactory { * @since 2.5 * @see #resolveDependency(DependencyDescriptor, String, Set, TypeConverter) */ + @Nullable Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName) throws BeansException; /** @@ -353,6 +355,7 @@ public interface AutowireCapableBeanFactory extends BeanFactory { * @since 2.5 * @see DependencyDescriptor */ + @Nullable Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName, Set autowiredBeanNames, TypeConverter typeConverter) throws BeansException; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/BeanDefinition.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/BeanDefinition.java index c9e0db6ad85..8cd218573fb 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/BeanDefinition.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/BeanDefinition.java @@ -19,6 +19,7 @@ package org.springframework.beans.factory.config; import org.springframework.beans.BeanMetadataElement; import org.springframework.beans.MutablePropertyValues; import org.springframework.core.AttributeAccessor; +import org.springframework.lang.Nullable; /** * A BeanDefinition describes a bean instance, which has property values, @@ -84,11 +85,12 @@ public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement { /** * Set the name of the parent definition of this bean definition, if any. */ - void setParentName(String parentName); + void setParentName(@Nullable String parentName); /** * Return the name of the parent definition of this bean definition, if any. */ + @Nullable String getParentName(); /** @@ -126,6 +128,7 @@ public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement { * Return the name of the current target scope for this bean, * or {@code null} if not known yet. */ + @Nullable String getScope(); /** @@ -188,6 +191,7 @@ public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement { /** * Return the factory bean name, if any. */ + @Nullable String getFactoryBeanName(); /** @@ -203,6 +207,7 @@ public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement { /** * Return a factory method, if any. */ + @Nullable String getFactoryMethodName(); /** @@ -260,6 +265,7 @@ public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement { * Return a description of the resource that this bean definition * came from (for the purpose of showing context in case of errors). */ + @Nullable String getResourceDescription(); /** @@ -268,6 +274,7 @@ public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement { *

Note that this method returns the immediate originator. Iterate through the * originator chain to find the original BeanDefinition as defined by the user. */ + @Nullable BeanDefinition getOriginatingBeanDefinition(); } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/BeanDefinitionHolder.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/BeanDefinitionHolder.java index 6e10d7573a1..9379a831af7 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/BeanDefinitionHolder.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/BeanDefinitionHolder.java @@ -18,6 +18,7 @@ package org.springframework.beans.factory.config; import org.springframework.beans.BeanMetadataElement; import org.springframework.beans.factory.BeanFactoryUtils; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -60,7 +61,7 @@ public class BeanDefinitionHolder implements BeanMetadataElement { * @param beanName the name of the bean, as specified for the bean definition * @param aliases alias names for the bean, or {@code null} if none */ - public BeanDefinitionHolder(BeanDefinition beanDefinition, String beanName, String[] aliases) { + public BeanDefinitionHolder(BeanDefinition beanDefinition, String beanName, @Nullable String[] aliases) { Assert.notNull(beanDefinition, "BeanDefinition must not be null"); Assert.notNull(beanName, "Bean name must not be null"); this.beanDefinition = beanDefinition; @@ -101,6 +102,7 @@ public class BeanDefinitionHolder implements BeanMetadataElement { * Return the alias names for the bean, as specified directly for the bean definition. * @return the array of alias names, or {@code null} if none */ + @Nullable public String[] getAliases() { return this.aliases; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/BeanExpressionContext.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/BeanExpressionContext.java index 1da52f0e203..2f0a5bead26 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/BeanExpressionContext.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/BeanExpressionContext.java @@ -16,6 +16,7 @@ package org.springframework.beans.factory.config; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -51,6 +52,7 @@ public class BeanExpressionContext { (this.scope != null && this.scope.resolveContextualObject(key) != null)); } + @Nullable public Object getObject(String key) { if (this.beanFactory.containsBean(key)) { return this.beanFactory.getBean(key); diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/BeanPostProcessor.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/BeanPostProcessor.java index ce61b2de933..7121908cf09 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/BeanPostProcessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/BeanPostProcessor.java @@ -17,6 +17,7 @@ package org.springframework.beans.factory.config; import org.springframework.beans.BeansException; +import org.springframework.lang.Nullable; /** * Factory hook that allows for custom modification of new bean instances, @@ -54,6 +55,7 @@ public interface BeanPostProcessor { * @throws org.springframework.beans.BeansException in case of errors * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet */ + @Nullable default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } @@ -79,6 +81,7 @@ public interface BeanPostProcessor { * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet * @see org.springframework.beans.factory.FactoryBean */ + @Nullable default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/ConfigurableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/ConfigurableBeanFactory.java index 302deec58fa..35f5b860b43 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/ConfigurableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/ConfigurableBeanFactory.java @@ -27,6 +27,7 @@ import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.HierarchicalBeanFactory; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.core.convert.ConversionService; +import org.springframework.lang.Nullable; import org.springframework.util.StringValueResolver; /** @@ -85,7 +86,7 @@ public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, Single * @param beanClassLoader the class loader to use, * or {@code null} to suggest the default class loader */ - void setBeanClassLoader(ClassLoader beanClassLoader); + void setBeanClassLoader(@Nullable ClassLoader beanClassLoader); /** * Return this factory's class loader for loading bean classes. @@ -108,6 +109,7 @@ public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, Single * if any. * @since 2.5 */ + @Nullable ClassLoader getTempClassLoader(); /** @@ -151,6 +153,7 @@ public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, Single * Return the associated ConversionService, if any. * @since 3.0 */ + @Nullable ConversionService getConversionService(); /** @@ -222,6 +225,7 @@ public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, Single * @return the resolved value (may be the original value as-is) * @since 3.0 */ + @Nullable String resolveEmbeddedValue(String value); /** @@ -265,6 +269,7 @@ public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, Single * @return the registered Scope implementation, or {@code null} if none * @see #registerScope */ + @Nullable Scope getRegisteredScope(String scopeName); /** diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/ConstructorArgumentValues.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/ConstructorArgumentValues.java index dfffe28e36a..87efa185e57 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/ConstructorArgumentValues.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/ConstructorArgumentValues.java @@ -26,6 +26,7 @@ import java.util.Set; import org.springframework.beans.BeanMetadataElement; import org.springframework.beans.Mergeable; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; @@ -146,7 +147,8 @@ public class ConstructorArgumentValues { * untyped values only) * @return the ValueHolder for the argument, or {@code null} if none set */ - public ValueHolder getIndexedArgumentValue(int index, Class requiredType) { + @Nullable + public ValueHolder getIndexedArgumentValue(int index, @Nullable Class requiredType) { return getIndexedArgumentValue(index, requiredType, null); } @@ -159,7 +161,8 @@ public class ConstructorArgumentValues { * unnamed values only, or empty String to match any name) * @return the ValueHolder for the argument, or {@code null} if none set */ - public ValueHolder getIndexedArgumentValue(int index, Class requiredType, String requiredName) { + @Nullable + public ValueHolder getIndexedArgumentValue(int index, @Nullable Class requiredType, @Nullable String requiredName) { Assert.isTrue(index >= 0, "Index must not be negative"); ValueHolder valueHolder = this.indexedArgumentValues.get(index); if (valueHolder != null && @@ -247,6 +250,7 @@ public class ConstructorArgumentValues { * @param requiredType the type to match * @return the ValueHolder for the argument, or {@code null} if none set */ + @Nullable public ValueHolder getGenericArgumentValue(Class requiredType) { return getGenericArgumentValue(requiredType, null, null); } @@ -257,6 +261,7 @@ public class ConstructorArgumentValues { * @param requiredName the name to match * @return the ValueHolder for the argument, or {@code null} if none set */ + @Nullable public ValueHolder getGenericArgumentValue(Class requiredType, String requiredName) { return getGenericArgumentValue(requiredType, requiredName, null); } @@ -273,7 +278,8 @@ public class ConstructorArgumentValues { * in the current resolution process and should therefore not be returned again * @return the ValueHolder for the argument, or {@code null} if none found */ - public ValueHolder getGenericArgumentValue(Class requiredType, String requiredName, Set usedValueHolders) { + @Nullable + public ValueHolder getGenericArgumentValue(@Nullable Class requiredType, @Nullable String requiredName, Set usedValueHolders) { for (ValueHolder valueHolder : this.genericArgumentValues) { if (usedValueHolders != null && usedValueHolders.contains(valueHolder)) { continue; @@ -312,6 +318,7 @@ public class ConstructorArgumentValues { * @param requiredType the parameter type to match * @return the ValueHolder for the argument, or {@code null} if none set */ + @Nullable public ValueHolder getArgumentValue(int index, Class requiredType) { return getArgumentValue(index, requiredType, null, null); } @@ -324,6 +331,7 @@ public class ConstructorArgumentValues { * @param requiredName the parameter name to match * @return the ValueHolder for the argument, or {@code null} if none set */ + @Nullable public ValueHolder getArgumentValue(int index, Class requiredType, String requiredName) { return getArgumentValue(index, requiredType, requiredName, null); } @@ -342,7 +350,8 @@ public class ConstructorArgumentValues { * in case of multiple generic argument values of the same type) * @return the ValueHolder for the argument, or {@code null} if none set */ - public ValueHolder getArgumentValue(int index, Class requiredType, String requiredName, Set usedValueHolders) { + @Nullable + public ValueHolder getArgumentValue(int index, @Nullable Class requiredType, @Nullable String requiredName, Set usedValueHolders) { Assert.isTrue(index >= 0, "Index must not be negative"); ValueHolder valueHolder = getIndexedArgumentValue(index, requiredType, requiredName); if (valueHolder == null) { diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/DependencyDescriptor.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/DependencyDescriptor.java index 7d19ad3481c..3b6288fc3b5 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/DependencyDescriptor.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/DependencyDescriptor.java @@ -38,6 +38,7 @@ import org.springframework.core.GenericTypeResolver; import org.springframework.core.MethodParameter; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.core.ResolvableType; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -211,6 +212,7 @@ public class DependencyDescriptor extends InjectionPoint implements Serializable * @throws BeansException in case of the not-unique scenario being fatal * @since 4.3 */ + @Nullable public Object resolveNotUnique(Class type, Map matchingBeans) throws BeansException { throw new NoUniqueBeanDefinitionException(type, matchingBeans.keySet()); } @@ -227,6 +229,7 @@ public class DependencyDescriptor extends InjectionPoint implements Serializable * @throws BeansException if the shortcut could not be obtained * @since 4.3.1 */ + @Nullable public Object resolveShortcut(BeanFactory beanFactory) throws BeansException { return null; } @@ -321,7 +324,7 @@ public class DependencyDescriptor extends InjectionPoint implements Serializable * this point; it just allows discovery to happen when the application calls * {@link #getDependencyName()} (if ever). */ - public void initParameterNameDiscovery(ParameterNameDiscoverer parameterNameDiscoverer) { + public void initParameterNameDiscovery(@Nullable ParameterNameDiscoverer parameterNameDiscoverer) { if (this.methodParameter != null) { this.methodParameter.initParameterNameDiscovery(parameterNameDiscoverer); } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/InstantiationAwareBeanPostProcessor.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/InstantiationAwareBeanPostProcessor.java index 595707fe764..ca664f40adb 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/InstantiationAwareBeanPostProcessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/InstantiationAwareBeanPostProcessor.java @@ -20,6 +20,7 @@ import java.beans.PropertyDescriptor; import org.springframework.beans.BeansException; import org.springframework.beans.PropertyValues; +import org.springframework.lang.Nullable; /** * Subinterface of {@link BeanPostProcessor} that adds a before-instantiation callback, @@ -67,6 +68,7 @@ public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { * @see org.springframework.beans.factory.support.AbstractBeanDefinition#hasBeanClass * @see org.springframework.beans.factory.support.AbstractBeanDefinition#getFactoryMethodName */ + @Nullable default Object postProcessBeforeInstantiation(Class beanClass, String beanName) throws BeansException { return null; } @@ -109,6 +111,7 @@ public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { * @throws org.springframework.beans.BeansException in case of errors * @see org.springframework.beans.MutablePropertyValues */ + @Nullable default PropertyValues postProcessPropertyValues( PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException { diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/NamedBeanHolder.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/NamedBeanHolder.java index 04e5e39a372..0c43b97c312 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/NamedBeanHolder.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/NamedBeanHolder.java @@ -17,6 +17,7 @@ package org.springframework.beans.factory.config; import org.springframework.beans.factory.NamedBean; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -56,6 +57,7 @@ public class NamedBeanHolder implements NamedBean { /** * Return the corresponding bean instance (can be {@code null}). */ + @Nullable public T getBeanInstance() { return this.beanInstance; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/PlaceholderConfigurerSupport.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/PlaceholderConfigurerSupport.java index f7223a9a1ce..91ec753eee6 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/PlaceholderConfigurerSupport.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/PlaceholderConfigurerSupport.java @@ -20,6 +20,7 @@ import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanNameAware; +import org.springframework.lang.Nullable; import org.springframework.util.StringValueResolver; /** @@ -140,7 +141,7 @@ public abstract class PlaceholderConfigurerSupport extends PropertyResourceConfi * special character should be processed as a value separator. * The default is {@value #DEFAULT_VALUE_SEPARATOR}. */ - public void setValueSeparator(String valueSeparator) { + public void setValueSeparator(@Nullable String valueSeparator) { this.valueSeparator = valueSeparator; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/PreferencesPlaceholderConfigurer.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/PreferencesPlaceholderConfigurer.java index c8de04029b6..89f41a126da 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/PreferencesPlaceholderConfigurer.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/PreferencesPlaceholderConfigurer.java @@ -22,6 +22,7 @@ import java.util.prefs.Preferences; import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.InitializingBean; +import org.springframework.lang.Nullable; /** * Subclass of PropertyPlaceholderConfigurer that supports JDK 1.4's @@ -113,6 +114,7 @@ public class PreferencesPlaceholderConfigurer extends PropertyPlaceholderConfigu * @param preferences the Preferences to resolve against * @return the value for the placeholder, or {@code null} if none found */ + @Nullable protected String resolvePlaceholder(String path, String key, Preferences preferences) { if (path != null) { // Do not create the node if it does not exist... diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.java index 39129c60a77..6a218052171 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.java @@ -22,6 +22,7 @@ import org.springframework.beans.BeansException; import org.springframework.core.Constants; import org.springframework.core.SpringProperties; import org.springframework.core.env.AbstractEnvironment; +import org.springframework.lang.Nullable; import org.springframework.util.PropertyPlaceholderHelper; import org.springframework.util.PropertyPlaceholderHelper.PlaceholderResolver; import org.springframework.util.StringValueResolver; @@ -179,6 +180,7 @@ public class PropertyPlaceholderConfigurer extends PlaceholderConfigurerSupport * @return the resolved value, of {@code null} if none * @see #setSystemPropertiesMode */ + @Nullable protected String resolvePlaceholder(String placeholder, Properties props) { return props.getProperty(placeholder); } @@ -192,6 +194,7 @@ public class PropertyPlaceholderConfigurer extends PlaceholderConfigurerSupport * @see System#getProperty(String) * @see System#getenv(String) */ + @Nullable protected String resolveSystemProperty(String key) { try { String value = System.getProperty(key); diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/Scope.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/Scope.java index 4e313c7919c..aebaf3135fb 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/Scope.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/Scope.java @@ -17,6 +17,7 @@ package org.springframework.beans.factory.config; import org.springframework.beans.factory.ObjectFactory; +import org.springframework.lang.Nullable; /** * Strategy interface used by a {@link ConfigurableBeanFactory}, @@ -88,6 +89,7 @@ public interface Scope { * @throws IllegalStateException if the underlying scope is not currently active * @see #registerDestructionCallback */ + @Nullable Object remove(String name); /** @@ -128,6 +130,7 @@ public interface Scope { * @return the corresponding object, or {@code null} if none found * @throws IllegalStateException if the underlying scope is not currently active */ + @Nullable Object resolveContextualObject(String key); /** @@ -145,6 +148,7 @@ public interface Scope { * conversation ID for the current scope * @throws IllegalStateException if the underlying scope is not currently active */ + @Nullable String getConversationId(); } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/SingletonBeanRegistry.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/SingletonBeanRegistry.java index e2188050f17..f610c8d8150 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/SingletonBeanRegistry.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/SingletonBeanRegistry.java @@ -16,6 +16,8 @@ package org.springframework.beans.factory.config; +import org.springframework.lang.Nullable; + /** * Interface that defines a registry for shared bean instances. * Can be implemented by {@link org.springframework.beans.factory.BeanFactory} @@ -68,6 +70,7 @@ public interface SingletonBeanRegistry { * @return the registered singleton object, or {@code null} if none found * @see ConfigurableListableBeanFactory#getBeanDefinition */ + @Nullable Object getSingleton(String beanName); /** diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/SmartInstantiationAwareBeanPostProcessor.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/SmartInstantiationAwareBeanPostProcessor.java index 61a0a8f666b..5d52fae329c 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/SmartInstantiationAwareBeanPostProcessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/SmartInstantiationAwareBeanPostProcessor.java @@ -19,6 +19,7 @@ package org.springframework.beans.factory.config; import java.lang.reflect.Constructor; import org.springframework.beans.BeansException; +import org.springframework.lang.Nullable; /** * Extension of the {@link InstantiationAwareBeanPostProcessor} interface, @@ -45,6 +46,7 @@ public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationA * @return the type of the bean, or {@code null} if not predictable * @throws org.springframework.beans.BeansException in case of errors */ + @Nullable default Class predictBeanType(Class beanClass, String beanName) throws BeansException { return null; } @@ -57,6 +59,7 @@ public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationA * @return the candidate constructors, or {@code null} if none specified * @throws org.springframework.beans.BeansException in case of errors */ + @Nullable default Constructor[] determineCandidateConstructors(Class beanClass, String beanName) throws BeansException { diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/TypedStringValue.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/TypedStringValue.java index 0a6f73e3507..1454ae8d597 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/TypedStringValue.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/TypedStringValue.java @@ -17,6 +17,7 @@ package org.springframework.beans.factory.config; import org.springframework.beans.BeanMetadataElement; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; @@ -153,6 +154,7 @@ public class TypedStringValue implements BeanMetadataElement { * @return the resolved type to convert to * @throws ClassNotFoundException if the type cannot be resolved */ + @Nullable public Class resolveTargetType(ClassLoader classLoader) throws ClassNotFoundException { if (this.targetType == null) { return null; @@ -179,13 +181,14 @@ public class TypedStringValue implements BeanMetadataElement { /** * Set the type name as actually specified for this particular value, if any. */ - public void setSpecifiedTypeName(String specifiedTypeName) { + public void setSpecifiedTypeName(@Nullable String specifiedTypeName) { this.specifiedTypeName = specifiedTypeName; } /** * Return the type name as actually specified for this particular value, if any. */ + @Nullable public String getSpecifiedTypeName() { return this.specifiedTypeName; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/package-info.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/package-info.java index 81e5ad66681..1bfd372f34c 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/package-info.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/package-info.java @@ -1,4 +1,7 @@ /** * SPI interfaces and configuration-related convenience classes for bean factories. */ +@NonNullApi package org.springframework.beans.factory.config; + +import org.springframework.lang.NonNullApi; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/package-info.java b/spring-beans/src/main/java/org/springframework/beans/factory/package-info.java index 0834baa9e5e..10b3a3a3cf3 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/package-info.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/package-info.java @@ -9,4 +9,7 @@ * Expert One-On-One J2EE Design and Development * by Rod Johnson (Wrox, 2002). */ +@NonNullApi package org.springframework.beans.factory; + +import org.springframework.lang.NonNullApi; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/AliasDefinition.java b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/AliasDefinition.java index 06d037c5d7f..e87d3c5ca93 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/AliasDefinition.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/AliasDefinition.java @@ -17,6 +17,7 @@ package org.springframework.beans.factory.parsing; import org.springframework.beans.BeanMetadataElement; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -50,7 +51,7 @@ public class AliasDefinition implements BeanMetadataElement { * @param alias the alias registered for the bean * @param source the source object (may be {@code null}) */ - public AliasDefinition(String beanName, String alias, Object source) { + public AliasDefinition(String beanName, String alias, @Nullable Object source) { Assert.notNull(beanName, "Bean name must not be null"); Assert.notNull(alias, "Alias must not be null"); this.beanName = beanName; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/BeanComponentDefinition.java b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/BeanComponentDefinition.java index fe309eeb3c5..c5b1c54a398 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/BeanComponentDefinition.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/BeanComponentDefinition.java @@ -24,6 +24,7 @@ import org.springframework.beans.PropertyValues; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.BeanReference; +import org.springframework.lang.Nullable; /** * ComponentDefinition based on a standard BeanDefinition, exposing the given bean @@ -56,7 +57,7 @@ public class BeanComponentDefinition extends BeanDefinitionHolder implements Com * @param beanName the name of the bean * @param aliases alias names for the bean, or {@code null} if none */ - public BeanComponentDefinition(BeanDefinition beanDefinition, String beanName, String[] aliases) { + public BeanComponentDefinition(BeanDefinition beanDefinition, String beanName, @Nullable String[] aliases) { super(beanDefinition, beanName, aliases); findInnerBeanDefinitionsAndBeanReferences(beanDefinition); } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/FailFastProblemReporter.java b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/FailFastProblemReporter.java index 859d611f145..dbafd3fddc8 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/FailFastProblemReporter.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/FailFastProblemReporter.java @@ -19,6 +19,8 @@ package org.springframework.beans.factory.parsing; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; + /** * Simple {@link ProblemReporter} implementation that exhibits fail-fast * behavior when errors are encountered. @@ -45,7 +47,7 @@ public class FailFastProblemReporter implements ProblemReporter { * the name of the instance class will be used. * @param logger the {@link Log logger} that is to be used to report warnings */ - public void setLogger(Log logger) { + public void setLogger(@Nullable Log logger) { this.logger = (logger != null ? logger : LogFactory.getLog(getClass())); } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/ImportDefinition.java b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/ImportDefinition.java index 85eea69610e..fdab1473e00 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/ImportDefinition.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/ImportDefinition.java @@ -18,6 +18,7 @@ package org.springframework.beans.factory.parsing; import org.springframework.beans.BeanMetadataElement; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -49,7 +50,7 @@ public class ImportDefinition implements BeanMetadataElement { * @param importedResource the location of the imported resource * @param source the source object (may be {@code null}) */ - public ImportDefinition(String importedResource, Object source) { + public ImportDefinition(String importedResource, @Nullable Object source) { this(importedResource, null, source); } @@ -58,7 +59,7 @@ public class ImportDefinition implements BeanMetadataElement { * @param importedResource the location of the imported resource * @param source the source object (may be {@code null}) */ - public ImportDefinition(String importedResource, Resource[] actualResources, Object source) { + public ImportDefinition(String importedResource, Resource[] actualResources, @Nullable Object source) { Assert.notNull(importedResource, "Imported resource must not be null"); this.importedResource = importedResource; this.actualResources = actualResources; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/Location.java b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/Location.java index 9ff54665c78..23747a032e1 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/Location.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/Location.java @@ -17,6 +17,7 @@ package org.springframework.beans.factory.parsing; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -53,7 +54,7 @@ public class Location { * @param source the actual location within the associated resource * (may be {@code null}) */ - public Location(Resource resource, Object source) { + public Location(Resource resource, @Nullable Object source) { Assert.notNull(resource, "Resource must not be null"); this.resource = resource; this.source = source; @@ -73,6 +74,7 @@ public class Location { *

See the {@link Location class level javadoc for this class} for examples * of what the actual type of the returned object may be. */ + @Nullable public Object getSource() { return this.source; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/ParseState.java b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/ParseState.java index 2edb93890d7..7e3ff72e52c 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/ParseState.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/ParseState.java @@ -18,6 +18,8 @@ package org.springframework.beans.factory.parsing; import java.util.Stack; +import org.springframework.lang.Nullable; + /** * Simple {@link Stack}-based structure for tracking the logical position during * a parsing process. {@link Entry entries} are added to the stack at @@ -78,6 +80,7 @@ public final class ParseState { * Return the {@link Entry} currently at the top of the {@link Stack} or * {@code null} if the {@link Stack} is empty. */ + @Nullable public Entry peek() { return this.state.empty() ? null : this.state.peek(); } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/Problem.java b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/Problem.java index c317d5f9358..a8150dc2f0e 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/Problem.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/Problem.java @@ -16,6 +16,7 @@ package org.springframework.beans.factory.parsing; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -66,7 +67,7 @@ public class Problem { * @param parseState the {@link ParseState} at the time of the error * @param location the location within a bean configuration source that triggered the error */ - public Problem(String message, Location location, ParseState parseState, Throwable rootCause) { + public Problem(String message, Location location, ParseState parseState, @Nullable Throwable rootCause) { Assert.notNull(message, "Message must not be null"); Assert.notNull(location, "Location must not be null"); this.message = message; @@ -102,6 +103,7 @@ public class Problem { /** * Get the {@link ParseState} at the time of the error (may be {@code null}). */ + @Nullable public ParseState getParseState() { return this.parseState; } @@ -109,6 +111,7 @@ public class Problem { /** * Get the underlying exception that caused the error (may be {@code null}). */ + @Nullable public Throwable getRootCause() { return this.rootCause; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/SourceExtractor.java b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/SourceExtractor.java index ed9248fdf28..a403c5c229c 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/SourceExtractor.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/SourceExtractor.java @@ -17,6 +17,7 @@ package org.springframework.beans.factory.parsing; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; /** * Simple strategy allowing tools to control how source metadata is attached @@ -44,6 +45,7 @@ public interface SourceExtractor { * (may be {@code null}) * @return the source metadata object to store (may be {@code null}) */ - Object extractSource(Object sourceCandidate, Resource definingResource); + @Nullable + Object extractSource(Object sourceCandidate, @Nullable Resource definingResource); } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/package-info.java b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/package-info.java index eae9057e60f..ab87c9bc5d5 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/parsing/package-info.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/parsing/package-info.java @@ -1,4 +1,7 @@ /** * Support infrastructure for bean definition parsing. */ +@NonNullApi package org.springframework.beans.factory.parsing; + +import org.springframework.lang.NonNullApi; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/serviceloader/package-info.java b/spring-beans/src/main/java/org/springframework/beans/factory/serviceloader/package-info.java index 793df3de8b6..71ae5239129 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/serviceloader/package-info.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/serviceloader/package-info.java @@ -1,4 +1,7 @@ /** * Support package for the Java 6 ServiceLoader facility. */ +@NonNullApi package org.springframework.beans.factory.serviceloader; + +import org.springframework.lang.NonNullApi; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java index b306901faa7..811b9140448 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java @@ -77,6 +77,7 @@ import org.springframework.core.NamedThreadLocal; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.core.PriorityOrdered; import org.springframework.core.ResolvableType; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.ReflectionUtils; @@ -175,7 +176,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac * Create a new AbstractAutowireCapableBeanFactory with the given parent. * @param parentBeanFactory parent bean factory, or {@code null} if none */ - public AbstractAutowireCapableBeanFactory(BeanFactory parentBeanFactory) { + public AbstractAutowireCapableBeanFactory(@Nullable BeanFactory parentBeanFactory) { this(); setParentBeanFactory(parentBeanFactory); } @@ -654,6 +655,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac * (also signals that the returned {@code Class} will never be exposed to application code) * @return the type for the bean if determinable, or {@code null} otherwise */ + @Nullable protected Class determineTargetType(String beanName, RootBeanDefinition mbd, Class... typesToMatch) { Class targetType = mbd.getTargetType(); if (targetType == null) { @@ -681,6 +683,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac * @return the type for the bean if determinable, or {@code null} otherwise * @see #createBean */ + @Nullable protected Class getTypeForFactoryMethod(String beanName, RootBeanDefinition mbd, Class... typesToMatch) { ResolvableType cachedReturnType = mbd.factoryMethodReturnType; if (cachedReturnType != null) { @@ -858,6 +861,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac * @param factoryMethodName the name of the factory method * @return the common {@code FactoryBean} object type, or {@code null} if none */ + @Nullable private Class getTypeForFactoryBeanFromMethod(Class beanClass, final String factoryMethodName) { class Holder { Class value = null; } final Holder objectType = new Holder(); @@ -893,6 +897,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac * @param bean the raw bean instance * @return the object to expose as bean reference */ + @Nullable protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) { Object exposedObject = bean; if (bean != null && !mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { @@ -922,6 +927,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac * @return the FactoryBean instance, or {@code null} to indicate * that we couldn't obtain a shortcut FactoryBean instance */ + @Nullable private FactoryBean getSingletonFactoryBeanForTypeCheck(String beanName, RootBeanDefinition mbd) { synchronized (getSingletonMutex()) { BeanWrapper bw = this.factoryBeanInstanceCache.get(beanName); @@ -965,6 +971,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac * @return the FactoryBean instance, or {@code null} to indicate * that we couldn't obtain a shortcut FactoryBean instance */ + @Nullable private FactoryBean getNonSingletonFactoryBeanForTypeCheck(String beanName, RootBeanDefinition mbd) { if (isPrototypeCurrentlyInCreation(beanName)) { return null; @@ -1021,6 +1028,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac * @param mbd the bean definition for the bean * @return the shortcut-determined bean instance, or {@code null} if none */ + @Nullable protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) { Object bean = null; if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) { @@ -1050,6 +1058,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac * @return the bean object to use instead of a default instance of the target bean, or {@code null} * @see InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation */ + @Nullable protected Object applyBeanPostProcessorsBeforeInstantiation(Class beanClass, String beanName) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof InstantiationAwareBeanPostProcessor) { @@ -1181,6 +1190,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac * @throws org.springframework.beans.BeansException in case of errors * @see org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors */ + @Nullable protected Constructor[] determineConstructorsFromBeanPostProcessors(Class beanClass, String beanName) throws BeansException { @@ -1241,7 +1251,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac * @see #getBean(String, Object[]) */ protected BeanWrapper instantiateUsingFactoryMethod( - String beanName, RootBeanDefinition mbd, Object[] explicitArgs) { + String beanName, RootBeanDefinition mbd, @Nullable Object[] explicitArgs) { return new ConstructorResolver(this).instantiateUsingFactoryMethod(beanName, mbd, explicitArgs); } @@ -1261,7 +1271,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac * @return a BeanWrapper for the new instance */ protected BeanWrapper autowireConstructor( - String beanName, RootBeanDefinition mbd, Constructor[] ctors, Object[] explicitArgs) { + String beanName, RootBeanDefinition mbd, Constructor[] ctors, @Nullable Object[] explicitArgs) { return new ConstructorResolver(this).autowireConstructor(beanName, mbd, ctors, explicitArgs); } @@ -1674,7 +1684,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac * @see #invokeInitMethods * @see #applyBeanPostProcessorsAfterInitialization */ - protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) { + protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) { if (System.getSecurityManager() != null) { AccessController.doPrivileged(new PrivilegedAction() { @Override @@ -1734,7 +1744,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac * @throws Throwable if thrown by init methods or by the invocation process * @see #invokeCustomInitMethod */ - protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd) + protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd) throws Throwable { boolean isInitializingBean = (bean instanceof InitializingBean); diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinition.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinition.java index 7b21fcb3ec8..5cdab4336d7 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinition.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinition.java @@ -31,6 +31,7 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConstructorArgumentValues; import org.springframework.core.io.DescriptiveResource; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; @@ -370,6 +371,7 @@ public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccess * @throws IllegalStateException if the bean definition does not define a bean class, * or a specified bean class name has not been resolved into an actual Class */ + @Nullable public Class getBeanClass() throws IllegalStateException { Object beanClassObject = this.beanClass; if (beanClassObject == null) { @@ -674,6 +676,7 @@ public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccess * Return a callback for creating an instance of the bean, if any. * @since 5.0 */ + @Nullable public Supplier getInstanceSupplier() { return this.instanceSupplier; } @@ -821,6 +824,7 @@ public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccess /** * Return the name of the initializer method. */ + @Nullable public String getInitMethodName() { return this.initMethodName; } @@ -853,6 +857,7 @@ public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccess /** * Return the name of the destroy method. */ + @Nullable public String getDestroyMethodName() { return this.destroyMethodName; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinitionReader.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinitionReader.java index bca9efeba92..a935bdbe266 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinitionReader.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinitionReader.java @@ -30,6 +30,7 @@ import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -119,7 +120,7 @@ public abstract class AbstractBeanDefinitionReader implements EnvironmentCapable * @see org.springframework.core.io.support.ResourcePatternResolver * @see org.springframework.core.io.support.PathMatchingResourcePatternResolver */ - public void setResourceLoader(ResourceLoader resourceLoader) { + public void setResourceLoader(@Nullable ResourceLoader resourceLoader) { this.resourceLoader = resourceLoader; } @@ -203,7 +204,7 @@ public abstract class AbstractBeanDefinitionReader implements EnvironmentCapable * @see #loadBeanDefinitions(org.springframework.core.io.Resource) * @see #loadBeanDefinitions(org.springframework.core.io.Resource[]) */ - public int loadBeanDefinitions(String location, Set actualResources) throws BeanDefinitionStoreException { + public int loadBeanDefinitions(String location, @Nullable Set actualResources) throws BeanDefinitionStoreException { ResourceLoader resourceLoader = getResourceLoader(); if (resourceLoader == null) { throw new BeanDefinitionStoreException( diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java index e4ab8b727fa..3e43d826ff4 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java @@ -71,6 +71,7 @@ import org.springframework.core.DecoratingClassLoader; import org.springframework.core.NamedThreadLocal; import org.springframework.core.ResolvableType; import org.springframework.core.convert.ConversionService; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; @@ -179,7 +180,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp * @param parentBeanFactory parent bean factory, or {@code null} if none * @see #getBean */ - public AbstractBeanFactory(BeanFactory parentBeanFactory) { + public AbstractBeanFactory(@Nullable BeanFactory parentBeanFactory) { this.parentBeanFactory = parentBeanFactory; } @@ -787,6 +788,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp * Return the custom TypeConverter to use, if any. * @return the custom TypeConverter, or {@code null} if none specified */ + @Nullable protected TypeConverter getCustomTypeConverter() { return this.typeConverter; } @@ -1228,7 +1230,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp * @throws BeanDefinitionStoreException in case of an invalid bean definition */ protected RootBeanDefinition getMergedBeanDefinition( - String beanName, BeanDefinition bd, BeanDefinition containingBd) + String beanName, BeanDefinition bd, @Nullable BeanDefinition containingBd) throws BeanDefinitionStoreException { synchronized (this.mergedBeanDefinitions) { @@ -1310,7 +1312,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp * @param args the arguments for bean creation, if any * @throws BeanDefinitionStoreException in case of validation failure */ - protected void checkMergedBeanDefinition(RootBeanDefinition mbd, String beanName, Object[] args) + protected void checkMergedBeanDefinition(RootBeanDefinition mbd, String beanName, @Nullable Object[] args) throws BeanDefinitionStoreException { if (mbd.isAbstract()) { @@ -1355,6 +1357,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp * @return the resolved bean class (or {@code null} if none) * @throws CannotLoadBeanClassException if we failed to load the class */ + @Nullable protected Class resolveBeanClass(final RootBeanDefinition mbd, String beanName, final Class... typesToMatch) throws CannotLoadBeanClassException { try { @@ -1460,6 +1463,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp * (also signals that the returned {@code Class} will never be exposed to application code) * @return the type of the bean, or {@code null} if not predictable */ + @Nullable protected Class predictBeanType(String beanName, RootBeanDefinition mbd, Class... typesToMatch) { Class targetType = mbd.getTargetType(); if (targetType != null) { @@ -1496,6 +1500,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp * @see org.springframework.beans.factory.FactoryBean#getObjectType() * @see #getBean(String) */ + @Nullable protected Class getTypeForFactoryBean(String beanName, RootBeanDefinition mbd) { if (!mbd.isSingleton()) { return null; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AutowireCandidateResolver.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AutowireCandidateResolver.java index a1e2eaf9f14..37ef03304d9 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AutowireCandidateResolver.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AutowireCandidateResolver.java @@ -18,6 +18,7 @@ package org.springframework.beans.factory.support; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.DependencyDescriptor; +import org.springframework.lang.Nullable; /** * Strategy interface for determining whether a specific bean definition @@ -64,6 +65,7 @@ public interface AutowireCandidateResolver { * or {@code null} if none found * @since 3.0 */ + @Nullable default Object getSuggestedValue(DependencyDescriptor descriptor) { return null; } @@ -78,6 +80,7 @@ public interface AutowireCandidateResolver { * or {@code null} if straight resolution is to be performed * @since 4.0 */ + @Nullable default Object getLazyResolutionProxyIfNecessary(DependencyDescriptor descriptor, String beanName) { return null; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionReader.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionReader.java index bd8b8f51b50..e14a7dc4839 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionReader.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionReader.java @@ -19,6 +19,7 @@ package org.springframework.beans.factory.support; import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; +import org.springframework.lang.Nullable; /** * Simple interface for bean definition readers. @@ -70,6 +71,7 @@ public interface BeanDefinitionReader { * but rather to just register bean definitions with class names, * with the corresponding Classes to be resolved later (or never). */ + @Nullable ClassLoader getBeanClassLoader(); /** diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionReaderUtils.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionReaderUtils.java index 8a745dab2c8..1098273a3d7 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionReaderUtils.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionReaderUtils.java @@ -20,6 +20,7 @@ import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -54,7 +55,7 @@ public class BeanDefinitionReaderUtils { * @throws ClassNotFoundException if the bean class could not be loaded */ public static AbstractBeanDefinition createBeanDefinition( - String parentName, String className, ClassLoader classLoader) throws ClassNotFoundException { + @Nullable String parentName, @Nullable String className, @Nullable ClassLoader classLoader) throws ClassNotFoundException { GenericBeanDefinition bd = new GenericBeanDefinition(); bd.setParentName(parentName); diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionValueResolver.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionValueResolver.java index 29acd9c9d8f..7d60ad437b2 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionValueResolver.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanDefinitionValueResolver.java @@ -37,6 +37,7 @@ import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.RuntimeBeanNameReference; import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.config.TypedStringValue; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -100,7 +101,7 @@ class BeanDefinitionValueResolver { * @param value the value object to resolve * @return the resolved object */ - public Object resolveValueIfNecessary(Object argName, Object value) { + public Object resolveValueIfNecessary(Object argName, @Nullable Object value) { // We must check each value to see whether it requires a runtime reference // to another bean to be resolved. if (value instanceof RuntimeBeanReference) { @@ -262,6 +263,7 @@ class BeanDefinitionValueResolver { * @throws ClassNotFoundException if the specified type cannot be resolved * @see TypedStringValue#resolveTargetType */ + @Nullable protected Class resolveTargetType(TypedStringValue value) throws ClassNotFoundException { if (value.hasTargetType()) { return value.getTargetType(); diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/CglibSubclassingInstantiationStrategy.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/CglibSubclassingInstantiationStrategy.java index cbb9d2f1536..0c140d4793b 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/CglibSubclassingInstantiationStrategy.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/CglibSubclassingInstantiationStrategy.java @@ -36,6 +36,7 @@ import org.springframework.cglib.proxy.Factory; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import org.springframework.cglib.proxy.NoOp; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -111,7 +112,7 @@ public class CglibSubclassingInstantiationStrategy extends SimpleInstantiationSt * Ignored if the {@code ctor} parameter is {@code null}. * @return new instance of the dynamically generated subclass */ - public Object instantiate(Constructor ctor, Object... args) { + public Object instantiate(@Nullable Constructor ctor, Object... args) { Class subclass = createEnhancedSubclass(this.beanDefinition); Object instance; if (ctor == null) { diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java index 1fb4c1e6bd2..399e437c959 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java @@ -49,6 +49,7 @@ import org.springframework.core.GenericTypeResolver; import org.springframework.core.MethodParameter; import org.springframework.core.NamedThreadLocal; import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.MethodInvoker; import org.springframework.util.ObjectUtils; @@ -100,7 +101,7 @@ class ConstructorResolver { * @return a BeanWrapper for the new instance */ public BeanWrapper autowireConstructor(final String beanName, final RootBeanDefinition mbd, - Constructor[] chosenCtors, final Object[] explicitArgs) { + @Nullable Constructor[] chosenCtors, @Nullable final Object[] explicitArgs) { BeanWrapperImpl bw = new BeanWrapperImpl(); this.beanFactory.initBeanWrapper(bw); @@ -353,8 +354,9 @@ class ConstructorResolver { * method, or {@code null} if none (-> use constructor argument values from bean definition) * @return a BeanWrapper for the new instance */ + @Nullable public BeanWrapper instantiateUsingFactoryMethod( - final String beanName, final RootBeanDefinition mbd, final Object[] explicitArgs) { + final String beanName, final RootBeanDefinition mbd, @Nullable final Object[] explicitArgs) { BeanWrapperImpl bw = new BeanWrapperImpl(); this.beanFactory.initBeanWrapper(bw); @@ -924,6 +926,7 @@ class ConstructorResolver { */ private static class ConstructorPropertiesChecker { + @Nullable public static String[] evaluate(Constructor candidate, int paramCount) { ConstructorProperties cp = candidate.getAnnotation(ConstructorProperties.class); if (cp != null) { diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java index e5f7465fc79..d0f14b96df1 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java @@ -41,6 +41,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; + import javax.inject.Provider; import org.springframework.beans.BeanUtils; @@ -72,6 +73,7 @@ import org.springframework.beans.factory.config.NamedBeanHolder; import org.springframework.core.OrderComparator; import org.springframework.core.ResolvableType; import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CompositeIterator; @@ -269,6 +271,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto * Return the dependency comparator for this BeanFactory (may be {@code null}. * @since 4.0 */ + @Nullable public Comparator getDependencyComparator() { return this.dependencyComparator; } @@ -987,6 +990,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto } @SuppressWarnings("unchecked") + @Nullable private NamedBeanHolder resolveNamedBean(Class requiredType, Object... args) throws BeansException { Assert.notNull(requiredType, "Required type must not be null"); String[] candidateNames = getBeanNamesForType(requiredType); @@ -1059,6 +1063,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto } } + @Nullable public Object doResolveDependency(DependencyDescriptor descriptor, String beanName, Set autowiredBeanNames, TypeConverter typeConverter) throws BeansException { @@ -1315,6 +1320,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto * @param descriptor the target dependency to match against * @return the name of the autowire candidate, or {@code null} if none found */ + @Nullable protected String determineAutowireCandidate(Map candidates, DependencyDescriptor descriptor) { Class requiredType = descriptor.getDependencyType(); String primaryCandidate = determinePrimaryCandidate(candidates, requiredType); @@ -1345,6 +1351,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto * @return the name of the primary candidate, or {@code null} if none found * @see #isPrimary(String, Object) */ + @Nullable protected String determinePrimaryCandidate(Map candidates, Class requiredType) { String primaryBeanName = null; for (Map.Entry entry : candidates.entrySet()) { @@ -1382,6 +1389,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto * or {@code null} if none found * @see #getPriority(Object) */ + @Nullable protected String determineHighestPriorityCandidate(Map candidates, Class requiredType) { String highestPriorityBeanName = null; Integer highestPriority = null; @@ -1438,6 +1446,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto * @param beanInstance the bean instance to check (can be {@code null}) * @return the priority assigned to that bean or {@code null} if none is set */ + @Nullable protected Integer getPriority(Object beanInstance) { Comparator comparator = getDependencyComparator(); if (comparator instanceof OrderComparator) { @@ -1727,6 +1736,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto return sources.toArray(new Object[sources.size()]); } + @Nullable private RootBeanDefinition getRootBeanDefinition(String beanName) { if (beanName != null && containsBeanDefinition(beanName)) { BeanDefinition bd = getMergedBeanDefinition(beanName); diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistry.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistry.java index 077c7804ee8..4ac4c91a1af 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistry.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistry.java @@ -36,6 +36,7 @@ import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.config.SingletonBeanRegistry; import org.springframework.core.SimpleAliasRegistry; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -181,6 +182,7 @@ public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements * @param allowEarlyReference whether early references should be created or not * @return the registered singleton object, or {@code null} if none found */ + @Nullable protected Object getSingleton(String beanName, boolean allowEarlyReference) { Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) { diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/DisposableBeanAdapter.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/DisposableBeanAdapter.java index 9f4e33d7f3e..5aa6a59164d 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/DisposableBeanAdapter.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/DisposableBeanAdapter.java @@ -34,6 +34,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; @@ -175,6 +176,7 @@ class DisposableBeanAdapter implements DisposableBean, Runnable, Serializable { *

Also processes the {@link java.io.Closeable} and {@link java.lang.AutoCloseable} * interfaces, reflectively calling the "close" method on implementing beans as well. */ + @Nullable private String inferDestroyMethodIfNecessary(Object bean, RootBeanDefinition beanDefinition) { String destroyMethodName = beanDefinition.getDestroyMethodName(); if (AbstractBeanDefinition.INFER_METHOD.equals(destroyMethodName) || diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/FactoryBeanRegistrySupport.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/FactoryBeanRegistrySupport.java index e83bec36336..42a15829361 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/FactoryBeanRegistrySupport.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/FactoryBeanRegistrySupport.java @@ -29,6 +29,7 @@ import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.BeanCurrentlyInCreationException; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.FactoryBeanNotInitializedException; +import org.springframework.lang.Nullable; /** * Support base class for singleton registries which need to handle @@ -52,6 +53,7 @@ public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanReg * @return the FactoryBean's object type, * or {@code null} if the type cannot be determined yet */ + @Nullable protected Class getTypeForFactoryBean(final FactoryBean factoryBean) { try { if (System.getSecurityManager() != null) { @@ -81,6 +83,7 @@ public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanReg * @return the object obtained from the FactoryBean, * or {@code null} if not available */ + @Nullable protected Object getCachedObjectForFactoryBean(String beanName) { Object object = this.factoryBeanObjectCache.get(beanName); return (object != NULL_OBJECT ? object : null); diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/GenericTypeAwareAutowireCandidateResolver.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/GenericTypeAwareAutowireCandidateResolver.java index 7ffbed3e0e5..20527340967 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/GenericTypeAwareAutowireCandidateResolver.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/GenericTypeAwareAutowireCandidateResolver.java @@ -26,6 +26,7 @@ import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.DependencyDescriptor; import org.springframework.core.ResolvableType; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -131,6 +132,7 @@ public class GenericTypeAwareAutowireCandidateResolver extends SimpleAutowireCan return dependencyType.isAssignableFrom(targetType); } + @Nullable protected RootBeanDefinition getResolvedDecoratedDefinition(RootBeanDefinition rbd) { BeanDefinitionHolder decDef = rbd.getDecoratedDefinition(); if (decDef != null && this.beanFactory instanceof ConfigurableListableBeanFactory) { @@ -145,6 +147,7 @@ public class GenericTypeAwareAutowireCandidateResolver extends SimpleAutowireCan return null; } + @Nullable protected ResolvableType getReturnTypeForFactoryMethod(RootBeanDefinition rbd, DependencyDescriptor descriptor) { // Should typically be set for any kind of factory method, since the BeanFactory // pre-resolves them before reaching out to the AutowireCandidateResolver... diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/InstantiationStrategy.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/InstantiationStrategy.java index 6aec7e8aa37..f4a84638ae8 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/InstantiationStrategy.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/InstantiationStrategy.java @@ -21,6 +21,7 @@ import java.lang.reflect.Method; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; +import org.springframework.lang.Nullable; /** * Interface responsible for creating instances corresponding to a root bean definition. @@ -44,7 +45,7 @@ public interface InstantiationStrategy { * @return a bean instance for this bean definition * @throws BeansException if the instantiation attempt failed */ - Object instantiate(RootBeanDefinition bd, String beanName, BeanFactory owner) + Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) throws BeansException; /** @@ -60,7 +61,7 @@ public interface InstantiationStrategy { * @return a bean instance for this bean definition * @throws BeansException if the instantiation attempt failed */ - Object instantiate(RootBeanDefinition bd, String beanName, BeanFactory owner, + Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner, Constructor ctor, Object... args) throws BeansException; /** @@ -78,7 +79,7 @@ public interface InstantiationStrategy { * @return a bean instance for this bean definition * @throws BeansException if the instantiation attempt failed */ - Object instantiate(RootBeanDefinition bd, String beanName, BeanFactory owner, - Object factoryBean, Method factoryMethod, Object... args) throws BeansException; + Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner, + @Nullable Object factoryBean, Method factoryMethod, Object... args) throws BeansException; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/LookupOverride.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/LookupOverride.java index 1a92d8bc40e..6fcc4e3f3b0 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/LookupOverride.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/LookupOverride.java @@ -19,6 +19,7 @@ package org.springframework.beans.factory.support; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -43,7 +44,7 @@ public class LookupOverride extends MethodOverride { * @param beanName the name of the bean in the current {@code BeanFactory} * that the overridden method should return (may be {@code null}) */ - public LookupOverride(String methodName, String beanName) { + public LookupOverride(String methodName, @Nullable String beanName) { super(methodName); this.beanName = beanName; } @@ -54,7 +55,7 @@ public class LookupOverride extends MethodOverride { * @param beanName the name of the bean in the current {@code BeanFactory} * that the overridden method should return (may be {@code null}) */ - public LookupOverride(Method method, String beanName) { + public LookupOverride(Method method, @Nullable String beanName) { super(method.getName()); this.method = method; this.beanName = beanName; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/MethodOverrides.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/MethodOverrides.java index 11b98753e9b..2d52488ad4e 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/MethodOverrides.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/MethodOverrides.java @@ -21,6 +21,8 @@ import java.util.Collections; import java.util.LinkedHashSet; import java.util.Set; +import org.springframework.lang.Nullable; + /** * Set of method overrides, determining which, if any, methods on a * managed object the Spring IoC container will override at runtime. @@ -95,6 +97,7 @@ public class MethodOverrides { * @param method method to check for overrides for * @return the method override, or {@code null} if none */ + @Nullable public MethodOverride getOverride(Method method) { if (!this.modified) { return null; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/PropertiesBeanDefinitionReader.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/PropertiesBeanDefinitionReader.java index 8797b54afd7..d48f80dae48 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/PropertiesBeanDefinitionReader.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/PropertiesBeanDefinitionReader.java @@ -34,6 +34,7 @@ import org.springframework.beans.factory.config.ConstructorArgumentValues; import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.core.io.Resource; import org.springframework.core.io.support.EncodedResource; +import org.springframework.lang.Nullable; import org.springframework.util.DefaultPropertiesPersister; import org.springframework.util.PropertiesPersister; import org.springframework.util.StringUtils; @@ -217,7 +218,7 @@ public class PropertiesBeanDefinitionReader extends AbstractBeanDefinitionReader * @return the number of bean definitions found * @throws BeanDefinitionStoreException in case of loading or parsing errors */ - public int loadBeanDefinitions(Resource resource, String prefix) throws BeanDefinitionStoreException { + public int loadBeanDefinitions(Resource resource, @Nullable String prefix) throws BeanDefinitionStoreException { return loadBeanDefinitions(new EncodedResource(resource), prefix); } @@ -241,7 +242,7 @@ public class PropertiesBeanDefinitionReader extends AbstractBeanDefinitionReader * @return the number of bean definitions found * @throws BeanDefinitionStoreException in case of loading or parsing errors */ - public int loadBeanDefinitions(EncodedResource encodedResource, String prefix) + public int loadBeanDefinitions(EncodedResource encodedResource, @Nullable String prefix) throws BeanDefinitionStoreException { Properties props = new Properties(); @@ -287,7 +288,7 @@ public class PropertiesBeanDefinitionReader extends AbstractBeanDefinitionReader * @return the number of bean definitions found * @throws BeanDefinitionStoreException in case of loading or parsing errors */ - public int registerBeanDefinitions(ResourceBundle rb, String prefix) throws BeanDefinitionStoreException { + public int registerBeanDefinitions(ResourceBundle rb, @Nullable String prefix) throws BeanDefinitionStoreException { // Simply create a map and call overloaded method. Map map = new HashMap<>(); Enumeration keys = rb.getKeys(); @@ -324,7 +325,7 @@ public class PropertiesBeanDefinitionReader extends AbstractBeanDefinitionReader * @return the number of bean definitions found * @throws BeansException in case of loading or parsing errors */ - public int registerBeanDefinitions(Map map, String prefix) throws BeansException { + public int registerBeanDefinitions(Map map, @Nullable String prefix) throws BeansException { return registerBeanDefinitions(map, prefix, "Map " + map); } @@ -342,7 +343,7 @@ public class PropertiesBeanDefinitionReader extends AbstractBeanDefinitionReader * @throws BeansException in case of loading or parsing errors * @see #registerBeanDefinitions(Map, String) */ - public int registerBeanDefinitions(Map map, String prefix, String resourceDescription) + public int registerBeanDefinitions(Map map, @Nullable String prefix, String resourceDescription) throws BeansException { if (prefix == null) { diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java index 31ab2a08663..32704c2cc74 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java @@ -29,6 +29,7 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.ConstructorArgumentValues; import org.springframework.core.ResolvableType; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -251,6 +252,7 @@ public class RootBeanDefinition extends AbstractBeanDefinition { /** * Return the target definition that is being decorated by this bean definition, if any. */ + @Nullable public BeanDefinitionHolder getDecoratedDefinition() { return this.decoratedDefinition; } @@ -271,6 +273,7 @@ public class RootBeanDefinition extends AbstractBeanDefinition { * Otherwise, the factory method and target class will be checked. * @since 4.3.3 */ + @Nullable public AnnotatedElement getQualifiedElement() { return this.qualifiedElement; } @@ -323,6 +326,7 @@ public class RootBeanDefinition extends AbstractBeanDefinition { * Return the resolved factory method as a Java Method object, if available. * @return the factory method, or {@code null} if not found or not resolved yet */ + @Nullable public Method getResolvedFactoryMethod() { synchronized (this.constructorArgumentLock) { Executable candidate = this.resolvedConstructorOrFactoryMethod; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/SimpleInstantiationStrategy.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/SimpleInstantiationStrategy.java index 59fbdaac644..7393fd5aa58 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/SimpleInstantiationStrategy.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/SimpleInstantiationStrategy.java @@ -27,6 +27,7 @@ import org.springframework.beans.BeanInstantiationException; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.lang.Nullable; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; @@ -50,6 +51,7 @@ public class SimpleInstantiationStrategy implements InstantiationStrategy { *

Allows factory method implementations to determine whether the current * caller is the container itself as opposed to user code. */ + @Nullable public static Method getCurrentlyInvokedFactoryMethod() { return currentlyInvokedFactoryMethod.get(); } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/SimpleSecurityContextProvider.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/SimpleSecurityContextProvider.java index 15aed4c50d0..8568a321b1f 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/SimpleSecurityContextProvider.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/SimpleSecurityContextProvider.java @@ -19,6 +19,8 @@ package org.springframework.beans.factory.support; import java.security.AccessControlContext; import java.security.AccessController; +import org.springframework.lang.Nullable; + /** * Simple {@link SecurityContextProvider} implementation. * @@ -46,7 +48,7 @@ public class SimpleSecurityContextProvider implements SecurityContextProvider { * @param acc access control context (can be {@code null}) * @see AccessController#getContext() */ - public SimpleSecurityContextProvider(AccessControlContext acc) { + public SimpleSecurityContextProvider(@Nullable AccessControlContext acc) { this.acc = acc; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/package-info.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/package-info.java index 2f90e25600a..df8d1de0ee3 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/package-info.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/package-info.java @@ -2,4 +2,7 @@ * Classes supporting the {@code org.springframework.beans.factory} package. * Contains abstract base classes for {@code BeanFactory} implementations. */ +@NonNullApi package org.springframework.beans.factory.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/wiring/BeanConfigurerSupport.java b/spring-beans/src/main/java/org/springframework/beans/factory/wiring/BeanConfigurerSupport.java index ccfd90f96a9..a1e4a9f4220 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/wiring/BeanConfigurerSupport.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/wiring/BeanConfigurerSupport.java @@ -26,6 +26,7 @@ import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -89,6 +90,7 @@ public class BeanConfigurerSupport implements BeanFactoryAware, InitializingBean *

The default implementation builds a {@link ClassNameBeanWiringInfoResolver}. * @return the default BeanWiringInfoResolver (never {@code null}) */ + @Nullable protected BeanWiringInfoResolver createDefaultBeanWiringInfoResolver() { return new ClassNameBeanWiringInfoResolver(); } @@ -118,7 +120,7 @@ public class BeanConfigurerSupport implements BeanFactoryAware, InitializingBean * Typically called by an aspect, for all bean instances matched by a pointcut. * @param beanInstance the bean instance to configure (must not be {@code null}) */ - public void configureBean(Object beanInstance) { + public void configureBean(@Nullable Object beanInstance) { if (this.beanFactory == null) { if (logger.isDebugEnabled()) { logger.debug("BeanFactory has not been set on " + ClassUtils.getShortName(getClass()) + ": " + diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/wiring/BeanWiringInfo.java b/spring-beans/src/main/java/org/springframework/beans/factory/wiring/BeanWiringInfo.java index 67f32d5d2c4..eaeafb220ef 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/wiring/BeanWiringInfo.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/wiring/BeanWiringInfo.java @@ -17,6 +17,7 @@ package org.springframework.beans.factory.wiring; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -118,6 +119,7 @@ public class BeanWiringInfo { /** * Return the specific bean name that this BeanWiringInfo points to, if any. */ + @Nullable public String getBeanName() { return this.beanName; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/wiring/BeanWiringInfoResolver.java b/spring-beans/src/main/java/org/springframework/beans/factory/wiring/BeanWiringInfoResolver.java index c306cb70bb1..97b279c3557 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/wiring/BeanWiringInfoResolver.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/wiring/BeanWiringInfoResolver.java @@ -16,6 +16,8 @@ package org.springframework.beans.factory.wiring; +import org.springframework.lang.Nullable; + /** * Strategy interface to be implemented by objects than can resolve bean name * information, given a newly instantiated bean object. Invocations to the @@ -39,6 +41,7 @@ public interface BeanWiringInfoResolver { * @param beanInstance the bean instance to resolve info for * @return the BeanWiringInfo, or {@code null} if not found */ + @Nullable BeanWiringInfo resolveWiringInfo(Object beanInstance); } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/wiring/package-info.java b/spring-beans/src/main/java/org/springframework/beans/factory/wiring/package-info.java index 5f5c9d62092..eac2388aeca 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/wiring/package-info.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/wiring/package-info.java @@ -2,4 +2,7 @@ * Mechanism to determine bean wiring metadata from a bean instance. * Foundation for aspect-driven bean configuration. */ +@NonNullApi package org.springframework.beans.factory.wiring; + +import org.springframework.lang.NonNullApi; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/xml/AbstractSingleBeanDefinitionParser.java b/spring-beans/src/main/java/org/springframework/beans/factory/xml/AbstractSingleBeanDefinitionParser.java index ec5d3687400..1310fc513b8 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/xml/AbstractSingleBeanDefinitionParser.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/xml/AbstractSingleBeanDefinitionParser.java @@ -20,6 +20,7 @@ import org.w3c.dom.Element; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.lang.Nullable; /** * Base class for those {@link BeanDefinitionParser} implementations that @@ -95,6 +96,7 @@ public abstract class AbstractSingleBeanDefinitionParser extends AbstractBeanDef * @return the name of the parent bean for the currently parsed bean, * or {@code null} if none */ + @Nullable protected String getParentName(Element element) { return null; } @@ -111,6 +113,7 @@ public abstract class AbstractSingleBeanDefinitionParser extends AbstractBeanDef * the supplied {@code Element}, or {@code null} if none * @see #getBeanClassName */ + @Nullable protected Class getBeanClass(Element element) { return null; } @@ -122,6 +125,7 @@ public abstract class AbstractSingleBeanDefinitionParser extends AbstractBeanDef * the supplied {@code Element}, or {@code null} if none * @see #getBeanClass */ + @Nullable protected String getBeanClassName(Element element) { return null; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/xml/BeanDefinitionParser.java b/spring-beans/src/main/java/org/springframework/beans/factory/xml/BeanDefinitionParser.java index 2c92ecd4775..80379c57bf1 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/xml/BeanDefinitionParser.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/xml/BeanDefinitionParser.java @@ -19,6 +19,7 @@ package org.springframework.beans.factory.xml; import org.w3c.dom.Element; import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.lang.Nullable; /** * Interface used by the {@link DefaultBeanDefinitionDocumentReader} to handle custom, @@ -51,6 +52,7 @@ public interface BeanDefinitionParser { * provides access to a {@link org.springframework.beans.factory.support.BeanDefinitionRegistry} * @return the primary {@link BeanDefinition} */ + @Nullable BeanDefinition parse(Element element, ParserContext parserContext); } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/xml/BeanDefinitionParserDelegate.java b/spring-beans/src/main/java/org/springframework/beans/factory/xml/BeanDefinitionParserDelegate.java index 6d7b210e62b..1b8bd0b0524 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/xml/BeanDefinitionParserDelegate.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/xml/BeanDefinitionParserDelegate.java @@ -58,6 +58,7 @@ import org.springframework.beans.factory.support.ManagedProperties; import org.springframework.beans.factory.support.ManagedSet; import org.springframework.beans.factory.support.MethodOverrides; import org.springframework.beans.factory.support.ReplaceOverride; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; @@ -322,7 +323,7 @@ public class BeanDefinitionParserDelegate { * @param parentDefaults the parent BeanDefinitionParserDelegate (if any) defaults to fall back to * @param root the root element of the current bean definition document (or nested beans element) */ - protected void populateDefaults(DocumentDefaultsDefinition defaults, DocumentDefaultsDefinition parentDefaults, Element root) { + protected void populateDefaults(DocumentDefaultsDefinition defaults, @Nullable DocumentDefaultsDefinition parentDefaults, Element root) { String lazyInit = root.getAttribute(DEFAULT_LAZY_INIT_ATTRIBUTE); if (DEFAULT_VALUE.equals(lazyInit)) { // Potentially inherited from outer sections, otherwise falling back to false. @@ -372,6 +373,7 @@ public class BeanDefinitionParserDelegate { * Return the defaults definition object, or {@code null} if the * defaults have been initialized yet. */ + @Nullable public DocumentDefaultsDefinition getDefaults() { return this.defaults; } @@ -404,6 +406,7 @@ public class BeanDefinitionParserDelegate { * if there were errors during parse. Errors are reported to the * {@link org.springframework.beans.factory.parsing.ProblemReporter}. */ + @Nullable public BeanDefinitionHolder parseBeanDefinitionElement(Element ele) { return parseBeanDefinitionElement(ele, null); } @@ -413,6 +416,7 @@ public class BeanDefinitionParserDelegate { * if there were errors during parse. Errors are reported to the * {@link org.springframework.beans.factory.parsing.ProblemReporter}. */ + @Nullable public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, BeanDefinition containingBean) { String id = ele.getAttribute(ID_ATTRIBUTE); String nameAttr = ele.getAttribute(NAME_ATTRIBUTE); @@ -498,6 +502,7 @@ public class BeanDefinitionParserDelegate { * Parse the bean definition itself, without regard to name or aliases. May return * {@code null} if problems occurred during the parsing of the bean definition. */ + @Nullable public AbstractBeanDefinition parseBeanDefinitionElement( Element ele, String beanName, BeanDefinition containingBean) { @@ -901,6 +906,7 @@ public class BeanDefinitionParserDelegate { * Get the value of a property element. May be a list etc. * Also used for constructor arguments, "propertyName" being null in this case. */ + @Nullable public Object parsePropertyValue(Element ele, BeanDefinition bd, String propertyName) { String elementName = (propertyName != null) ? " element for property '" + propertyName + "'" : @@ -966,6 +972,7 @@ public class BeanDefinitionParserDelegate { * @param defaultValueType the default type (class name) for any * {@code } tag that might be created */ + @Nullable public Object parsePropertySubElement(Element ele, BeanDefinition bd, String defaultValueType) { if (!isDefaultNamespace(ele)) { return parseNestedCustomElement(ele, bd); @@ -1035,6 +1042,7 @@ public class BeanDefinitionParserDelegate { /** * Return a typed String value Object for the given 'idref' element. */ + @Nullable public Object parseIdRefElement(Element ele) { // A generic reference to any name of any bean. String refName = ele.getAttribute(BEAN_REF_ATTRIBUTE); @@ -1346,6 +1354,7 @@ public class BeanDefinitionParserDelegate { return parseCustomElement(ele, null); } + @Nullable public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) { String namespaceUri = getNamespaceURI(ele); NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri); @@ -1405,6 +1414,7 @@ public class BeanDefinitionParserDelegate { return originalDef; } + @Nullable private BeanDefinitionHolder parseNestedCustomElement(Element ele, BeanDefinition containingBd) { BeanDefinition innerDefinition = parseCustomElement(ele, containingBd); if (innerDefinition == null) { diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/xml/BeansDtdResolver.java b/spring-beans/src/main/java/org/springframework/beans/factory/xml/BeansDtdResolver.java index dba29ca05fc..3411deb2c6c 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/xml/BeansDtdResolver.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/xml/BeansDtdResolver.java @@ -25,6 +25,7 @@ import org.xml.sax.InputSource; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; /** * EntityResolver implementation for the Spring beans DTD, @@ -50,6 +51,7 @@ public class BeansDtdResolver implements EntityResolver { @Override + @Nullable public InputSource resolveEntity(String publicId, String systemId) throws IOException { if (logger.isTraceEnabled()) { logger.trace("Trying to resolve XML entity with public ID [" + publicId + diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/xml/DefaultNamespaceHandlerResolver.java b/spring-beans/src/main/java/org/springframework/beans/factory/xml/DefaultNamespaceHandlerResolver.java index 36cda2df717..64540fe7511 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/xml/DefaultNamespaceHandlerResolver.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/xml/DefaultNamespaceHandlerResolver.java @@ -27,6 +27,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.FatalBeanException; import org.springframework.core.io.support.PropertiesLoaderUtils; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; @@ -85,7 +86,7 @@ public class DefaultNamespaceHandlerResolver implements NamespaceHandlerResolver * (may be {@code null}, in which case the thread context ClassLoader will be used) * @see #DEFAULT_HANDLER_MAPPINGS_LOCATION */ - public DefaultNamespaceHandlerResolver(ClassLoader classLoader) { + public DefaultNamespaceHandlerResolver(@Nullable ClassLoader classLoader) { this(classLoader, DEFAULT_HANDLER_MAPPINGS_LOCATION); } @@ -96,7 +97,7 @@ public class DefaultNamespaceHandlerResolver implements NamespaceHandlerResolver * may be {@code null}, in which case the thread context ClassLoader will be used) * @param handlerMappingsLocation the mapping file location */ - public DefaultNamespaceHandlerResolver(ClassLoader classLoader, String handlerMappingsLocation) { + public DefaultNamespaceHandlerResolver(@Nullable ClassLoader classLoader, String handlerMappingsLocation) { Assert.notNull(handlerMappingsLocation, "Handler mappings location must not be null"); this.classLoader = (classLoader != null ? classLoader : ClassUtils.getDefaultClassLoader()); this.handlerMappingsLocation = handlerMappingsLocation; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/xml/DelegatingEntityResolver.java b/spring-beans/src/main/java/org/springframework/beans/factory/xml/DelegatingEntityResolver.java index 019b9c16a2d..030198636f4 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/xml/DelegatingEntityResolver.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/xml/DelegatingEntityResolver.java @@ -22,6 +22,7 @@ import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -57,7 +58,7 @@ public class DelegatingEntityResolver implements EntityResolver { * @param classLoader the ClassLoader to use for loading * (can be {@code null}) to use the default ClassLoader) */ - public DelegatingEntityResolver(ClassLoader classLoader) { + public DelegatingEntityResolver(@Nullable ClassLoader classLoader) { this.dtdResolver = new BeansDtdResolver(); this.schemaResolver = new PluggableSchemaResolver(classLoader); } @@ -77,6 +78,7 @@ public class DelegatingEntityResolver implements EntityResolver { @Override + @Nullable public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { if (systemId != null) { if (systemId.endsWith(DTD_SUFFIX)) { diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/xml/NamespaceHandler.java b/spring-beans/src/main/java/org/springframework/beans/factory/xml/NamespaceHandler.java index 920a36fde96..bfa0529b3ef 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/xml/NamespaceHandler.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/xml/NamespaceHandler.java @@ -21,6 +21,7 @@ import org.w3c.dom.Node; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; +import org.springframework.lang.Nullable; /** * Base interface used by the {@link DefaultBeanDefinitionDocumentReader} @@ -68,6 +69,7 @@ public interface NamespaceHandler { * @param parserContext the object encapsulating the current state of the parsing process * @return the primary {@code BeanDefinition} (can be {@code null} as explained above) */ + @Nullable BeanDefinition parse(Element element, ParserContext parserContext); /** diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/xml/NamespaceHandlerResolver.java b/spring-beans/src/main/java/org/springframework/beans/factory/xml/NamespaceHandlerResolver.java index 7874ed2f195..8237d13a034 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/xml/NamespaceHandlerResolver.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/xml/NamespaceHandlerResolver.java @@ -16,6 +16,8 @@ package org.springframework.beans.factory.xml; +import org.springframework.lang.Nullable; + /** * Used by the {@link org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader} to * locate a {@link NamespaceHandler} implementation for a particular namespace URI. @@ -34,6 +36,7 @@ public interface NamespaceHandlerResolver { * @param namespaceUri the relevant namespace URI * @return the located {@link NamespaceHandler} (may be {@code null}) */ + @Nullable NamespaceHandler resolve(String namespaceUri); } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/xml/PluggableSchemaResolver.java b/spring-beans/src/main/java/org/springframework/beans/factory/xml/PluggableSchemaResolver.java index ebad84b995e..a56dc16f078 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/xml/PluggableSchemaResolver.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/xml/PluggableSchemaResolver.java @@ -30,6 +30,7 @@ import org.xml.sax.InputSource; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PropertiesLoaderUtils; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -80,7 +81,7 @@ public class PluggableSchemaResolver implements EntityResolver { * (can be {@code null}) to use the default ClassLoader) * @see PropertiesLoaderUtils#loadAllProperties(String, ClassLoader) */ - public PluggableSchemaResolver(ClassLoader classLoader) { + public PluggableSchemaResolver(@Nullable ClassLoader classLoader) { this.classLoader = classLoader; this.schemaMappingsLocation = DEFAULT_SCHEMA_MAPPINGS_LOCATION; } @@ -94,13 +95,14 @@ public class PluggableSchemaResolver implements EntityResolver { * (must not be empty) * @see PropertiesLoaderUtils#loadAllProperties(String, ClassLoader) */ - public PluggableSchemaResolver(ClassLoader classLoader, String schemaMappingsLocation) { + public PluggableSchemaResolver(@Nullable ClassLoader classLoader, String schemaMappingsLocation) { Assert.hasText(schemaMappingsLocation, "'schemaMappingsLocation' must not be empty"); this.classLoader = classLoader; this.schemaMappingsLocation = schemaMappingsLocation; } @Override + @Nullable public InputSource resolveEntity(String publicId, String systemId) throws IOException { if (logger.isTraceEnabled()) { logger.trace("Trying to resolve XML entity with public id [" + publicId + diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/xml/XmlBeanDefinitionReader.java b/spring-beans/src/main/java/org/springframework/beans/factory/xml/XmlBeanDefinitionReader.java index dbefa35e40e..384543fbecf 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/xml/XmlBeanDefinitionReader.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/xml/XmlBeanDefinitionReader.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.HashSet; import java.util.Set; + import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; @@ -45,6 +46,7 @@ import org.springframework.core.io.DescriptiveResource; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.support.EncodedResource; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.xml.SimpleSaxErrorHandler; import org.springframework.util.xml.XmlValidationModeDetector; @@ -369,7 +371,7 @@ public class XmlBeanDefinitionReader extends AbstractBeanDefinitionReader { * @return the number of bean definitions found * @throws BeanDefinitionStoreException in case of loading or parsing errors */ - public int loadBeanDefinitions(InputSource inputSource, String resourceDescription) + public int loadBeanDefinitions(InputSource inputSource, @Nullable String resourceDescription) throws BeanDefinitionStoreException { return doLoadBeanDefinitions(inputSource, new DescriptiveResource(resourceDescription)); diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/xml/package-info.java b/spring-beans/src/main/java/org/springframework/beans/factory/xml/package-info.java index 8b0070dafeb..949b5e791b5 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/xml/package-info.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/xml/package-info.java @@ -2,4 +2,7 @@ * Contains an abstract XML-based {@code BeanFactory} implementation, * including a standard "spring-beans" XSD. */ +@NonNullApi package org.springframework.beans.factory.xml; + +import org.springframework.lang.NonNullApi; diff --git a/spring-beans/src/main/java/org/springframework/beans/package-info.java b/spring-beans/src/main/java/org/springframework/beans/package-info.java index 6b4466dbea8..e264366a08c 100644 --- a/spring-beans/src/main/java/org/springframework/beans/package-info.java +++ b/spring-beans/src/main/java/org/springframework/beans/package-info.java @@ -9,4 +9,7 @@ * Expert One-On-One J2EE Design and Development * by Rod Johnson (Wrox, 2002). */ +@NonNullApi package org.springframework.beans; + +import org.springframework.lang.NonNullApi; diff --git a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ClassArrayEditor.java b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ClassArrayEditor.java index c63bb7c00d1..bcc1a90a6d1 100644 --- a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ClassArrayEditor.java +++ b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ClassArrayEditor.java @@ -18,6 +18,7 @@ package org.springframework.beans.propertyeditors; import java.beans.PropertyEditorSupport; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -53,7 +54,7 @@ public class ClassArrayEditor extends PropertyEditorSupport { * @param classLoader the {@code ClassLoader} to use * (or pass {@code null} for the thread context {@code ClassLoader}) */ - public ClassArrayEditor(ClassLoader classLoader) { + public ClassArrayEditor(@Nullable ClassLoader classLoader) { this.classLoader = (classLoader != null ? classLoader : ClassUtils.getDefaultClassLoader()); } diff --git a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ClassEditor.java b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ClassEditor.java index 51e630cd9b6..fcff9ad0645 100644 --- a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ClassEditor.java +++ b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ClassEditor.java @@ -18,6 +18,7 @@ package org.springframework.beans.propertyeditors; import java.beans.PropertyEditorSupport; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; @@ -52,7 +53,7 @@ public class ClassEditor extends PropertyEditorSupport { * @param classLoader the ClassLoader to use * (or {@code null} for the thread context ClassLoader) */ - public ClassEditor(ClassLoader classLoader) { + public ClassEditor(@Nullable ClassLoader classLoader) { this.classLoader = (classLoader != null ? classLoader : ClassUtils.getDefaultClassLoader()); } diff --git a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/CustomCollectionEditor.java b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/CustomCollectionEditor.java index ced9aa043de..303612b4659 100644 --- a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/CustomCollectionEditor.java +++ b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/CustomCollectionEditor.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.SortedSet; import java.util.TreeSet; +import org.springframework.lang.Nullable; import org.springframework.util.ReflectionUtils; /** @@ -207,6 +208,7 @@ public class CustomCollectionEditor extends PropertyEditorSupport { * there is no appropriate text representation. */ @Override + @Nullable public String getAsText() { return null; } diff --git a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/CustomMapEditor.java b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/CustomMapEditor.java index afb393576a9..1f85ee721e1 100644 --- a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/CustomMapEditor.java +++ b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/CustomMapEditor.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; +import org.springframework.lang.Nullable; import org.springframework.util.ReflectionUtils; /** @@ -199,6 +200,7 @@ public class CustomMapEditor extends PropertyEditorSupport { * there is no appropriate text representation. */ @Override + @Nullable public String getAsText() { return null; } diff --git a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/InputStreamEditor.java b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/InputStreamEditor.java index dc9823935aa..9d5c8542117 100644 --- a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/InputStreamEditor.java +++ b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/InputStreamEditor.java @@ -21,6 +21,7 @@ import java.io.IOException; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceEditor; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -80,6 +81,7 @@ public class InputStreamEditor extends PropertyEditorSupport { * there is no appropriate text representation. */ @Override + @Nullable public String getAsText() { return null; } diff --git a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ReaderEditor.java b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ReaderEditor.java index 894d97709ee..bbed9e85790 100644 --- a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ReaderEditor.java +++ b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ReaderEditor.java @@ -22,6 +22,7 @@ import java.io.IOException; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceEditor; import org.springframework.core.io.support.EncodedResource; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -80,6 +81,7 @@ public class ReaderEditor extends PropertyEditorSupport { * there is no appropriate text representation. */ @Override + @Nullable public String getAsText() { return null; } diff --git a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/URIEditor.java b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/URIEditor.java index 7dc173a0d26..56537ca9554 100644 --- a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/URIEditor.java +++ b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/URIEditor.java @@ -22,6 +22,7 @@ import java.net.URI; import java.net.URISyntaxException; import org.springframework.core.io.ClassPathResource; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ResourceUtils; import org.springframework.util.StringUtils; @@ -79,7 +80,7 @@ public class URIEditor extends PropertyEditorSupport { * @param classLoader the ClassLoader to use for resolving "classpath:" locations * (may be {@code null} to indicate the default ClassLoader) */ - public URIEditor(ClassLoader classLoader) { + public URIEditor(@Nullable ClassLoader classLoader) { this(classLoader, true); } @@ -90,7 +91,7 @@ public class URIEditor extends PropertyEditorSupport { * (may be {@code null} to indicate the default ClassLoader) * @param encode indicates whether Strings will be encoded or not */ - public URIEditor(ClassLoader classLoader, boolean encode) { + public URIEditor(@Nullable ClassLoader classLoader, boolean encode) { this.classLoader = (classLoader != null ? classLoader : ClassUtils.getDefaultClassLoader()); this.encode = encode; } diff --git a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/package-info.java b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/package-info.java index 755aee3ae88..45e18cc8518 100644 --- a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/package-info.java +++ b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/package-info.java @@ -6,4 +6,7 @@ * "CustomXxxEditor" classes are intended for manual registration in * specific binding processes, as they are localized or the like. */ +@NonNullApi package org.springframework.beans.propertyeditors; + +import org.springframework.lang.NonNullApi; diff --git a/spring-beans/src/main/java/org/springframework/beans/support/ArgumentConvertingMethodInvoker.java b/spring-beans/src/main/java/org/springframework/beans/support/ArgumentConvertingMethodInvoker.java index ebdf6a494bb..72912d5e320 100644 --- a/spring-beans/src/main/java/org/springframework/beans/support/ArgumentConvertingMethodInvoker.java +++ b/spring-beans/src/main/java/org/springframework/beans/support/ArgumentConvertingMethodInvoker.java @@ -23,6 +23,7 @@ import org.springframework.beans.PropertyEditorRegistry; import org.springframework.beans.SimpleTypeConverter; import org.springframework.beans.TypeConverter; import org.springframework.beans.TypeMismatchException; +import org.springframework.lang.Nullable; import org.springframework.util.MethodInvoker; import org.springframework.util.ReflectionUtils; @@ -127,6 +128,7 @@ public class ArgumentConvertingMethodInvoker extends MethodInvoker { * @param arguments the argument values to match against method parameters * @return a matching method, or {@code null} if none */ + @Nullable protected Method doFindMatchingMethod(Object[] arguments) { TypeConverter converter = getTypeConverter(); if (converter != null) { diff --git a/spring-beans/src/main/java/org/springframework/beans/support/PropertyComparator.java b/spring-beans/src/main/java/org/springframework/beans/support/PropertyComparator.java index c50251174ed..6eb876a3c14 100644 --- a/spring-beans/src/main/java/org/springframework/beans/support/PropertyComparator.java +++ b/spring-beans/src/main/java/org/springframework/beans/support/PropertyComparator.java @@ -26,6 +26,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeanWrapperImpl; import org.springframework.beans.BeansException; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -108,6 +109,7 @@ public class PropertyComparator implements Comparator { * @param obj the object to get the property value for * @return the property value */ + @Nullable private Object getPropertyValue(Object obj) { // If a nested property cannot be read, simply return null // (similar to JSTL EL). If the property doesn't exist in the diff --git a/spring-beans/src/main/java/org/springframework/beans/support/package-info.java b/spring-beans/src/main/java/org/springframework/beans/support/package-info.java index a4679c4737f..7147fd0293c 100644 --- a/spring-beans/src/main/java/org/springframework/beans/support/package-info.java +++ b/spring-beans/src/main/java/org/springframework/beans/support/package-info.java @@ -2,4 +2,7 @@ * Classes supporting the org.springframework.beans package, * such as utility classes for sorting and holding lists of beans. */ +@NonNullApi package org.springframework.beans.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-context-support/src/main/java/org/springframework/cache/caffeine/CaffeineCacheManager.java b/spring-context-support/src/main/java/org/springframework/cache/caffeine/CaffeineCacheManager.java index 15ebcb91acf..f09322f6021 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/caffeine/CaffeineCacheManager.java +++ b/spring-context-support/src/main/java/org/springframework/cache/caffeine/CaffeineCacheManager.java @@ -29,6 +29,7 @@ import com.github.benmanes.caffeine.cache.CaffeineSpec; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -88,7 +89,7 @@ public class CaffeineCacheManager implements CacheManager { *

Calling this with a {@code null} collection argument resets the * mode to 'dynamic', allowing for further creation of caches again. */ - public void setCacheNames(Collection cacheNames) { + public void setCacheNames(@Nullable Collection cacheNames) { if (cacheNames != null) { for (String name : cacheNames) { this.cacheMap.put(name, createCaffeineCache(name)); diff --git a/spring-context-support/src/main/java/org/springframework/cache/caffeine/package-info.java b/spring-context-support/src/main/java/org/springframework/cache/caffeine/package-info.java index 786880a748c..e98cf7f00cd 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/caffeine/package-info.java +++ b/spring-context-support/src/main/java/org/springframework/cache/caffeine/package-info.java @@ -3,4 +3,7 @@ * Caffeine library, * allowing to set up Caffeine caches within Spring's cache abstraction. */ +@NonNullApi package org.springframework.cache.caffeine; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context-support/src/main/java/org/springframework/cache/ehcache/package-info.java b/spring-context-support/src/main/java/org/springframework/cache/ehcache/package-info.java index edb951a4ce5..ba15c197014 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/ehcache/package-info.java +++ b/spring-context-support/src/main/java/org/springframework/cache/ehcache/package-info.java @@ -9,4 +9,7 @@ * Instead, consider using it through JCache (JSR-107), with * Spring's support in {@code org.springframework.cache.jcache}. */ +@NonNullApi package org.springframework.cache.ehcache; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context-support/src/main/java/org/springframework/cache/jcache/JCacheManagerFactoryBean.java b/spring-context-support/src/main/java/org/springframework/cache/jcache/JCacheManagerFactoryBean.java index 1de64fbb42d..1b58aa9da30 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/jcache/JCacheManagerFactoryBean.java +++ b/spring-context-support/src/main/java/org/springframework/cache/jcache/JCacheManagerFactoryBean.java @@ -25,6 +25,7 @@ import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; +import org.springframework.lang.Nullable; /** * {@link FactoryBean} for a JCache {@link javax.cache.CacheManager}, @@ -54,7 +55,7 @@ public class JCacheManagerFactoryBean * Specify the URI for the desired CacheManager. * Default is {@code null} (i.e. JCache's default). */ - public void setCacheManagerUri(URI cacheManagerUri) { + public void setCacheManagerUri(@Nullable URI cacheManagerUri) { this.cacheManagerUri = cacheManagerUri; } @@ -63,7 +64,7 @@ public class JCacheManagerFactoryBean * Default is {@code null} (i.e. no special properties to apply). * @see javax.cache.spi.CachingProvider#getCacheManager(URI, ClassLoader, Properties) */ - public void setCacheManagerProperties(Properties cacheManagerProperties) { + public void setCacheManagerProperties(@Nullable Properties cacheManagerProperties) { this.cacheManagerProperties = cacheManagerProperties; } diff --git a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/AbstractCacheInterceptor.java b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/AbstractCacheInterceptor.java index 800ceeec149..3fc4e4f56af 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/AbstractCacheInterceptor.java +++ b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/AbstractCacheInterceptor.java @@ -28,6 +28,7 @@ import org.springframework.cache.interceptor.AbstractCacheInvoker; import org.springframework.cache.interceptor.CacheErrorHandler; import org.springframework.cache.interceptor.CacheOperationInvocationContext; import org.springframework.cache.interceptor.CacheOperationInvoker; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; /** @@ -71,6 +72,7 @@ abstract class AbstractCacheInterceptor, A *

Throw an {@link IllegalStateException} if the collection holds more than one element * @return the single element or {@code null} if the collection is empty */ + @Nullable static Cache extractFrom(Collection caches) { if (CollectionUtils.isEmpty(caches)) { return null; diff --git a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/AbstractFallbackJCacheOperationSource.java b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/AbstractFallbackJCacheOperationSource.java index 875a55540d5..3466475a038 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/AbstractFallbackJCacheOperationSource.java +++ b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/AbstractFallbackJCacheOperationSource.java @@ -26,6 +26,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.core.BridgeMethodResolver; import org.springframework.core.MethodClassKey; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -77,6 +78,7 @@ public abstract class AbstractFallbackJCacheOperationSource implements JCacheOpe } } + @Nullable private JCacheOperation computeCacheOperation(Method method, Class targetClass) { // Don't allow no-public methods as required. if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) { @@ -113,6 +115,7 @@ public abstract class AbstractFallbackJCacheOperationSource implements JCacheOpe * @return the cache operation associated with this method * (or {@code null} if none) */ + @Nullable protected abstract JCacheOperation findCacheOperation(Method method, Class targetType); /** diff --git a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/AnnotationJCacheOperationSource.java b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/AnnotationJCacheOperationSource.java index 9f75bce7c9d..0ebf93a71ff 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/AnnotationJCacheOperationSource.java +++ b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/AnnotationJCacheOperationSource.java @@ -31,6 +31,7 @@ import javax.cache.annotation.CacheResult; import org.springframework.cache.interceptor.CacheResolver; import org.springframework.cache.interceptor.KeyGenerator; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -157,6 +158,7 @@ public abstract class AnnotationJCacheOperationSource extends AbstractFallbackJC } } + @Nullable protected CacheResolverFactory determineCacheResolverFactory(CacheDefaults defaults, Class candidate) { diff --git a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/CacheResultInterceptor.java b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/CacheResultInterceptor.java index 3f01b009c04..6cdf120ee77 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/CacheResultInterceptor.java +++ b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/CacheResultInterceptor.java @@ -23,6 +23,7 @@ import org.springframework.cache.interceptor.CacheErrorHandler; import org.springframework.cache.interceptor.CacheOperationInvocationContext; import org.springframework.cache.interceptor.CacheOperationInvoker; import org.springframework.cache.interceptor.CacheResolver; +import org.springframework.lang.Nullable; import org.springframework.util.ExceptionTypeFilter; import org.springframework.util.SerializationUtils; @@ -92,6 +93,7 @@ class CacheResultInterceptor extends AbstractKeyCacheInterceptor context) { CacheResolver exceptionCacheResolver = context.getOperation().getExceptionCacheResolver(); if (exceptionCacheResolver != null) { diff --git a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/CacheResultOperation.java b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/CacheResultOperation.java index 314fdc62a14..f421dfe850d 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/CacheResultOperation.java +++ b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/CacheResultOperation.java @@ -21,6 +21,7 @@ import javax.cache.annotation.CacheResult; import org.springframework.cache.interceptor.CacheResolver; import org.springframework.cache.interceptor.KeyGenerator; +import org.springframework.lang.Nullable; import org.springframework.util.ExceptionTypeFilter; import org.springframework.util.StringUtils; @@ -78,6 +79,7 @@ class CacheResultOperation extends AbstractJCacheKeyOperation { * caching exceptions should be disabled. * @see javax.cache.annotation.CacheResult#exceptionCacheName() */ + @Nullable public String getExceptionCacheName() { return this.exceptionCacheName; } diff --git a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/DefaultJCacheOperationSource.java b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/DefaultJCacheOperationSource.java index acc1a12ec72..efe4c2fe067 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/DefaultJCacheOperationSource.java +++ b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/DefaultJCacheOperationSource.java @@ -32,6 +32,7 @@ import org.springframework.cache.interceptor.CacheResolver; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.cache.interceptor.SimpleCacheResolver; import org.springframework.cache.interceptor.SimpleKeyGenerator; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -69,6 +70,7 @@ public class DefaultJCacheOperationSource extends AnnotationJCacheOperationSourc /** * Return the specified cache manager to use, if any. */ + @Nullable public CacheManager getCacheManager() { return this.cacheManager; } @@ -84,6 +86,7 @@ public class DefaultJCacheOperationSource extends AnnotationJCacheOperationSourc /** * Return the specified cache resolver to use, if any. */ + @Nullable public CacheResolver getCacheResolver() { return this.cacheResolver; } @@ -99,6 +102,7 @@ public class DefaultJCacheOperationSource extends AnnotationJCacheOperationSourc /** * Return the specified exception cache resolver to use, if any. */ + @Nullable public CacheResolver getExceptionCacheResolver() { return this.exceptionCacheResolver; } @@ -115,6 +119,7 @@ public class DefaultJCacheOperationSource extends AnnotationJCacheOperationSourc /** * Return the specified key generator to use, if any. */ + @Nullable public KeyGenerator getKeyGenerator() { return this.keyGenerator; } diff --git a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/JCacheOperationSource.java b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/JCacheOperationSource.java index 36177dda86b..5139282c1d5 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/JCacheOperationSource.java +++ b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/JCacheOperationSource.java @@ -18,6 +18,8 @@ package org.springframework.cache.jcache.interceptor; import java.lang.reflect.Method; +import org.springframework.lang.Nullable; + /** * Interface used by {@link JCacheInterceptor}. Implementations know how to source * cache operation attributes from standard JSR-107 annotations. @@ -37,6 +39,7 @@ public interface JCacheOperationSource { * the declaring class of the method must be used) * @return the cache operation for this method, or {@code null} if none found */ - JCacheOperation getCacheOperation(Method method, Class targetClass); + @Nullable + JCacheOperation getCacheOperation(Method method, @Nullable Class targetClass); } diff --git a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/JCacheOperationSourcePointcut.java b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/JCacheOperationSourcePointcut.java index ad19123e173..46fbd7439b4 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/JCacheOperationSourcePointcut.java +++ b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/JCacheOperationSourcePointcut.java @@ -20,6 +20,7 @@ import java.io.Serializable; import java.lang.reflect.Method; import org.springframework.aop.support.StaticMethodMatcherPointcut; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -43,6 +44,7 @@ public abstract class JCacheOperationSourcePointcut * Obtain the underlying {@link JCacheOperationSource} (may be {@code null}). * To be implemented by subclasses. */ + @Nullable protected abstract JCacheOperationSource getCacheOperationSource(); @Override diff --git a/spring-context-support/src/main/java/org/springframework/cache/jcache/package-info.java b/spring-context-support/src/main/java/org/springframework/cache/jcache/package-info.java index 59393e85a1c..aedc6c65c1c 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/jcache/package-info.java +++ b/spring-context-support/src/main/java/org/springframework/cache/jcache/package-info.java @@ -4,4 +4,7 @@ * and {@link org.springframework.cache.Cache Cache} implementation for * use in a Spring context, using a JSR-107 compliant cache provider. */ +@NonNullApi package org.springframework.cache.jcache; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context-support/src/main/java/org/springframework/cache/transaction/package-info.java b/spring-context-support/src/main/java/org/springframework/cache/transaction/package-info.java index 7d210e6fdf1..89b7e74dd2c 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/transaction/package-info.java +++ b/spring-context-support/src/main/java/org/springframework/cache/transaction/package-info.java @@ -2,4 +2,7 @@ * Transaction-aware decorators for the org.springframework.cache package. * Provides synchronization of put operations with Spring-managed transactions. */ +@NonNullApi package org.springframework.cache.transaction; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context-support/src/main/java/org/springframework/mail/javamail/ConfigurableMimeFileTypeMap.java b/spring-context-support/src/main/java/org/springframework/mail/javamail/ConfigurableMimeFileTypeMap.java index eb3f67ce6b6..75761a38e77 100644 --- a/spring-context-support/src/main/java/org/springframework/mail/javamail/ConfigurableMimeFileTypeMap.java +++ b/spring-context-support/src/main/java/org/springframework/mail/javamail/ConfigurableMimeFileTypeMap.java @@ -25,6 +25,7 @@ import javax.activation.MimetypesFileTypeMap; import org.springframework.beans.factory.InitializingBean; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; /** * Spring-configurable {@code FileTypeMap} implementation that will read @@ -139,7 +140,7 @@ public class ConfigurableMimeFileTypeMap extends FileTypeMap implements Initiali * @see javax.activation.MimetypesFileTypeMap#MimetypesFileTypeMap(java.io.InputStream) * @see javax.activation.MimetypesFileTypeMap#addMimeTypes(String) */ - protected FileTypeMap createFileTypeMap(Resource mappingLocation, String[] mappings) throws IOException { + protected FileTypeMap createFileTypeMap(@Nullable Resource mappingLocation, @Nullable String[] mappings) throws IOException { MimetypesFileTypeMap fileTypeMap = null; if (mappingLocation != null) { InputStream is = mappingLocation.getInputStream(); diff --git a/spring-context-support/src/main/java/org/springframework/mail/javamail/JavaMailSenderImpl.java b/spring-context-support/src/main/java/org/springframework/mail/javamail/JavaMailSenderImpl.java index 7107f1f6c15..b2adc8516ac 100644 --- a/spring-context-support/src/main/java/org/springframework/mail/javamail/JavaMailSenderImpl.java +++ b/spring-context-support/src/main/java/org/springframework/mail/javamail/JavaMailSenderImpl.java @@ -31,6 +31,7 @@ import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.MimeMessage; +import org.springframework.lang.Nullable; import org.springframework.mail.MailAuthenticationException; import org.springframework.mail.MailException; import org.springframework.mail.MailParseException; @@ -218,6 +219,7 @@ public class JavaMailSenderImpl implements JavaMailSender { /** * Return the username for the account at the mail host. */ + @Nullable public String getUsername() { return this.username; } @@ -240,6 +242,7 @@ public class JavaMailSenderImpl implements JavaMailSender { /** * Return the password for the account at the mail host. */ + @Nullable public String getPassword() { return this.password; } @@ -257,6 +260,7 @@ public class JavaMailSenderImpl implements JavaMailSender { * Return the default encoding for {@link MimeMessage MimeMessages}, * or {@code null} if none. */ + @Nullable public String getDefaultEncoding() { return this.defaultEncoding; } @@ -282,6 +286,7 @@ public class JavaMailSenderImpl implements JavaMailSender { * Return the default Java Activation {@link FileTypeMap} for * {@link MimeMessage MimeMessages}, or {@code null} if none. */ + @Nullable public FileTypeMap getDefaultFileTypeMap() { return this.defaultFileTypeMap; } diff --git a/spring-context-support/src/main/java/org/springframework/mail/javamail/MimeMessageHelper.java b/spring-context-support/src/main/java/org/springframework/mail/javamail/MimeMessageHelper.java index 9b755e843e3..68526e85d7d 100644 --- a/spring-context-support/src/main/java/org/springframework/mail/javamail/MimeMessageHelper.java +++ b/spring-context-support/src/main/java/org/springframework/mail/javamail/MimeMessageHelper.java @@ -39,6 +39,7 @@ import javax.mail.internet.MimeUtility; import org.springframework.core.io.InputStreamSource; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -361,7 +362,7 @@ public class MimeMessageHelper { * will be added to (can be the same as the root multipart object, or an element * nested underneath the root multipart element) */ - protected final void setMimeMultiparts(MimeMultipart root, MimeMultipart main) { + protected final void setMimeMultiparts(@Nullable MimeMultipart root, MimeMultipart main) { this.rootMimeMultipart = root; this.mimeMultipart = main; } @@ -423,6 +424,7 @@ public class MimeMessageHelper { * @return the default encoding associated with the MimeMessage, * or {@code null} if none found */ + @Nullable protected String getDefaultEncoding(MimeMessage mimeMessage) { if (mimeMessage instanceof SmartMimeMessage) { return ((SmartMimeMessage) mimeMessage).getDefaultEncoding(); @@ -433,6 +435,7 @@ public class MimeMessageHelper { /** * Return the specific character encoding used for this message, if any. */ + @Nullable public String getEncoding() { return this.encoding; } diff --git a/spring-context-support/src/main/java/org/springframework/mail/javamail/SmartMimeMessage.java b/spring-context-support/src/main/java/org/springframework/mail/javamail/SmartMimeMessage.java index 35b3ace313c..d17a10ab955 100644 --- a/spring-context-support/src/main/java/org/springframework/mail/javamail/SmartMimeMessage.java +++ b/spring-context-support/src/main/java/org/springframework/mail/javamail/SmartMimeMessage.java @@ -20,6 +20,8 @@ import javax.activation.FileTypeMap; import javax.mail.Session; import javax.mail.internet.MimeMessage; +import org.springframework.lang.Nullable; + /** * Special subclass of the standard JavaMail {@link MimeMessage}, carrying a * default encoding to be used when populating the message and a default Java @@ -48,7 +50,7 @@ class SmartMimeMessage extends MimeMessage { * @param defaultEncoding the default encoding, or {@code null} if none * @param defaultFileTypeMap the default FileTypeMap, or {@code null} if none */ - public SmartMimeMessage(Session session, String defaultEncoding, FileTypeMap defaultFileTypeMap) { + public SmartMimeMessage(Session session, @Nullable String defaultEncoding, @Nullable FileTypeMap defaultFileTypeMap) { super(session); this.defaultEncoding = defaultEncoding; this.defaultFileTypeMap = defaultFileTypeMap; @@ -58,6 +60,7 @@ class SmartMimeMessage extends MimeMessage { /** * Return the default encoding of this message, or {@code null} if none. */ + @Nullable public final String getDefaultEncoding() { return this.defaultEncoding; } @@ -65,6 +68,7 @@ class SmartMimeMessage extends MimeMessage { /** * Return the default FileTypeMap of this message, or {@code null} if none. */ + @Nullable public final FileTypeMap getDefaultFileTypeMap() { return this.defaultFileTypeMap; } diff --git a/spring-context-support/src/main/java/org/springframework/mail/javamail/package-info.java b/spring-context-support/src/main/java/org/springframework/mail/javamail/package-info.java index 44d9ed12c5a..ea2101475c7 100644 --- a/spring-context-support/src/main/java/org/springframework/mail/javamail/package-info.java +++ b/spring-context-support/src/main/java/org/springframework/mail/javamail/package-info.java @@ -3,4 +3,7 @@ * Provides an extended JavaMailSender interface and a MimeMessageHelper * class for convenient population of a JavaMail MimeMessage. */ +@NonNullApi package org.springframework.mail.javamail; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context-support/src/main/java/org/springframework/mail/package-info.java b/spring-context-support/src/main/java/org/springframework/mail/package-info.java index c9a94c5c783..cf4d9360f79 100644 --- a/spring-context-support/src/main/java/org/springframework/mail/package-info.java +++ b/spring-context-support/src/main/java/org/springframework/mail/package-info.java @@ -2,4 +2,7 @@ * Spring's generic mail infrastructure. * Concrete implementations are provided in the subpackages. */ +@NonNullApi package org.springframework.mail; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context-support/src/main/java/org/springframework/scheduling/commonj/TimerManagerTaskScheduler.java b/spring-context-support/src/main/java/org/springframework/scheduling/commonj/TimerManagerTaskScheduler.java index 2d392dea322..a2dc1b8d4bd 100644 --- a/spring-context-support/src/main/java/org/springframework/scheduling/commonj/TimerManagerTaskScheduler.java +++ b/spring-context-support/src/main/java/org/springframework/scheduling/commonj/TimerManagerTaskScheduler.java @@ -25,6 +25,7 @@ import java.util.concurrent.TimeUnit; import commonj.timers.Timer; import commonj.timers.TimerListener; +import org.springframework.lang.Nullable; import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.support.SimpleTriggerContext; @@ -164,6 +165,7 @@ public class TimerManagerTaskScheduler extends TimerManagerAccessor implements T this.trigger = trigger; } + @Nullable public ScheduledFuture schedule() { this.scheduledExecutionTime = this.trigger.nextExecutionTime(this.triggerContext); if (this.scheduledExecutionTime == null) { diff --git a/spring-context-support/src/main/java/org/springframework/scheduling/commonj/package-info.java b/spring-context-support/src/main/java/org/springframework/scheduling/commonj/package-info.java index ad5b35f30bf..edaf056d5b3 100644 --- a/spring-context-support/src/main/java/org/springframework/scheduling/commonj/package-info.java +++ b/spring-context-support/src/main/java/org/springframework/scheduling/commonj/package-info.java @@ -2,4 +2,7 @@ * Convenience classes for scheduling based on the CommonJ WorkManager/TimerManager * facility, as supported by IBM WebSphere 6.0+ and BEA WebLogic 9.0+. */ +@NonNullApi package org.springframework.scheduling.commonj; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context-support/src/main/java/org/springframework/scheduling/quartz/ResourceLoaderClassLoadHelper.java b/spring-context-support/src/main/java/org/springframework/scheduling/quartz/ResourceLoaderClassLoadHelper.java index 726f9732d74..dcc0d764aaa 100644 --- a/spring-context-support/src/main/java/org/springframework/scheduling/quartz/ResourceLoaderClassLoadHelper.java +++ b/spring-context-support/src/main/java/org/springframework/scheduling/quartz/ResourceLoaderClassLoadHelper.java @@ -27,6 +27,7 @@ import org.quartz.spi.ClassLoadHelper; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; +import org.springframework.lang.Nullable; /** * Wrapper that adapts from the Quartz {@link ClassLoadHelper} interface @@ -82,6 +83,7 @@ public class ResourceLoaderClassLoadHelper implements ClassLoadHelper { } @Override + @Nullable public URL getResource(String name) { Resource resource = this.resourceLoader.getResource(name); if (resource.exists()) { @@ -101,6 +103,7 @@ public class ResourceLoaderClassLoadHelper implements ClassLoadHelper { } @Override + @Nullable public InputStream getResourceAsStream(String name) { Resource resource = this.resourceLoader.getResource(name); if (resource.exists()) { diff --git a/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SpringBeanJobFactory.java b/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SpringBeanJobFactory.java index e4dbef0d3e7..4c13e1478bf 100644 --- a/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SpringBeanJobFactory.java +++ b/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SpringBeanJobFactory.java @@ -22,6 +22,7 @@ import org.quartz.spi.TriggerFiredBundle; import org.springframework.beans.BeanWrapper; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.PropertyAccessorFactory; +import org.springframework.lang.Nullable; /** * Subclass of {@link AdaptableJobFactory} that also supports Spring-style @@ -55,7 +56,7 @@ public class SpringBeanJobFactory extends AdaptableJobFactory implements Schedul * ignored if there is no corresponding property found on the particular * job class (all other unknown properties will still trigger an exception). */ - public void setIgnoredUnknownProperties(String... ignoredUnknownProperties) { + public void setIgnoredUnknownProperties(@Nullable String... ignoredUnknownProperties) { this.ignoredUnknownProperties = ignoredUnknownProperties; } diff --git a/spring-context-support/src/main/java/org/springframework/scheduling/quartz/package-info.java b/spring-context-support/src/main/java/org/springframework/scheduling/quartz/package-info.java index df50ca80d70..3681e86d3ba 100644 --- a/spring-context-support/src/main/java/org/springframework/scheduling/quartz/package-info.java +++ b/spring-context-support/src/main/java/org/springframework/scheduling/quartz/package-info.java @@ -5,4 +5,7 @@ * Triggers as beans in a Spring context. Also provides * convenience classes for implementing Quartz Jobs. */ +@NonNullApi package org.springframework.scheduling.quartz; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context-support/src/main/java/org/springframework/ui/freemarker/FreeMarkerConfigurationFactory.java b/spring-context-support/src/main/java/org/springframework/ui/freemarker/FreeMarkerConfigurationFactory.java index 9d114f4d1f7..dde83abf13a 100644 --- a/spring-context-support/src/main/java/org/springframework/ui/freemarker/FreeMarkerConfigurationFactory.java +++ b/spring-context-support/src/main/java/org/springframework/ui/freemarker/FreeMarkerConfigurationFactory.java @@ -38,6 +38,7 @@ import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.support.PropertiesLoaderUtils; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; /** @@ -380,6 +381,7 @@ public class FreeMarkerConfigurationFactory { * @param templateLoaders the final List of TemplateLoader instances * @return the aggregate TemplateLoader */ + @Nullable protected TemplateLoader getAggregateTemplateLoader(List templateLoaders) { int loaderCount = templateLoaders.size(); switch (loaderCount) { diff --git a/spring-context-support/src/main/java/org/springframework/ui/freemarker/package-info.java b/spring-context-support/src/main/java/org/springframework/ui/freemarker/package-info.java index 28fbe3bf516..d7cb60f3ad7 100644 --- a/spring-context-support/src/main/java/org/springframework/ui/freemarker/package-info.java +++ b/spring-context-support/src/main/java/org/springframework/ui/freemarker/package-info.java @@ -3,4 +3,7 @@ * FreeMarker * within a Spring application context. */ +@NonNullApi package org.springframework.ui.freemarker; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/cache/Cache.java b/spring-context/src/main/java/org/springframework/cache/Cache.java index 3124461b2e5..78a9cd6b134 100644 --- a/spring-context/src/main/java/org/springframework/cache/Cache.java +++ b/spring-context/src/main/java/org/springframework/cache/Cache.java @@ -18,6 +18,8 @@ package org.springframework.cache; import java.util.concurrent.Callable; +import org.springframework.lang.Nullable; + /** * Interface that defines common cache operations. * @@ -54,7 +56,8 @@ public interface Cache { * returned means that the cache contains no mapping for this key. * @see #get(Object, Class) */ - ValueWrapper get(Object key); + @Nullable + ValueWrapper get(@Nullable Object key); /** * Return the value to which this cache maps the specified key, @@ -74,7 +77,8 @@ public interface Cache { * @since 4.0 * @see #get(Object) */ - T get(Object key, Class type); + @Nullable + T get(@Nullable Object key, Class type); /** * Return the value to which this cache maps the specified key, obtaining @@ -91,7 +95,8 @@ public interface Cache { * @throws ValueRetrievalException if the {@code valueLoader} throws an exception * @since 4.3 */ - T get(Object key, Callable valueLoader); + @Nullable + T get(@Nullable Object key, Callable valueLoader); /** * Associate the specified value with the specified key in this cache. @@ -100,7 +105,7 @@ public interface Cache { * @param key the key with which the specified value is to be associated * @param value the value to be associated with the specified key */ - void put(Object key, Object value); + void put(@Nullable Object key, @Nullable Object value); /** * Atomically associate the specified value with the specified key in this cache @@ -128,13 +133,14 @@ public interface Cache { * an indicator that the given {@code value} has been associated with the key. * @since 4.1 */ - ValueWrapper putIfAbsent(Object key, Object value); + @Nullable + ValueWrapper putIfAbsent(@Nullable Object key, @Nullable Object value); /** * Evict the mapping for this key from this cache if it is present. * @param key the key whose mapping is to be removed from the cache */ - void evict(Object key); + void evict(@Nullable Object key); /** * Remove all mappings from the cache. @@ -151,7 +157,7 @@ public interface Cache { /** * Return the actual value in the cache. */ - Object get(); + @Nullable Object get(); } @@ -165,11 +171,12 @@ public interface Cache { private final Object key; - public ValueRetrievalException(Object key, Callable loader, Throwable ex) { + public ValueRetrievalException(@Nullable Object key, Callable loader, Throwable ex) { super(String.format("Value for key '%s' could not be loaded using '%s'", key, loader), ex); this.key = key; } + @Nullable public Object getKey() { return this.key; } diff --git a/spring-context/src/main/java/org/springframework/cache/CacheManager.java b/spring-context/src/main/java/org/springframework/cache/CacheManager.java index 205bc9a3272..fffb6bc2bd7 100644 --- a/spring-context/src/main/java/org/springframework/cache/CacheManager.java +++ b/spring-context/src/main/java/org/springframework/cache/CacheManager.java @@ -18,6 +18,8 @@ package org.springframework.cache; import java.util.Collection; +import org.springframework.lang.Nullable; + /** * Spring's central cache manager SPI. * Allows for retrieving named {@link Cache} regions. @@ -32,6 +34,7 @@ public interface CacheManager { * @param name the cache identifier (must not be {@code null}) * @return the associated cache, or {@code null} if none found */ + @Nullable Cache getCache(String name); /** diff --git a/spring-context/src/main/java/org/springframework/cache/annotation/AnnotationCacheOperationSource.java b/spring-context/src/main/java/org/springframework/cache/annotation/AnnotationCacheOperationSource.java index cbb4570f626..68ce9c8530a 100644 --- a/spring-context/src/main/java/org/springframework/cache/annotation/AnnotationCacheOperationSource.java +++ b/spring-context/src/main/java/org/springframework/cache/annotation/AnnotationCacheOperationSource.java @@ -26,6 +26,7 @@ import java.util.Set; import org.springframework.cache.interceptor.AbstractFallbackCacheOperationSource; import org.springframework.cache.interceptor.CacheOperation; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -135,6 +136,7 @@ public class AnnotationCacheOperationSource extends AbstractFallbackCacheOperati * @param provider the cache operation provider to use * @return the configured caching operations, or {@code null} if none found */ + @Nullable protected Collection determineCacheOperations(CacheOperationProvider provider) { Collection ops = null; for (CacheAnnotationParser annotationParser : this.annotationParsers) { @@ -189,6 +191,7 @@ public class AnnotationCacheOperationSource extends AbstractFallbackCacheOperati * @param parser the parser to use * @return the cache operations, or {@code null} if none found */ + @Nullable Collection getCacheOperations(CacheAnnotationParser parser); } diff --git a/spring-context/src/main/java/org/springframework/cache/annotation/CacheAnnotationParser.java b/spring-context/src/main/java/org/springframework/cache/annotation/CacheAnnotationParser.java index 80bafb871a7..b602b8f4248 100644 --- a/spring-context/src/main/java/org/springframework/cache/annotation/CacheAnnotationParser.java +++ b/spring-context/src/main/java/org/springframework/cache/annotation/CacheAnnotationParser.java @@ -20,6 +20,7 @@ import java.lang.reflect.Method; import java.util.Collection; import org.springframework.cache.interceptor.CacheOperation; +import org.springframework.lang.Nullable; /** * Strategy interface for parsing known caching annotation types. @@ -44,6 +45,7 @@ public interface CacheAnnotationParser { * or {@code null} if none was found * @see AnnotationCacheOperationSource#findCacheOperations(Class) */ + @Nullable Collection parseCacheAnnotations(Class type); /** @@ -57,5 +59,6 @@ public interface CacheAnnotationParser { * or {@code null} if none was found * @see AnnotationCacheOperationSource#findCacheOperations(Method) */ + @Nullable Collection parseCacheAnnotations(Method method); } diff --git a/spring-context/src/main/java/org/springframework/cache/annotation/CachingConfigurer.java b/spring-context/src/main/java/org/springframework/cache/annotation/CachingConfigurer.java index 97cfff7acb7..348281fbe1b 100644 --- a/spring-context/src/main/java/org/springframework/cache/annotation/CachingConfigurer.java +++ b/spring-context/src/main/java/org/springframework/cache/annotation/CachingConfigurer.java @@ -20,6 +20,7 @@ import org.springframework.cache.CacheManager; import org.springframework.cache.interceptor.CacheErrorHandler; import org.springframework.cache.interceptor.CacheResolver; import org.springframework.cache.interceptor.KeyGenerator; +import org.springframework.lang.Nullable; /** * Interface to be implemented by @{@link org.springframework.context.annotation.Configuration @@ -61,6 +62,7 @@ public interface CachingConfigurer { * * See @{@link EnableCaching} for more complete examples. */ + @Nullable CacheManager cacheManager(); /** @@ -85,6 +87,7 @@ public interface CachingConfigurer { * * See {@link EnableCaching} for more complete examples. */ + @Nullable CacheResolver cacheResolver(); /** @@ -105,6 +108,7 @@ public interface CachingConfigurer { * * See @{@link EnableCaching} for more complete examples. */ + @Nullable KeyGenerator keyGenerator(); /** @@ -127,6 +131,7 @@ public interface CachingConfigurer { * * See @{@link EnableCaching} for more complete examples. */ + @Nullable CacheErrorHandler errorHandler(); } diff --git a/spring-context/src/main/java/org/springframework/cache/annotation/package-info.java b/spring-context/src/main/java/org/springframework/cache/annotation/package-info.java index 52bd2a3586d..fe4e17c50a0 100644 --- a/spring-context/src/main/java/org/springframework/cache/annotation/package-info.java +++ b/spring-context/src/main/java/org/springframework/cache/annotation/package-info.java @@ -3,4 +3,7 @@ * Hooked into Spring's cache interception infrastructure via * {@link org.springframework.cache.interceptor.CacheOperationSource}. */ +@NonNullApi package org.springframework.cache.annotation; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCache.java b/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCache.java index c43499ceae9..4ea72404b1a 100644 --- a/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCache.java +++ b/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCache.java @@ -25,6 +25,7 @@ import java.util.concurrent.ConcurrentMap; import org.springframework.cache.support.AbstractValueAdaptingCache; import org.springframework.core.serializer.support.SerializationDelegate; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -98,7 +99,7 @@ public class ConcurrentMapCache extends AbstractValueAdaptingCache { * @since 4.3 */ protected ConcurrentMapCache(String name, ConcurrentMap store, - boolean allowNullValues, SerializationDelegate serialization) { + boolean allowNullValues, @Nullable SerializationDelegate serialization) { super(allowNullValues); Assert.notNull(name, "Name must not be null"); diff --git a/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCacheManager.java b/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCacheManager.java index ad33fc4c874..781448b7c90 100644 --- a/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCacheManager.java +++ b/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCacheManager.java @@ -27,6 +27,7 @@ import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.core.serializer.support.SerializationDelegate; +import org.springframework.lang.Nullable; /** * {@link CacheManager} implementation that lazily builds {@link ConcurrentMapCache} @@ -81,7 +82,7 @@ public class ConcurrentMapCacheManager implements CacheManager, BeanClassLoaderA *

Calling this with a {@code null} collection argument resets the * mode to 'dynamic', allowing for further creation of caches again. */ - public void setCacheNames(Collection cacheNames) { + public void setCacheNames(@Nullable Collection cacheNames) { if (cacheNames != null) { for (String name : cacheNames) { this.cacheMap.put(name, createConcurrentMapCache(name)); diff --git a/spring-context/src/main/java/org/springframework/cache/concurrent/package-info.java b/spring-context/src/main/java/org/springframework/cache/concurrent/package-info.java index 40cf65d3136..d2e7d514bb7 100644 --- a/spring-context/src/main/java/org/springframework/cache/concurrent/package-info.java +++ b/spring-context/src/main/java/org/springframework/cache/concurrent/package-info.java @@ -4,4 +4,7 @@ * and {@link org.springframework.cache.Cache Cache} implementation for * use in a Spring context, using a JDK based thread pool at runtime. */ +@NonNullApi package org.springframework.cache.concurrent; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/cache/config/CacheAdviceParser.java b/spring-context/src/main/java/org/springframework/cache/config/CacheAdviceParser.java index b8864b70054..8503fcc6908 100644 --- a/spring-context/src/main/java/org/springframework/cache/config/CacheAdviceParser.java +++ b/spring-context/src/main/java/org/springframework/cache/config/CacheAdviceParser.java @@ -36,6 +36,7 @@ import org.springframework.cache.interceptor.CacheOperation; import org.springframework.cache.interceptor.CachePutOperation; import org.springframework.cache.interceptor.CacheableOperation; import org.springframework.cache.interceptor.NameMatchCacheOperationSource; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; @@ -241,6 +242,7 @@ class CacheAdviceParser extends AbstractSingleBeanDefinitionParser { return builder; } + @Nullable String merge(Element element, ReaderContext readerCtx) { String method = element.getAttribute(METHOD_ATTRIBUTE); if (StringUtils.hasText(method)) { diff --git a/spring-context/src/main/java/org/springframework/cache/config/package-info.java b/spring-context/src/main/java/org/springframework/cache/config/package-info.java index f2533d31462..9d1e1f37f42 100644 --- a/spring-context/src/main/java/org/springframework/cache/config/package-info.java +++ b/spring-context/src/main/java/org/springframework/cache/config/package-info.java @@ -4,4 +4,7 @@ * org.springframework.cache.annotation.EnableCaching EnableCaching} * for details on code-based configuration without XML. */ +@NonNullApi package org.springframework.cache.config; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/cache/interceptor/AbstractCacheInvoker.java b/spring-context/src/main/java/org/springframework/cache/interceptor/AbstractCacheInvoker.java index 81edc067036..7a793df9844 100644 --- a/spring-context/src/main/java/org/springframework/cache/interceptor/AbstractCacheInvoker.java +++ b/spring-context/src/main/java/org/springframework/cache/interceptor/AbstractCacheInvoker.java @@ -17,6 +17,7 @@ package org.springframework.cache.interceptor; import org.springframework.cache.Cache; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -66,6 +67,7 @@ public abstract class AbstractCacheInvoker { * miss in case of error. * @see Cache#get(Object) */ + @Nullable protected Cache.ValueWrapper doGet(Cache cache, Object key) { try { return cache.get(key); diff --git a/spring-context/src/main/java/org/springframework/cache/interceptor/AbstractCacheResolver.java b/spring-context/src/main/java/org/springframework/cache/interceptor/AbstractCacheResolver.java index 3f018f46b6b..e54fe17eabd 100644 --- a/spring-context/src/main/java/org/springframework/cache/interceptor/AbstractCacheResolver.java +++ b/spring-context/src/main/java/org/springframework/cache/interceptor/AbstractCacheResolver.java @@ -23,6 +23,7 @@ import java.util.Collections; import org.springframework.beans.factory.InitializingBean; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -93,6 +94,7 @@ public abstract class AbstractCacheResolver implements CacheResolver, Initializi * @param context the context of the particular invocation * @return the cache name(s) to resolve or {@code null} if no cache should be resolved */ + @Nullable protected abstract Collection getCacheNames(CacheOperationInvocationContext context); } diff --git a/spring-context/src/main/java/org/springframework/cache/interceptor/AbstractFallbackCacheOperationSource.java b/spring-context/src/main/java/org/springframework/cache/interceptor/AbstractFallbackCacheOperationSource.java index 886aa94004a..2a7fe443564 100644 --- a/spring-context/src/main/java/org/springframework/cache/interceptor/AbstractFallbackCacheOperationSource.java +++ b/spring-context/src/main/java/org/springframework/cache/interceptor/AbstractFallbackCacheOperationSource.java @@ -28,6 +28,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.core.BridgeMethodResolver; import org.springframework.core.MethodClassKey; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -116,10 +117,11 @@ public abstract class AbstractFallbackCacheOperationSource implements CacheOpera * @param targetClass the target class (may be {@code null}) * @return the cache key (never {@code null}) */ - protected Object getCacheKey(Method method, Class targetClass) { + protected Object getCacheKey(Method method, @Nullable Class targetClass) { return new MethodClassKey(method, targetClass); } + @Nullable private Collection computeCacheOperations(Method method, Class targetClass) { // Don't allow no-public methods as required. if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) { @@ -168,6 +170,7 @@ public abstract class AbstractFallbackCacheOperationSource implements CacheOpera * @return all caching attribute associated with this method * (or {@code null} if none) */ + @Nullable protected abstract Collection findCacheOperations(Method method); /** @@ -177,6 +180,7 @@ public abstract class AbstractFallbackCacheOperationSource implements CacheOpera * @return all caching attribute associated with this class * (or {@code null} if none) */ + @Nullable protected abstract Collection findCacheOperations(Class clazz); /** diff --git a/spring-context/src/main/java/org/springframework/cache/interceptor/CacheAspectSupport.java b/spring-context/src/main/java/org/springframework/cache/interceptor/CacheAspectSupport.java index 1e03becc11b..e69e141f4da 100644 --- a/spring-context/src/main/java/org/springframework/cache/interceptor/CacheAspectSupport.java +++ b/spring-context/src/main/java/org/springframework/cache/interceptor/CacheAspectSupport.java @@ -42,6 +42,7 @@ import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.context.expression.AnnotatedElementKey; import org.springframework.expression.EvaluationContext; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; @@ -470,6 +471,7 @@ public abstract class CacheAspectSupport extends AbstractCacheInvoker * @return a {@link Cache.ValueWrapper} holding the cached item, * or {@code null} if none is found */ + @Nullable private Cache.ValueWrapper findCachedItem(Collection contexts) { Object result = CacheOperationExpressionEvaluator.NO_RESULT; for (CacheOperationContext context : contexts) { @@ -507,6 +509,7 @@ public abstract class CacheAspectSupport extends AbstractCacheInvoker } } + @Nullable private Cache.ValueWrapper findInCaches(CacheOperationContext context, Object key) { for (Cache cache : context.getCaches()) { Cache.ValueWrapper wrapper = doGet(cache, key); @@ -711,6 +714,7 @@ public abstract class CacheAspectSupport extends AbstractCacheInvoker * Compute the key for the given caching operation. * @return the generated key, or {@code null} if none can be generated */ + @Nullable protected Object generateKey(Object result) { if (StringUtils.hasText(this.metadata.operation.getKey())) { EvaluationContext evaluationContext = createEvaluationContext(result); diff --git a/spring-context/src/main/java/org/springframework/cache/interceptor/CacheOperationExpressionEvaluator.java b/spring-context/src/main/java/org/springframework/cache/interceptor/CacheOperationExpressionEvaluator.java index 0e3de59b5b5..58fb2db42be 100644 --- a/spring-context/src/main/java/org/springframework/cache/interceptor/CacheOperationExpressionEvaluator.java +++ b/spring-context/src/main/java/org/springframework/cache/interceptor/CacheOperationExpressionEvaluator.java @@ -29,6 +29,7 @@ import org.springframework.context.expression.BeanFactoryResolver; import org.springframework.context.expression.CachedExpressionEvaluator; import org.springframework.expression.EvaluationContext; import org.springframework.expression.Expression; +import org.springframework.lang.Nullable; /** * Utility class handling the SpEL expression parsing. @@ -93,7 +94,7 @@ class CacheOperationExpressionEvaluator extends CachedExpressionEvaluator { * @return the evaluation context */ public EvaluationContext createEvaluationContext(Collection caches, - Method method, Object[] args, Object target, Class targetClass, Object result, + Method method, Object[] args, Object target, Class targetClass, @Nullable Object result, BeanFactory beanFactory) { CacheExpressionRootObject rootObject = new CacheExpressionRootObject( diff --git a/spring-context/src/main/java/org/springframework/cache/interceptor/CacheOperationSource.java b/spring-context/src/main/java/org/springframework/cache/interceptor/CacheOperationSource.java index 376d2a16473..0ab1059325b 100644 --- a/spring-context/src/main/java/org/springframework/cache/interceptor/CacheOperationSource.java +++ b/spring-context/src/main/java/org/springframework/cache/interceptor/CacheOperationSource.java @@ -19,6 +19,8 @@ package org.springframework.cache.interceptor; import java.lang.reflect.Method; import java.util.Collection; +import org.springframework.lang.Nullable; + /** * Interface used by {@link CacheInterceptor}. Implementations know how to source * cache operation attributes, whether from configuration, metadata attributes at @@ -37,6 +39,7 @@ public interface CacheOperationSource { * the declaring class of the method must be used) * @return all cache operations for this method, or {@code null} if none found */ - Collection getCacheOperations(Method method, Class targetClass); + @Nullable + Collection getCacheOperations(Method method, @Nullable Class targetClass); } diff --git a/spring-context/src/main/java/org/springframework/cache/interceptor/CacheOperationSourcePointcut.java b/spring-context/src/main/java/org/springframework/cache/interceptor/CacheOperationSourcePointcut.java index 58548bb799f..6a245b055ba 100644 --- a/spring-context/src/main/java/org/springframework/cache/interceptor/CacheOperationSourcePointcut.java +++ b/spring-context/src/main/java/org/springframework/cache/interceptor/CacheOperationSourcePointcut.java @@ -20,6 +20,7 @@ import java.io.Serializable; import java.lang.reflect.Method; import org.springframework.aop.support.StaticMethodMatcherPointcut; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; @@ -66,6 +67,7 @@ abstract class CacheOperationSourcePointcut extends StaticMethodMatcherPointcut * Obtain the underlying {@link CacheOperationSource} (may be {@code null}). * To be implemented by subclasses. */ + @Nullable protected abstract CacheOperationSource getCacheOperationSource(); } diff --git a/spring-context/src/main/java/org/springframework/cache/interceptor/package-info.java b/spring-context/src/main/java/org/springframework/cache/interceptor/package-info.java index 943130ebfed..cce2ac4f347 100644 --- a/spring-context/src/main/java/org/springframework/cache/interceptor/package-info.java +++ b/spring-context/src/main/java/org/springframework/cache/interceptor/package-info.java @@ -3,4 +3,7 @@ * Builds on the AOP infrastructure in org.springframework.aop.framework. * Any POJO can be cache-advised with Spring. */ +@NonNullApi package org.springframework.cache.interceptor; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/cache/package-info.java b/spring-context/src/main/java/org/springframework/cache/package-info.java index 982312e8246..3944cf0ce12 100644 --- a/spring-context/src/main/java/org/springframework/cache/package-info.java +++ b/spring-context/src/main/java/org/springframework/cache/package-info.java @@ -2,4 +2,7 @@ * Spring's generic cache abstraction. * Concrete implementations are provided in the subpackages. */ +@NonNullApi package org.springframework.cache; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/cache/support/AbstractCacheManager.java b/spring-context/src/main/java/org/springframework/cache/support/AbstractCacheManager.java index a05aa254a44..7acb7deb1b2 100644 --- a/spring-context/src/main/java/org/springframework/cache/support/AbstractCacheManager.java +++ b/spring-context/src/main/java/org/springframework/cache/support/AbstractCacheManager.java @@ -26,6 +26,7 @@ import java.util.concurrent.ConcurrentMap; import org.springframework.beans.factory.InitializingBean; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; +import org.springframework.lang.Nullable; /** * Abstract base class implementing the common {@link CacheManager} methods. @@ -124,6 +125,7 @@ public abstract class AbstractCacheManager implements CacheManager, Initializing * @see #getCache(String) * @see #getMissingCache(String) */ + @Nullable protected final Cache lookupCache(String name) { return this.cacheMap.get(name); } @@ -183,6 +185,7 @@ public abstract class AbstractCacheManager implements CacheManager, Initializing * @since 4.1 * @see #getCache(String) */ + @Nullable protected Cache getMissingCache(String name) { return null; } diff --git a/spring-context/src/main/java/org/springframework/cache/support/AbstractValueAdaptingCache.java b/spring-context/src/main/java/org/springframework/cache/support/AbstractValueAdaptingCache.java index a197831c5e5..d70b9ed94af 100644 --- a/spring-context/src/main/java/org/springframework/cache/support/AbstractValueAdaptingCache.java +++ b/spring-context/src/main/java/org/springframework/cache/support/AbstractValueAdaptingCache.java @@ -17,6 +17,7 @@ package org.springframework.cache.support; import org.springframework.cache.Cache; +import org.springframework.lang.Nullable; /** * Common base class for {@link Cache} implementations that need to adapt @@ -81,7 +82,8 @@ public abstract class AbstractValueAdaptingCache implements Cache { * @param storeValue the store value * @return the value to return to the user */ - protected Object fromStoreValue(Object storeValue) { + @Nullable + protected Object fromStoreValue(@Nullable Object storeValue) { if (this.allowNullValues && storeValue == NullValue.INSTANCE) { return null; } @@ -94,7 +96,7 @@ public abstract class AbstractValueAdaptingCache implements Cache { * @param userValue the given user value * @return the value to store */ - protected Object toStoreValue(Object userValue) { + protected Object toStoreValue(@Nullable Object userValue) { if (userValue == null) { if (this.allowNullValues) { return NullValue.INSTANCE; diff --git a/spring-context/src/main/java/org/springframework/cache/support/SimpleValueWrapper.java b/spring-context/src/main/java/org/springframework/cache/support/SimpleValueWrapper.java index b248902038b..3c94d081a34 100644 --- a/spring-context/src/main/java/org/springframework/cache/support/SimpleValueWrapper.java +++ b/spring-context/src/main/java/org/springframework/cache/support/SimpleValueWrapper.java @@ -17,6 +17,7 @@ package org.springframework.cache.support; import org.springframework.cache.Cache.ValueWrapper; +import org.springframework.lang.Nullable; /** * Straightforward implementation of {@link org.springframework.cache.Cache.ValueWrapper}, @@ -34,7 +35,7 @@ public class SimpleValueWrapper implements ValueWrapper { * Create a new SimpleValueWrapper instance for exposing the given value. * @param value the value to expose (may be {@code null}) */ - public SimpleValueWrapper(Object value) { + public SimpleValueWrapper(@Nullable Object value) { this.value = value; } diff --git a/spring-context/src/main/java/org/springframework/cache/support/package-info.java b/spring-context/src/main/java/org/springframework/cache/support/package-info.java index cf3f5d4f297..6be9db7ef0f 100644 --- a/spring-context/src/main/java/org/springframework/cache/support/package-info.java +++ b/spring-context/src/main/java/org/springframework/cache/support/package-info.java @@ -2,4 +2,7 @@ * Support classes for the org.springframework.cache package. * Provides abstract classes for cache managers and caches. */ +@NonNullApi package org.springframework.cache.support; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/context/ApplicationContext.java b/spring-context/src/main/java/org/springframework/context/ApplicationContext.java index c68f01265eb..2982f9ab12f 100644 --- a/spring-context/src/main/java/org/springframework/context/ApplicationContext.java +++ b/spring-context/src/main/java/org/springframework/context/ApplicationContext.java @@ -21,6 +21,7 @@ import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.core.env.EnvironmentCapable; import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.lang.Nullable; /** * Central interface to provide configuration for an application. @@ -61,6 +62,7 @@ public interface ApplicationContext extends EnvironmentCapable, ListableBeanFact * Return the unique id of this application context. * @return the unique id of the context, or {@code null} if none */ + @Nullable String getId(); /** @@ -86,6 +88,7 @@ public interface ApplicationContext extends EnvironmentCapable, ListableBeanFact * and this is the root of the context hierarchy. * @return the parent context, or {@code null} if there is no parent */ + @Nullable ApplicationContext getParent(); /** diff --git a/spring-context/src/main/java/org/springframework/context/ConfigurableApplicationContext.java b/spring-context/src/main/java/org/springframework/context/ConfigurableApplicationContext.java index 1f6ecc41966..0ffc57839cb 100644 --- a/spring-context/src/main/java/org/springframework/context/ConfigurableApplicationContext.java +++ b/spring-context/src/main/java/org/springframework/context/ConfigurableApplicationContext.java @@ -24,6 +24,7 @@ import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.Environment; import org.springframework.core.io.ProtocolResolver; +import org.springframework.lang.Nullable; /** * SPI interface to be implemented by most if not all application contexts. @@ -100,7 +101,7 @@ public interface ConfigurableApplicationContext extends ApplicationContext, Life * @param parent the parent context * @see org.springframework.web.context.ConfigurableWebApplicationContext */ - void setParent(ApplicationContext parent); + void setParent(@Nullable ApplicationContext parent); /** * Set the {@code Environment} for this application context. diff --git a/spring-context/src/main/java/org/springframework/context/HierarchicalMessageSource.java b/spring-context/src/main/java/org/springframework/context/HierarchicalMessageSource.java index d03b98774d5..c2433874514 100644 --- a/spring-context/src/main/java/org/springframework/context/HierarchicalMessageSource.java +++ b/spring-context/src/main/java/org/springframework/context/HierarchicalMessageSource.java @@ -16,6 +16,8 @@ package org.springframework.context; +import org.springframework.lang.Nullable; + /** * Sub-interface of MessageSource to be implemented by objects that * can resolve messages hierarchically. @@ -32,11 +34,12 @@ public interface HierarchicalMessageSource extends MessageSource { * resolve messages that this object can't resolve. * May be {@code null}, in which case no further resolution is possible. */ - void setParentMessageSource(MessageSource parent); + void setParentMessageSource(@Nullable MessageSource parent); /** * Return the parent of this MessageSource, or {@code null} if none. */ + @Nullable MessageSource getParentMessageSource(); } diff --git a/spring-context/src/main/java/org/springframework/context/MessageSource.java b/spring-context/src/main/java/org/springframework/context/MessageSource.java index 1a4d0b40ef8..27bac5068e9 100644 --- a/spring-context/src/main/java/org/springframework/context/MessageSource.java +++ b/spring-context/src/main/java/org/springframework/context/MessageSource.java @@ -18,6 +18,8 @@ package org.springframework.context; import java.util.Locale; +import org.springframework.lang.Nullable; + /** * Strategy interface for resolving messages, with support for the parameterization * and internationalization of such messages. @@ -51,7 +53,7 @@ public interface MessageSource { * otherwise the default message passed as a parameter * @see java.text.MessageFormat */ - String getMessage(String code, Object[] args, String defaultMessage, Locale locale); + String getMessage(String code, @Nullable Object[] args, String defaultMessage, Locale locale); /** * Try to resolve the message. Treat as an error if the message can't be found. @@ -64,7 +66,7 @@ public interface MessageSource { * @throws NoSuchMessageException if the message wasn't found * @see java.text.MessageFormat */ - String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException; + String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException; /** * Try to resolve the message using all the attributes contained within the diff --git a/spring-context/src/main/java/org/springframework/context/MessageSourceResolvable.java b/spring-context/src/main/java/org/springframework/context/MessageSourceResolvable.java index 3dca904f63d..096e774d2ad 100644 --- a/spring-context/src/main/java/org/springframework/context/MessageSourceResolvable.java +++ b/spring-context/src/main/java/org/springframework/context/MessageSourceResolvable.java @@ -16,6 +16,8 @@ package org.springframework.context; +import org.springframework.lang.Nullable; + /** * Interface for objects that are suitable for message resolution in a * {@link MessageSource}. @@ -44,6 +46,7 @@ public interface MessageSourceResolvable { * placeholders within the message text * @see java.text.MessageFormat */ + @Nullable default Object[] getArguments() { return null; } @@ -57,6 +60,7 @@ public interface MessageSourceResolvable { * for this particular message. * @return the default message, or {@code null} if no default */ + @Nullable default String getDefaultMessage() { return null; } diff --git a/spring-context/src/main/java/org/springframework/context/annotation/AdviceModeImportSelector.java b/spring-context/src/main/java/org/springframework/context/annotation/AdviceModeImportSelector.java index 14f9f1bfa24..adfb7a55dea 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/AdviceModeImportSelector.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/AdviceModeImportSelector.java @@ -21,8 +21,9 @@ import java.lang.annotation.Annotation; import org.springframework.core.GenericTypeResolver; import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.type.AnnotationMetadata; +import org.springframework.lang.Nullable; - /** +/** * Convenient base class for {@link ImportSelector} implementations that select imports * based on an {@link AdviceMode} value from an annotation (such as the {@code @Enable*} * annotations). @@ -85,6 +86,7 @@ public abstract class AdviceModeImportSelector implements * @return array containing classes to import; empty array if none, {@code null} if * the given {@code AdviceMode} is unknown. */ + @Nullable protected abstract String[] selectImports(AdviceMode adviceMode); } diff --git a/spring-context/src/main/java/org/springframework/context/annotation/AnnotatedBeanDefinitionReader.java b/spring-context/src/main/java/org/springframework/context/annotation/AnnotatedBeanDefinitionReader.java index e28f41d9d18..1b2101c765e 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/AnnotatedBeanDefinitionReader.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/AnnotatedBeanDefinitionReader.java @@ -30,6 +30,7 @@ import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.core.env.Environment; import org.springframework.core.env.EnvironmentCapable; import org.springframework.core.env.StandardEnvironment; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -153,7 +154,7 @@ public class AnnotatedBeanDefinitionReader { * (may be {@code null}) * @since 5.0 */ - public void registerBean(Class annotatedClass, Supplier instanceSupplier) { + public void registerBean(Class annotatedClass, @Nullable Supplier instanceSupplier) { doRegisterBean(annotatedClass, instanceSupplier, null, null); } @@ -167,7 +168,7 @@ public class AnnotatedBeanDefinitionReader { * (may be {@code null}) * @since 5.0 */ - public void registerBean(Class annotatedClass, String name, Supplier instanceSupplier) { + public void registerBean(Class annotatedClass, String name, @Nullable Supplier instanceSupplier) { doRegisterBean(annotatedClass, instanceSupplier, name, null); } @@ -209,8 +210,8 @@ public class AnnotatedBeanDefinitionReader { * factory's {@link BeanDefinition}, e.g. setting a lazy-init or primary flag * @since 5.0 */ - void doRegisterBean(Class annotatedClass, Supplier instanceSupplier, String name, - Class[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) { + void doRegisterBean(Class annotatedClass, @Nullable Supplier instanceSupplier, String name, + @Nullable Class[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) { AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass); if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) { diff --git a/spring-context/src/main/java/org/springframework/context/annotation/AnnotationBeanNameGenerator.java b/spring-context/src/main/java/org/springframework/context/annotation/AnnotationBeanNameGenerator.java index dea7da17b7f..8d4dd12103d 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/AnnotationBeanNameGenerator.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/AnnotationBeanNameGenerator.java @@ -26,6 +26,7 @@ import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.type.AnnotationMetadata; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; @@ -82,6 +83,7 @@ public class AnnotationBeanNameGenerator implements BeanNameGenerator { * @param annotatedDef the annotation-aware bean definition * @return the bean name, or {@code null} if none is found */ + @Nullable protected String determineBeanNameFromAnnotation(AnnotatedBeanDefinition annotatedDef) { AnnotationMetadata amd = annotatedDef.getMetadata(); Set types = amd.getAnnotationTypes(); @@ -131,6 +133,7 @@ public class AnnotationBeanNameGenerator implements BeanNameGenerator { * @param registry the registry that the given bean definition is being registered with * @return the default bean name (never {@code null}) */ + @Nullable protected String buildDefaultBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) { return buildDefaultBeanName(definition); } @@ -145,6 +148,7 @@ public class AnnotationBeanNameGenerator implements BeanNameGenerator { * @param definition the bean definition to build a bean name for * @return the default bean name (never {@code null}) */ + @Nullable protected String buildDefaultBeanName(BeanDefinition definition) { String shortClassName = ClassUtils.getShortName(definition.getBeanClassName()); return Introspector.decapitalize(shortClassName); diff --git a/spring-context/src/main/java/org/springframework/context/annotation/AnnotationConfigApplicationContext.java b/spring-context/src/main/java/org/springframework/context/annotation/AnnotationConfigApplicationContext.java index 61957aec476..1f67a31a589 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/AnnotationConfigApplicationContext.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/AnnotationConfigApplicationContext.java @@ -23,6 +23,7 @@ import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -187,7 +188,7 @@ public class AnnotationConfigApplicationContext extends GenericApplicationContex * (may be {@code null} or empty) * @since 5.0 */ - public void registerBean(Class annotatedClass, Object... constructorArguments) { + public void registerBean(Class annotatedClass, @Nullable Object... constructorArguments) { registerBean(null, annotatedClass, constructorArguments); } @@ -203,7 +204,7 @@ public class AnnotationConfigApplicationContext extends GenericApplicationContex * (may be {@code null} or empty) * @since 5.0 */ - public void registerBean(String beanName, Class annotatedClass, Object... constructorArguments) { + public void registerBean(@Nullable String beanName, Class annotatedClass, @Nullable Object... constructorArguments) { this.reader.doRegisterBean(annotatedClass, null, beanName, null, bd -> { for (Object arg : constructorArguments) { diff --git a/spring-context/src/main/java/org/springframework/context/annotation/AnnotationConfigUtils.java b/spring-context/src/main/java/org/springframework/context/annotation/AnnotationConfigUtils.java index a8976529841..9f688c893a6 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/AnnotationConfigUtils.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/AnnotationConfigUtils.java @@ -37,6 +37,7 @@ import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.type.AnnotatedTypeMetadata; import org.springframework.core.type.AnnotationMetadata; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -143,7 +144,7 @@ public class AnnotationConfigUtils { * that have actually been registered by this call */ public static Set registerAnnotationConfigProcessors( - BeanDefinitionRegistry registry, Object source) { + BeanDefinitionRegistry registry, @Nullable Object source) { DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry); if (beanFactory != null) { @@ -219,6 +220,7 @@ public class AnnotationConfigUtils { return new BeanDefinitionHolder(definition, beanName); } + @Nullable private static DefaultListableBeanFactory unwrapDefaultListableBeanFactory(BeanDefinitionRegistry registry) { if (registry instanceof DefaultListableBeanFactory) { return (DefaultListableBeanFactory) registry; diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ClassPathScanningCandidateComponentProvider.java b/spring-context/src/main/java/org/springframework/context/annotation/ClassPathScanningCandidateComponentProvider.java index f6aa75deff6..fb182667f5a 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ClassPathScanningCandidateComponentProvider.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ClassPathScanningCandidateComponentProvider.java @@ -51,6 +51,7 @@ import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.core.type.filter.AssignableTypeFilter; import org.springframework.core.type.filter.TypeFilter; +import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; import org.springframework.stereotype.Controller; import org.springframework.stereotype.Indexed; @@ -237,6 +238,7 @@ public class ClassPathScanningCandidateComponentProvider implements EnvironmentC /** * Return the {@link BeanDefinitionRegistry} used by this scanner, if any. */ + @Nullable protected BeanDefinitionRegistry getRegistry() { return null; } @@ -341,6 +343,7 @@ public class ClassPathScanningCandidateComponentProvider implements EnvironmentC * @since 5.0 * @see #isIndexSupportsIncludeFilter(TypeFilter) */ + @Nullable protected String extractStereotype(TypeFilter filter) { if (filter instanceof AnnotationTypeFilter) { return ((AnnotationTypeFilter) filter).getAnnotationType().getName(); diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConditionContext.java b/spring-context/src/main/java/org/springframework/context/annotation/ConditionContext.java index 8be2dad8296..4eb3a847ca4 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConditionContext.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConditionContext.java @@ -20,6 +20,7 @@ import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.core.env.Environment; import org.springframework.core.io.ResourceLoader; +import org.springframework.lang.Nullable; /** * Context information for use by {@link Condition}s. @@ -34,6 +35,7 @@ public interface ConditionContext { * should the condition match or {@code null} if the registry is not available. * @return the registry or {@code null} */ + @Nullable BeanDefinitionRegistry getRegistry(); /** @@ -42,6 +44,7 @@ public interface ConditionContext { * is not available. * @return the bean factory or {@code null} */ + @Nullable ConfigurableListableBeanFactory getBeanFactory(); /** @@ -49,6 +52,7 @@ public interface ConditionContext { * or {@code null} if no environment is available. * @return the environment or {@code null} */ + @Nullable Environment getEnvironment(); /** @@ -56,6 +60,7 @@ public interface ConditionContext { * if the resource loader cannot be obtained. * @return a resource loader or {@code null} */ + @Nullable ResourceLoader getResourceLoader(); /** @@ -63,6 +68,7 @@ public interface ConditionContext { * classes or {@code null} if the default classloader should be used. * @return the class loader or {@code null} */ + @Nullable ClassLoader getClassLoader(); } diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConditionEvaluator.java b/spring-context/src/main/java/org/springframework/context/annotation/ConditionEvaluator.java index 617a045652a..7f085e101bc 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConditionEvaluator.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConditionEvaluator.java @@ -31,6 +31,7 @@ import org.springframework.core.env.EnvironmentCapable; import org.springframework.core.io.ResourceLoader; import org.springframework.core.type.AnnotatedTypeMetadata; import org.springframework.core.type.AnnotationMetadata; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.MultiValueMap; @@ -141,6 +142,7 @@ class ConditionEvaluator { this.resourceLoader = (resourceLoader != null ? resourceLoader : deduceResourceLoader(registry)); } + @Nullable private ConfigurableListableBeanFactory deduceBeanFactory(BeanDefinitionRegistry source) { if (source instanceof ConfigurableListableBeanFactory) { return (ConfigurableListableBeanFactory) source; @@ -151,6 +153,7 @@ class ConditionEvaluator { return null; } + @Nullable private Environment deduceEnvironment(BeanDefinitionRegistry source) { if (source instanceof EnvironmentCapable) { return ((EnvironmentCapable) source).getEnvironment(); @@ -158,6 +161,7 @@ class ConditionEvaluator { return null; } + @Nullable private ResourceLoader deduceResourceLoader(BeanDefinitionRegistry source) { if (source instanceof ResourceLoader) { return (ResourceLoader) source; diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClass.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClass.java index 5802c69b512..5cc0dccc259 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClass.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClass.java @@ -31,6 +31,7 @@ import org.springframework.core.io.Resource; import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.StandardAnnotationMetadata; import org.springframework.core.type.classreading.MetadataReader; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -88,7 +89,7 @@ final class ConfigurationClass { * @param importedBy the configuration class importing this one or {@code null} * @since 3.1.1 */ - public ConfigurationClass(MetadataReader metadataReader, ConfigurationClass importedBy) { + public ConfigurationClass(MetadataReader metadataReader, @Nullable ConfigurationClass importedBy) { this.metadata = metadataReader.getAnnotationMetadata(); this.resource = metadataReader.getResource(); this.importedBy.add(importedBy); @@ -115,7 +116,7 @@ final class ConfigurationClass { * @param importedBy the configuration class importing this one or {@code null} * @since 3.1.1 */ - public ConfigurationClass(Class clazz, ConfigurationClass importedBy) { + public ConfigurationClass(Class clazz, @Nullable ConfigurationClass importedBy) { this.metadata = new StandardAnnotationMetadata(clazz, true); this.resource = new DescriptiveResource(clazz.getName()); this.importedBy.add(importedBy); diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java index 192a8eabab2..cd4881f37f5 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java @@ -49,6 +49,7 @@ import org.springframework.cglib.proxy.NoOp; import org.springframework.cglib.transform.ClassEmitterTransformer; import org.springframework.cglib.transform.TransformingClassGenerator; import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.lang.Nullable; import org.springframework.objenesis.ObjenesisException; import org.springframework.objenesis.SpringObjenesis; import org.springframework.util.Assert; @@ -269,6 +270,7 @@ class ConfigurationClassEnhancer { private static class BeanFactoryAwareMethodInterceptor implements MethodInterceptor, ConditionalCallback { @Override + @Nullable public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { Field field = ReflectionUtils.findField(obj.getClass(), BEAN_FACTORY_FIELD); Assert.state(field != null, "Unable to find generated BeanFactory field"); diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java index 165a801be18..e6c1c3d3687 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java @@ -72,6 +72,7 @@ import org.springframework.core.type.StandardAnnotationMetadata; import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.AssignableTypeFilter; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.LinkedMultiValueMap; @@ -258,6 +259,7 @@ class ConfigurationClassParser { * @param sourceClass a source class * @return the superclass, or {@code null} if none found or previously processed */ + @Nullable protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass) throws IOException { diff --git a/spring-context/src/main/java/org/springframework/context/annotation/MBeanExportConfiguration.java b/spring-context/src/main/java/org/springframework/context/annotation/MBeanExportConfiguration.java index b934db9403c..0e4a8410411 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/MBeanExportConfiguration.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/MBeanExportConfiguration.java @@ -32,6 +32,7 @@ import org.springframework.jmx.export.annotation.AnnotationMBeanExporter; import org.springframework.jmx.support.RegistrationPolicy; import org.springframework.jmx.support.WebSphereMBeanServerFactoryBean; import org.springframework.jndi.JndiLocatorDelegate; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; @@ -152,6 +153,7 @@ public class MBeanExportConfiguration implements ImportAware, EnvironmentAware, public abstract MBeanServer getMBeanServer(); + @Nullable public static SpecificPlatform get() { ClassLoader classLoader = MBeanExportConfiguration.class.getClassLoader(); for (SpecificPlatform environment : values()) { diff --git a/spring-context/src/main/java/org/springframework/context/annotation/package-info.java b/spring-context/src/main/java/org/springframework/context/annotation/package-info.java index 590924e7d43..ca7cc4691b6 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/package-info.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/package-info.java @@ -3,4 +3,7 @@ * annotations, component-scanning, and Java-based metadata for creating * Spring-managed objects. */ +@NonNullApi package org.springframework.context.annotation; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/context/config/MBeanServerBeanDefinitionParser.java b/spring-context/src/main/java/org/springframework/context/config/MBeanServerBeanDefinitionParser.java index 2557ab6afbc..f9dc36848cc 100644 --- a/spring-context/src/main/java/org/springframework/context/config/MBeanServerBeanDefinitionParser.java +++ b/spring-context/src/main/java/org/springframework/context/config/MBeanServerBeanDefinitionParser.java @@ -26,6 +26,7 @@ import org.springframework.beans.factory.xml.ParserContext; import org.springframework.jmx.support.MBeanServerFactoryBean; import org.springframework.jmx.support.WebSphereMBeanServerFactoryBean; import org.springframework.jndi.JndiObjectFactoryBean; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; @@ -82,6 +83,7 @@ class MBeanServerBeanDefinitionParser extends AbstractBeanDefinitionParser { return bd; } + @Nullable static AbstractBeanDefinition findServerForSpecialEnvironment() { if (weblogicPresent) { RootBeanDefinition bd = new RootBeanDefinition(JndiObjectFactoryBean.class); diff --git a/spring-context/src/main/java/org/springframework/context/config/package-info.java b/spring-context/src/main/java/org/springframework/context/config/package-info.java index 872af52b884..cb5eea6b560 100644 --- a/spring-context/src/main/java/org/springframework/context/config/package-info.java +++ b/spring-context/src/main/java/org/springframework/context/config/package-info.java @@ -2,4 +2,7 @@ * Support package for advanced application context configuration, * with XML schema being the primary configuration format. */ +@NonNullApi package org.springframework.context.config; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/context/event/ApplicationEventMulticaster.java b/spring-context/src/main/java/org/springframework/context/event/ApplicationEventMulticaster.java index e00601d2437..f5a71053df8 100644 --- a/spring-context/src/main/java/org/springframework/context/event/ApplicationEventMulticaster.java +++ b/spring-context/src/main/java/org/springframework/context/event/ApplicationEventMulticaster.java @@ -19,6 +19,7 @@ package org.springframework.context.event; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.core.ResolvableType; +import org.springframework.lang.Nullable; /** * Interface to be implemented by objects that can manage a number of @@ -81,6 +82,6 @@ public interface ApplicationEventMulticaster { * @param eventType the type of event (can be null) * @since 4.2 */ - void multicastEvent(ApplicationEvent event, ResolvableType eventType); + void multicastEvent(ApplicationEvent event, @Nullable ResolvableType eventType); } diff --git a/spring-context/src/main/java/org/springframework/context/event/ApplicationListenerMethodAdapter.java b/spring-context/src/main/java/org/springframework/context/event/ApplicationListenerMethodAdapter.java index 4bb3088fdf5..3db1c2a5f45 100644 --- a/spring-context/src/main/java/org/springframework/context/event/ApplicationListenerMethodAdapter.java +++ b/spring-context/src/main/java/org/springframework/context/event/ApplicationListenerMethodAdapter.java @@ -36,6 +36,7 @@ import org.springframework.core.ResolvableType; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.Order; import org.springframework.expression.EvaluationContext; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.util.ReflectionUtils; @@ -187,6 +188,7 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe * return {@code null} to indicate that no suitable arguments could be resolved and * therefore the method should not be invoked at all for the specified event. */ + @Nullable protected Object[] resolveArguments(ApplicationEvent event) { ResolvableType declaredEventType = getResolvableType(event); if (declaredEventType == null) { @@ -338,7 +340,7 @@ public class ApplicationListenerMethodAdapter implements GenericApplicationListe return sb.toString(); } - + @Nullable private ResolvableType getResolvableType(ApplicationEvent event) { ResolvableType payloadType = null; if (event instanceof PayloadApplicationEvent) { diff --git a/spring-context/src/main/java/org/springframework/context/event/GenericApplicationListenerAdapter.java b/spring-context/src/main/java/org/springframework/context/event/GenericApplicationListenerAdapter.java index 7f27f1c6025..1af2b407de2 100644 --- a/spring-context/src/main/java/org/springframework/context/event/GenericApplicationListenerAdapter.java +++ b/spring-context/src/main/java/org/springframework/context/event/GenericApplicationListenerAdapter.java @@ -21,6 +21,7 @@ import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.core.Ordered; import org.springframework.core.ResolvableType; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -88,7 +89,7 @@ public class GenericApplicationListenerAdapter implements GenericApplicationList return (this.delegate instanceof Ordered ? ((Ordered) this.delegate).getOrder() : Ordered.LOWEST_PRECEDENCE); } - + @Nullable static ResolvableType resolveDeclaredEventType(Class listenerType) { ResolvableType resolvableType = ResolvableType.forClass(listenerType).as(ApplicationListener.class); if (resolvableType == null || !resolvableType.hasGenerics()) { diff --git a/spring-context/src/main/java/org/springframework/context/event/package-info.java b/spring-context/src/main/java/org/springframework/context/event/package-info.java index d4dcbaa6945..b364750977c 100644 --- a/spring-context/src/main/java/org/springframework/context/event/package-info.java +++ b/spring-context/src/main/java/org/springframework/context/event/package-info.java @@ -2,4 +2,7 @@ * Support classes for application events, like standard context events. * To be supported by all major application context implementations. */ +@NonNullApi package org.springframework.context.event; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/context/expression/package-info.java b/spring-context/src/main/java/org/springframework/context/expression/package-info.java index cb8b9b2db6e..37e662a8767 100644 --- a/spring-context/src/main/java/org/springframework/context/expression/package-info.java +++ b/spring-context/src/main/java/org/springframework/context/expression/package-info.java @@ -1,4 +1,7 @@ /** * Expression parsing support within a Spring application context. */ +@NonNullApi package org.springframework.context.expression; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/context/i18n/LocaleContext.java b/spring-context/src/main/java/org/springframework/context/i18n/LocaleContext.java index 6ac813b5274..001956ffac7 100644 --- a/spring-context/src/main/java/org/springframework/context/i18n/LocaleContext.java +++ b/spring-context/src/main/java/org/springframework/context/i18n/LocaleContext.java @@ -18,6 +18,8 @@ package org.springframework.context.i18n; import java.util.Locale; +import org.springframework.lang.Nullable; + /** * Strategy interface for determining the current Locale. * @@ -36,6 +38,7 @@ public interface LocaleContext { * depending on the implementation strategy. * @return the current Locale, or {@code null} if no specific Locale associated */ + @Nullable Locale getLocale(); } diff --git a/spring-context/src/main/java/org/springframework/context/i18n/LocaleContextHolder.java b/spring-context/src/main/java/org/springframework/context/i18n/LocaleContextHolder.java index fd8875b9a2e..b6fa354bf81 100644 --- a/spring-context/src/main/java/org/springframework/context/i18n/LocaleContextHolder.java +++ b/spring-context/src/main/java/org/springframework/context/i18n/LocaleContextHolder.java @@ -21,6 +21,7 @@ import java.util.TimeZone; import org.springframework.core.NamedInheritableThreadLocal; import org.springframework.core.NamedThreadLocal; +import org.springframework.lang.Nullable; /** * Simple holder class that associates a LocaleContext instance @@ -74,7 +75,7 @@ public abstract class LocaleContextHolder { * @see SimpleLocaleContext * @see SimpleTimeZoneAwareLocaleContext */ - public static void setLocaleContext(LocaleContext localeContext) { + public static void setLocaleContext(@Nullable LocaleContext localeContext) { setLocaleContext(localeContext, false); } @@ -89,7 +90,7 @@ public abstract class LocaleContextHolder { * @see SimpleLocaleContext * @see SimpleTimeZoneAwareLocaleContext */ - public static void setLocaleContext(LocaleContext localeContext, boolean inheritable) { + public static void setLocaleContext(@Nullable LocaleContext localeContext, boolean inheritable) { if (localeContext == null) { resetLocaleContext(); } @@ -109,6 +110,7 @@ public abstract class LocaleContextHolder { * Return the LocaleContext associated with the current thread, if any. * @return the current LocaleContext, or {@code null} if none */ + @Nullable public static LocaleContext getLocaleContext() { LocaleContext localeContext = localeContextHolder.get(); if (localeContext == null) { @@ -127,7 +129,7 @@ public abstract class LocaleContextHolder { * @see #setTimeZone(TimeZone) * @see SimpleLocaleContext#SimpleLocaleContext(Locale) */ - public static void setLocale(Locale locale) { + public static void setLocale(@Nullable Locale locale) { setLocale(locale, false); } @@ -142,7 +144,7 @@ public abstract class LocaleContextHolder { * @see #setTimeZone(TimeZone, boolean) * @see SimpleLocaleContext#SimpleLocaleContext(Locale) */ - public static void setLocale(Locale locale, boolean inheritable) { + public static void setLocale(@Nullable Locale locale, boolean inheritable) { LocaleContext localeContext = getLocaleContext(); TimeZone timeZone = (localeContext instanceof TimeZoneAwareLocaleContext ? ((TimeZoneAwareLocaleContext) localeContext).getTimeZone() : null); @@ -172,7 +174,7 @@ public abstract class LocaleContextHolder { * @see #getLocale() * @see Locale#getDefault() */ - public static void setDefaultLocale(Locale locale) { + public static void setDefaultLocale(@Nullable Locale locale) { LocaleContextHolder.defaultLocale = locale; } @@ -213,7 +215,7 @@ public abstract class LocaleContextHolder { * @see #setLocale(Locale) * @see SimpleTimeZoneAwareLocaleContext#SimpleTimeZoneAwareLocaleContext(Locale, TimeZone) */ - public static void setTimeZone(TimeZone timeZone) { + public static void setTimeZone(@Nullable TimeZone timeZone) { setTimeZone(timeZone, false); } @@ -228,7 +230,7 @@ public abstract class LocaleContextHolder { * @see #setLocale(Locale, boolean) * @see SimpleTimeZoneAwareLocaleContext#SimpleTimeZoneAwareLocaleContext(Locale, TimeZone) */ - public static void setTimeZone(TimeZone timeZone, boolean inheritable) { + public static void setTimeZone(@Nullable TimeZone timeZone, boolean inheritable) { LocaleContext localeContext = getLocaleContext(); Locale locale = (localeContext != null ? localeContext.getLocale() : null); if (timeZone != null) { @@ -257,7 +259,7 @@ public abstract class LocaleContextHolder { * @see #getTimeZone() * @see TimeZone#getDefault() */ - public static void setDefaultTimeZone(TimeZone timeZone) { + public static void setDefaultTimeZone(@Nullable TimeZone timeZone) { defaultTimeZone = timeZone; } diff --git a/spring-context/src/main/java/org/springframework/context/i18n/TimeZoneAwareLocaleContext.java b/spring-context/src/main/java/org/springframework/context/i18n/TimeZoneAwareLocaleContext.java index 825e0ecd041..186afeb4dac 100644 --- a/spring-context/src/main/java/org/springframework/context/i18n/TimeZoneAwareLocaleContext.java +++ b/spring-context/src/main/java/org/springframework/context/i18n/TimeZoneAwareLocaleContext.java @@ -18,6 +18,8 @@ package org.springframework.context.i18n; import java.util.TimeZone; +import org.springframework.lang.Nullable; + /** * Extension of {@link LocaleContext}, adding awareness of the current time zone. * @@ -37,6 +39,7 @@ public interface TimeZoneAwareLocaleContext extends LocaleContext { * depending on the implementation strategy. * @return the current TimeZone, or {@code null} if no specific TimeZone associated */ + @Nullable TimeZone getTimeZone(); } diff --git a/spring-context/src/main/java/org/springframework/context/i18n/package-info.java b/spring-context/src/main/java/org/springframework/context/i18n/package-info.java index 1bad27837cc..41c681a297d 100644 --- a/spring-context/src/main/java/org/springframework/context/i18n/package-info.java +++ b/spring-context/src/main/java/org/springframework/context/i18n/package-info.java @@ -2,4 +2,7 @@ * Abstraction for determining the current Locale, * plus global holder that exposes a thread-bound Locale. */ +@NonNullApi package org.springframework.context.i18n; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/context/index/CandidateComponentsIndexLoader.java b/spring-context/src/main/java/org/springframework/context/index/CandidateComponentsIndexLoader.java index bdb649d2640..02d85b9a49b 100644 --- a/spring-context/src/main/java/org/springframework/context/index/CandidateComponentsIndexLoader.java +++ b/spring-context/src/main/java/org/springframework/context/index/CandidateComponentsIndexLoader.java @@ -30,6 +30,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.core.SpringProperties; import org.springframework.core.io.UrlResource; import org.springframework.core.io.support.PropertiesLoaderUtils; +import org.springframework.lang.Nullable; import org.springframework.util.ConcurrentReferenceHashMap; /** @@ -75,7 +76,8 @@ public class CandidateComponentsIndexLoader { * @throws IllegalArgumentException if any module index cannot * be loaded or if an error occurs while creating {@link CandidateComponentsIndex} */ - public static CandidateComponentsIndex loadIndex(ClassLoader classLoader) { + @Nullable + public static CandidateComponentsIndex loadIndex(@Nullable ClassLoader classLoader) { ClassLoader classLoaderToUse = classLoader; if (classLoaderToUse == null) { classLoaderToUse = CandidateComponentsIndexLoader.class.getClassLoader(); @@ -83,6 +85,7 @@ public class CandidateComponentsIndexLoader { return cache.computeIfAbsent(classLoaderToUse, CandidateComponentsIndexLoader::doLoadIndex); } + @Nullable private static CandidateComponentsIndex doLoadIndex(ClassLoader classLoader) { if (shouldIgnoreIndex) { return null; diff --git a/spring-context/src/main/java/org/springframework/context/index/package-info.java b/spring-context/src/main/java/org/springframework/context/index/package-info.java index 25c09d5c6d1..4793fd57ea0 100644 --- a/spring-context/src/main/java/org/springframework/context/index/package-info.java +++ b/spring-context/src/main/java/org/springframework/context/index/package-info.java @@ -1,4 +1,7 @@ /** * Support package for reading and managing the components index. */ +@NonNullApi package org.springframework.context.index; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/context/package-info.java b/spring-context/src/main/java/org/springframework/context/package-info.java index 357cee5d73a..3f08f4ef0b6 100644 --- a/spring-context/src/main/java/org/springframework/context/package-info.java +++ b/spring-context/src/main/java/org/springframework/context/package-info.java @@ -10,4 +10,7 @@ * is that application objects can often be configured without * any dependency on Spring-specific APIs. */ +@NonNullApi package org.springframework.context; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/context/support/AbstractMessageSource.java b/spring-context/src/main/java/org/springframework/context/support/AbstractMessageSource.java index 6dcd90989bf..307cd0b23a9 100644 --- a/spring-context/src/main/java/org/springframework/context/support/AbstractMessageSource.java +++ b/spring-context/src/main/java/org/springframework/context/support/AbstractMessageSource.java @@ -26,6 +26,7 @@ import org.springframework.context.HierarchicalMessageSource; import org.springframework.context.MessageSource; import org.springframework.context.MessageSourceResolvable; import org.springframework.context.NoSuchMessageException; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -93,6 +94,7 @@ public abstract class AbstractMessageSource extends MessageSourceSupport impleme /** * Return a Properties object defining locale-independent common messages, if any. */ + @Nullable protected Properties getCommonMessages() { return this.commonMessages; } @@ -192,6 +194,7 @@ public abstract class AbstractMessageSource extends MessageSourceSupport impleme * @see #getMessage(MessageSourceResolvable, Locale) * @see #setUseCodeAsDefaultMessage */ + @Nullable protected String getMessageInternal(String code, Object[] args, Locale locale) { if (code == null) { return null; @@ -248,6 +251,7 @@ public abstract class AbstractMessageSource extends MessageSourceSupport impleme * @return the resolved message, or {@code null} if not found * @see #getParentMessageSource() */ + @Nullable protected String getMessageFromParent(String code, Object[] args, Locale locale) { MessageSource parent = getParentMessageSource(); if (parent != null) { @@ -277,6 +281,7 @@ public abstract class AbstractMessageSource extends MessageSourceSupport impleme * @see #renderDefaultMessage(String, Object[], Locale) * @see #getDefaultMessage(String) */ + @Nullable protected String getDefaultMessage(MessageSourceResolvable resolvable, Locale locale) { String defaultMessage = resolvable.getDefaultMessage(); String[] codes = resolvable.getCodes(); @@ -300,6 +305,7 @@ public abstract class AbstractMessageSource extends MessageSourceSupport impleme * @return the default message to use, or {@code null} if none * @see #setUseCodeAsDefaultMessage */ + @Nullable protected String getDefaultMessage(String code) { if (isUseCodeAsDefaultMessage()) { return code; @@ -350,6 +356,7 @@ public abstract class AbstractMessageSource extends MessageSourceSupport impleme * @see #resolveCode * @see java.text.MessageFormat */ + @Nullable protected String resolveCodeWithoutArguments(String code, Locale locale) { MessageFormat messageFormat = resolveCode(code, locale); if (messageFormat != null) { @@ -373,6 +380,7 @@ public abstract class AbstractMessageSource extends MessageSourceSupport impleme * @return the MessageFormat for the message, or {@code null} if not found * @see #resolveCodeWithoutArguments(String, java.util.Locale) */ + @Nullable protected abstract MessageFormat resolveCode(String code, Locale locale); } diff --git a/spring-context/src/main/java/org/springframework/context/support/AbstractRefreshableConfigApplicationContext.java b/spring-context/src/main/java/org/springframework/context/support/AbstractRefreshableConfigApplicationContext.java index 0775e5782d4..9109f94e7e8 100644 --- a/spring-context/src/main/java/org/springframework/context/support/AbstractRefreshableConfigApplicationContext.java +++ b/spring-context/src/main/java/org/springframework/context/support/AbstractRefreshableConfigApplicationContext.java @@ -19,6 +19,7 @@ package org.springframework.context.support; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -94,6 +95,7 @@ public abstract class AbstractRefreshableConfigApplicationContext extends Abstra * @see #getResources * @see #getResourcePatternResolver */ + @Nullable protected String[] getConfigLocations() { return (this.configLocations != null ? this.configLocations : getDefaultConfigLocations()); } @@ -106,6 +108,7 @@ public abstract class AbstractRefreshableConfigApplicationContext extends Abstra * @return an array of default config locations, if any * @see #setConfigLocations */ + @Nullable protected String[] getDefaultConfigLocations() { return null; } diff --git a/spring-context/src/main/java/org/springframework/context/support/AbstractResourceBasedMessageSource.java b/spring-context/src/main/java/org/springframework/context/support/AbstractResourceBasedMessageSource.java index 5c6bae5777b..a97f5e5f8a0 100644 --- a/spring-context/src/main/java/org/springframework/context/support/AbstractResourceBasedMessageSource.java +++ b/spring-context/src/main/java/org/springframework/context/support/AbstractResourceBasedMessageSource.java @@ -19,6 +19,7 @@ package org.springframework.context.support; import java.util.LinkedHashSet; import java.util.Set; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -126,6 +127,7 @@ public abstract class AbstractResourceBasedMessageSource extends AbstractMessage * Return the default charset to use for parsing properties files, if any. * @since 4.3 */ + @Nullable protected String getDefaultEncoding() { return this.defaultEncoding; } diff --git a/spring-context/src/main/java/org/springframework/context/support/AbstractXmlApplicationContext.java b/spring-context/src/main/java/org/springframework/context/support/AbstractXmlApplicationContext.java index 1e7681aa0ba..57aedda8edd 100644 --- a/spring-context/src/main/java/org/springframework/context/support/AbstractXmlApplicationContext.java +++ b/spring-context/src/main/java/org/springframework/context/support/AbstractXmlApplicationContext.java @@ -24,6 +24,7 @@ import org.springframework.beans.factory.xml.ResourceEntityResolver; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.context.ApplicationContext; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; /** * Convenient base class for {@link org.springframework.context.ApplicationContext} @@ -136,6 +137,7 @@ public abstract class AbstractXmlApplicationContext extends AbstractRefreshableC * @return an array of Resource objects, or {@code null} if none * @see #getConfigLocations() */ + @Nullable protected Resource[] getConfigResources() { return null; } diff --git a/spring-context/src/main/java/org/springframework/context/support/GenericApplicationContext.java b/spring-context/src/main/java/org/springframework/context/support/GenericApplicationContext.java index f52b4cd41a6..a8ef05ed80c 100644 --- a/spring-context/src/main/java/org/springframework/context/support/GenericApplicationContext.java +++ b/spring-context/src/main/java/org/springframework/context/support/GenericApplicationContext.java @@ -34,6 +34,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -384,7 +385,7 @@ public class GenericApplicationContext extends AbstractApplicationContext implem * @since 5.0 * @see #registerBean(String, Class, Supplier, BeanDefinitionCustomizer...) */ - public final void registerBean(String beanName, Class beanClass, BeanDefinitionCustomizer... customizers) { + public final void registerBean(@Nullable String beanName, Class beanClass, BeanDefinitionCustomizer... customizers) { registerBean(beanName, beanClass, null, customizers); } @@ -418,7 +419,7 @@ public class GenericApplicationContext extends AbstractApplicationContext implem * factory's {@link BeanDefinition}, e.g. setting a lazy-init or primary flag * @since 5.0 */ - public void registerBean(String beanName, Class beanClass, Supplier supplier, + public void registerBean(@Nullable String beanName, @Nullable Class beanClass, Supplier supplier, BeanDefinitionCustomizer... customizers) { Assert.isTrue(beanName != null || beanClass != null, "Either bean name or bean class must be specified"); diff --git a/spring-context/src/main/java/org/springframework/context/support/LiveBeansView.java b/spring-context/src/main/java/org/springframework/context/support/LiveBeansView.java index eb2b3bd5a90..97d437e1207 100644 --- a/spring-context/src/main/java/org/springframework/context/support/LiveBeansView.java +++ b/spring-context/src/main/java/org/springframework/context/support/LiveBeansView.java @@ -31,6 +31,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationContextException; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -223,6 +224,7 @@ public class LiveBeansView implements LiveBeansViewMBean, ApplicationContextAwar * @param bd the bean definition to build the resource description for * @return the JSON-escaped resource description */ + @Nullable protected String getEscapedResourceDescription(BeanDefinition bd) { String resourceDescription = bd.getResourceDescription(); if (resourceDescription == null) { diff --git a/spring-context/src/main/java/org/springframework/context/support/MessageSourceAccessor.java b/spring-context/src/main/java/org/springframework/context/support/MessageSourceAccessor.java index 03fa94a5256..808766d297f 100644 --- a/spring-context/src/main/java/org/springframework/context/support/MessageSourceAccessor.java +++ b/spring-context/src/main/java/org/springframework/context/support/MessageSourceAccessor.java @@ -22,6 +22,7 @@ import org.springframework.context.MessageSource; import org.springframework.context.MessageSourceResolvable; import org.springframework.context.NoSuchMessageException; import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.lang.Nullable; /** * Helper class for easy access to messages from a MessageSource, @@ -101,7 +102,7 @@ public class MessageSourceAccessor { * @param defaultMessage String to return if the lookup fails * @return the message */ - public String getMessage(String code, Object[] args, String defaultMessage) { + public String getMessage(String code, @Nullable Object[] args, String defaultMessage) { return this.messageSource.getMessage(code, args, defaultMessage, getDefaultLocale()); } @@ -113,7 +114,7 @@ public class MessageSourceAccessor { * @param locale Locale in which to do lookup * @return the message */ - public String getMessage(String code, Object[] args, String defaultMessage, Locale locale) { + public String getMessage(String code, @Nullable Object[] args, String defaultMessage, Locale locale) { return this.messageSource.getMessage(code, args, defaultMessage, locale); } @@ -145,7 +146,7 @@ public class MessageSourceAccessor { * @return the message * @throws org.springframework.context.NoSuchMessageException if not found */ - public String getMessage(String code, Object[] args) throws NoSuchMessageException { + public String getMessage(String code, @Nullable Object[] args) throws NoSuchMessageException { return this.messageSource.getMessage(code, args, getDefaultLocale()); } @@ -157,7 +158,7 @@ public class MessageSourceAccessor { * @return the message * @throws org.springframework.context.NoSuchMessageException if not found */ - public String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException { + public String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException { return this.messageSource.getMessage(code, args, locale); } diff --git a/spring-context/src/main/java/org/springframework/context/support/MessageSourceResourceBundle.java b/spring-context/src/main/java/org/springframework/context/support/MessageSourceResourceBundle.java index 605aa72e871..31ff1043781 100644 --- a/spring-context/src/main/java/org/springframework/context/support/MessageSourceResourceBundle.java +++ b/spring-context/src/main/java/org/springframework/context/support/MessageSourceResourceBundle.java @@ -22,6 +22,7 @@ import java.util.ResourceBundle; import org.springframework.context.MessageSource; import org.springframework.context.NoSuchMessageException; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -70,6 +71,7 @@ public class MessageSourceResourceBundle extends ResourceBundle { * Returns {@code null} if the message could not be resolved. */ @Override + @Nullable protected Object handleGetObject(String key) { try { return this.messageSource.getMessage(key, null, this.locale); diff --git a/spring-context/src/main/java/org/springframework/context/support/MessageSourceSupport.java b/spring-context/src/main/java/org/springframework/context/support/MessageSourceSupport.java index d7e175d8a87..86d877ce9c3 100644 --- a/spring-context/src/main/java/org/springframework/context/support/MessageSourceSupport.java +++ b/spring-context/src/main/java/org/springframework/context/support/MessageSourceSupport.java @@ -24,6 +24,7 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -96,7 +97,7 @@ public abstract class MessageSourceSupport { * @return the rendered default message (with resolved arguments) * @see #formatMessage(String, Object[], java.util.Locale) */ - protected String renderDefaultMessage(String defaultMessage, Object[] args, Locale locale) { + protected String renderDefaultMessage(String defaultMessage, @Nullable Object[] args, Locale locale) { return formatMessage(defaultMessage, args, locale); } diff --git a/spring-context/src/main/java/org/springframework/context/support/ReloadableResourceBundleMessageSource.java b/spring-context/src/main/java/org/springframework/context/support/ReloadableResourceBundleMessageSource.java index b281902eb26..b144f245d32 100644 --- a/spring-context/src/main/java/org/springframework/context/support/ReloadableResourceBundleMessageSource.java +++ b/spring-context/src/main/java/org/springframework/context/support/ReloadableResourceBundleMessageSource.java @@ -33,6 +33,7 @@ import org.springframework.context.ResourceLoaderAware; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; +import org.springframework.lang.Nullable; import org.springframework.util.DefaultPropertiesPersister; import org.springframework.util.PropertiesPersister; import org.springframework.util.StringUtils; @@ -395,7 +396,7 @@ public class ReloadableResourceBundleMessageSource extends AbstractResourceBased * @param filename the bundle filename (basename + Locale) * @param propHolder the current PropertiesHolder for the bundle */ - protected PropertiesHolder refreshProperties(String filename, PropertiesHolder propHolder) { + protected PropertiesHolder refreshProperties(String filename, @Nullable PropertiesHolder propHolder) { long refreshTimestamp = (getCacheMillis() < 0 ? -1 : System.currentTimeMillis()); Resource resource = this.resourceLoader.getResource(filename + PROPERTIES_SUFFIX); @@ -585,6 +586,7 @@ public class ReloadableResourceBundleMessageSource extends AbstractResourceBased return this.refreshTimestamp; } + @Nullable public String getProperty(String code) { if (this.properties == null) { return null; @@ -592,6 +594,7 @@ public class ReloadableResourceBundleMessageSource extends AbstractResourceBased return this.properties.getProperty(code); } + @Nullable public MessageFormat getMessageFormat(String code, Locale locale) { if (this.properties == null) { return null; diff --git a/spring-context/src/main/java/org/springframework/context/support/ResourceBundleMessageSource.java b/spring-context/src/main/java/org/springframework/context/support/ResourceBundleMessageSource.java index 3417ae508bd..d70b21b633c 100644 --- a/spring-context/src/main/java/org/springframework/context/support/ResourceBundleMessageSource.java +++ b/spring-context/src/main/java/org/springframework/context/support/ResourceBundleMessageSource.java @@ -35,6 +35,7 @@ import java.util.ResourceBundle; import java.util.Set; import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -165,6 +166,7 @@ public class ResourceBundleMessageSource extends AbstractResourceBasedMessageSou * @return the resulting ResourceBundle, or {@code null} if none * found for the given basename and Locale */ + @Nullable protected ResourceBundle getResourceBundle(String basename, Locale locale) { if (getCacheMillis() >= 0) { // Fresh ResourceBundle.getBundle call in order to let ResourceBundle @@ -238,6 +240,7 @@ public class ResourceBundleMessageSource extends AbstractResourceBasedMessageSou * defined for the given code * @throws MissingResourceException if thrown by the ResourceBundle */ + @Nullable protected MessageFormat getMessageFormat(ResourceBundle bundle, String code, Locale locale) throws MissingResourceException { @@ -287,6 +290,7 @@ public class ResourceBundleMessageSource extends AbstractResourceBasedMessageSou * @see ResourceBundle#getString(String) * @see ResourceBundle#containsKey(String) */ + @Nullable protected String getStringOrNull(ResourceBundle bundle, String key) { if (bundle.containsKey(key)) { try { diff --git a/spring-context/src/main/java/org/springframework/context/support/package-info.java b/spring-context/src/main/java/org/springframework/context/support/package-info.java index da9f3cafdd0..c84723e8e06 100644 --- a/spring-context/src/main/java/org/springframework/context/support/package-info.java +++ b/spring-context/src/main/java/org/springframework/context/support/package-info.java @@ -3,4 +3,7 @@ * such as abstract base classes for ApplicationContext * implementations and a MessageSource implementation. */ +@NonNullApi package org.springframework.context.support; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/context/weaving/AspectJWeavingEnabler.java b/spring-context/src/main/java/org/springframework/context/weaving/AspectJWeavingEnabler.java index e93e500baff..ec5627bf071 100644 --- a/spring-context/src/main/java/org/springframework/context/weaving/AspectJWeavingEnabler.java +++ b/spring-context/src/main/java/org/springframework/context/weaving/AspectJWeavingEnabler.java @@ -29,6 +29,7 @@ import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.core.Ordered; import org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver; import org.springframework.instrument.classloading.LoadTimeWeaver; +import org.springframework.lang.Nullable; /** * Post-processor that registers AspectJ's @@ -77,7 +78,7 @@ public class AspectJWeavingEnabler * @param weaverToUse the LoadTimeWeaver to apply to (or {@code null} for a default weaver) * @param beanClassLoader the class loader to create a default weaver for (if necessary) */ - public static void enableAspectJWeaving(LoadTimeWeaver weaverToUse, ClassLoader beanClassLoader) { + public static void enableAspectJWeaving(@Nullable LoadTimeWeaver weaverToUse, ClassLoader beanClassLoader) { if (weaverToUse == null) { if (InstrumentationLoadTimeWeaver.isInstrumentationAvailable()) { weaverToUse = new InstrumentationLoadTimeWeaver(beanClassLoader); diff --git a/spring-context/src/main/java/org/springframework/context/weaving/DefaultContextLoadTimeWeaver.java b/spring-context/src/main/java/org/springframework/context/weaving/DefaultContextLoadTimeWeaver.java index 65d5a6c204b..1299a216523 100644 --- a/spring-context/src/main/java/org/springframework/context/weaving/DefaultContextLoadTimeWeaver.java +++ b/spring-context/src/main/java/org/springframework/context/weaving/DefaultContextLoadTimeWeaver.java @@ -32,6 +32,7 @@ import org.springframework.instrument.classloading.jboss.JBossLoadTimeWeaver; import org.springframework.instrument.classloading.tomcat.TomcatLoadTimeWeaver; import org.springframework.instrument.classloading.weblogic.WebLogicLoadTimeWeaver; import org.springframework.instrument.classloading.websphere.WebSphereLoadTimeWeaver; +import org.springframework.lang.Nullable; /** * Default {@link LoadTimeWeaver} bean for use in an application context, @@ -105,6 +106,7 @@ public class DefaultContextLoadTimeWeaver implements LoadTimeWeaver, BeanClassLo * of a specific method (addInstanceClassPreProcessor) for any earlier * versions even though the ClassLoader name is the same. */ + @Nullable protected LoadTimeWeaver createServerSpecificLoadTimeWeaver(ClassLoader classLoader) { String name = classLoader.getClass().getName(); try { diff --git a/spring-context/src/main/java/org/springframework/context/weaving/LoadTimeWeaverAwareProcessor.java b/spring-context/src/main/java/org/springframework/context/weaving/LoadTimeWeaverAwareProcessor.java index 7509b8beffa..22ceb478ec2 100644 --- a/spring-context/src/main/java/org/springframework/context/weaving/LoadTimeWeaverAwareProcessor.java +++ b/spring-context/src/main/java/org/springframework/context/weaving/LoadTimeWeaverAwareProcessor.java @@ -22,6 +22,7 @@ import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.instrument.classloading.LoadTimeWeaver; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -65,7 +66,7 @@ public class LoadTimeWeaverAwareProcessor implements BeanPostProcessor, BeanFact * {@link ConfigurableApplicationContext#LOAD_TIME_WEAVER_BEAN_NAME "loadTimeWeaver"}. * @param loadTimeWeaver the specific {@code LoadTimeWeaver} that is to be used */ - public LoadTimeWeaverAwareProcessor(LoadTimeWeaver loadTimeWeaver) { + public LoadTimeWeaverAwareProcessor(@Nullable LoadTimeWeaver loadTimeWeaver) { this.loadTimeWeaver = loadTimeWeaver; } diff --git a/spring-context/src/main/java/org/springframework/context/weaving/package-info.java b/spring-context/src/main/java/org/springframework/context/weaving/package-info.java index 68b06e332b5..533a21bedbe 100644 --- a/spring-context/src/main/java/org/springframework/context/weaving/package-info.java +++ b/spring-context/src/main/java/org/springframework/context/weaving/package-info.java @@ -2,4 +2,7 @@ * Load-time weaving support for a Spring application context, building on Spring's * {@link org.springframework.instrument.classloading.LoadTimeWeaver} abstraction. */ +@NonNullApi package org.springframework.context.weaving; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/ejb/access/AbstractRemoteSlsbInvokerInterceptor.java b/spring-context/src/main/java/org/springframework/ejb/access/AbstractRemoteSlsbInvokerInterceptor.java index 2bb1b146aea..d785341b268 100644 --- a/spring-context/src/main/java/org/springframework/ejb/access/AbstractRemoteSlsbInvokerInterceptor.java +++ b/spring-context/src/main/java/org/springframework/ejb/access/AbstractRemoteSlsbInvokerInterceptor.java @@ -25,6 +25,7 @@ import javax.naming.NamingException; import org.aopalliance.intercept.MethodInvocation; +import org.springframework.lang.Nullable; import org.springframework.remoting.RemoteConnectFailureException; import org.springframework.remoting.RemoteLookupFailureException; import org.springframework.remoting.rmi.RmiClientInterceptorUtils; @@ -164,6 +165,7 @@ public abstract class AbstractRemoteSlsbInvokerInterceptor extends AbstractSlsbI * @throws Throwable in case of invocation failure * @see #invoke */ + @Nullable protected Object refreshAndRetry(MethodInvocation invocation) throws Throwable { try { refreshHome(); @@ -184,6 +186,7 @@ public abstract class AbstractRemoteSlsbInvokerInterceptor extends AbstractSlsbI * @see #getHome * @see #newSessionBeanInstance */ + @Nullable protected abstract Object doInvoke(MethodInvocation invocation) throws Throwable; diff --git a/spring-context/src/main/java/org/springframework/ejb/access/AbstractSlsbInvokerInterceptor.java b/spring-context/src/main/java/org/springframework/ejb/access/AbstractSlsbInvokerInterceptor.java index a9a770f510d..7f6ec9a15b5 100644 --- a/spring-context/src/main/java/org/springframework/ejb/access/AbstractSlsbInvokerInterceptor.java +++ b/spring-context/src/main/java/org/springframework/ejb/access/AbstractSlsbInvokerInterceptor.java @@ -25,6 +25,7 @@ import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.springframework.jndi.JndiObjectLocator; +import org.springframework.lang.Nullable; /** * Base class for AOP interceptors invoking local or remote Stateless Session Beans. @@ -132,6 +133,7 @@ public abstract class AbstractSlsbInvokerInterceptor extends JndiObjectLocator * @return the create method * @throws EjbAccessException if the method couldn't be retrieved */ + @Nullable protected Method getCreateMethod(Object home) throws EjbAccessException { try { // Cache the EJB create() method that must be declared on the home interface. @@ -201,6 +203,7 @@ public abstract class AbstractSlsbInvokerInterceptor extends JndiObjectLocator * @return the invocation result, if any * @throws Throwable in case of invocation failure */ + @Nullable protected abstract Object invokeInContext(MethodInvocation invocation) throws Throwable; diff --git a/spring-context/src/main/java/org/springframework/ejb/access/package-info.java b/spring-context/src/main/java/org/springframework/ejb/access/package-info.java index 523280e2e41..bc4fcfdf628 100644 --- a/spring-context/src/main/java/org/springframework/ejb/access/package-info.java +++ b/spring-context/src/main/java/org/springframework/ejb/access/package-info.java @@ -19,4 +19,7 @@ * It now uses FactoryBeans and AOP, rather than the custom bean definitions described in * Expert One-on-One J2EE. */ +@NonNullApi package org.springframework.ejb.access; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/ejb/config/package-info.java b/spring-context/src/main/java/org/springframework/ejb/config/package-info.java index ccb26f87bb0..7cdd1053479 100644 --- a/spring-context/src/main/java/org/springframework/ejb/config/package-info.java +++ b/spring-context/src/main/java/org/springframework/ejb/config/package-info.java @@ -2,4 +2,7 @@ * Support package for EJB/Java EE-related configuration, * with XML schema being the primary configuration format. */ +@NonNullApi package org.springframework.ejb.config; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/format/annotation/package-info.java b/spring-context/src/main/java/org/springframework/format/annotation/package-info.java index 3656baa1699..88d246417c5 100644 --- a/spring-context/src/main/java/org/springframework/format/annotation/package-info.java +++ b/spring-context/src/main/java/org/springframework/format/annotation/package-info.java @@ -1,4 +1,7 @@ /** * Annotations for declaratively configuring field formatting rules. */ +@NonNullApi package org.springframework.format.annotation; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/format/datetime/joda/DateTimeFormatterFactory.java b/spring-context/src/main/java/org/springframework/format/datetime/joda/DateTimeFormatterFactory.java index d0efdaa3a1d..1bacf2b4ddc 100644 --- a/spring-context/src/main/java/org/springframework/format/datetime/joda/DateTimeFormatterFactory.java +++ b/spring-context/src/main/java/org/springframework/format/datetime/joda/DateTimeFormatterFactory.java @@ -24,6 +24,7 @@ import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.ISODateTimeFormat; import org.springframework.format.annotation.DateTimeFormat.ISO; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -129,7 +130,7 @@ public class DateTimeFormatterFactory { * factory properties have been set (can be {@code null}). * @return a new date time formatter */ - public DateTimeFormatter createDateTimeFormatter(DateTimeFormatter fallbackFormatter) { + public DateTimeFormatter createDateTimeFormatter(@Nullable DateTimeFormatter fallbackFormatter) { DateTimeFormatter dateTimeFormatter = null; if (StringUtils.hasLength(this.pattern)) { dateTimeFormatter = DateTimeFormat.forPattern(this.pattern); diff --git a/spring-context/src/main/java/org/springframework/format/datetime/joda/JodaTimeContext.java b/spring-context/src/main/java/org/springframework/format/datetime/joda/JodaTimeContext.java index b5c2766c7a6..4c8c2a0090e 100644 --- a/spring-context/src/main/java/org/springframework/format/datetime/joda/JodaTimeContext.java +++ b/spring-context/src/main/java/org/springframework/format/datetime/joda/JodaTimeContext.java @@ -25,6 +25,7 @@ import org.joda.time.format.DateTimeFormatter; import org.springframework.context.i18n.LocaleContext; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.context.i18n.TimeZoneAwareLocaleContext; +import org.springframework.lang.Nullable; /** * A context that holds user-specific Joda-Time settings such as the user's @@ -53,6 +54,7 @@ public class JodaTimeContext { /** * Return the user's chronology (calendar system), if any. */ + @Nullable public Chronology getChronology() { return this.chronology; } @@ -72,6 +74,7 @@ public class JodaTimeContext { /** * Return the user's time zone, if any. */ + @Nullable public DateTimeZone getTimeZone() { return this.timeZone; } diff --git a/spring-context/src/main/java/org/springframework/format/datetime/joda/JodaTimeContextHolder.java b/spring-context/src/main/java/org/springframework/format/datetime/joda/JodaTimeContextHolder.java index 631420b2569..7b6148d9ba3 100644 --- a/spring-context/src/main/java/org/springframework/format/datetime/joda/JodaTimeContextHolder.java +++ b/spring-context/src/main/java/org/springframework/format/datetime/joda/JodaTimeContextHolder.java @@ -21,6 +21,7 @@ import java.util.Locale; import org.joda.time.format.DateTimeFormatter; import org.springframework.core.NamedThreadLocal; +import org.springframework.lang.Nullable; /** * A holder for a thread-local {@link JodaTimeContext} @@ -49,7 +50,7 @@ public final class JodaTimeContextHolder { * @param jodaTimeContext the current JodaTimeContext, * or {@code null} to reset the thread-bound context */ - public static void setJodaTimeContext(JodaTimeContext jodaTimeContext) { + public static void setJodaTimeContext(@Nullable JodaTimeContext jodaTimeContext) { if (jodaTimeContext == null) { resetJodaTimeContext(); } @@ -62,6 +63,7 @@ public final class JodaTimeContextHolder { * Return the JodaTimeContext associated with the current thread, if any. * @return the current JodaTimeContext, or {@code null} if none */ + @Nullable public static JodaTimeContext getJodaTimeContext() { return jodaTimeContextHolder.get(); } @@ -74,7 +76,7 @@ public final class JodaTimeContextHolder { * @param locale the current user locale (may be {@code null} if not known) * @return the user-specific DateTimeFormatter */ - public static DateTimeFormatter getFormatter(DateTimeFormatter formatter, Locale locale) { + public static DateTimeFormatter getFormatter(DateTimeFormatter formatter, @Nullable Locale locale) { DateTimeFormatter formatterToUse = (locale != null ? formatter.withLocale(locale) : formatter); JodaTimeContext context = getJodaTimeContext(); return (context != null ? context.getFormatter(formatterToUse) : formatterToUse); diff --git a/spring-context/src/main/java/org/springframework/format/datetime/joda/package-info.java b/spring-context/src/main/java/org/springframework/format/datetime/joda/package-info.java index 857da5300a1..ec5ed442192 100644 --- a/spring-context/src/main/java/org/springframework/format/datetime/joda/package-info.java +++ b/spring-context/src/main/java/org/springframework/format/datetime/joda/package-info.java @@ -1,4 +1,7 @@ /** * Integration with Joda-Time for formatting Joda date and time types as well as standard JDK Date types. */ +@NonNullApi package org.springframework.format.datetime.joda; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/format/datetime/package-info.java b/spring-context/src/main/java/org/springframework/format/datetime/package-info.java index 62d9dbb0ee5..e52e15806f4 100644 --- a/spring-context/src/main/java/org/springframework/format/datetime/package-info.java +++ b/spring-context/src/main/java/org/springframework/format/datetime/package-info.java @@ -1,4 +1,7 @@ /** * Formatters for {@code java.util.Date} properties. */ +@NonNullApi package org.springframework.format.datetime; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/format/datetime/standard/DateTimeContext.java b/spring-context/src/main/java/org/springframework/format/datetime/standard/DateTimeContext.java index 4ef23be208a..677348f4f9b 100644 --- a/spring-context/src/main/java/org/springframework/format/datetime/standard/DateTimeContext.java +++ b/spring-context/src/main/java/org/springframework/format/datetime/standard/DateTimeContext.java @@ -24,6 +24,7 @@ import java.util.TimeZone; import org.springframework.context.i18n.LocaleContext; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.context.i18n.TimeZoneAwareLocaleContext; +import org.springframework.lang.Nullable; /** * A context that holds user-specific java.time (JSR-310) settings @@ -51,6 +52,7 @@ public class DateTimeContext { /** * Return the user's chronology (calendar system), if any. */ + @Nullable public Chronology getChronology() { return this.chronology; } @@ -70,6 +72,7 @@ public class DateTimeContext { /** * Return the user's time zone, if any. */ + @Nullable public ZoneId getTimeZone() { return this.timeZone; } diff --git a/spring-context/src/main/java/org/springframework/format/datetime/standard/DateTimeContextHolder.java b/spring-context/src/main/java/org/springframework/format/datetime/standard/DateTimeContextHolder.java index 8a7c0720400..44546c7a69c 100644 --- a/spring-context/src/main/java/org/springframework/format/datetime/standard/DateTimeContextHolder.java +++ b/spring-context/src/main/java/org/springframework/format/datetime/standard/DateTimeContextHolder.java @@ -20,6 +20,7 @@ import java.time.format.DateTimeFormatter; import java.util.Locale; import org.springframework.core.NamedThreadLocal; +import org.springframework.lang.Nullable; /** * A holder for a thread-local user {@link DateTimeContext}. @@ -46,7 +47,7 @@ public final class DateTimeContextHolder { * @param dateTimeContext the current DateTimeContext, * or {@code null} to reset the thread-bound context */ - public static void setDateTimeContext(DateTimeContext dateTimeContext) { + public static void setDateTimeContext(@Nullable DateTimeContext dateTimeContext) { if (dateTimeContext == null) { resetDateTimeContext(); } @@ -59,6 +60,7 @@ public final class DateTimeContextHolder { * Return the DateTimeContext associated with the current thread, if any. * @return the current DateTimeContext, or {@code null} if none */ + @Nullable public static DateTimeContext getDateTimeContext() { return dateTimeContextHolder.get(); } @@ -71,7 +73,7 @@ public final class DateTimeContextHolder { * @param locale the current user locale (may be {@code null} if not known) * @return the user-specific DateTimeFormatter */ - public static DateTimeFormatter getFormatter(DateTimeFormatter formatter, Locale locale) { + public static DateTimeFormatter getFormatter(DateTimeFormatter formatter, @Nullable Locale locale) { DateTimeFormatter formatterToUse = (locale != null ? formatter.withLocale(locale) : formatter); DateTimeContext context = getDateTimeContext(); return (context != null ? context.getFormatter(formatterToUse) : formatterToUse); diff --git a/spring-context/src/main/java/org/springframework/format/datetime/standard/DateTimeFormatterFactory.java b/spring-context/src/main/java/org/springframework/format/datetime/standard/DateTimeFormatterFactory.java index 18f10bdfada..c2126d3c1d9 100644 --- a/spring-context/src/main/java/org/springframework/format/datetime/standard/DateTimeFormatterFactory.java +++ b/spring-context/src/main/java/org/springframework/format/datetime/standard/DateTimeFormatterFactory.java @@ -22,6 +22,7 @@ import java.time.format.ResolverStyle; import java.util.TimeZone; import org.springframework.format.annotation.DateTimeFormat.ISO; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -131,6 +132,7 @@ public class DateTimeFormatterFactory { this.timeStyle = convertStyleCharacter(style.charAt(1)); } + @Nullable private FormatStyle convertStyleCharacter(char c) { switch (c) { case 'S': return FormatStyle.SHORT; @@ -170,7 +172,7 @@ public class DateTimeFormatterFactory { * factory properties have been set (can be {@code null}). * @return a new date time formatter */ - public DateTimeFormatter createDateTimeFormatter(DateTimeFormatter fallbackFormatter) { + public DateTimeFormatter createDateTimeFormatter(@Nullable DateTimeFormatter fallbackFormatter) { DateTimeFormatter dateTimeFormatter = null; if (StringUtils.hasLength(this.pattern)) { // Using strict parsing to align with Joda-Time and standard DateFormat behavior: diff --git a/spring-context/src/main/java/org/springframework/format/datetime/standard/package-info.java b/spring-context/src/main/java/org/springframework/format/datetime/standard/package-info.java index 31c142dcd69..90341d52ece 100644 --- a/spring-context/src/main/java/org/springframework/format/datetime/standard/package-info.java +++ b/spring-context/src/main/java/org/springframework/format/datetime/standard/package-info.java @@ -1,4 +1,7 @@ /** * Integration with the JSR-310 java.time package in JDK 8. */ +@NonNullApi package org.springframework.format.datetime.standard; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/format/number/money/package-info.java b/spring-context/src/main/java/org/springframework/format/number/money/package-info.java index d19fccfc37c..1e9169ff468 100644 --- a/spring-context/src/main/java/org/springframework/format/number/money/package-info.java +++ b/spring-context/src/main/java/org/springframework/format/number/money/package-info.java @@ -1,4 +1,7 @@ /** * Integration with the JSR-354 javax.money package. */ +@NonNullApi package org.springframework.format.number.money; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/format/number/package-info.java b/spring-context/src/main/java/org/springframework/format/number/package-info.java index f406a63fd07..538351d7a27 100644 --- a/spring-context/src/main/java/org/springframework/format/number/package-info.java +++ b/spring-context/src/main/java/org/springframework/format/number/package-info.java @@ -1,4 +1,7 @@ /** * Formatters for {@code java.lang.Number} properties. */ +@NonNullApi package org.springframework.format.number; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/format/package-info.java b/spring-context/src/main/java/org/springframework/format/package-info.java index 0f98f75c591..4c03ccf2f74 100644 --- a/spring-context/src/main/java/org/springframework/format/package-info.java +++ b/spring-context/src/main/java/org/springframework/format/package-info.java @@ -1,4 +1,7 @@ /** * An API for defining Formatters to format field model values for display in a UI. */ +@NonNullApi package org.springframework.format; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/format/support/package-info.java b/spring-context/src/main/java/org/springframework/format/support/package-info.java index f653d540815..8b44df0e34d 100644 --- a/spring-context/src/main/java/org/springframework/format/support/package-info.java +++ b/spring-context/src/main/java/org/springframework/format/support/package-info.java @@ -2,4 +2,7 @@ * Support classes for the formatting package, * providing common implementations as well as adapters. */ +@NonNullApi package org.springframework.format.support; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/instrument/classloading/InstrumentationLoadTimeWeaver.java b/spring-context/src/main/java/org/springframework/instrument/classloading/InstrumentationLoadTimeWeaver.java index 827b56e9f23..2a8ec58a113 100644 --- a/spring-context/src/main/java/org/springframework/instrument/classloading/InstrumentationLoadTimeWeaver.java +++ b/spring-context/src/main/java/org/springframework/instrument/classloading/InstrumentationLoadTimeWeaver.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.List; import org.springframework.instrument.InstrumentationSavingAgent; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -139,6 +140,7 @@ public class InstrumentationLoadTimeWeaver implements LoadTimeWeaver { * @return the Instrumentation instance, or {@code null} if none found * @see #isInstrumentationAvailable() */ + @Nullable private static Instrumentation getInstrumentation() { if (AGENT_CLASS_PRESENT) { return InstrumentationAccessor.getInstrumentation(); @@ -175,6 +177,7 @@ public class InstrumentationLoadTimeWeaver implements LoadTimeWeaver { } @Override + @Nullable public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { diff --git a/spring-context/src/main/java/org/springframework/instrument/classloading/glassfish/package-info.java b/spring-context/src/main/java/org/springframework/instrument/classloading/glassfish/package-info.java index b282705390b..04734b910e7 100644 --- a/spring-context/src/main/java/org/springframework/instrument/classloading/glassfish/package-info.java +++ b/spring-context/src/main/java/org/springframework/instrument/classloading/glassfish/package-info.java @@ -1,4 +1,7 @@ /** * Support for class instrumentation on GlassFish. */ +@NonNullApi package org.springframework.instrument.classloading.glassfish; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/instrument/classloading/jboss/package-info.java b/spring-context/src/main/java/org/springframework/instrument/classloading/jboss/package-info.java index e746ce5e7f5..50447e45937 100644 --- a/spring-context/src/main/java/org/springframework/instrument/classloading/jboss/package-info.java +++ b/spring-context/src/main/java/org/springframework/instrument/classloading/jboss/package-info.java @@ -1,4 +1,7 @@ /** * Support for class instrumentation on JBoss AS 6 and 7. */ +@NonNullApi package org.springframework.instrument.classloading.jboss; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/instrument/classloading/package-info.java b/spring-context/src/main/java/org/springframework/instrument/classloading/package-info.java index c1b7cf3d2cb..8714f2dba60 100644 --- a/spring-context/src/main/java/org/springframework/instrument/classloading/package-info.java +++ b/spring-context/src/main/java/org/springframework/instrument/classloading/package-info.java @@ -2,4 +2,7 @@ * Support package for load time weaving based on class loaders, * as required by JPA providers (but not JPA-specific). */ +@NonNullApi package org.springframework.instrument.classloading; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/instrument/classloading/tomcat/package-info.java b/spring-context/src/main/java/org/springframework/instrument/classloading/tomcat/package-info.java index 11c70a1c6c5..e5441f1aff5 100644 --- a/spring-context/src/main/java/org/springframework/instrument/classloading/tomcat/package-info.java +++ b/spring-context/src/main/java/org/springframework/instrument/classloading/tomcat/package-info.java @@ -1,4 +1,7 @@ /** * Support for class instrumentation on Tomcat. */ +@NonNullApi package org.springframework.instrument.classloading.tomcat; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/instrument/classloading/weblogic/package-info.java b/spring-context/src/main/java/org/springframework/instrument/classloading/weblogic/package-info.java index c767e969a38..3293ec2ba7f 100644 --- a/spring-context/src/main/java/org/springframework/instrument/classloading/weblogic/package-info.java +++ b/spring-context/src/main/java/org/springframework/instrument/classloading/weblogic/package-info.java @@ -1,4 +1,7 @@ /** * Support for class instrumentation on BEA WebLogic 10+. */ +@NonNullApi package org.springframework.instrument.classloading.weblogic; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/instrument/classloading/websphere/package-info.java b/spring-context/src/main/java/org/springframework/instrument/classloading/websphere/package-info.java index 11c66d85b95..ed9abd00398 100644 --- a/spring-context/src/main/java/org/springframework/instrument/classloading/websphere/package-info.java +++ b/spring-context/src/main/java/org/springframework/instrument/classloading/websphere/package-info.java @@ -1,4 +1,7 @@ /** * Support for class instrumentation on IBM WebSphere Application Server 7+. */ +@NonNullApi package org.springframework.instrument.classloading.websphere; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/jmx/access/ConnectorDelegate.java b/spring-context/src/main/java/org/springframework/jmx/access/ConnectorDelegate.java index 8490d680202..8b408254dc8 100644 --- a/spring-context/src/main/java/org/springframework/jmx/access/ConnectorDelegate.java +++ b/spring-context/src/main/java/org/springframework/jmx/access/ConnectorDelegate.java @@ -28,6 +28,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.jmx.MBeanServerNotFoundException; import org.springframework.jmx.support.JmxUtils; +import org.springframework.lang.Nullable; /** * Internal helper class for managing a JMX connector. @@ -49,7 +50,7 @@ class ConnectorDelegate { * @param environment the JMX environment for the connector (may be {@code null}) * @param agentId the local JMX MBeanServer's agent id (may be {@code null}) */ - public MBeanServerConnection connect(JMXServiceURL serviceUrl, Map environment, String agentId) + public MBeanServerConnection connect(@Nullable JMXServiceURL serviceUrl, @Nullable Map environment, @Nullable String agentId) throws MBeanServerNotFoundException { if (serviceUrl != null) { diff --git a/spring-context/src/main/java/org/springframework/jmx/access/MBeanClientInterceptor.java b/spring-context/src/main/java/org/springframework/jmx/access/MBeanClientInterceptor.java index 6efbb2209e5..329c3dc5a36 100644 --- a/spring-context/src/main/java/org/springframework/jmx/access/MBeanClientInterceptor.java +++ b/spring-context/src/main/java/org/springframework/jmx/access/MBeanClientInterceptor.java @@ -61,6 +61,7 @@ import org.springframework.core.MethodParameter; import org.springframework.core.ResolvableType; import org.springframework.jmx.support.JmxUtils; import org.springframework.jmx.support.ObjectNameManager; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; @@ -224,6 +225,7 @@ public class MBeanClientInterceptor * Return the management interface of the target MBean, * or {@code null} if none specified. */ + @Nullable protected final Class getManagementInterface() { return this.managementInterface; } @@ -460,6 +462,7 @@ public class MBeanClientInterceptor } } + @Nullable private Object invokeAttribute(PropertyDescriptor pd, MethodInvocation invocation) throws JMException, IOException { @@ -527,7 +530,8 @@ public class MBeanClientInterceptor * @return the converted result object, or the passed-in object if no conversion * is necessary */ - protected Object convertResultValueIfNecessary(Object result, MethodParameter parameter) { + @Nullable + protected Object convertResultValueIfNecessary(@Nullable Object result, MethodParameter parameter) { Class targetClass = parameter.getParameterType(); try { if (result == null) { diff --git a/spring-context/src/main/java/org/springframework/jmx/access/package-info.java b/spring-context/src/main/java/org/springframework/jmx/access/package-info.java index 410e754b1a5..a97129abba6 100644 --- a/spring-context/src/main/java/org/springframework/jmx/access/package-info.java +++ b/spring-context/src/main/java/org/springframework/jmx/access/package-info.java @@ -1,4 +1,7 @@ /** * Provides support for accessing remote MBean resources. */ +@NonNullApi package org.springframework.jmx.access; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/jmx/export/MBeanExporter.java b/spring-context/src/main/java/org/springframework/jmx/export/MBeanExporter.java index 4385854cb99..32e09d9d355 100644 --- a/spring-context/src/main/java/org/springframework/jmx/export/MBeanExporter.java +++ b/spring-context/src/main/java/org/springframework/jmx/export/MBeanExporter.java @@ -63,6 +63,7 @@ import org.springframework.jmx.export.notification.ModelMBeanNotificationPublish import org.springframework.jmx.export.notification.NotificationPublisherAware; import org.springframework.jmx.support.JmxUtils; import org.springframework.jmx.support.MBeanRegistrationSupport; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; @@ -585,6 +586,7 @@ public class MBeanExporter extends MBeanRegistrationSupport implements MBeanExpo * @see #registerBeanInstance * @see #registerLazyInit */ + @Nullable protected ObjectName registerBeanNameOrInstance(Object mapValue, String beanKey) throws MBeanExportException { try { if (mapValue instanceof String) { @@ -779,6 +781,7 @@ public class MBeanExporter extends MBeanRegistrationSupport implements MBeanExpo * @return the adapted MBean, or {@code null} if not possible */ @SuppressWarnings("unchecked") + @Nullable protected DynamicMBean adaptMBeanIfPossible(Object bean) throws JMException { Class targetClass = AopUtils.getTargetClass(bean); if (targetClass != bean.getClass()) { diff --git a/spring-context/src/main/java/org/springframework/jmx/export/annotation/package-info.java b/spring-context/src/main/java/org/springframework/jmx/export/annotation/package-info.java index 80ac35387da..6a9da5ccc94 100644 --- a/spring-context/src/main/java/org/springframework/jmx/export/annotation/package-info.java +++ b/spring-context/src/main/java/org/springframework/jmx/export/annotation/package-info.java @@ -3,4 +3,7 @@ * Hooked into Spring's JMX export infrastructure * via a special JmxAttributeSource implementation. */ +@NonNullApi package org.springframework.jmx.export.annotation; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/jmx/export/assembler/AbstractReflectiveMBeanInfoAssembler.java b/spring-context/src/main/java/org/springframework/jmx/export/assembler/AbstractReflectiveMBeanInfoAssembler.java index f2d95bfa22c..a600ae2980e 100644 --- a/spring-context/src/main/java/org/springframework/jmx/export/assembler/AbstractReflectiveMBeanInfoAssembler.java +++ b/spring-context/src/main/java/org/springframework/jmx/export/assembler/AbstractReflectiveMBeanInfoAssembler.java @@ -33,6 +33,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.jmx.support.JmxUtils; +import org.springframework.lang.Nullable; /** * Builds on the {@link AbstractMBeanInfoAssembler} superclass to @@ -210,6 +211,7 @@ public abstract class AbstractReflectiveMBeanInfoAssembler extends AbstractMBean /** * Return default value for the JMX field "currencyTimeLimit", if any. */ + @Nullable protected Integer getDefaultCurrencyTimeLimit() { return this.defaultCurrencyTimeLimit; } @@ -272,6 +274,7 @@ public abstract class AbstractReflectiveMBeanInfoAssembler extends AbstractMBean * Return the ParameterNameDiscoverer to use for resolving method parameter * names if needed (may be {@code null} in order to skip parameter detection). */ + @Nullable protected ParameterNameDiscoverer getParameterNameDiscoverer() { return this.parameterNameDiscoverer; } diff --git a/spring-context/src/main/java/org/springframework/jmx/export/assembler/package-info.java b/spring-context/src/main/java/org/springframework/jmx/export/assembler/package-info.java index 649b1f97b52..a708f600e49 100644 --- a/spring-context/src/main/java/org/springframework/jmx/export/assembler/package-info.java +++ b/spring-context/src/main/java/org/springframework/jmx/export/assembler/package-info.java @@ -2,4 +2,7 @@ * Provides a strategy for MBeanInfo assembly. Used by MBeanExporter to * determine the attributes and operations to expose for Spring-managed beans. */ +@NonNullApi package org.springframework.jmx.export.assembler; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/jmx/export/metadata/JmxAttributeSource.java b/spring-context/src/main/java/org/springframework/jmx/export/metadata/JmxAttributeSource.java index 8861079de22..aea85829567 100644 --- a/spring-context/src/main/java/org/springframework/jmx/export/metadata/JmxAttributeSource.java +++ b/spring-context/src/main/java/org/springframework/jmx/export/metadata/JmxAttributeSource.java @@ -18,6 +18,8 @@ package org.springframework.jmx.export.metadata; import java.lang.reflect.Method; +import org.springframework.lang.Nullable; + /** * Interface used by the {@code MetadataMBeanInfoAssembler} to * read source-level metadata from a managed resource's class. @@ -38,6 +40,7 @@ public interface JmxAttributeSource { * @return the attribute, or {@code null} if not found * @throws InvalidMetadataException in case of invalid attributes */ + @Nullable ManagedResource getManagedResource(Class clazz) throws InvalidMetadataException; /** @@ -48,6 +51,7 @@ public interface JmxAttributeSource { * @return the attribute, or {@code null} if not found * @throws InvalidMetadataException in case of invalid attributes */ + @Nullable ManagedAttribute getManagedAttribute(Method method) throws InvalidMetadataException; /** @@ -58,6 +62,7 @@ public interface JmxAttributeSource { * @return the metric, or {@code null} if not found * @throws InvalidMetadataException in case of invalid attributes */ + @Nullable ManagedMetric getManagedMetric(Method method) throws InvalidMetadataException; /** @@ -68,6 +73,7 @@ public interface JmxAttributeSource { * @return the attribute, or {@code null} if not found * @throws InvalidMetadataException in case of invalid attributes */ + @Nullable ManagedOperation getManagedOperation(Method method) throws InvalidMetadataException; /** diff --git a/spring-context/src/main/java/org/springframework/jmx/export/metadata/package-info.java b/spring-context/src/main/java/org/springframework/jmx/export/metadata/package-info.java index 8890cbda663..0eeca293333 100644 --- a/spring-context/src/main/java/org/springframework/jmx/export/metadata/package-info.java +++ b/spring-context/src/main/java/org/springframework/jmx/export/metadata/package-info.java @@ -2,4 +2,7 @@ * Provides generic JMX metadata classes and basic support for reading * JMX metadata in a provider-agnostic manner. */ +@NonNullApi package org.springframework.jmx.export.metadata; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/jmx/export/naming/package-info.java b/spring-context/src/main/java/org/springframework/jmx/export/naming/package-info.java index f01f25f8dae..f64aec45cce 100644 --- a/spring-context/src/main/java/org/springframework/jmx/export/naming/package-info.java +++ b/spring-context/src/main/java/org/springframework/jmx/export/naming/package-info.java @@ -2,4 +2,7 @@ * Provides a strategy for ObjectName creation. Used by MBeanExporter * to determine the JMX names to use for exported Spring-managed beans. */ +@NonNullApi package org.springframework.jmx.export.naming; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/jmx/export/notification/package-info.java b/spring-context/src/main/java/org/springframework/jmx/export/notification/package-info.java index c0bd0a5b5c6..3cedf29c048 100644 --- a/spring-context/src/main/java/org/springframework/jmx/export/notification/package-info.java +++ b/spring-context/src/main/java/org/springframework/jmx/export/notification/package-info.java @@ -2,4 +2,7 @@ * Provides supporting infrastructure to allow Spring-created MBeans * to send JMX notifications. */ +@NonNullApi package org.springframework.jmx.export.notification; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/jmx/export/package-info.java b/spring-context/src/main/java/org/springframework/jmx/export/package-info.java index 1e277306358..a3a63477193 100644 --- a/spring-context/src/main/java/org/springframework/jmx/export/package-info.java +++ b/spring-context/src/main/java/org/springframework/jmx/export/package-info.java @@ -2,4 +2,7 @@ * This package provides declarative creation and registration of * Spring-managed beans as JMX MBeans. */ +@NonNullApi package org.springframework.jmx.export; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/jmx/package-info.java b/spring-context/src/main/java/org/springframework/jmx/package-info.java index 2f95f654239..f300a243cc5 100644 --- a/spring-context/src/main/java/org/springframework/jmx/package-info.java +++ b/spring-context/src/main/java/org/springframework/jmx/package-info.java @@ -2,4 +2,7 @@ * This package contains Spring's JMX support, which includes registration of * Spring-managed beans as JMX MBeans as well as access to remote JMX MBeans. */ +@NonNullApi package org.springframework.jmx; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/jmx/support/JmxUtils.java b/spring-context/src/main/java/org/springframework/jmx/support/JmxUtils.java index 6b372799776..8410bb6072e 100644 --- a/spring-context/src/main/java/org/springframework/jmx/support/JmxUtils.java +++ b/spring-context/src/main/java/org/springframework/jmx/support/JmxUtils.java @@ -33,6 +33,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.jmx.MBeanServerNotFoundException; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -88,7 +89,7 @@ public abstract class JmxUtils { * if no {@code MBeanServer} could be found * @see javax.management.MBeanServerFactory#findMBeanServer(String) */ - public static MBeanServer locateMBeanServer(String agentId) throws MBeanServerNotFoundException { + public static MBeanServer locateMBeanServer(@Nullable String agentId) throws MBeanServerNotFoundException { MBeanServer server = null; // null means any registered server, but "" specifically means the platform server @@ -267,6 +268,7 @@ public abstract class JmxUtils { * @param clazz the class to check * @return the Standard MBean interface for the given class */ + @Nullable public static Class getMBeanInterface(Class clazz) { if (clazz == null || clazz.getSuperclass() == null) { return null; @@ -288,6 +290,7 @@ public abstract class JmxUtils { * @param clazz the class to check * @return whether there is an MXBean interface for the given class */ + @Nullable public static Class getMXBeanInterface(Class clazz) { if (clazz == null || clazz.getSuperclass() == null) { return null; diff --git a/spring-context/src/main/java/org/springframework/jmx/support/MBeanServerFactoryBean.java b/spring-context/src/main/java/org/springframework/jmx/support/MBeanServerFactoryBean.java index 9bbfe08c85f..0639aa87d91 100644 --- a/spring-context/src/main/java/org/springframework/jmx/support/MBeanServerFactoryBean.java +++ b/spring-context/src/main/java/org/springframework/jmx/support/MBeanServerFactoryBean.java @@ -26,6 +26,7 @@ import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.jmx.MBeanServerNotFoundException; +import org.springframework.lang.Nullable; /** * {@link FactoryBean} that obtains an {@link javax.management.MBeanServer} reference @@ -157,7 +158,7 @@ public class MBeanServerFactoryBean implements FactoryBean, Initial * @see JmxUtils#locateMBeanServer(String) * @see javax.management.MBeanServerFactory#findMBeanServer(String) */ - protected MBeanServer locateMBeanServer(String agentId) throws MBeanServerNotFoundException { + protected MBeanServer locateMBeanServer(@Nullable String agentId) throws MBeanServerNotFoundException { return JmxUtils.locateMBeanServer(agentId); } @@ -170,7 +171,7 @@ public class MBeanServerFactoryBean implements FactoryBean, Initial * @see javax.management.MBeanServerFactory#createMBeanServer * @see javax.management.MBeanServerFactory#newMBeanServer */ - protected MBeanServer createMBeanServer(String defaultDomain, boolean registerWithFactory) { + protected MBeanServer createMBeanServer(@Nullable String defaultDomain, boolean registerWithFactory) { if (registerWithFactory) { return MBeanServerFactory.createMBeanServer(defaultDomain); } diff --git a/spring-context/src/main/java/org/springframework/jmx/support/NotificationListenerHolder.java b/spring-context/src/main/java/org/springframework/jmx/support/NotificationListenerHolder.java index c40fd00972d..6a0a6dd332b 100644 --- a/spring-context/src/main/java/org/springframework/jmx/support/NotificationListenerHolder.java +++ b/spring-context/src/main/java/org/springframework/jmx/support/NotificationListenerHolder.java @@ -24,6 +24,7 @@ import javax.management.NotificationFilter; import javax.management.NotificationListener; import javax.management.ObjectName; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -67,7 +68,7 @@ public class NotificationListenerHolder { * with the encapsulated {@link #getNotificationFilter() NotificationFilter}. *

May be {@code null}. */ - public void setNotificationFilter(NotificationFilter notificationFilter) { + public void setNotificationFilter(@Nullable NotificationFilter notificationFilter) { this.notificationFilter = notificationFilter; } @@ -76,6 +77,7 @@ public class NotificationListenerHolder { * with the encapsulated {@link #getNotificationFilter() NotificationFilter}. *

May be {@code null}. */ + @Nullable public NotificationFilter getNotificationFilter() { return this.notificationFilter; } @@ -87,7 +89,7 @@ public class NotificationListenerHolder { * @param handback the handback object (can be {@code null}) * @see javax.management.NotificationListener#handleNotification(javax.management.Notification, Object) */ - public void setHandback(Object handback) { + public void setHandback(@Nullable Object handback) { this.handback = handback; } @@ -98,6 +100,7 @@ public class NotificationListenerHolder { * @return the handback object (may be {@code null}) * @see javax.management.NotificationListener#handleNotification(javax.management.Notification, Object) */ + @Nullable public Object getHandback() { return this.handback; } diff --git a/spring-context/src/main/java/org/springframework/jmx/support/package-info.java b/spring-context/src/main/java/org/springframework/jmx/support/package-info.java index 56a389e6cce..1e9aeb5337b 100644 --- a/spring-context/src/main/java/org/springframework/jmx/support/package-info.java +++ b/spring-context/src/main/java/org/springframework/jmx/support/package-info.java @@ -2,4 +2,7 @@ * Contains support classes for connecting to local and remote {@code MBeanServer}s * and for exposing an {@code MBeanServer} to remote clients. */ +@NonNullApi package org.springframework.jmx.support; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/jndi/JndiCallback.java b/spring-context/src/main/java/org/springframework/jndi/JndiCallback.java index c6c76826f7e..48f795e8314 100644 --- a/spring-context/src/main/java/org/springframework/jndi/JndiCallback.java +++ b/spring-context/src/main/java/org/springframework/jndi/JndiCallback.java @@ -19,6 +19,8 @@ package org.springframework.jndi; import javax.naming.Context; import javax.naming.NamingException; +import org.springframework.lang.Nullable; + /** * Callback interface to be implemented by classes that need to perform an * operation (such as a lookup) in a JNDI context. This callback approach @@ -44,6 +46,7 @@ public interface JndiCallback { * @throws NamingException if thrown by JNDI methods * @return a result object, or {@code null} */ + @Nullable T doInContext(Context ctx) throws NamingException; } diff --git a/spring-context/src/main/java/org/springframework/jndi/JndiObjectLocator.java b/spring-context/src/main/java/org/springframework/jndi/JndiObjectLocator.java index bcf442ac0f6..2adbceb8a0b 100644 --- a/spring-context/src/main/java/org/springframework/jndi/JndiObjectLocator.java +++ b/spring-context/src/main/java/org/springframework/jndi/JndiObjectLocator.java @@ -19,6 +19,7 @@ package org.springframework.jndi; import javax.naming.NamingException; import org.springframework.beans.factory.InitializingBean; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -81,6 +82,7 @@ public abstract class JndiObjectLocator extends JndiLocatorSupport implements In * Return the type that the located JNDI object is supposed * to be assignable to, if any. */ + @Nullable public Class getExpectedType() { return this.expectedType; } diff --git a/spring-context/src/main/java/org/springframework/jndi/JndiTemplate.java b/spring-context/src/main/java/org/springframework/jndi/JndiTemplate.java index 3cec10527df..a1f1acfe394 100644 --- a/spring-context/src/main/java/org/springframework/jndi/JndiTemplate.java +++ b/spring-context/src/main/java/org/springframework/jndi/JndiTemplate.java @@ -26,6 +26,7 @@ import javax.naming.NamingException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; /** @@ -69,6 +70,7 @@ public class JndiTemplate { /** * Return the environment for the JNDI InitialContext, if any. */ + @Nullable public Properties getEnvironment() { return this.environment; } @@ -81,6 +83,7 @@ public class JndiTemplate { * @throws NamingException thrown by the callback implementation * @see #createInitialContext */ + @Nullable public T execute(JndiCallback contextCallback) throws NamingException { Context ctx = getContext(); try { @@ -108,7 +111,7 @@ public class JndiTemplate { * @param ctx the JNDI context to release (may be {@code null}) * @see #getContext */ - public void releaseContext(Context ctx) { + public void releaseContext(@Nullable Context ctx) { if (ctx != null) { try { ctx.close(); @@ -175,7 +178,7 @@ public class JndiTemplate { * name bound to JNDI */ @SuppressWarnings("unchecked") - public T lookup(String name, Class requiredType) throws NamingException { + public T lookup(String name, @Nullable Class requiredType) throws NamingException { Object jndiObject = lookup(name); if (requiredType != null && !requiredType.isInstance(jndiObject)) { throw new TypeMismatchNamingException( diff --git a/spring-context/src/main/java/org/springframework/jndi/package-info.java b/spring-context/src/main/java/org/springframework/jndi/package-info.java index 55bbba27ce4..259a4f9a48c 100644 --- a/spring-context/src/main/java/org/springframework/jndi/package-info.java +++ b/spring-context/src/main/java/org/springframework/jndi/package-info.java @@ -7,4 +7,7 @@ * Expert One-On-One J2EE Design and Development * by Rod Johnson (Wrox, 2002). */ +@NonNullApi package org.springframework.jndi; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/jndi/support/package-info.java b/spring-context/src/main/java/org/springframework/jndi/support/package-info.java index 079a7677ad7..2654ad32bfd 100644 --- a/spring-context/src/main/java/org/springframework/jndi/support/package-info.java +++ b/spring-context/src/main/java/org/springframework/jndi/support/package-info.java @@ -2,4 +2,7 @@ * Support classes for JNDI usage, * including a JNDI-based BeanFactory implementation. */ +@NonNullApi package org.springframework.jndi.support; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/remoting/package-info.java b/spring-context/src/main/java/org/springframework/remoting/package-info.java index 34c7601a70f..85517537a40 100644 --- a/spring-context/src/main/java/org/springframework/remoting/package-info.java +++ b/spring-context/src/main/java/org/springframework/remoting/package-info.java @@ -2,4 +2,7 @@ * Exception hierarchy for Spring's remoting infrastructure, * independent of any specific remote method invocation system. */ +@NonNullApi package org.springframework.remoting; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/remoting/rmi/CodebaseAwareObjectInputStream.java b/spring-context/src/main/java/org/springframework/remoting/rmi/CodebaseAwareObjectInputStream.java index 4bc3d794dca..ffdc6bda1f4 100644 --- a/spring-context/src/main/java/org/springframework/remoting/rmi/CodebaseAwareObjectInputStream.java +++ b/spring-context/src/main/java/org/springframework/remoting/rmi/CodebaseAwareObjectInputStream.java @@ -21,6 +21,7 @@ import java.io.InputStream; import java.rmi.server.RMIClassLoader; import org.springframework.core.ConfigurableObjectInputStream; +import org.springframework.lang.Nullable; /** * Special ObjectInputStream subclass that falls back to a specified codebase @@ -76,7 +77,7 @@ public class CodebaseAwareObjectInputStream extends ConfigurableObjectInputStrea * @see java.io.ObjectInputStream#ObjectInputStream(java.io.InputStream) */ public CodebaseAwareObjectInputStream( - InputStream in, ClassLoader classLoader, String codebaseUrl) throws IOException { + InputStream in, @Nullable ClassLoader classLoader, String codebaseUrl) throws IOException { super(in, classLoader); this.codebaseUrl = codebaseUrl; @@ -92,7 +93,7 @@ public class CodebaseAwareObjectInputStream extends ConfigurableObjectInputStrea * @see java.io.ObjectInputStream#ObjectInputStream(java.io.InputStream) */ public CodebaseAwareObjectInputStream( - InputStream in, ClassLoader classLoader, boolean acceptProxyClasses) throws IOException { + InputStream in, @Nullable ClassLoader classLoader, boolean acceptProxyClasses) throws IOException { super(in, classLoader, acceptProxyClasses); this.codebaseUrl = null; diff --git a/spring-context/src/main/java/org/springframework/remoting/rmi/JndiRmiClientInterceptor.java b/spring-context/src/main/java/org/springframework/remoting/rmi/JndiRmiClientInterceptor.java index 1b3e43c6944..fc8c6f8dee3 100644 --- a/spring-context/src/main/java/org/springframework/remoting/rmi/JndiRmiClientInterceptor.java +++ b/spring-context/src/main/java/org/springframework/remoting/rmi/JndiRmiClientInterceptor.java @@ -28,6 +28,7 @@ import org.aopalliance.intercept.MethodInvocation; import org.springframework.aop.support.AopUtils; import org.springframework.beans.factory.InitializingBean; import org.springframework.jndi.JndiObjectLocator; +import org.springframework.lang.Nullable; import org.springframework.remoting.RemoteConnectFailureException; import org.springframework.remoting.RemoteInvocationFailureException; import org.springframework.remoting.RemoteLookupFailureException; @@ -338,6 +339,7 @@ public class JndiRmiClientInterceptor extends JndiObjectLocator implements Metho * @throws Throwable in case of invocation failure * @see #invoke */ + @Nullable protected Object refreshAndRetry(MethodInvocation invocation) throws Throwable { Object freshStub; synchronized (this.stubMonitor) { @@ -358,6 +360,7 @@ public class JndiRmiClientInterceptor extends JndiObjectLocator implements Metho * @return the invocation result, if any * @throws Throwable in case of invocation failure */ + @Nullable protected Object doInvoke(MethodInvocation invocation, Object stub) throws Throwable { if (stub instanceof RmiInvocationHandler) { // RMI invoker diff --git a/spring-context/src/main/java/org/springframework/remoting/rmi/RmiClientInterceptor.java b/spring-context/src/main/java/org/springframework/remoting/rmi/RmiClientInterceptor.java index b9e5330a176..829a18546b3 100644 --- a/spring-context/src/main/java/org/springframework/remoting/rmi/RmiClientInterceptor.java +++ b/spring-context/src/main/java/org/springframework/remoting/rmi/RmiClientInterceptor.java @@ -34,6 +34,7 @@ import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.springframework.aop.support.AopUtils; +import org.springframework.lang.Nullable; import org.springframework.remoting.RemoteConnectFailureException; import org.springframework.remoting.RemoteInvocationFailureException; import org.springframework.remoting.RemoteLookupFailureException; @@ -295,6 +296,7 @@ public class RmiClientInterceptor extends RemoteInvocationBasedAccessor * @see #setRefreshStubOnConnectFailure * @see #doInvoke */ + @Nullable private Object handleRemoteConnectFailure(MethodInvocation invocation, Exception ex) throws Throwable { if (this.refreshStubOnConnectFailure) { String msg = "Could not connect to RMI service [" + getServiceUrl() + "] - retrying"; @@ -319,6 +321,7 @@ public class RmiClientInterceptor extends RemoteInvocationBasedAccessor * @throws Throwable in case of invocation failure * @see #invoke */ + @Nullable protected Object refreshAndRetry(MethodInvocation invocation) throws Throwable { Remote freshStub = null; synchronized (this.stubMonitor) { @@ -338,6 +341,7 @@ public class RmiClientInterceptor extends RemoteInvocationBasedAccessor * @return the invocation result, if any * @throws Throwable in case of invocation failure */ + @Nullable protected Object doInvoke(MethodInvocation invocation, Remote stub) throws Throwable { if (stub instanceof RmiInvocationHandler) { // RMI invoker @@ -389,6 +393,7 @@ public class RmiClientInterceptor extends RemoteInvocationBasedAccessor * @throws InvocationTargetException if the method invocation resulted in an exception * @see org.springframework.remoting.support.RemoteInvocation */ + @Nullable protected Object doInvoke(MethodInvocation methodInvocation, RmiInvocationHandler invocationHandler) throws RemoteException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { diff --git a/spring-context/src/main/java/org/springframework/remoting/rmi/RmiClientInterceptorUtils.java b/spring-context/src/main/java/org/springframework/remoting/rmi/RmiClientInterceptorUtils.java index 4ee08b5d3be..af69edef55f 100644 --- a/spring-context/src/main/java/org/springframework/remoting/rmi/RmiClientInterceptorUtils.java +++ b/spring-context/src/main/java/org/springframework/remoting/rmi/RmiClientInterceptorUtils.java @@ -30,6 +30,7 @@ import org.aopalliance.intercept.MethodInvocation; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.remoting.RemoteAccessException; import org.springframework.remoting.RemoteConnectFailureException; import org.springframework.remoting.RemoteProxyFailureException; @@ -57,6 +58,7 @@ public abstract class RmiClientInterceptorUtils { * @return the invocation result, if any * @throws InvocationTargetException if thrown by reflection */ + @Nullable public static Object invokeRemoteMethod(MethodInvocation invocation, Object stub) throws InvocationTargetException { diff --git a/spring-context/src/main/java/org/springframework/remoting/rmi/RmiInvocationHandler.java b/spring-context/src/main/java/org/springframework/remoting/rmi/RmiInvocationHandler.java index 77ddbaf44f3..bdbcd184fc0 100644 --- a/spring-context/src/main/java/org/springframework/remoting/rmi/RmiInvocationHandler.java +++ b/spring-context/src/main/java/org/springframework/remoting/rmi/RmiInvocationHandler.java @@ -20,6 +20,7 @@ import java.lang.reflect.InvocationTargetException; import java.rmi.Remote; import java.rmi.RemoteException; +import org.springframework.lang.Nullable; import org.springframework.remoting.support.RemoteInvocation; /** @@ -40,6 +41,7 @@ public interface RmiInvocationHandler extends Remote { * @throws RemoteException in case of communication errors * @see RmiServiceExporter#getServiceInterface() */ + @Nullable public String getTargetInterfaceName() throws RemoteException; /** @@ -53,6 +55,7 @@ public interface RmiInvocationHandler extends Remote { * @throws IllegalAccessException if the method could not be accessed * @throws InvocationTargetException if the method invocation resulted in an exception */ + @Nullable public Object invoke(RemoteInvocation invocation) throws RemoteException, NoSuchMethodException, IllegalAccessException, InvocationTargetException; diff --git a/spring-context/src/main/java/org/springframework/remoting/rmi/RmiRegistryFactoryBean.java b/spring-context/src/main/java/org/springframework/remoting/rmi/RmiRegistryFactoryBean.java index b7107934b3f..8833b8e070c 100644 --- a/spring-context/src/main/java/org/springframework/remoting/rmi/RmiRegistryFactoryBean.java +++ b/spring-context/src/main/java/org/springframework/remoting/rmi/RmiRegistryFactoryBean.java @@ -29,6 +29,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; +import org.springframework.lang.Nullable; /** * {@link FactoryBean} that locates a {@link java.rmi.registry.Registry} and @@ -177,7 +178,7 @@ public class RmiRegistryFactoryBean implements FactoryBean, Initializi * @throws java.rmi.RemoteException if the registry couldn't be located or created */ protected Registry getRegistry(String registryHost, int registryPort, - RMIClientSocketFactory clientSocketFactory, RMIServerSocketFactory serverSocketFactory) + @Nullable RMIClientSocketFactory clientSocketFactory, @Nullable RMIServerSocketFactory serverSocketFactory) throws RemoteException { if (registryHost != null) { @@ -203,8 +204,8 @@ public class RmiRegistryFactoryBean implements FactoryBean, Initializi * @return the RMI registry * @throws RemoteException if the registry couldn't be located or created */ - protected Registry getRegistry( - int registryPort, RMIClientSocketFactory clientSocketFactory, RMIServerSocketFactory serverSocketFactory) + protected Registry getRegistry(int registryPort, + @Nullable RMIClientSocketFactory clientSocketFactory, @Nullable RMIServerSocketFactory serverSocketFactory) throws RemoteException { if (clientSocketFactory != null) { diff --git a/spring-context/src/main/java/org/springframework/remoting/rmi/RmiServiceExporter.java b/spring-context/src/main/java/org/springframework/remoting/rmi/RmiServiceExporter.java index ca3f6e5f2ed..960fc466b56 100644 --- a/spring-context/src/main/java/org/springframework/remoting/rmi/RmiServiceExporter.java +++ b/spring-context/src/main/java/org/springframework/remoting/rmi/RmiServiceExporter.java @@ -29,6 +29,7 @@ import java.rmi.server.UnicastRemoteObject; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; +import org.springframework.lang.Nullable; /** * RMI exporter that exposes the specified service as RMI object with the specified name. @@ -319,7 +320,7 @@ public class RmiServiceExporter extends RmiBasedExporter implements Initializing * @throws RemoteException if the registry couldn't be located or created */ protected Registry getRegistry(String registryHost, int registryPort, - RMIClientSocketFactory clientSocketFactory, RMIServerSocketFactory serverSocketFactory) + @Nullable RMIClientSocketFactory clientSocketFactory, @Nullable RMIServerSocketFactory serverSocketFactory) throws RemoteException { if (registryHost != null) { @@ -345,8 +346,8 @@ public class RmiServiceExporter extends RmiBasedExporter implements Initializing * @return the RMI registry * @throws RemoteException if the registry couldn't be located or created */ - protected Registry getRegistry( - int registryPort, RMIClientSocketFactory clientSocketFactory, RMIServerSocketFactory serverSocketFactory) + protected Registry getRegistry(int registryPort, + @Nullable RMIClientSocketFactory clientSocketFactory, @Nullable RMIServerSocketFactory serverSocketFactory) throws RemoteException { if (clientSocketFactory != null) { diff --git a/spring-context/src/main/java/org/springframework/remoting/support/RemoteInvocation.java b/spring-context/src/main/java/org/springframework/remoting/support/RemoteInvocation.java index 3d8ebba918d..e868f21210b 100644 --- a/spring-context/src/main/java/org/springframework/remoting/support/RemoteInvocation.java +++ b/spring-context/src/main/java/org/springframework/remoting/support/RemoteInvocation.java @@ -24,6 +24,7 @@ import java.util.Map; import org.aopalliance.intercept.MethodInvocation; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -165,6 +166,7 @@ public class RemoteInvocation implements Serializable { * @param key the attribute key * @return the attribute value, or {@code null} if not defined */ + @Nullable public Serializable getAttribute(String key) { if (this.attributes == null) { return null; @@ -190,6 +192,7 @@ public class RemoteInvocation implements Serializable { * @see #addAttribute * @see #getAttribute */ + @Nullable public Map getAttributes() { return this.attributes; } diff --git a/spring-context/src/main/java/org/springframework/remoting/support/RemoteInvocationResult.java b/spring-context/src/main/java/org/springframework/remoting/support/RemoteInvocationResult.java index e9dee2f72bd..8e7ef09fabe 100644 --- a/spring-context/src/main/java/org/springframework/remoting/support/RemoteInvocationResult.java +++ b/spring-context/src/main/java/org/springframework/remoting/support/RemoteInvocationResult.java @@ -19,6 +19,8 @@ package org.springframework.remoting.support; import java.io.Serializable; import java.lang.reflect.InvocationTargetException; +import org.springframework.lang.Nullable; + /** * Encapsulates a remote invocation result, holding a result value or an exception. * Used for HTTP-based serialization invokers. @@ -88,6 +90,7 @@ public class RemoteInvocationResult implements Serializable { * of the target method, if any. * @see #hasException */ + @Nullable public Object getValue() { return this.value; } @@ -108,6 +111,7 @@ public class RemoteInvocationResult implements Serializable { * of the target method, if any. * @see #hasException */ + @Nullable public Throwable getException() { return this.exception; } @@ -140,6 +144,7 @@ public class RemoteInvocationResult implements Serializable { * @return the result value, if any * @throws Throwable the exception, if any */ + @Nullable public Object recreate() throws Throwable { if (this.exception != null) { Throwable exToThrow = this.exception; diff --git a/spring-context/src/main/java/org/springframework/remoting/support/RemotingSupport.java b/spring-context/src/main/java/org/springframework/remoting/support/RemotingSupport.java index 02f31ba803b..4cae3f2188d 100644 --- a/spring-context/src/main/java/org/springframework/remoting/support/RemotingSupport.java +++ b/spring-context/src/main/java/org/springframework/remoting/support/RemotingSupport.java @@ -20,6 +20,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -57,6 +58,7 @@ public abstract class RemotingSupport implements BeanClassLoaderAware { * context ClassLoader already. * @return the original thread context ClassLoader, or {@code null} if not overridden */ + @Nullable protected ClassLoader overrideThreadContextClassLoader() { return ClassUtils.overrideThreadContextClassLoader(getBeanClassLoader()); } @@ -66,7 +68,7 @@ public abstract class RemotingSupport implements BeanClassLoaderAware { * @param original the original thread context ClassLoader, * or {@code null} if not overridden (and hence nothing to reset) */ - protected void resetThreadContextClassLoader(ClassLoader original) { + protected void resetThreadContextClassLoader(@Nullable ClassLoader original) { if (original != null) { Thread.currentThread().setContextClassLoader(original); } diff --git a/spring-context/src/main/java/org/springframework/scheduling/TaskScheduler.java b/spring-context/src/main/java/org/springframework/scheduling/TaskScheduler.java index bf902e71db6..51863793c79 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/TaskScheduler.java +++ b/spring-context/src/main/java/org/springframework/scheduling/TaskScheduler.java @@ -21,6 +21,8 @@ import java.time.Instant; import java.util.Date; import java.util.concurrent.ScheduledFuture; +import org.springframework.lang.Nullable; + /** * Task scheduler interface that abstracts the scheduling of * {@link Runnable Runnables} based on different kinds of triggers. @@ -63,6 +65,7 @@ public interface TaskScheduler { * for internal reasons (e.g. a pool overload handling policy or a pool shutdown in progress) * @see org.springframework.scheduling.support.CronTrigger */ + @Nullable ScheduledFuture schedule(Runnable task, Trigger trigger); /** diff --git a/spring-context/src/main/java/org/springframework/scheduling/Trigger.java b/spring-context/src/main/java/org/springframework/scheduling/Trigger.java index 4c8d9a1ed73..0211382493f 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/Trigger.java +++ b/spring-context/src/main/java/org/springframework/scheduling/Trigger.java @@ -18,6 +18,8 @@ package org.springframework.scheduling; import java.util.Date; +import org.springframework.lang.Nullable; + /** * Common interface for trigger objects that determine the next execution time * of a task that they get associated with. @@ -36,6 +38,7 @@ public interface Trigger { * @return the next execution time as defined by the trigger, * or {@code null} if the trigger won't fire anymore */ + @Nullable Date nextExecutionTime(TriggerContext triggerContext); } diff --git a/spring-context/src/main/java/org/springframework/scheduling/TriggerContext.java b/spring-context/src/main/java/org/springframework/scheduling/TriggerContext.java index feeb2ecea6e..38fce123925 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/TriggerContext.java +++ b/spring-context/src/main/java/org/springframework/scheduling/TriggerContext.java @@ -18,6 +18,8 @@ package org.springframework.scheduling; import java.util.Date; +import org.springframework.lang.Nullable; + /** * Context object encapsulating last execution times and last completion time * of a given task. @@ -31,18 +33,21 @@ public interface TriggerContext { * Return the last scheduled execution time of the task, * or {@code null} if not scheduled before. */ + @Nullable Date lastScheduledExecutionTime(); /** * Return the last actual execution time of the task, * or {@code null} if not scheduled before. */ + @Nullable Date lastActualExecutionTime(); /** * Return the last completion time of the task, * or {@code null} if not scheduled before. */ + @Nullable Date lastCompletionTime(); } diff --git a/spring-context/src/main/java/org/springframework/scheduling/annotation/AsyncAnnotationAdvisor.java b/spring-context/src/main/java/org/springframework/scheduling/annotation/AsyncAnnotationAdvisor.java index 15dea168d7c..3a28f39066d 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/annotation/AsyncAnnotationAdvisor.java +++ b/spring-context/src/main/java/org/springframework/scheduling/annotation/AsyncAnnotationAdvisor.java @@ -32,6 +32,7 @@ import org.springframework.aop.support.ComposablePointcut; import org.springframework.aop.support.annotation.AnnotationMatchingPointcut; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -76,7 +77,7 @@ public class AsyncAnnotationAdvisor extends AbstractPointcutAdvisor implements B * @see AnnotationAsyncExecutionInterceptor#getDefaultExecutor(BeanFactory) */ @SuppressWarnings("unchecked") - public AsyncAnnotationAdvisor(Executor executor, AsyncUncaughtExceptionHandler exceptionHandler) { + public AsyncAnnotationAdvisor(@Nullable Executor executor, AsyncUncaughtExceptionHandler exceptionHandler) { Set> asyncAnnotationTypes = new LinkedHashSet<>(2); asyncAnnotationTypes.add(Async.class); try { @@ -151,6 +152,7 @@ public class AsyncAnnotationAdvisor extends AbstractPointcutAdvisor implements B * @param asyncAnnotationTypes the async annotation types to introspect * @return the applicable Pointcut object, or {@code null} if none */ + @Nullable protected Pointcut buildPointcut(Set> asyncAnnotationTypes) { ComposablePointcut result = null; for (Class asyncAnnotationType : asyncAnnotationTypes) { diff --git a/spring-context/src/main/java/org/springframework/scheduling/annotation/package-info.java b/spring-context/src/main/java/org/springframework/scheduling/annotation/package-info.java index 318c8fbee88..1f38139ead2 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/annotation/package-info.java +++ b/spring-context/src/main/java/org/springframework/scheduling/annotation/package-info.java @@ -1,4 +1,7 @@ /** * Java 5 annotation for asynchronous method execution. */ +@NonNullApi package org.springframework.scheduling.annotation; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/scheduling/concurrent/ReschedulingRunnable.java b/spring-context/src/main/java/org/springframework/scheduling/concurrent/ReschedulingRunnable.java index 0a3e6ecdd91..b43d04ecbe0 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/concurrent/ReschedulingRunnable.java +++ b/spring-context/src/main/java/org/springframework/scheduling/concurrent/ReschedulingRunnable.java @@ -24,6 +24,7 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import org.springframework.lang.Nullable; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.support.DelegatingErrorHandlingRunnable; import org.springframework.scheduling.support.SimpleTriggerContext; @@ -63,6 +64,7 @@ class ReschedulingRunnable extends DelegatingErrorHandlingRunnable implements Sc } + @Nullable public ScheduledFuture schedule() { synchronized (this.triggerContextMonitor) { this.scheduledExecutionTime = this.trigger.nextExecutionTime(this.triggerContext); diff --git a/spring-context/src/main/java/org/springframework/scheduling/concurrent/package-info.java b/spring-context/src/main/java/org/springframework/scheduling/concurrent/package-info.java index 40779559585..bf23055e21f 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/concurrent/package-info.java +++ b/spring-context/src/main/java/org/springframework/scheduling/concurrent/package-info.java @@ -5,4 +5,7 @@ * context. Provides support for the native {@code java.util.concurrent} * interfaces as well as the Spring {@code TaskExecutor} mechanism. */ +@NonNullApi package org.springframework.scheduling.concurrent; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/scheduling/config/ScheduledTaskRegistrar.java b/spring-context/src/main/java/org/springframework/scheduling/config/ScheduledTaskRegistrar.java index a613c0b7821..b1702be5adc 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/config/ScheduledTaskRegistrar.java +++ b/spring-context/src/main/java/org/springframework/scheduling/config/ScheduledTaskRegistrar.java @@ -29,6 +29,7 @@ import java.util.concurrent.ScheduledExecutorService; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; +import org.springframework.lang.Nullable; import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.concurrent.ConcurrentTaskScheduler; @@ -101,6 +102,7 @@ public class ScheduledTaskRegistrar implements InitializingBean, DisposableBean /** * Return the {@link TaskScheduler} instance for this registrar (may be {@code null}). */ + @Nullable public TaskScheduler getScheduler() { return this.taskScheduler; } @@ -398,6 +400,7 @@ public class ScheduledTaskRegistrar implements InitializingBean, DisposableBean * (or {@code null} if processing a previously registered task) * @since 4.3 */ + @Nullable public ScheduledTask scheduleCronTask(CronTask task) { ScheduledTask scheduledTask = this.unresolvedTasks.remove(task); boolean newTask = false; @@ -422,6 +425,7 @@ public class ScheduledTaskRegistrar implements InitializingBean, DisposableBean * (or {@code null} if processing a previously registered task) * @since 4.3 */ + @Nullable public ScheduledTask scheduleFixedRateTask(IntervalTask task) { ScheduledTask scheduledTask = this.unresolvedTasks.remove(task); boolean newTask = false; @@ -454,6 +458,7 @@ public class ScheduledTaskRegistrar implements InitializingBean, DisposableBean * (or {@code null} if processing a previously registered task) * @since 4.3 */ + @Nullable public ScheduledTask scheduleFixedDelayTask(IntervalTask task) { ScheduledTask scheduledTask = this.unresolvedTasks.remove(task); boolean newTask = false; diff --git a/spring-context/src/main/java/org/springframework/scheduling/config/package-info.java b/spring-context/src/main/java/org/springframework/scheduling/config/package-info.java index 65dac8fec36..8fdf7b700ba 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/config/package-info.java +++ b/spring-context/src/main/java/org/springframework/scheduling/config/package-info.java @@ -2,4 +2,7 @@ * Support package for declarative scheduling configuration, * with XML schema being the primary configuration format. */ +@NonNullApi package org.springframework.scheduling.config; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/scheduling/package-info.java b/spring-context/src/main/java/org/springframework/scheduling/package-info.java index 22dd462809b..6ae921bb0ed 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/package-info.java +++ b/spring-context/src/main/java/org/springframework/scheduling/package-info.java @@ -2,4 +2,7 @@ * General exceptions for Spring's scheduling support, * independent of any specific scheduling system. */ +@NonNullApi package org.springframework.scheduling; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/scheduling/support/TaskUtils.java b/spring-context/src/main/java/org/springframework/scheduling/support/TaskUtils.java index 3b86d2fbd2d..22a7c74fe11 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/support/TaskUtils.java +++ b/spring-context/src/main/java/org/springframework/scheduling/support/TaskUtils.java @@ -21,6 +21,7 @@ import java.util.concurrent.Future; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.ErrorHandler; import org.springframework.util.ReflectionUtils; @@ -60,7 +61,7 @@ public abstract class TaskUtils { * returned {@link Future}. In both cases, the errors will be logged. */ public static DelegatingErrorHandlingRunnable decorateTaskWithErrorHandler( - Runnable task, ErrorHandler errorHandler, boolean isRepeatingTask) { + Runnable task, @Nullable ErrorHandler errorHandler, boolean isRepeatingTask) { if (task instanceof DelegatingErrorHandlingRunnable) { return (DelegatingErrorHandlingRunnable) task; diff --git a/spring-context/src/main/java/org/springframework/scheduling/support/package-info.java b/spring-context/src/main/java/org/springframework/scheduling/support/package-info.java index 25b09fb0d7f..d1bc1cefffa 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/support/package-info.java +++ b/spring-context/src/main/java/org/springframework/scheduling/support/package-info.java @@ -2,4 +2,7 @@ * Generic support classes for scheduling. * Provides a Runnable adapter for Spring's MethodInvoker. */ +@NonNullApi package org.springframework.scheduling.support; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/scripting/ScriptCompilationException.java b/spring-context/src/main/java/org/springframework/scripting/ScriptCompilationException.java index 2064ae90800..ec0660be0b3 100644 --- a/spring-context/src/main/java/org/springframework/scripting/ScriptCompilationException.java +++ b/spring-context/src/main/java/org/springframework/scripting/ScriptCompilationException.java @@ -17,6 +17,7 @@ package org.springframework.scripting; import org.springframework.core.NestedRuntimeException; +import org.springframework.lang.Nullable; /** * Exception to be thrown on script compilation failure. @@ -84,6 +85,7 @@ public class ScriptCompilationException extends NestedRuntimeException { * Return the source for the offending script. * @return the source, or {@code null} if not available */ + @Nullable public ScriptSource getScriptSource() { return this.scriptSource; } diff --git a/spring-context/src/main/java/org/springframework/scripting/ScriptEvaluator.java b/spring-context/src/main/java/org/springframework/scripting/ScriptEvaluator.java index 918877c4e58..35b150dd8b5 100644 --- a/spring-context/src/main/java/org/springframework/scripting/ScriptEvaluator.java +++ b/spring-context/src/main/java/org/springframework/scripting/ScriptEvaluator.java @@ -18,6 +18,8 @@ package org.springframework.scripting; import java.util.Map; +import org.springframework.lang.Nullable; + /** * Spring's strategy interface for evaluating a script. * @@ -38,6 +40,7 @@ public interface ScriptEvaluator { * @throws ScriptCompilationException if the evaluator failed to read, * compile or evaluate the script */ + @Nullable Object evaluate(ScriptSource script) throws ScriptCompilationException; /** @@ -49,6 +52,7 @@ public interface ScriptEvaluator { * @throws ScriptCompilationException if the evaluator failed to read, * compile or evaluate the script */ - Object evaluate(ScriptSource script, Map arguments) throws ScriptCompilationException; + @Nullable + Object evaluate(ScriptSource script, @Nullable Map arguments) throws ScriptCompilationException; } diff --git a/spring-context/src/main/java/org/springframework/scripting/ScriptFactory.java b/spring-context/src/main/java/org/springframework/scripting/ScriptFactory.java index dc835a60ff3..f4cb808ebf1 100644 --- a/spring-context/src/main/java/org/springframework/scripting/ScriptFactory.java +++ b/spring-context/src/main/java/org/springframework/scripting/ScriptFactory.java @@ -18,6 +18,8 @@ package org.springframework.scripting; import java.io.IOException; +import org.springframework.lang.Nullable; + /** * Script definition interface, encapsulating the configuration * of a specific script as well as a factory method for @@ -49,6 +51,7 @@ public interface ScriptFactory { * its Java interfaces (such as in the case of Groovy). * @return the interfaces for the script */ + @Nullable Class[] getScriptInterfaces(); /** @@ -75,7 +78,7 @@ public interface ScriptFactory { * @throws IOException if script retrieval failed * @throws ScriptCompilationException if script compilation failed */ - Object getScriptedObject(ScriptSource scriptSource, Class... actualInterfaces) + Object getScriptedObject(ScriptSource scriptSource, @Nullable Class... actualInterfaces) throws IOException, ScriptCompilationException; /** @@ -91,6 +94,7 @@ public interface ScriptFactory { * @throws ScriptCompilationException if script compilation failed * @since 2.0.3 */ + @Nullable Class getScriptedObjectType(ScriptSource scriptSource) throws IOException, ScriptCompilationException; diff --git a/spring-context/src/main/java/org/springframework/scripting/ScriptSource.java b/spring-context/src/main/java/org/springframework/scripting/ScriptSource.java index 2e5a37e4d48..2e13af6b108 100644 --- a/spring-context/src/main/java/org/springframework/scripting/ScriptSource.java +++ b/spring-context/src/main/java/org/springframework/scripting/ScriptSource.java @@ -18,6 +18,8 @@ package org.springframework.scripting; import java.io.IOException; +import org.springframework.lang.Nullable; + /** * Interface that defines the source of a script. * Tracks whether the underlying script has been modified. @@ -47,6 +49,7 @@ public interface ScriptSource { * Determine a class name for the underlying script. * @return the suggested class name, or {@code null} if none available */ + @Nullable String suggestedClassName(); } diff --git a/spring-context/src/main/java/org/springframework/scripting/bsh/BshScriptFactory.java b/spring-context/src/main/java/org/springframework/scripting/bsh/BshScriptFactory.java index 86d87d354e2..4f4b7710e04 100644 --- a/spring-context/src/main/java/org/springframework/scripting/bsh/BshScriptFactory.java +++ b/spring-context/src/main/java/org/springframework/scripting/bsh/BshScriptFactory.java @@ -21,6 +21,7 @@ import java.io.IOException; import bsh.EvalError; import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.lang.Nullable; import org.springframework.scripting.ScriptCompilationException; import org.springframework.scripting.ScriptFactory; import org.springframework.scripting.ScriptSource; @@ -81,7 +82,7 @@ public class BshScriptFactory implements ScriptFactory, BeanClassLoaderAware { * @param scriptInterfaces the Java interfaces that the scripted object * is supposed to implement (may be {@code null}) */ - public BshScriptFactory(String scriptSourceLocator, Class... scriptInterfaces) { + public BshScriptFactory(String scriptSourceLocator, @Nullable Class... scriptInterfaces) { Assert.hasText(scriptSourceLocator, "'scriptSourceLocator' must not be empty"); this.scriptSourceLocator = scriptSourceLocator; this.scriptInterfaces = scriptInterfaces; diff --git a/spring-context/src/main/java/org/springframework/scripting/bsh/BshScriptUtils.java b/spring-context/src/main/java/org/springframework/scripting/bsh/BshScriptUtils.java index f7f634df2c6..7ebc36b192d 100644 --- a/spring-context/src/main/java/org/springframework/scripting/bsh/BshScriptUtils.java +++ b/spring-context/src/main/java/org/springframework/scripting/bsh/BshScriptUtils.java @@ -26,6 +26,7 @@ import bsh.Primitive; import bsh.XThis; import org.springframework.core.NestedRuntimeException; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; @@ -66,7 +67,7 @@ public abstract class BshScriptUtils { * @throws EvalError in case of BeanShell parsing failure * @see #createBshObject(String, Class[], ClassLoader) */ - public static Object createBshObject(String scriptSource, Class... scriptInterfaces) throws EvalError { + public static Object createBshObject(String scriptSource, @Nullable Class... scriptInterfaces) throws EvalError { return createBshObject(scriptSource, scriptInterfaces, ClassUtils.getDefaultClassLoader()); } @@ -84,7 +85,7 @@ public abstract class BshScriptUtils { * @return the scripted Java object * @throws EvalError in case of BeanShell parsing failure */ - public static Object createBshObject(String scriptSource, Class[] scriptInterfaces, ClassLoader classLoader) + public static Object createBshObject(String scriptSource, @Nullable Class[] scriptInterfaces, ClassLoader classLoader) throws EvalError { Object result = evaluateBshScript(scriptSource, scriptInterfaces, classLoader); @@ -113,6 +114,7 @@ public abstract class BshScriptUtils { * @return the scripted Java class, or {@code null} if none could be determined * @throws EvalError in case of BeanShell parsing failure */ + @Nullable static Class determineBshObjectType(String scriptSource, ClassLoader classLoader) throws EvalError { Assert.hasText(scriptSource, "Script source must not be empty"); Interpreter interpreter = new Interpreter(); @@ -144,7 +146,7 @@ public abstract class BshScriptUtils { * @return the scripted Java class or Java object * @throws EvalError in case of BeanShell parsing failure */ - static Object evaluateBshScript(String scriptSource, Class[] scriptInterfaces, ClassLoader classLoader) + static Object evaluateBshScript(String scriptSource, @Nullable Class[] scriptInterfaces, ClassLoader classLoader) throws EvalError { Assert.hasText(scriptSource, "Script source must not be empty"); @@ -176,6 +178,7 @@ public abstract class BshScriptUtils { } @Override + @Nullable public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (ReflectionUtils.isEqualsMethod(method)) { return (isProxyForSameBshObject(args[0])); diff --git a/spring-context/src/main/java/org/springframework/scripting/bsh/package-info.java b/spring-context/src/main/java/org/springframework/scripting/bsh/package-info.java index a8adbca6c95..9ac76f5b111 100644 --- a/spring-context/src/main/java/org/springframework/scripting/bsh/package-info.java +++ b/spring-context/src/main/java/org/springframework/scripting/bsh/package-info.java @@ -4,4 +4,7 @@ * (and BeanShell2) * into Spring's scripting infrastructure. */ +@NonNullApi package org.springframework.scripting.bsh; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/scripting/config/ScriptBeanDefinitionParser.java b/spring-context/src/main/java/org/springframework/scripting/config/ScriptBeanDefinitionParser.java index 159e0aa108b..70f026bf005 100644 --- a/spring-context/src/main/java/org/springframework/scripting/config/ScriptBeanDefinitionParser.java +++ b/spring-context/src/main/java/org/springframework/scripting/config/ScriptBeanDefinitionParser.java @@ -29,6 +29,7 @@ import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser; import org.springframework.beans.factory.xml.BeanDefinitionParserDelegate; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.beans.factory.xml.XmlReaderContext; +import org.springframework.lang.Nullable; import org.springframework.scripting.support.ScriptFactoryPostProcessor; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; @@ -213,6 +214,7 @@ class ScriptBeanDefinitionParser extends AbstractBeanDefinitionParser { * the '{@code inline-script}' element. Logs and {@link XmlReaderContext#error} and * returns {@code null} if neither or both of these values are specified. */ + @Nullable private String resolveScriptSource(Element element, XmlReaderContext readerContext) { boolean hasScriptSource = element.hasAttribute(SCRIPT_SOURCE_ATTRIBUTE); List elements = DomUtils.getChildElementsByTagName(element, INLINE_SCRIPT_ELEMENT); diff --git a/spring-context/src/main/java/org/springframework/scripting/config/package-info.java b/spring-context/src/main/java/org/springframework/scripting/config/package-info.java index c0747d0db38..6688a44389e 100644 --- a/spring-context/src/main/java/org/springframework/scripting/config/package-info.java +++ b/spring-context/src/main/java/org/springframework/scripting/config/package-info.java @@ -2,4 +2,7 @@ * Support package for Spring's dynamic language machinery, * with XML schema being the primary configuration format. */ +@NonNullApi package org.springframework.scripting.config; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/scripting/groovy/GroovyScriptFactory.java b/spring-context/src/main/java/org/springframework/scripting/groovy/GroovyScriptFactory.java index 4155b3f986b..ba9faf6408f 100644 --- a/spring-context/src/main/java/org/springframework/scripting/groovy/GroovyScriptFactory.java +++ b/spring-context/src/main/java/org/springframework/scripting/groovy/GroovyScriptFactory.java @@ -31,6 +31,7 @@ import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.lang.Nullable; import org.springframework.scripting.ScriptCompilationException; import org.springframework.scripting.ScriptFactory; import org.springframework.scripting.ScriptSource; @@ -100,7 +101,7 @@ public class GroovyScriptFactory implements ScriptFactory, BeanFactoryAware, Bea * (may be {@code null}) * @see GroovyObjectCustomizer#customize */ - public GroovyScriptFactory(String scriptSourceLocator, GroovyObjectCustomizer groovyObjectCustomizer) { + public GroovyScriptFactory(String scriptSourceLocator, @Nullable GroovyObjectCustomizer groovyObjectCustomizer) { this(scriptSourceLocator); this.groovyObjectCustomizer = groovyObjectCustomizer; } @@ -116,7 +117,7 @@ public class GroovyScriptFactory implements ScriptFactory, BeanFactoryAware, Bea * @since 4.3.3 * @see GroovyClassLoader#GroovyClassLoader(ClassLoader, CompilerConfiguration) */ - public GroovyScriptFactory(String scriptSourceLocator, CompilerConfiguration compilerConfiguration) { + public GroovyScriptFactory(String scriptSourceLocator, @Nullable CompilerConfiguration compilerConfiguration) { this(scriptSourceLocator); this.compilerConfiguration = compilerConfiguration; } diff --git a/spring-context/src/main/java/org/springframework/scripting/groovy/package-info.java b/spring-context/src/main/java/org/springframework/scripting/groovy/package-info.java index 47d7fa23d99..a8d72bb5ed6 100644 --- a/spring-context/src/main/java/org/springframework/scripting/groovy/package-info.java +++ b/spring-context/src/main/java/org/springframework/scripting/groovy/package-info.java @@ -3,4 +3,7 @@ * Groovy * into Spring's scripting infrastructure. */ +@NonNullApi package org.springframework.scripting.groovy; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/scripting/package-info.java b/spring-context/src/main/java/org/springframework/scripting/package-info.java index 64d0f935e19..cbbf0f1ee6f 100644 --- a/spring-context/src/main/java/org/springframework/scripting/package-info.java +++ b/spring-context/src/main/java/org/springframework/scripting/package-info.java @@ -1,4 +1,7 @@ /** * Core interfaces for Spring's scripting support. */ +@NonNullApi package org.springframework.scripting; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/scripting/support/ResourceScriptSource.java b/spring-context/src/main/java/org/springframework/scripting/support/ResourceScriptSource.java index 3e4c1df36bf..0d19bb798ab 100644 --- a/spring-context/src/main/java/org/springframework/scripting/support/ResourceScriptSource.java +++ b/spring-context/src/main/java/org/springframework/scripting/support/ResourceScriptSource.java @@ -24,6 +24,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.core.io.Resource; import org.springframework.core.io.support.EncodedResource; +import org.springframework.lang.Nullable; import org.springframework.scripting.ScriptSource; import org.springframework.util.Assert; import org.springframework.util.FileCopyUtils; @@ -88,7 +89,7 @@ public class ResourceScriptSource implements ScriptSource { *

The default value for regular Resources is "UTF-8". * A {@code null} value implies the platform default. */ - public void setEncoding(String encoding) { + public void setEncoding(@Nullable String encoding) { this.resource = new EncodedResource(this.resource.getResource(), encoding); } diff --git a/spring-context/src/main/java/org/springframework/scripting/support/ScriptFactoryPostProcessor.java b/spring-context/src/main/java/org/springframework/scripting/support/ScriptFactoryPostProcessor.java index d655e266ff2..034b84c8bee 100644 --- a/spring-context/src/main/java/org/springframework/scripting/support/ScriptFactoryPostProcessor.java +++ b/spring-context/src/main/java/org/springframework/scripting/support/ScriptFactoryPostProcessor.java @@ -53,6 +53,7 @@ import org.springframework.core.Conventions; import org.springframework.core.Ordered; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.ResourceLoader; +import org.springframework.lang.Nullable; import org.springframework.scripting.ScriptFactory; import org.springframework.scripting.ScriptSource; import org.springframework.util.ClassUtils; @@ -557,7 +558,7 @@ public class ScriptFactoryPostProcessor extends InstantiationAwareBeanPostProces * @return the generated proxy * @see RefreshableScriptTargetSource */ - protected Object createRefreshableProxy(TargetSource ts, Class[] interfaces, boolean proxyTargetClass) { + protected Object createRefreshableProxy(TargetSource ts, @Nullable Class[] interfaces, boolean proxyTargetClass) { ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.setTargetSource(ts); ClassLoader classLoader = this.beanClassLoader; diff --git a/spring-context/src/main/java/org/springframework/scripting/support/StaticScriptSource.java b/spring-context/src/main/java/org/springframework/scripting/support/StaticScriptSource.java index dbd937a0f0a..8e2673da2a2 100644 --- a/spring-context/src/main/java/org/springframework/scripting/support/StaticScriptSource.java +++ b/spring-context/src/main/java/org/springframework/scripting/support/StaticScriptSource.java @@ -16,6 +16,7 @@ package org.springframework.scripting.support; +import org.springframework.lang.Nullable; import org.springframework.scripting.ScriptSource; import org.springframework.util.Assert; @@ -52,7 +53,7 @@ public class StaticScriptSource implements ScriptSource { * @param className the suggested class name for the script * (may be {@code null}) */ - public StaticScriptSource(String script, String className) { + public StaticScriptSource(String script, @Nullable String className) { setScript(script); this.className = className; } diff --git a/spring-context/src/main/java/org/springframework/scripting/support/package-info.java b/spring-context/src/main/java/org/springframework/scripting/support/package-info.java index 2c640d727fa..6fee64c9631 100644 --- a/spring-context/src/main/java/org/springframework/scripting/support/package-info.java +++ b/spring-context/src/main/java/org/springframework/scripting/support/package-info.java @@ -3,4 +3,7 @@ * Provides a ScriptFactoryPostProcessor for turning ScriptFactory * definitions into scripted objects. */ +@NonNullApi package org.springframework.scripting.support; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/stereotype/package-info.java b/spring-context/src/main/java/org/springframework/stereotype/package-info.java index 5bc2ecf287d..8754a268145 100644 --- a/spring-context/src/main/java/org/springframework/stereotype/package-info.java +++ b/spring-context/src/main/java/org/springframework/stereotype/package-info.java @@ -4,4 +4,7 @@ * *

Intended for use by tools and aspects (making an ideal target for pointcuts). */ +@NonNullApi package org.springframework.stereotype; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/ui/ConcurrentModel.java b/spring-context/src/main/java/org/springframework/ui/ConcurrentModel.java index 553120af447..d564b396f8a 100644 --- a/spring-context/src/main/java/org/springframework/ui/ConcurrentModel.java +++ b/spring-context/src/main/java/org/springframework/ui/ConcurrentModel.java @@ -21,6 +21,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.springframework.core.Conventions; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -69,7 +70,7 @@ public class ConcurrentModel extends ConcurrentHashMap implement * @param attributeName the name of the model attribute (never {@code null}) * @param attributeValue the model attribute value (can be {@code null}) */ - public ConcurrentModel addAttribute(String attributeName, Object attributeValue) { + public ConcurrentModel addAttribute(String attributeName, @Nullable Object attributeValue) { Assert.notNull(attributeName, "Model attribute name must not be null"); put(attributeName, attributeValue); return this; diff --git a/spring-context/src/main/java/org/springframework/ui/Model.java b/spring-context/src/main/java/org/springframework/ui/Model.java index 4a51e9182c8..2be7496b136 100644 --- a/spring-context/src/main/java/org/springframework/ui/Model.java +++ b/spring-context/src/main/java/org/springframework/ui/Model.java @@ -19,6 +19,8 @@ package org.springframework.ui; import java.util.Collection; import java.util.Map; +import org.springframework.lang.Nullable; + /** * Java-5-specific interface that defines a holder for model attributes. * Primarily designed for adding attributes to the model. @@ -34,7 +36,7 @@ public interface Model { * @param attributeName the name of the model attribute (never {@code null}) * @param attributeValue the model attribute value (can be {@code null}) */ - Model addAttribute(String attributeName, Object attributeValue); + Model addAttribute(String attributeName, @Nullable Object attributeValue); /** * Add the supplied attribute to this {@code Map} using a @@ -45,7 +47,7 @@ public interface Model { * than for empty collections as is already done by JSTL tags. * @param attributeValue the model attribute value (never {@code null}) */ - Model addAttribute(Object attributeValue); + Model addAttribute(@Nullable Object attributeValue); /** * Copy all attributes in the supplied {@code Collection} into this diff --git a/spring-context/src/main/java/org/springframework/ui/ModelMap.java b/spring-context/src/main/java/org/springframework/ui/ModelMap.java index dad6b113b6c..6b263795fc1 100644 --- a/spring-context/src/main/java/org/springframework/ui/ModelMap.java +++ b/spring-context/src/main/java/org/springframework/ui/ModelMap.java @@ -21,6 +21,7 @@ import java.util.LinkedHashMap; import java.util.Map; import org.springframework.core.Conventions; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -70,7 +71,7 @@ public class ModelMap extends LinkedHashMap { * @param attributeName the name of the model attribute (never {@code null}) * @param attributeValue the model attribute value (can be {@code null}) */ - public ModelMap addAttribute(String attributeName, Object attributeValue) { + public ModelMap addAttribute(String attributeName, @Nullable Object attributeValue) { Assert.notNull(attributeName, "Model attribute name must not be null"); put(attributeName, attributeValue); return this; diff --git a/spring-context/src/main/java/org/springframework/ui/context/HierarchicalThemeSource.java b/spring-context/src/main/java/org/springframework/ui/context/HierarchicalThemeSource.java index e20db315c93..b97568d2b53 100644 --- a/spring-context/src/main/java/org/springframework/ui/context/HierarchicalThemeSource.java +++ b/spring-context/src/main/java/org/springframework/ui/context/HierarchicalThemeSource.java @@ -16,6 +16,8 @@ package org.springframework.ui.context; +import org.springframework.lang.Nullable; + /** * Sub-interface of ThemeSource to be implemented by objects that * can resolve theme messages hierarchically. @@ -32,11 +34,12 @@ public interface HierarchicalThemeSource extends ThemeSource { * resolve messages that this object can't resolve. * May be {@code null}, in which case no further resolution is possible. */ - void setParentThemeSource(ThemeSource parent); + void setParentThemeSource(@Nullable ThemeSource parent); /** * Return the parent of this ThemeSource, or {@code null} if none. */ + @Nullable ThemeSource getParentThemeSource(); } diff --git a/spring-context/src/main/java/org/springframework/ui/context/ThemeSource.java b/spring-context/src/main/java/org/springframework/ui/context/ThemeSource.java index 85c676aa06e..43ab228d0b2 100644 --- a/spring-context/src/main/java/org/springframework/ui/context/ThemeSource.java +++ b/spring-context/src/main/java/org/springframework/ui/context/ThemeSource.java @@ -16,6 +16,8 @@ package org.springframework.ui.context; +import org.springframework.lang.Nullable; + /** * Interface to be implemented by objects that can resolve {@link Theme Themes}. * This enables parameterization and internationalization of messages @@ -38,6 +40,7 @@ public interface ThemeSource { * return default Themes for other theme names. * @see org.springframework.web.servlet.theme.AbstractThemeResolver#ORIGINAL_DEFAULT_THEME_NAME */ + @Nullable Theme getTheme(String themeName); } diff --git a/spring-context/src/main/java/org/springframework/ui/context/package-info.java b/spring-context/src/main/java/org/springframework/ui/context/package-info.java index ffc6e3d7053..355eabb4beb 100644 --- a/spring-context/src/main/java/org/springframework/ui/context/package-info.java +++ b/spring-context/src/main/java/org/springframework/ui/context/package-info.java @@ -2,4 +2,7 @@ * Contains classes defining the application context subinterface * for UI applications. The theme feature is added here. */ +@NonNullApi package org.springframework.ui.context; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/ui/context/support/package-info.java b/spring-context/src/main/java/org/springframework/ui/context/support/package-info.java index f18e77c605d..59d7fb291d6 100644 --- a/spring-context/src/main/java/org/springframework/ui/context/support/package-info.java +++ b/spring-context/src/main/java/org/springframework/ui/context/support/package-info.java @@ -2,4 +2,7 @@ * Classes supporting the org.springframework.ui.context package. * Provides support classes for specialized UI contexts, e.g. for web UIs. */ +@NonNullApi package org.springframework.ui.context.support; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/ui/package-info.java b/spring-context/src/main/java/org/springframework/ui/package-info.java index 77380dc8f3f..a513de69384 100644 --- a/spring-context/src/main/java/org/springframework/ui/package-info.java +++ b/spring-context/src/main/java/org/springframework/ui/package-info.java @@ -2,4 +2,7 @@ * Generic support for UI layer concepts. * Provides a generic ModelMap for model holding. */ +@NonNullApi package org.springframework.ui; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/validation/AbstractPropertyBindingResult.java b/spring-context/src/main/java/org/springframework/validation/AbstractPropertyBindingResult.java index 7a3ffc4ac9b..e87b0df4688 100644 --- a/spring-context/src/main/java/org/springframework/validation/AbstractPropertyBindingResult.java +++ b/spring-context/src/main/java/org/springframework/validation/AbstractPropertyBindingResult.java @@ -25,6 +25,7 @@ import org.springframework.beans.PropertyEditorRegistry; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.support.ConvertingPropertyEditorAdapter; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -133,6 +134,7 @@ public abstract class AbstractPropertyBindingResult extends AbstractBindingResul * @param fixedField the fully qualified field name * @return the custom PropertyEditor, or {@code null} */ + @Nullable protected PropertyEditor getCustomEditor(String fixedField) { Class targetType = getPropertyAccessor().getPropertyType(fixedField); PropertyEditor editor = getPropertyAccessor().findCustomEditor(targetType, fixedField); diff --git a/spring-context/src/main/java/org/springframework/validation/BindingResult.java b/spring-context/src/main/java/org/springframework/validation/BindingResult.java index 32c93215cbe..26e68081ee9 100644 --- a/spring-context/src/main/java/org/springframework/validation/BindingResult.java +++ b/spring-context/src/main/java/org/springframework/validation/BindingResult.java @@ -20,6 +20,7 @@ import java.beans.PropertyEditor; import java.util.Map; import org.springframework.beans.PropertyEditorRegistry; +import org.springframework.lang.Nullable; /** * General interface that represents binding results. Extends the @@ -83,6 +84,7 @@ public interface BindingResult extends Errors { * @return the current value of the field in its raw form, * or {@code null} if not known */ + @Nullable Object getRawFieldValue(String field); /** @@ -93,13 +95,15 @@ public interface BindingResult extends Errors { * is given but should be specified in any case for consistency checking) * @return the registered editor, or {@code null} if none */ - PropertyEditor findEditor(String field, Class valueType); + @Nullable + PropertyEditor findEditor(@Nullable String field, @Nullable Class valueType); /** * Return the underlying PropertyEditorRegistry. * @return the PropertyEditorRegistry, or {@code null} if none * available for this BindingResult */ + @Nullable PropertyEditorRegistry getPropertyEditorRegistry(); /** diff --git a/spring-context/src/main/java/org/springframework/validation/BindingResultUtils.java b/spring-context/src/main/java/org/springframework/validation/BindingResultUtils.java index ae3c0357688..28f23ab69fe 100644 --- a/spring-context/src/main/java/org/springframework/validation/BindingResultUtils.java +++ b/spring-context/src/main/java/org/springframework/validation/BindingResultUtils.java @@ -18,6 +18,7 @@ package org.springframework.validation; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -36,6 +37,7 @@ public abstract class BindingResultUtils { * @return the BindingResult, or {@code null} if none found * @throws IllegalStateException if the attribute found is not of type BindingResult */ + @Nullable public static BindingResult getBindingResult(Map model, String name) { Assert.notNull(model, "Model map must not be null"); Assert.notNull(name, "Name must not be null"); diff --git a/spring-context/src/main/java/org/springframework/validation/DataBinder.java b/spring-context/src/main/java/org/springframework/validation/DataBinder.java index 7538ece1da7..b5199d314e9 100644 --- a/spring-context/src/main/java/org/springframework/validation/DataBinder.java +++ b/spring-context/src/main/java/org/springframework/validation/DataBinder.java @@ -25,6 +25,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.validation.constraints.Null; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -43,6 +45,7 @@ import org.springframework.core.MethodParameter; import org.springframework.core.convert.ConversionService; import org.springframework.format.Formatter; import org.springframework.format.support.FormatterPropertyEditorAdapter; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.util.PatternMatchUtils; @@ -159,7 +162,7 @@ public class DataBinder implements PropertyEditorRegistry, TypeConverter { * if the binder is just used to convert a plain parameter value) * @see #DEFAULT_OBJECT_NAME */ - public DataBinder(Object target) { + public DataBinder(@Nullable Object target) { this(target, DEFAULT_OBJECT_NAME); } @@ -169,7 +172,7 @@ public class DataBinder implements PropertyEditorRegistry, TypeConverter { * if the binder is just used to convert a plain parameter value) * @param objectName the name of the target object */ - public DataBinder(Object target, String objectName) { + public DataBinder(@Nullable Object target, String objectName) { this.target = ObjectUtils.unwrapOptional(target); this.objectName = objectName; } @@ -557,6 +560,7 @@ public class DataBinder implements PropertyEditorRegistry, TypeConverter { /** * Return the primary Validator to apply after each binding step, if any. */ + @Nullable public Validator getValidator() { return (this.validators.size() > 0 ? this.validators.get(0) : null); } @@ -588,6 +592,7 @@ public class DataBinder implements PropertyEditorRegistry, TypeConverter { /** * Return the associated ConversionService, if any. */ + @Nullable public ConversionService getConversionService() { return this.conversionService; } diff --git a/spring-context/src/main/java/org/springframework/validation/Errors.java b/spring-context/src/main/java/org/springframework/validation/Errors.java index bea2a7061bb..42c7094e2a9 100644 --- a/spring-context/src/main/java/org/springframework/validation/Errors.java +++ b/spring-context/src/main/java/org/springframework/validation/Errors.java @@ -19,6 +19,7 @@ package org.springframework.validation; import java.util.List; import org.springframework.beans.PropertyAccessor; +import org.springframework.lang.Nullable; /** * Stores and exposes information about data-binding and validation @@ -66,13 +67,14 @@ public interface Errors { * e.g. "address" (defaults to "", {@code null} is also acceptable). * Can end with a dot: both "address" and "address." are valid. */ - void setNestedPath(String nestedPath); + void setNestedPath(@Nullable String nestedPath); /** * Return the current nested path of this {@link Errors} object. *

Returns a nested path with a dot, i.e. "address.", for easy * building of concatenated paths. Default is an empty String. */ + @Nullable String getNestedPath(); /** @@ -119,7 +121,7 @@ public interface Errors { * (can be {@code null}) * @param defaultMessage fallback default message */ - void reject(String errorCode, Object[] errorArgs, String defaultMessage); + void reject(String errorCode, @Nullable Object[] errorArgs, String defaultMessage); /** * Register a field error for the specified field of the current object @@ -133,7 +135,7 @@ public interface Errors { * @param errorCode error code, interpretable as a message key * @see #getNestedPath() */ - void rejectValue(String field, String errorCode); + void rejectValue(@Nullable String field, String errorCode); /** * Register a field error for the specified field of the current object @@ -148,7 +150,7 @@ public interface Errors { * @param defaultMessage fallback default message * @see #getNestedPath() */ - void rejectValue(String field, String errorCode, String defaultMessage); + void rejectValue(@Nullable String field, String errorCode, String defaultMessage); /** * Register a field error for the specified field of the current object @@ -165,7 +167,7 @@ public interface Errors { * @param defaultMessage fallback default message * @see #getNestedPath() */ - void rejectValue(String field, String errorCode, Object[] errorArgs, String defaultMessage); + void rejectValue(@Nullable String field, String errorCode, @Nullable Object[] errorArgs, String defaultMessage); /** * Add all errors from the given {@code Errors} instance to this @@ -220,6 +222,7 @@ public interface Errors { * Get the first global error, if any. * @return the global error, or {@code null} */ + @Nullable ObjectError getGlobalError(); /** @@ -246,6 +249,7 @@ public interface Errors { * Get the first error associated with a field, if any. * @return the field-specific error, or {@code null} */ + @Nullable FieldError getFieldError(); /** @@ -276,6 +280,7 @@ public interface Errors { * @param field the field name * @return the field-specific error, or {@code null} */ + @Nullable FieldError getFieldError(String field); /** @@ -296,6 +301,7 @@ public interface Errors { * @param field the field name * @return the type of the field, or {@code null} if not determinable */ - Class getFieldType(String field); + @Nullable + Class getFieldType(@Nullable String field); } diff --git a/spring-context/src/main/java/org/springframework/validation/MessageCodesResolver.java b/spring-context/src/main/java/org/springframework/validation/MessageCodesResolver.java index d86acd476b4..14dd97c752f 100644 --- a/spring-context/src/main/java/org/springframework/validation/MessageCodesResolver.java +++ b/spring-context/src/main/java/org/springframework/validation/MessageCodesResolver.java @@ -16,6 +16,8 @@ package org.springframework.validation; +import org.springframework.lang.Nullable; + /** * Strategy interface for building message codes from validation error codes. * Used by DataBinder to build the codes list for ObjectErrors and FieldErrors. @@ -50,6 +52,6 @@ public interface MessageCodesResolver { * @param fieldType the field type (may be {@code null} if not determinable) * @return the message codes to use */ - String[] resolveMessageCodes(String errorCode, String objectName, String field, Class fieldType); + String[] resolveMessageCodes(String errorCode, String objectName, String field, @Nullable Class fieldType); } diff --git a/spring-context/src/main/java/org/springframework/validation/SmartValidator.java b/spring-context/src/main/java/org/springframework/validation/SmartValidator.java index 772849e3ec6..16f7c7580ed 100644 --- a/spring-context/src/main/java/org/springframework/validation/SmartValidator.java +++ b/spring-context/src/main/java/org/springframework/validation/SmartValidator.java @@ -16,6 +16,8 @@ package org.springframework.validation; +import org.springframework.lang.Nullable; + /** * Extended variant of the {@link Validator} interface, adding support for * validation 'hints'. @@ -42,6 +44,6 @@ public interface SmartValidator extends Validator { * @param validationHints one or more hint objects to be passed to the validation engine * @see ValidationUtils */ - void validate(Object target, Errors errors, Object... validationHints); + void validate(@Nullable Object target, Errors errors, Object... validationHints); } diff --git a/spring-context/src/main/java/org/springframework/validation/ValidationUtils.java b/spring-context/src/main/java/org/springframework/validation/ValidationUtils.java index 973078c59d2..ebd1084ffa9 100644 --- a/spring-context/src/main/java/org/springframework/validation/ValidationUtils.java +++ b/spring-context/src/main/java/org/springframework/validation/ValidationUtils.java @@ -19,6 +19,7 @@ package org.springframework.validation; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -139,7 +140,7 @@ public abstract class ValidationUtils { * @param errorArgs the error arguments, for argument binding via MessageFormat * (can be {@code null}) */ - public static void rejectIfEmpty(Errors errors, String field, String errorCode, Object[] errorArgs) { + public static void rejectIfEmpty(Errors errors, String field, @Nullable String errorCode, Object[] errorArgs) { rejectIfEmpty(errors, field, errorCode, errorArgs, null); } @@ -159,7 +160,7 @@ public abstract class ValidationUtils { * @param defaultMessage fallback default message */ public static void rejectIfEmpty( - Errors errors, String field, String errorCode, Object[] errorArgs, String defaultMessage) { + Errors errors, String field, String errorCode, @Nullable Object[] errorArgs, String defaultMessage) { Assert.notNull(errors, "Errors object must not be null"); Object value = errors.getFieldValue(field); @@ -218,7 +219,7 @@ public abstract class ValidationUtils { * (can be {@code null}) */ public static void rejectIfEmptyOrWhitespace( - Errors errors, String field, String errorCode, Object[] errorArgs) { + Errors errors, String field, String errorCode, @Nullable Object[] errorArgs) { rejectIfEmptyOrWhitespace(errors, field, errorCode, errorArgs, null); } @@ -239,7 +240,7 @@ public abstract class ValidationUtils { * @param defaultMessage fallback default message */ public static void rejectIfEmptyOrWhitespace( - Errors errors, String field, String errorCode, Object[] errorArgs, String defaultMessage) { + Errors errors, String field, String errorCode, @Nullable Object[] errorArgs, String defaultMessage) { Assert.notNull(errors, "Errors object must not be null"); Object value = errors.getFieldValue(field); diff --git a/spring-context/src/main/java/org/springframework/validation/Validator.java b/spring-context/src/main/java/org/springframework/validation/Validator.java index 0c4d069f030..d5511c602be 100644 --- a/spring-context/src/main/java/org/springframework/validation/Validator.java +++ b/spring-context/src/main/java/org/springframework/validation/Validator.java @@ -16,6 +16,8 @@ package org.springframework.validation; +import org.springframework.lang.Nullable; + /** * A validator for application-specific objects. * @@ -89,6 +91,6 @@ public interface Validator { * @param errors contextual state about the validation process (never {@code null}) * @see ValidationUtils */ - void validate(Object target, Errors errors); + void validate(@Nullable Object target, Errors errors); } diff --git a/spring-context/src/main/java/org/springframework/validation/annotation/package-info.java b/spring-context/src/main/java/org/springframework/validation/annotation/package-info.java index 17f378cb166..8e50d9326e3 100644 --- a/spring-context/src/main/java/org/springframework/validation/annotation/package-info.java +++ b/spring-context/src/main/java/org/springframework/validation/annotation/package-info.java @@ -5,4 +5,7 @@ *

Provides an extended variant of JSR-303's {@code @Valid}, * supporting the specification of validation groups. */ +@NonNullApi package org.springframework.validation.annotation; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/validation/beanvalidation/package-info.java b/spring-context/src/main/java/org/springframework/validation/beanvalidation/package-info.java index a8bea39a03d..2f76fd1ba68 100644 --- a/spring-context/src/main/java/org/springframework/validation/beanvalidation/package-info.java +++ b/spring-context/src/main/java/org/springframework/validation/beanvalidation/package-info.java @@ -8,4 +8,7 @@ * which defines a shared ValidatorFactory/Validator setup for availability * to other Spring components. */ +@NonNullApi package org.springframework.validation.beanvalidation; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/validation/package-info.java b/spring-context/src/main/java/org/springframework/validation/package-info.java index ce6b2dd243a..04d9aea2fe8 100644 --- a/spring-context/src/main/java/org/springframework/validation/package-info.java +++ b/spring-context/src/main/java/org/springframework/validation/package-info.java @@ -2,4 +2,7 @@ * Provides data binding and validation functionality, * for usage in business and/or UI layers. */ +@NonNullApi package org.springframework.validation; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-context/src/main/java/org/springframework/validation/support/package-info.java b/spring-context/src/main/java/org/springframework/validation/support/package-info.java index 9482069695d..595a80b9aa5 100644 --- a/spring-context/src/main/java/org/springframework/validation/support/package-info.java +++ b/spring-context/src/main/java/org/springframework/validation/support/package-info.java @@ -1,4 +1,7 @@ /** * Support classes for handling validation results. */ +@NonNullApi package org.springframework.validation.support; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-core/src/main/java/org/springframework/core/AttributeAccessor.java b/spring-core/src/main/java/org/springframework/core/AttributeAccessor.java index 27130bce2b3..9d407f708f2 100644 --- a/spring-core/src/main/java/org/springframework/core/AttributeAccessor.java +++ b/spring-core/src/main/java/org/springframework/core/AttributeAccessor.java @@ -16,6 +16,8 @@ package org.springframework.core; +import org.springframework.lang.Nullable; + /** * Interface defining a generic contract for attaching and accessing metadata * to/from arbitrary objects. @@ -34,7 +36,7 @@ public interface AttributeAccessor { * @param name the unique attribute key * @param value the attribute value to be attached */ - void setAttribute(String name, Object value); + void setAttribute(String name, @Nullable Object value); /** * Get the value of the attribute identified by {@code name}. @@ -42,6 +44,7 @@ public interface AttributeAccessor { * @param name the unique attribute key * @return the current value of the attribute, if any */ + @Nullable Object getAttribute(String name); /** @@ -50,6 +53,7 @@ public interface AttributeAccessor { * @param name the unique attribute key * @return the last value of the attribute, if any */ + @Nullable Object removeAttribute(String name); /** diff --git a/spring-core/src/main/java/org/springframework/core/BridgeMethodResolver.java b/spring-core/src/main/java/org/springframework/core/BridgeMethodResolver.java index 034f13aa31c..b76fb6373fa 100644 --- a/spring-core/src/main/java/org/springframework/core/BridgeMethodResolver.java +++ b/spring-core/src/main/java/org/springframework/core/BridgeMethodResolver.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; @@ -102,7 +103,8 @@ public abstract class BridgeMethodResolver { * @param bridgeMethod the bridge method * @return the bridged method, or {@code null} if none found */ - private static Method searchCandidates(List candidateMethods, Method bridgeMethod) { + @Nullable + private static Method searchCandidates(@Nullable List candidateMethods, Method bridgeMethod) { if (candidateMethods.isEmpty()) { return null; } @@ -138,6 +140,7 @@ public abstract class BridgeMethodResolver { * matches that of the supplied bridge method. * @throws IllegalStateException if the generic declaration cannot be found */ + @Nullable private static Method findGenericDeclaration(Method bridgeMethod) { // Search parent types for method that has same signature as bridge. Class superclass = bridgeMethod.getDeclaringClass().getSuperclass(); @@ -196,6 +199,7 @@ public abstract class BridgeMethodResolver { * that of the supplied {@link Method}, then this matching {@link Method} is returned, * otherwise {@code null} is returned. */ + @Nullable private static Method searchForMatch(Class type, Method bridgeMethod) { return ReflectionUtils.findMethod(type, bridgeMethod.getName(), bridgeMethod.getParameterTypes()); } diff --git a/spring-core/src/main/java/org/springframework/core/CollectionFactory.java b/spring-core/src/main/java/org/springframework/core/CollectionFactory.java index b21641761b4..bac3121171c 100644 --- a/spring-core/src/main/java/org/springframework/core/CollectionFactory.java +++ b/spring-core/src/main/java/org/springframework/core/CollectionFactory.java @@ -36,6 +36,7 @@ import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @@ -115,7 +116,7 @@ public abstract class CollectionFactory { * @see java.util.LinkedHashSet */ @SuppressWarnings({ "unchecked", "cast", "rawtypes" }) - public static Collection createApproximateCollection(Object collection, int capacity) { + public static Collection createApproximateCollection(@Nullable Object collection, int capacity) { if (collection instanceof LinkedList) { return new LinkedList<>(); } @@ -174,7 +175,7 @@ public abstract class CollectionFactory { * the supplied {@code elementType} is not a subtype of {@link Enum} */ @SuppressWarnings({ "unchecked", "cast" }) - public static Collection createCollection(Class collectionType, Class elementType, int capacity) { + public static Collection createCollection(Class collectionType, @Nullable Class elementType, int capacity) { Assert.notNull(collectionType, "Collection type must not be null"); if (collectionType.isInterface()) { if (Set.class == collectionType || Collection.class == collectionType) { @@ -237,7 +238,7 @@ public abstract class CollectionFactory { * @see java.util.LinkedHashMap */ @SuppressWarnings({"unchecked", "rawtypes"}) - public static Map createApproximateMap(Object map, int capacity) { + public static Map createApproximateMap(@Nullable Object map, int capacity) { if (map instanceof EnumMap) { EnumMap enumMap = new EnumMap((EnumMap) map); enumMap.clear(); @@ -290,7 +291,7 @@ public abstract class CollectionFactory { * the supplied {@code keyType} is not a subtype of {@link Enum} */ @SuppressWarnings({"unchecked", "rawtypes"}) - public static Map createMap(Class mapType, Class keyType, int capacity) { + public static Map createMap(Class mapType, @Nullable Class keyType, int capacity) { Assert.notNull(mapType, "Map type must not be null"); if (mapType.isInterface()) { if (Map.class == mapType) { diff --git a/spring-core/src/main/java/org/springframework/core/ConfigurableObjectInputStream.java b/spring-core/src/main/java/org/springframework/core/ConfigurableObjectInputStream.java index 70a0a87c88d..01b1dd1275c 100644 --- a/spring-core/src/main/java/org/springframework/core/ConfigurableObjectInputStream.java +++ b/spring-core/src/main/java/org/springframework/core/ConfigurableObjectInputStream.java @@ -22,6 +22,7 @@ import java.io.NotSerializableException; import java.io.ObjectInputStream; import java.io.ObjectStreamClass; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -142,6 +143,7 @@ public class ConfigurableObjectInputStream extends ObjectInputStream { *

The default implementation simply returns {@code null}, indicating * that no specific fallback is available. */ + @Nullable protected ClassLoader getFallbackClassLoader() throws IOException { return null; } diff --git a/spring-core/src/main/java/org/springframework/core/Constants.java b/spring-core/src/main/java/org/springframework/core/Constants.java index 5045d09a523..a3a70f2e7ef 100644 --- a/spring-core/src/main/java/org/springframework/core/Constants.java +++ b/spring-core/src/main/java/org/springframework/core/Constants.java @@ -23,6 +23,7 @@ import java.util.Locale; import java.util.Map; import java.util.Set; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ReflectionUtils; @@ -157,7 +158,7 @@ public class Constants { * @param namePrefix prefix of the constant names to search (may be {@code null}) * @return the set of constant names */ - public Set getNames(String namePrefix) { + public Set getNames(@Nullable String namePrefix) { String prefixToUse = (namePrefix != null ? namePrefix.trim().toUpperCase(Locale.ENGLISH) : ""); Set names = new HashSet<>(); for (String code : this.fieldCache.keySet()) { @@ -189,7 +190,7 @@ public class Constants { * @param nameSuffix suffix of the constant names to search (may be {@code null}) * @return the set of constant names */ - public Set getNamesForSuffix(String nameSuffix) { + public Set getNamesForSuffix(@Nullable String nameSuffix) { String suffixToUse = (nameSuffix != null ? nameSuffix.trim().toUpperCase(Locale.ENGLISH) : ""); Set names = new HashSet<>(); for (String code : this.fieldCache.keySet()) { @@ -211,7 +212,7 @@ public class Constants { * @param namePrefix prefix of the constant names to search (may be {@code null}) * @return the set of values */ - public Set getValues(String namePrefix) { + public Set getValues(@Nullable String namePrefix) { String prefixToUse = (namePrefix != null ? namePrefix.trim().toUpperCase(Locale.ENGLISH) : ""); Set values = new HashSet<>(); for (String code : this.fieldCache.keySet()) { @@ -243,7 +244,7 @@ public class Constants { * @param nameSuffix suffix of the constant names to search (may be {@code null}) * @return the set of values */ - public Set getValuesForSuffix(String nameSuffix) { + public Set getValuesForSuffix(@Nullable String nameSuffix) { String suffixToUse = (nameSuffix != null ? nameSuffix.trim().toUpperCase(Locale.ENGLISH) : ""); Set values = new HashSet<>(); for (String code : this.fieldCache.keySet()) { @@ -263,7 +264,7 @@ public class Constants { * @return the name of the constant field * @throws ConstantException if the value wasn't found */ - public String toCode(Object value, String namePrefix) throws ConstantException { + public String toCode(Object value, @Nullable String namePrefix) throws ConstantException { String prefixToUse = (namePrefix != null ? namePrefix.trim().toUpperCase(Locale.ENGLISH) : ""); for (Map.Entry entry : this.fieldCache.entrySet()) { if (entry.getKey().startsWith(prefixToUse) && entry.getValue().equals(value)) { @@ -294,7 +295,7 @@ public class Constants { * @return the name of the constant field * @throws ConstantException if the value wasn't found */ - public String toCodeForSuffix(Object value, String nameSuffix) throws ConstantException { + public String toCodeForSuffix(Object value, @Nullable String nameSuffix) throws ConstantException { String suffixToUse = (nameSuffix != null ? nameSuffix.trim().toUpperCase(Locale.ENGLISH) : ""); for (Map.Entry entry : this.fieldCache.entrySet()) { if (entry.getKey().endsWith(suffixToUse) && entry.getValue().equals(value)) { diff --git a/spring-core/src/main/java/org/springframework/core/Conventions.java b/spring-core/src/main/java/org/springframework/core/Conventions.java index 1fbeeae6867..95bbef49e65 100644 --- a/spring-core/src/main/java/org/springframework/core/Conventions.java +++ b/spring-core/src/main/java/org/springframework/core/Conventions.java @@ -27,6 +27,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Set; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -171,7 +172,7 @@ public abstract class Conventions { * @param value the return value (may be {@code null} if not available) * @return the generated variable name */ - public static String getVariableNameForReturnType(Method method, Object value) { + public static String getVariableNameForReturnType(Method method, @Nullable Object value) { return getVariableNameForReturnType(method, method.getReturnType(), value); } @@ -191,7 +192,7 @@ public abstract class Conventions { * @param value the return value (may be {@code null} if not available) * @return the generated variable name */ - public static String getVariableNameForReturnType(Method method, Class resolvedType, Object value) { + public static String getVariableNameForReturnType(Method method, Class resolvedType, @Nullable Object value) { Assert.notNull(method, "Method must not be null"); if (Object.class == resolvedType) { diff --git a/spring-core/src/main/java/org/springframework/core/GenericTypeResolver.java b/spring-core/src/main/java/org/springframework/core/GenericTypeResolver.java index eb00d48d0f6..ad97bc5940a 100644 --- a/spring-core/src/main/java/org/springframework/core/GenericTypeResolver.java +++ b/spring-core/src/main/java/org/springframework/core/GenericTypeResolver.java @@ -25,6 +25,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ConcurrentReferenceHashMap; @@ -83,6 +84,7 @@ public abstract class GenericTypeResolver { * @return the resolved parameter type of the method return type, or {@code null} * if not resolvable or if the single argument is of type {@link WildcardType}. */ + @Nullable public static Class resolveReturnTypeArgument(Method method, Class genericIfc) { Assert.notNull(method, "method must not be null"); ResolvableType resolvableType = ResolvableType.forMethodReturnType(method).as(genericIfc); @@ -100,6 +102,7 @@ public abstract class GenericTypeResolver { * @param genericIfc the generic interface or superclass to resolve the type argument from * @return the resolved type of the argument, or {@code null} if not resolvable */ + @Nullable public static Class resolveTypeArgument(Class clazz, Class genericIfc) { ResolvableType resolvableType = ResolvableType.forClass(clazz).as(genericIfc); if (!resolvableType.hasGenerics()) { @@ -125,6 +128,7 @@ public abstract class GenericTypeResolver { * @return the resolved type of each argument, with the array size matching the * number of actual type arguments, or {@code null} if not resolvable */ + @Nullable public static Class[] resolveTypeArguments(Class clazz, Class genericIfc) { ResolvableType type = ResolvableType.forClass(clazz).as(genericIfc); if (!type.hasGenerics() || type.isEntirelyUnresolvable()) { @@ -142,6 +146,7 @@ public abstract class GenericTypeResolver { * @return the resolved type (possibly the given generic type as-is) * @since 5.0 */ + @Nullable public static Type resolveType(Type genericType, Class contextClass) { if (contextClass != null) { if (genericType instanceof TypeVariable) { diff --git a/spring-core/src/main/java/org/springframework/core/MethodClassKey.java b/spring-core/src/main/java/org/springframework/core/MethodClassKey.java index b837fc6486a..44356128804 100644 --- a/spring-core/src/main/java/org/springframework/core/MethodClassKey.java +++ b/spring-core/src/main/java/org/springframework/core/MethodClassKey.java @@ -18,6 +18,7 @@ package org.springframework.core; import java.lang.reflect.Method; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -41,7 +42,7 @@ public final class MethodClassKey implements Comparable { * @param targetClass the target class that the method will be invoked * on (may be {@code null} if identical to the declaring class) */ - public MethodClassKey(Method method, Class targetClass) { + public MethodClassKey(Method method, @Nullable Class targetClass) { this.method = method; this.targetClass = targetClass; } diff --git a/spring-core/src/main/java/org/springframework/core/MethodIntrospector.java b/spring-core/src/main/java/org/springframework/core/MethodIntrospector.java index 0f8e3965564..8e3439ca7c0 100644 --- a/spring-core/src/main/java/org/springframework/core/MethodIntrospector.java +++ b/spring-core/src/main/java/org/springframework/core/MethodIntrospector.java @@ -24,6 +24,7 @@ import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; @@ -51,7 +52,7 @@ public abstract class MethodIntrospector { * @return the selected methods associated with their metadata (in the order of retrieval), * or an empty map in case of no match */ - public static Map selectMethods(Class targetType, final MetadataLookup metadataLookup) { + public static Map selectMethods(Class targetType, @Nullable final MetadataLookup metadataLookup) { final Map methodMap = new LinkedHashMap<>(); Set> handlerTypes = new LinkedHashSet<>(); Class specificHandlerType = null; @@ -155,6 +156,7 @@ public abstract class MethodIntrospector { * @return non-null metadata to be associated with a method if there is a match, * or {@code null} for no match */ + @Nullable T inspect(Method method); } diff --git a/spring-core/src/main/java/org/springframework/core/MethodParameter.java b/spring-core/src/main/java/org/springframework/core/MethodParameter.java index 14d18544f1a..0f3481a5027 100644 --- a/spring-core/src/main/java/org/springframework/core/MethodParameter.java +++ b/spring-core/src/main/java/org/springframework/core/MethodParameter.java @@ -36,6 +36,7 @@ import kotlin.reflect.KFunction; import kotlin.reflect.KParameter; import kotlin.reflect.jvm.ReflectJvmMapping; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -171,6 +172,7 @@ public class MethodParameter { *

Note: Either Method or Constructor is available. * @return the Method, or {@code null} if none */ + @Nullable public Method getMethod() { return this.method; } @@ -180,6 +182,7 @@ public class MethodParameter { *

Note: Either Method or Constructor is available. * @return the Constructor, or {@code null} if none */ + @Nullable public Constructor getConstructor() { return this.constructor; } @@ -279,6 +282,7 @@ public class MethodParameter { * if none specified (indicating the default type index) * @see #getNestingLevel() */ + @Nullable public Integer getTypeIndexForCurrentLevel() { return getTypeIndexForLevel(this.nestingLevel); } @@ -289,6 +293,7 @@ public class MethodParameter { * @return the corresponding type index, or {@code null} * if none specified (indicating the default type index) */ + @Nullable public Integer getTypeIndexForLevel(int nestingLevel) { return getTypeIndexesPerLevel().get(nestingLevel); } @@ -482,6 +487,7 @@ public class MethodParameter { * @param annotationType the annotation type to look for * @return the annotation object, or {@code null} if not found */ + @Nullable public A getMethodAnnotation(Class annotationType) { return adaptAnnotation(getAnnotatedElement().getAnnotation(annotationType)); } @@ -528,6 +534,7 @@ public class MethodParameter { * @return the annotation object, or {@code null} if not found */ @SuppressWarnings("unchecked") + @Nullable public A getParameterAnnotation(Class annotationType) { Annotation[] anns = getParameterAnnotations(); for (Annotation ann : anns) { @@ -564,6 +571,7 @@ public class MethodParameter { * {@link #initParameterNameDiscovery ParameterNameDiscoverer} * has been set to begin with) */ + @Nullable public String getParameterName() { ParameterNameDiscoverer discoverer = this.parameterNameDiscoverer; if (discoverer != null) { diff --git a/spring-core/src/main/java/org/springframework/core/NestedCheckedException.java b/spring-core/src/main/java/org/springframework/core/NestedCheckedException.java index 0cb2920dce1..8b786f180af 100644 --- a/spring-core/src/main/java/org/springframework/core/NestedCheckedException.java +++ b/spring-core/src/main/java/org/springframework/core/NestedCheckedException.java @@ -16,6 +16,8 @@ package org.springframework.core; +import org.springframework.lang.Nullable; + /** * Handy class for wrapping checked {@code Exceptions} with a root cause. * @@ -79,6 +81,7 @@ public abstract class NestedCheckedException extends Exception { * Retrieve the innermost cause of this exception, if any. * @return the innermost exception, or {@code null} if none */ + @Nullable public Throwable getRootCause() { return NestedExceptionUtils.getRootCause(this); } diff --git a/spring-core/src/main/java/org/springframework/core/NestedExceptionUtils.java b/spring-core/src/main/java/org/springframework/core/NestedExceptionUtils.java index e7c11aed755..7fd024601b4 100644 --- a/spring-core/src/main/java/org/springframework/core/NestedExceptionUtils.java +++ b/spring-core/src/main/java/org/springframework/core/NestedExceptionUtils.java @@ -16,6 +16,8 @@ package org.springframework.core; +import org.springframework.lang.Nullable; + /** * Helper class for implementing exception classes which are capable of * holding nested exceptions. Necessary because we can't share a base @@ -56,6 +58,7 @@ public abstract class NestedExceptionUtils { * @return the innermost exception, or {@code null} if none * @since 4.3.9 */ + @Nullable public static Throwable getRootCause(Throwable original) { if (original == null) { return null; diff --git a/spring-core/src/main/java/org/springframework/core/NestedRuntimeException.java b/spring-core/src/main/java/org/springframework/core/NestedRuntimeException.java index 6e8843f0f8c..5cb6832c2c0 100644 --- a/spring-core/src/main/java/org/springframework/core/NestedRuntimeException.java +++ b/spring-core/src/main/java/org/springframework/core/NestedRuntimeException.java @@ -16,6 +16,8 @@ package org.springframework.core; +import org.springframework.lang.Nullable; + /** * Handy class for wrapping runtime {@code Exceptions} with a root cause. * @@ -80,6 +82,7 @@ public abstract class NestedRuntimeException extends RuntimeException { * @return the innermost exception, or {@code null} if none * @since 2.0 */ + @Nullable public Throwable getRootCause() { return NestedExceptionUtils.getRootCause(this); } diff --git a/spring-core/src/main/java/org/springframework/core/OrderComparator.java b/spring-core/src/main/java/org/springframework/core/OrderComparator.java index 39e27ac56cb..0f8fa5e54db 100644 --- a/spring-core/src/main/java/org/springframework/core/OrderComparator.java +++ b/spring-core/src/main/java/org/springframework/core/OrderComparator.java @@ -21,6 +21,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -135,6 +136,7 @@ public class OrderComparator implements Comparator { * @param obj the object to check * @return the order value, or {@code null} if none found */ + @Nullable protected Integer findOrder(Object obj) { return (obj instanceof Ordered ? ((Ordered) obj).getOrder() : null); } @@ -150,6 +152,7 @@ public class OrderComparator implements Comparator { * @return the priority value, or {@code null} if none * @since 4.1 */ + @Nullable public Integer getPriority(Object obj) { return null; } @@ -215,6 +218,7 @@ public class OrderComparator implements Comparator { * @param obj the object to find an order source for * @return the order source for that object, or {@code null} if none found */ + @Nullable Object getOrderSource(Object obj); } diff --git a/spring-core/src/main/java/org/springframework/core/OverridingClassLoader.java b/spring-core/src/main/java/org/springframework/core/OverridingClassLoader.java index 5a45cde1f2e..f0b0602ee43 100644 --- a/spring-core/src/main/java/org/springframework/core/OverridingClassLoader.java +++ b/spring-core/src/main/java/org/springframework/core/OverridingClassLoader.java @@ -19,6 +19,7 @@ package org.springframework.core; import java.io.IOException; import java.io.InputStream; +import org.springframework.lang.Nullable; import org.springframework.util.FileCopyUtils; /** @@ -113,6 +114,7 @@ public class OverridingClassLoader extends DecoratingClassLoader { * @return the Class object, or {@code null} if no class defined for that name * @throws ClassNotFoundException if the class for the given name couldn't be loaded */ + @Nullable protected Class loadClassForOverriding(String name) throws ClassNotFoundException { Class result = findLoadedClass(name); if (result == null) { @@ -134,6 +136,7 @@ public class OverridingClassLoader extends DecoratingClassLoader { * or {@code null} if no class defined for that name * @throws ClassNotFoundException if the class for the given name couldn't be loaded */ + @Nullable protected byte[] loadBytesForClass(String name) throws ClassNotFoundException { InputStream is = openStreamForClass(name); if (is == null) { diff --git a/spring-core/src/main/java/org/springframework/core/ParameterNameDiscoverer.java b/spring-core/src/main/java/org/springframework/core/ParameterNameDiscoverer.java index 01356c2967b..8c551f21407 100644 --- a/spring-core/src/main/java/org/springframework/core/ParameterNameDiscoverer.java +++ b/spring-core/src/main/java/org/springframework/core/ParameterNameDiscoverer.java @@ -19,6 +19,8 @@ package org.springframework.core; import java.lang.reflect.Constructor; import java.lang.reflect.Method; +import org.springframework.lang.Nullable; + /** * Interface to discover parameter names for methods and constructors. * @@ -40,6 +42,7 @@ public interface ParameterNameDiscoverer { * @return an array of parameter names if the names can be resolved, * or {@code null} if they cannot */ + @Nullable String[] getParameterNames(Method method); /** @@ -49,6 +52,7 @@ public interface ParameterNameDiscoverer { * @return an array of parameter names if the names can be resolved, * or {@code null} if they cannot */ + @Nullable String[] getParameterNames(Constructor ctor); } diff --git a/spring-core/src/main/java/org/springframework/core/ReactiveAdapterRegistry.java b/spring-core/src/main/java/org/springframework/core/ReactiveAdapterRegistry.java index 3a22bbcb1e7..7954b9dcf23 100644 --- a/spring-core/src/main/java/org/springframework/core/ReactiveAdapterRegistry.java +++ b/spring-core/src/main/java/org/springframework/core/ReactiveAdapterRegistry.java @@ -28,6 +28,7 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import rx.RxReactiveStreams; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -120,7 +121,8 @@ public class ReactiveAdapterRegistry { * @param source an instance of the reactive type * (i.e. to adapt from; may be {@code null} if the reactive type is specified) */ - public ReactiveAdapter getAdapter(Class reactiveType, Object source) { + @Nullable + public ReactiveAdapter getAdapter(@Nullable Class reactiveType, Object source) { Object sourceToUse = (source instanceof Optional ? ((Optional) source).orElse(null) : source); Class clazz = (sourceToUse != null ? sourceToUse.getClass() : reactiveType); diff --git a/spring-core/src/main/java/org/springframework/core/ResolvableType.java b/spring-core/src/main/java/org/springframework/core/ResolvableType.java index fc79e4fbcdb..1347a3ed807 100644 --- a/spring-core/src/main/java/org/springframework/core/ResolvableType.java +++ b/spring-core/src/main/java/org/springframework/core/ResolvableType.java @@ -34,6 +34,7 @@ import java.util.Map; import org.springframework.core.SerializableTypeWrapper.FieldTypeProvider; import org.springframework.core.SerializableTypeWrapper.MethodParameterTypeProvider; import org.springframework.core.SerializableTypeWrapper.TypeProvider; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ConcurrentReferenceHashMap; @@ -196,6 +197,7 @@ public class ResolvableType implements Serializable { * Return the underlying Java {@link Class} being managed, if available; * otherwise {@code null}. */ + @Nullable public Class getRawClass() { if (this.type == this.resolved) { return this.resolved; @@ -587,7 +589,7 @@ public class ResolvableType implements Serializable { * level (may be {@code null}) * @return a {@link ResolvableType} for the nested level or {@link #NONE} */ - public ResolvableType getNested(int nestingLevel, Map typeIndexesPerLevel) { + public ResolvableType getNested(int nestingLevel, @Nullable Map typeIndexesPerLevel) { ResolvableType result = this; for (int i = 2; i <= nestingLevel; i++) { if (result.isArray()) { @@ -716,6 +718,7 @@ public class ResolvableType implements Serializable { * @see #getGeneric(int...) * @see #resolve() */ + @Nullable public Class resolveGeneric(int... indexes) { return getGeneric(indexes).resolve(); } @@ -730,6 +733,7 @@ public class ResolvableType implements Serializable { * @see #resolveGeneric(int...) * @see #resolveGenerics() */ + @Nullable public Class resolve() { return resolve(null); } @@ -745,7 +749,7 @@ public class ResolvableType implements Serializable { * @see #resolveGeneric(int...) * @see #resolveGenerics() */ - public Class resolve(Class fallback) { + public Class resolve(@Nullable Class fallback) { return (this.resolved != null ? this.resolved : fallback); } @@ -791,6 +795,7 @@ public class ResolvableType implements Serializable { return NONE; } + @Nullable private Type resolveBounds(Type[] bounds) { if (ObjectUtils.isEmpty(bounds) || Object.class == bounds[0]) { return null; @@ -798,6 +803,7 @@ public class ResolvableType implements Serializable { return bounds[0]; } + @Nullable private ResolvableType resolveVariable(TypeVariable variable) { if (this.type instanceof TypeVariable) { return resolveType().resolveVariable(variable); @@ -873,6 +879,7 @@ public class ResolvableType implements Serializable { /** * Adapts this {@link ResolvableType} to a {@link VariableResolver}. */ + @Nullable VariableResolver asVariableResolver() { if (this == NONE) { return null; @@ -929,7 +936,7 @@ public class ResolvableType implements Serializable { * @see #forClass(Class, Class) * @see #forClassWithGenerics(Class, Class...) */ - public static ResolvableType forClass(Class clazz) { + public static ResolvableType forClass(@Nullable Class clazz) { return new ResolvableType(clazz); } @@ -945,7 +952,7 @@ public class ResolvableType implements Serializable { * @see #forClass(Class) * @see #getRawClass() */ - public static ResolvableType forRawClass(Class clazz) { + public static ResolvableType forRawClass(@Nullable Class clazz) { return new ResolvableType(clazz) { @Override public ResolvableType[] getGenerics() { @@ -1289,7 +1296,7 @@ public class ResolvableType implements Serializable { * @return a {@link ResolvableType} for the specified {@link Type} * @see #forType(Type, ResolvableType) */ - public static ResolvableType forType(Type type) { + public static ResolvableType forType(@Nullable Type type) { return forType(type, null, null); } @@ -1301,7 +1308,7 @@ public class ResolvableType implements Serializable { * @return a {@link ResolvableType} for the specified {@link Type} and owner * @see #forType(Type) */ - public static ResolvableType forType(Type type, ResolvableType owner) { + public static ResolvableType forType(@Nullable Type type, ResolvableType owner) { VariableResolver variableResolver = null; if (owner != null) { variableResolver = owner.asVariableResolver(); @@ -1316,7 +1323,7 @@ public class ResolvableType implements Serializable { * @param variableResolver the variable resolver or {@code null} * @return a {@link ResolvableType} for the specified {@link Type} and {@link VariableResolver} */ - static ResolvableType forType(Type type, VariableResolver variableResolver) { + static ResolvableType forType(@Nullable Type type, @Nullable VariableResolver variableResolver) { return forType(type, null, variableResolver); } @@ -1328,7 +1335,7 @@ public class ResolvableType implements Serializable { * @param variableResolver the variable resolver or {@code null} * @return a {@link ResolvableType} for the specified {@link Type} and {@link VariableResolver} */ - static ResolvableType forType(Type type, TypeProvider typeProvider, VariableResolver variableResolver) { + static ResolvableType forType(@Nullable Type type, @Nullable TypeProvider typeProvider, @Nullable VariableResolver variableResolver) { if (type == null && typeProvider != null) { type = SerializableTypeWrapper.forTypeProvider(typeProvider); } @@ -1380,6 +1387,7 @@ public class ResolvableType implements Serializable { * @param variable the variable to resolve * @return the resolved variable, or {@code null} if not found */ + @Nullable ResolvableType resolveVariable(TypeVariable variable); } @@ -1535,6 +1543,7 @@ public class ResolvableType implements Serializable { * @param type the source type * @return a {@link WildcardBounds} instance or {@code null} */ + @Nullable public static WildcardBounds get(ResolvableType type) { ResolvableType resolveToWildcard = type; while (!(resolveToWildcard.getType() instanceof WildcardType)) { diff --git a/spring-core/src/main/java/org/springframework/core/ResolvableTypeProvider.java b/spring-core/src/main/java/org/springframework/core/ResolvableTypeProvider.java index 1f361fbc5d7..948e92f4f4f 100644 --- a/spring-core/src/main/java/org/springframework/core/ResolvableTypeProvider.java +++ b/spring-core/src/main/java/org/springframework/core/ResolvableTypeProvider.java @@ -16,6 +16,8 @@ package org.springframework.core; +import org.springframework.lang.Nullable; + /** * Any object can implement this interface to provide its actual {@link ResolvableType}. * @@ -35,6 +37,7 @@ public interface ResolvableTypeProvider { * Return the {@link ResolvableType} describing this instance * (or {@code null} if some sort of default should be applied instead). */ + @Nullable ResolvableType getResolvableType(); } diff --git a/spring-core/src/main/java/org/springframework/core/SerializableTypeWrapper.java b/spring-core/src/main/java/org/springframework/core/SerializableTypeWrapper.java index 8d91564bad1..32e3b492c02 100644 --- a/spring-core/src/main/java/org/springframework/core/SerializableTypeWrapper.java +++ b/spring-core/src/main/java/org/springframework/core/SerializableTypeWrapper.java @@ -30,6 +30,7 @@ import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; import java.lang.reflect.WildcardType; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ConcurrentReferenceHashMap; import org.springframework.util.ReflectionUtils; @@ -179,6 +180,7 @@ abstract class SerializableTypeWrapper { * Return the source of the type, or {@code null} if not known. *

The default implementations returns {@code null}. */ + @Nullable default Object getSource() { return null; } diff --git a/spring-core/src/main/java/org/springframework/core/SpringProperties.java b/spring-core/src/main/java/org/springframework/core/SpringProperties.java index f5c3499428a..dedeed6ee43 100644 --- a/spring-core/src/main/java/org/springframework/core/SpringProperties.java +++ b/spring-core/src/main/java/org/springframework/core/SpringProperties.java @@ -24,6 +24,8 @@ import java.util.Properties; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; + /** * Static holder for local Spring properties, i.e. defined at the Spring library level. * @@ -83,7 +85,7 @@ public abstract class SpringProperties { * @param key the property key * @param value the associated property value, or {@code null} to reset it */ - public static void setProperty(String key, String value) { + public static void setProperty(String key, @Nullable String value) { if (value != null) { localProperties.setProperty(key, value); } @@ -98,6 +100,7 @@ public abstract class SpringProperties { * @param key the property key * @return the associated property value, or {@code null} if none found */ + @Nullable public static String getProperty(String key) { String value = localProperties.getProperty(key); if (value == null) { diff --git a/spring-core/src/main/java/org/springframework/core/SpringVersion.java b/spring-core/src/main/java/org/springframework/core/SpringVersion.java index 38426f1be84..a8c7fcead50 100644 --- a/spring-core/src/main/java/org/springframework/core/SpringVersion.java +++ b/spring-core/src/main/java/org/springframework/core/SpringVersion.java @@ -16,6 +16,8 @@ package org.springframework.core; +import org.springframework.lang.Nullable; + /** * Class that exposes the Spring version. Fetches the * "Implementation-Version" manifest attribute from the jar file. @@ -36,6 +38,7 @@ public class SpringVersion { * or {@code null} if it cannot be determined. * @see Package#getImplementationVersion() */ + @Nullable public static String getVersion() { Package pkg = SpringVersion.class.getPackage(); return (pkg != null ? pkg.getImplementationVersion() : null); diff --git a/spring-core/src/main/java/org/springframework/core/annotation/AbstractAliasAwareAnnotationAttributeExtractor.java b/spring-core/src/main/java/org/springframework/core/annotation/AbstractAliasAwareAnnotationAttributeExtractor.java index 32b8725c2d6..64602fa523e 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/AbstractAliasAwareAnnotationAttributeExtractor.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/AbstractAliasAwareAnnotationAttributeExtractor.java @@ -21,6 +21,7 @@ import java.lang.reflect.Method; import java.util.List; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -55,7 +56,7 @@ abstract class AbstractAliasAwareAnnotationAttributeExtractor implements Anno * @param source the underlying source of annotation attributes; never {@code null} */ AbstractAliasAwareAnnotationAttributeExtractor( - Class annotationType, Object annotatedElement, S source) { + Class annotationType, @Nullable Object annotatedElement, S source) { Assert.notNull(annotationType, "annotationType must not be null"); Assert.notNull(source, "source must not be null"); diff --git a/spring-core/src/main/java/org/springframework/core/annotation/AnnotatedElementUtils.java b/spring-core/src/main/java/org/springframework/core/annotation/AnnotatedElementUtils.java index 9643760d330..18582f5039d 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/AnnotatedElementUtils.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/AnnotatedElementUtils.java @@ -28,6 +28,7 @@ import java.util.Map; import java.util.Set; import org.springframework.core.BridgeMethodResolver; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @@ -149,6 +150,7 @@ public class AnnotatedElementUtils { * @see #getMetaAnnotationTypes(AnnotatedElement, String) * @see #hasMetaAnnotationTypes */ + @Nullable public static Set getMetaAnnotationTypes(AnnotatedElement element, Class annotationType) { Assert.notNull(element, "AnnotatedElement must not be null"); Assert.notNull(annotationType, "'annotationType' must not be null"); @@ -170,6 +172,7 @@ public class AnnotatedElementUtils { * @see #getMetaAnnotationTypes(AnnotatedElement, Class) * @see #hasMetaAnnotationTypes */ + @Nullable public static Set getMetaAnnotationTypes(AnnotatedElement element, String annotationName) { Assert.notNull(element, "AnnotatedElement must not be null"); Assert.hasLength(annotationName, "'annotationName' must not be null or empty"); @@ -312,6 +315,7 @@ public class AnnotatedElementUtils { * @see #getMergedAnnotation(AnnotatedElement, Class) * @see #findMergedAnnotation(AnnotatedElement, Class) */ + @Nullable public static AnnotationAttributes getMergedAnnotationAttributes( AnnotatedElement element, Class annotationType) { @@ -340,6 +344,7 @@ public class AnnotatedElementUtils { * @see #findMergedAnnotation(AnnotatedElement, Class) * @see #getAllAnnotationAttributes(AnnotatedElement, String) */ + @Nullable public static AnnotationAttributes getMergedAnnotationAttributes(AnnotatedElement element, String annotationName) { return getMergedAnnotationAttributes(element, annotationName, false, false); } @@ -370,6 +375,7 @@ public class AnnotatedElementUtils { * @see #findMergedAnnotationAttributes(AnnotatedElement, String, boolean, boolean) * @see #getAllAnnotationAttributes(AnnotatedElement, String, boolean, boolean) */ + @Nullable public static AnnotationAttributes getMergedAnnotationAttributes(AnnotatedElement element, String annotationName, boolean classValuesAsString, boolean nestedAnnotationsAsMap) { @@ -398,6 +404,7 @@ public class AnnotatedElementUtils { * @see #findMergedAnnotation(AnnotatedElement, Class) * @see AnnotationUtils#synthesizeAnnotation(Map, Class, AnnotatedElement) */ + @Nullable public static A getMergedAnnotation(AnnotatedElement element, Class annotationType) { Assert.notNull(annotationType, "'annotationType' must not be null"); @@ -504,7 +511,7 @@ public class AnnotatedElementUtils { * is not a valid container annotation for the supplied {@code annotationType} */ public static Set getMergedRepeatableAnnotations(AnnotatedElement element, - Class annotationType, Class containerType) { + Class annotationType, @Nullable Class containerType) { Assert.notNull(element, "AnnotatedElement must not be null"); Assert.notNull(annotationType, "'annotationType' must not be null"); @@ -535,6 +542,7 @@ public class AnnotatedElementUtils { * attributes from all annotations found, or {@code null} if not found * @see #getAllAnnotationAttributes(AnnotatedElement, String, boolean, boolean) */ + @Nullable public static MultiValueMap getAllAnnotationAttributes(AnnotatedElement element, String annotationName) { return getAllAnnotationAttributes(element, annotationName, false, false); } @@ -557,6 +565,7 @@ public class AnnotatedElementUtils { * @return a {@link MultiValueMap} keyed by attribute name, containing the annotation * attributes from all annotations found, or {@code null} if not found */ + @Nullable public static MultiValueMap getAllAnnotationAttributes(AnnotatedElement element, String annotationName, final boolean classValuesAsString, final boolean nestedAnnotationsAsMap) { @@ -632,6 +641,7 @@ public class AnnotatedElementUtils { * @see #findMergedAnnotation(AnnotatedElement, Class) * @see #getMergedAnnotationAttributes(AnnotatedElement, String, boolean, boolean) */ + @Nullable public static AnnotationAttributes findMergedAnnotationAttributes(AnnotatedElement element, Class annotationType, boolean classValuesAsString, boolean nestedAnnotationsAsMap) { @@ -668,6 +678,7 @@ public class AnnotatedElementUtils { * @see #findMergedAnnotation(AnnotatedElement, Class) * @see #getMergedAnnotationAttributes(AnnotatedElement, String, boolean, boolean) */ + @Nullable public static AnnotationAttributes findMergedAnnotationAttributes(AnnotatedElement element, String annotationName, boolean classValuesAsString, boolean nestedAnnotationsAsMap) { @@ -695,6 +706,7 @@ public class AnnotatedElementUtils { * @see #findMergedAnnotationAttributes(AnnotatedElement, String, boolean, boolean) * @see #getMergedAnnotationAttributes(AnnotatedElement, Class) */ + @Nullable public static A findMergedAnnotation(AnnotatedElement element, Class annotationType) { Assert.notNull(annotationType, "'annotationType' must not be null"); @@ -800,7 +812,7 @@ public class AnnotatedElementUtils { * is not a valid container annotation for the supplied {@code annotationType} */ public static Set findMergedRepeatableAnnotations(AnnotatedElement element, - Class annotationType, Class containerType) { + Class annotationType, @Nullable Class containerType) { Assert.notNull(element, "AnnotatedElement must not be null"); Assert.notNull(annotationType, "'annotationType' must not be null"); @@ -828,6 +840,7 @@ public class AnnotatedElementUtils { * @param processor the processor to delegate to * @return the result of the processor, potentially {@code null} */ + @Nullable private static T searchWithGetSemantics(AnnotatedElement element, Class annotationType, String annotationName, Processor processor) { @@ -848,8 +861,9 @@ public class AnnotatedElementUtils { * @return the result of the processor, potentially {@code null} * @since 4.3 */ + @Nullable private static T searchWithGetSemantics(AnnotatedElement element, Class annotationType, - String annotationName, Class containerType, Processor processor) { + String annotationName, @Nullable Class containerType, Processor processor) { try { return searchWithGetSemantics(element, annotationType, annotationName, containerType, processor, @@ -878,8 +892,9 @@ public class AnnotatedElementUtils { * @param metaDepth the meta-depth of the annotation * @return the result of the processor, potentially {@code null} */ + @Nullable private static T searchWithGetSemantics(AnnotatedElement element, Class annotationType, - String annotationName, Class containerType, Processor processor, + String annotationName, @Nullable Class containerType, Processor processor, Set visited, int metaDepth) { Assert.notNull(element, "AnnotatedElement must not be null"); @@ -940,9 +955,10 @@ public class AnnotatedElementUtils { * @return the result of the processor, potentially {@code null} * @since 4.2 */ - private static T searchWithGetSemanticsInAnnotations(AnnotatedElement element, + @Nullable + private static T searchWithGetSemanticsInAnnotations(@Nullable AnnotatedElement element, List annotations, Class annotationType, String annotationName, - Class containerType, Processor processor, Set visited, + @Nullable Class containerType, Processor processor, Set visited, int metaDepth) { // Search in annotations @@ -1009,6 +1025,7 @@ public class AnnotatedElementUtils { * @return the result of the processor, potentially {@code null} * @since 4.2 */ + @Nullable private static T searchWithFindSemantics(AnnotatedElement element, Class annotationType, String annotationName, Processor processor) { @@ -1029,8 +1046,9 @@ public class AnnotatedElementUtils { * @return the result of the processor, potentially {@code null} * @since 4.3 */ + @Nullable private static T searchWithFindSemantics(AnnotatedElement element, Class annotationType, - String annotationName, Class containerType, Processor processor) { + String annotationName, @Nullable Class containerType, Processor processor) { if (containerType != null && !processor.aggregates()) { throw new IllegalArgumentException( @@ -1065,8 +1083,9 @@ public class AnnotatedElementUtils { * @return the result of the processor, potentially {@code null} * @since 4.2 */ + @Nullable private static T searchWithFindSemantics(AnnotatedElement element, Class annotationType, - String annotationName, Class containerType, Processor processor, + String annotationName, @Nullable Class containerType, Processor processor, Set visited, int metaDepth) { Assert.notNull(element, "AnnotatedElement must not be null"); @@ -1365,7 +1384,8 @@ public class AnnotatedElementUtils { * @return the result of the processing, or {@code null} to continue * searching for additional annotations */ - T process(AnnotatedElement annotatedElement, Annotation annotation, int metaDepth); + @Nullable + T process(@Nullable AnnotatedElement annotatedElement, Annotation annotation, int metaDepth); /** * Post-process the result returned by the {@link #process} method. @@ -1379,7 +1399,7 @@ public class AnnotatedElementUtils { * @param annotation the annotation to post-process * @param result the result to post-process */ - void postProcess(AnnotatedElement annotatedElement, Annotation annotation, T result); + void postProcess(@Nullable AnnotatedElement annotatedElement, Annotation annotation, T result); /** * Determine if this processor always processes annotations regardless of diff --git a/spring-core/src/main/java/org/springframework/core/annotation/AnnotationAttributeExtractor.java b/spring-core/src/main/java/org/springframework/core/annotation/AnnotationAttributeExtractor.java index 7fd8dd4263d..c8f2ae0c358 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/AnnotationAttributeExtractor.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/AnnotationAttributeExtractor.java @@ -19,6 +19,8 @@ package org.springframework.core.annotation; import java.lang.annotation.Annotation; import java.lang.reflect.Method; +import org.springframework.lang.Nullable; + /** * An {@code AnnotationAttributeExtractor} is responsible for * {@linkplain #getAttributeValue extracting} annotation attribute values @@ -43,6 +45,7 @@ interface AnnotationAttributeExtractor { * type supported by this extractor. * @return the annotated element, or {@code null} if unknown */ + @Nullable Object getAnnotatedElement(); /** diff --git a/spring-core/src/main/java/org/springframework/core/annotation/AnnotationAttributes.java b/spring-core/src/main/java/org/springframework/core/annotation/AnnotationAttributes.java index 9a53474eddd..7c98e513418 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/AnnotationAttributes.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/AnnotationAttributes.java @@ -22,6 +22,7 @@ import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -120,7 +121,7 @@ public class AnnotationAttributes extends LinkedHashMap { * or {@code null} to just store the annotation type name * @since 4.3.2 */ - public AnnotationAttributes(String annotationType, ClassLoader classLoader) { + public AnnotationAttributes(String annotationType, @Nullable ClassLoader classLoader) { Assert.notNull(annotationType, "'annotationType' must not be null"); this.annotationType = getAnnotationType(annotationType, classLoader); this.displayName = annotationType; @@ -146,6 +147,7 @@ public class AnnotationAttributes extends LinkedHashMap { * @return the annotation type, or {@code null} if unknown * @since 4.2 */ + @Nullable public Class annotationType() { return this.annotationType; } diff --git a/spring-core/src/main/java/org/springframework/core/annotation/AnnotationUtils.java b/spring-core/src/main/java/org/springframework/core/annotation/AnnotationUtils.java index 6511262b844..fa9d6b0bca2 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/AnnotationUtils.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/AnnotationUtils.java @@ -38,6 +38,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.core.BridgeMethodResolver; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ConcurrentReferenceHashMap; import org.springframework.util.ObjectUtils; @@ -151,6 +152,7 @@ public abstract class AnnotationUtils { * @since 4.0 */ @SuppressWarnings("unchecked") + @Nullable public static A getAnnotation(Annotation ann, Class annotationType) { if (annotationType.isInstance(ann)) { return synthesizeAnnotation((A) ann); @@ -177,6 +179,7 @@ public abstract class AnnotationUtils { * @return the first matching annotation, or {@code null} if not found * @since 3.1 */ + @Nullable public static A getAnnotation(AnnotatedElement annotatedElement, Class annotationType) { try { A annotation = annotatedElement.getAnnotation(annotationType); @@ -210,6 +213,7 @@ public abstract class AnnotationUtils { * @see org.springframework.core.BridgeMethodResolver#findBridgedMethod(Method) * @see #getAnnotation(AnnotatedElement, Class) */ + @Nullable public static A getAnnotation(Method method, Class annotationType) { Method resolvedMethod = BridgeMethodResolver.findBridgedMethod(method); return getAnnotation((AnnotatedElement) resolvedMethod, annotationType); @@ -226,6 +230,7 @@ public abstract class AnnotationUtils { * @since 4.0.8 * @see AnnotatedElement#getAnnotations() */ + @Nullable public static Annotation[] getAnnotations(AnnotatedElement annotatedElement) { try { return synthesizeAnnotationArray(annotatedElement.getAnnotations(), annotatedElement); @@ -248,6 +253,7 @@ public abstract class AnnotationUtils { * @see org.springframework.core.BridgeMethodResolver#findBridgedMethod(Method) * @see AnnotatedElement#getAnnotations() */ + @Nullable public static Annotation[] getAnnotations(Method method) { try { return synthesizeAnnotationArray(BridgeMethodResolver.findBridgedMethod(method).getAnnotations(), method); @@ -285,6 +291,7 @@ public abstract class AnnotationUtils { * @see java.lang.annotation.Repeatable * @see java.lang.reflect.AnnotatedElement#getAnnotationsByType */ + @Nullable public static Set getRepeatableAnnotations(AnnotatedElement annotatedElement, Class annotationType) { @@ -322,7 +329,7 @@ public abstract class AnnotationUtils { * @see java.lang.reflect.AnnotatedElement#getAnnotationsByType */ public static Set getRepeatableAnnotations(AnnotatedElement annotatedElement, - Class annotationType, Class containerAnnotationType) { + Class annotationType, @Nullable Class containerAnnotationType) { Set annotations = getDeclaredRepeatableAnnotations(annotatedElement, annotationType, containerAnnotationType); if (!annotations.isEmpty()) { @@ -404,7 +411,7 @@ public abstract class AnnotationUtils { * @see java.lang.reflect.AnnotatedElement#getDeclaredAnnotationsByType */ public static Set getDeclaredRepeatableAnnotations(AnnotatedElement annotatedElement, - Class annotationType, Class containerAnnotationType) { + Class annotationType, @Nullable Class containerAnnotationType) { return getRepeatableAnnotations(annotatedElement, annotationType, containerAnnotationType, true); } @@ -430,7 +437,7 @@ public abstract class AnnotationUtils { * @see java.lang.annotation.Repeatable */ private static Set getRepeatableAnnotations(AnnotatedElement annotatedElement, - Class annotationType, Class containerAnnotationType, boolean declaredMode) { + Class annotationType, @Nullable Class containerAnnotationType, boolean declaredMode) { Assert.notNull(annotatedElement, "AnnotatedElement must not be null"); Assert.notNull(annotationType, "Annotation type must not be null"); @@ -463,6 +470,7 @@ public abstract class AnnotationUtils { * @return the first matching annotation, or {@code null} if not found * @since 4.2 */ + @Nullable public static A findAnnotation(AnnotatedElement annotatedElement, Class annotationType) { Assert.notNull(annotatedElement, "AnnotatedElement must not be null"); if (annotationType == null) { @@ -485,6 +493,7 @@ public abstract class AnnotationUtils { * @return the first matching annotation, or {@code null} if not found * @since 4.2 */ + @Nullable private static A findAnnotation( AnnotatedElement annotatedElement, Class annotationType, Set visited) { try { @@ -524,6 +533,7 @@ public abstract class AnnotationUtils { * @see #getAnnotation(Method, Class) */ @SuppressWarnings("unchecked") + @Nullable public static A findAnnotation(Method method, Class annotationType) { Assert.notNull(method, "Method must not be null"); if (annotationType == null) { @@ -631,6 +641,7 @@ public abstract class AnnotationUtils { * @param annotationType the type of annotation to look for * @return the first matching annotation, or {@code null} if not found */ + @Nullable public static A findAnnotation(Class clazz, Class annotationType) { return findAnnotation(clazz, annotationType, true); } @@ -646,6 +657,7 @@ public abstract class AnnotationUtils { * @since 4.2.1 */ @SuppressWarnings("unchecked") + @Nullable private static A findAnnotation(Class clazz, Class annotationType, boolean synthesize) { Assert.notNull(clazz, "Class must not be null"); if (annotationType == null) { @@ -673,6 +685,7 @@ public abstract class AnnotationUtils { * @param visited the set of annotations that have already been visited * @return the first matching annotation, or {@code null} if not found */ + @Nullable private static A findAnnotation(Class clazz, Class annotationType, Set visited) { try { A annotation = clazz.getDeclaredAnnotation(annotationType); @@ -730,7 +743,8 @@ public abstract class AnnotationUtils { * @see #findAnnotationDeclaringClassForTypes(List, Class) * @see #isAnnotationDeclaredLocally(Class, Class) */ - public static Class findAnnotationDeclaringClass(Class annotationType, Class clazz) { + @Nullable + public static Class findAnnotationDeclaringClass(Class annotationType, @Nullable Class clazz) { Assert.notNull(annotationType, "Annotation type must not be null"); if (clazz == null || Object.class == clazz) { return null; @@ -765,7 +779,8 @@ public abstract class AnnotationUtils { * @see #findAnnotationDeclaringClass(Class, Class) * @see #isAnnotationDeclaredLocally(Class, Class) */ - public static Class findAnnotationDeclaringClassForTypes(List> annotationTypes, Class clazz) { + @Nullable + public static Class findAnnotationDeclaringClassForTypes(List> annotationTypes, @Nullable Class clazz) { Assert.notEmpty(annotationTypes, "List of annotation types must not be empty"); if (clazz == null || Object.class == clazz) { return null; @@ -966,7 +981,7 @@ public abstract class AnnotationUtils { * @since 4.2 * @see #getAnnotationAttributes(AnnotatedElement, Annotation, boolean, boolean) */ - public static AnnotationAttributes getAnnotationAttributes(AnnotatedElement annotatedElement, Annotation annotation) { + public static AnnotationAttributes getAnnotationAttributes(@Nullable AnnotatedElement annotatedElement, Annotation annotation) { return getAnnotationAttributes(annotatedElement, annotation, false, false); } @@ -988,7 +1003,7 @@ public abstract class AnnotationUtils { * and corresponding attribute values as values (never {@code null}) * @since 4.2 */ - public static AnnotationAttributes getAnnotationAttributes(AnnotatedElement annotatedElement, + public static AnnotationAttributes getAnnotationAttributes(@Nullable AnnotatedElement annotatedElement, Annotation annotation, boolean classValuesAsString, boolean nestedAnnotationsAsMap) { return getAnnotationAttributes( @@ -1032,7 +1047,7 @@ public abstract class AnnotationUtils { * @since 4.2 * @see #postProcessAnnotationAttributes */ - static AnnotationAttributes retrieveAnnotationAttributes(Object annotatedElement, Annotation annotation, + static AnnotationAttributes retrieveAnnotationAttributes(@Nullable Object annotatedElement, Annotation annotation, boolean classValuesAsString, boolean nestedAnnotationsAsMap) { Class annotationType = annotation.annotationType(); @@ -1076,7 +1091,7 @@ public abstract class AnnotationUtils { * {@code Annotation} instances * @return the adapted value, or the original value if no adaptation is needed */ - static Object adaptValue(Object annotatedElement, Object value, boolean classValuesAsString, + static Object adaptValue(@Nullable Object annotatedElement, Object value, boolean classValuesAsString, boolean nestedAnnotationsAsMap) { if (classValuesAsString) { @@ -1173,7 +1188,7 @@ public abstract class AnnotationUtils { * @see #postProcessAnnotationAttributes(Object, AnnotationAttributes, boolean, boolean) * @see #getDefaultValue(Class, String) */ - public static void postProcessAnnotationAttributes(Object annotatedElement, + public static void postProcessAnnotationAttributes(@Nullable Object annotatedElement, AnnotationAttributes attributes, boolean classValuesAsString) { postProcessAnnotationAttributes(annotatedElement, attributes, classValuesAsString, false); @@ -1199,7 +1214,7 @@ public abstract class AnnotationUtils { * @see #retrieveAnnotationAttributes(Object, Annotation, boolean, boolean) * @see #getDefaultValue(Class, String) */ - static void postProcessAnnotationAttributes(Object annotatedElement, + static void postProcessAnnotationAttributes(@Nullable Object annotatedElement, AnnotationAttributes attributes, boolean classValuesAsString, boolean nestedAnnotationsAsMap) { // Abort? @@ -1287,6 +1302,7 @@ public abstract class AnnotationUtils { * in which case such an exception will be rethrown * @see #getValue(Annotation, String) */ + @Nullable public static Object getValue(Annotation annotation) { return getValue(annotation, VALUE); } @@ -1301,6 +1317,7 @@ public abstract class AnnotationUtils { * @see #getValue(Annotation) * @see #rethrowAnnotationConfigurationException(Throwable) */ + @Nullable public static Object getValue(Annotation annotation, String attributeName) { if (annotation == null || !StringUtils.hasText(attributeName)) { return null; @@ -1328,6 +1345,7 @@ public abstract class AnnotationUtils { * @return the default value, or {@code null} if not found * @see #getDefaultValue(Annotation, String) */ + @Nullable public static Object getDefaultValue(Annotation annotation) { return getDefaultValue(annotation, VALUE); } @@ -1339,6 +1357,7 @@ public abstract class AnnotationUtils { * @return the default value of the named attribute, or {@code null} if not found * @see #getDefaultValue(Class, String) */ + @Nullable public static Object getDefaultValue(Annotation annotation, String attributeName) { if (annotation == null) { return null; @@ -1353,6 +1372,7 @@ public abstract class AnnotationUtils { * @return the default value, or {@code null} if not found * @see #getDefaultValue(Class, String) */ + @Nullable public static Object getDefaultValue(Class annotationType) { return getDefaultValue(annotationType, VALUE); } @@ -1365,6 +1385,7 @@ public abstract class AnnotationUtils { * @return the default value of the named attribute, or {@code null} if not found * @see #getDefaultValue(Annotation, String) */ + @Nullable public static Object getDefaultValue(Class annotationType, String attributeName) { if (annotationType == null || !StringUtils.hasText(attributeName)) { return null; @@ -1392,7 +1413,8 @@ public abstract class AnnotationUtils { * @since 4.2 * @see #synthesizeAnnotation(Annotation, AnnotatedElement) */ - static A synthesizeAnnotation(A annotation) { + @Nullable + static A synthesizeAnnotation(@Nullable A annotation) { return synthesizeAnnotation(annotation, null); } @@ -1413,7 +1435,8 @@ public abstract class AnnotationUtils { * @see #synthesizeAnnotation(Map, Class, AnnotatedElement) * @see #synthesizeAnnotation(Class) */ - public static A synthesizeAnnotation(A annotation, AnnotatedElement annotatedElement) { + @Nullable + public static A synthesizeAnnotation(A annotation, @Nullable AnnotatedElement annotatedElement) { return synthesizeAnnotation(annotation, (Object) annotatedElement); } @@ -1472,8 +1495,9 @@ public abstract class AnnotationUtils { * @see #getAnnotationAttributes(AnnotatedElement, Annotation, boolean, boolean) */ @SuppressWarnings("unchecked") + @Nullable public static A synthesizeAnnotation(Map attributes, - Class annotationType, AnnotatedElement annotatedElement) { + Class annotationType, @Nullable AnnotatedElement annotatedElement) { Assert.notNull(annotationType, "'annotationType' must not be null"); if (attributes == null) { @@ -1503,6 +1527,7 @@ public abstract class AnnotationUtils { * @see #synthesizeAnnotation(Map, Class, AnnotatedElement) * @see #synthesizeAnnotation(Annotation, AnnotatedElement) */ + @Nullable public static A synthesizeAnnotation(Class annotationType) { return synthesizeAnnotation(Collections. emptyMap(), annotationType, null); } @@ -1523,7 +1548,8 @@ public abstract class AnnotationUtils { * @see #synthesizeAnnotation(Annotation, AnnotatedElement) * @see #synthesizeAnnotation(Map, Class, AnnotatedElement) */ - static Annotation[] synthesizeAnnotationArray(Annotation[] annotations, Object annotatedElement) { + @Nullable + static Annotation[] synthesizeAnnotationArray(@Nullable Annotation[] annotations, @Nullable Object annotatedElement) { if (annotations == null) { return null; } @@ -1554,7 +1580,8 @@ public abstract class AnnotationUtils { * @see #synthesizeAnnotationArray(Annotation[], Object) */ @SuppressWarnings("unchecked") - static A[] synthesizeAnnotationArray(Map[] maps, Class annotationType) { + @Nullable + static A[] synthesizeAnnotationArray(@Nullable Map[] maps, Class annotationType) { Assert.notNull(annotationType, "'annotationType' must not be null"); if (maps == null) { return null; @@ -1705,7 +1732,8 @@ public abstract class AnnotationUtils { * {@code @AliasFor} is detected * @since 4.2 */ - static String getAttributeOverrideName(Method attribute, Class metaAnnotationType) { + @Nullable + static String getAttributeOverrideName(Method attribute, @Nullable Class metaAnnotationType) { Assert.notNull(attribute, "attribute must not be null"); Assert.notNull(metaAnnotationType, "metaAnnotationType must not be null"); Assert.isTrue(Annotation.class != metaAnnotationType, @@ -1753,6 +1781,7 @@ public abstract class AnnotationUtils { * @return the annotation if found; {@code null} otherwise * @since 4.2 */ + @Nullable static Annotation getAnnotation(AnnotatedElement element, String annotationName) { for (Annotation annotation : element.getAnnotations()) { if (annotation.annotationType().getName().equals(annotationName)) { @@ -1790,6 +1819,7 @@ public abstract class AnnotationUtils { * {@code null}. * @since 4.2 */ + @Nullable static Class resolveContainerAnnotationType(Class annotationType) { Repeatable repeatable = getAnnotation(annotationType, Repeatable.class); return (repeatable != null ? repeatable.value() : null); @@ -1994,6 +2024,7 @@ public abstract class AnnotationUtils { * is not annotated with {@code @AliasFor} * @see #validateAgainst */ + @Nullable public static AliasDescriptor from(Method attribute) { AliasDescriptor descriptor = aliasDescriptorCache.get(attribute); if (descriptor != null) { @@ -2180,6 +2211,7 @@ public abstract class AnnotationUtils { return otherDescriptors; } + @Nullable public String getAttributeOverrideName(Class metaAnnotationType) { Assert.notNull(metaAnnotationType, "metaAnnotationType must not be null"); Assert.isTrue(Annotation.class != metaAnnotationType, @@ -2196,6 +2228,7 @@ public abstract class AnnotationUtils { return null; } + @Nullable private AliasDescriptor getAttributeOverrideDescriptor() { if (this.isAliasPair) { return null; @@ -2219,6 +2252,7 @@ public abstract class AnnotationUtils { * @throws AnnotationConfigurationException if invalid configuration of * {@code @AliasFor} is detected */ + @Nullable private String getAliasedAttributeName(AliasFor aliasFor, Method attribute) { String attributeName = aliasFor.attribute(); String value = aliasFor.value(); diff --git a/spring-core/src/main/java/org/springframework/core/annotation/DefaultAnnotationAttributeExtractor.java b/spring-core/src/main/java/org/springframework/core/annotation/DefaultAnnotationAttributeExtractor.java index 0ea2cf0013b..35046ad4fc2 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/DefaultAnnotationAttributeExtractor.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/DefaultAnnotationAttributeExtractor.java @@ -19,6 +19,7 @@ package org.springframework.core.annotation; import java.lang.annotation.Annotation; import java.lang.reflect.Method; +import org.springframework.lang.Nullable; import org.springframework.util.ReflectionUtils; /** @@ -41,7 +42,7 @@ class DefaultAnnotationAttributeExtractor extends AbstractAliasAwareAnnotationAt * @param annotatedElement the element that is annotated with the supplied * annotation; may be {@code null} if unknown */ - DefaultAnnotationAttributeExtractor(Annotation annotation, Object annotatedElement) { + DefaultAnnotationAttributeExtractor(Annotation annotation, @Nullable Object annotatedElement) { super(annotation.annotationType(), annotatedElement, annotation); } diff --git a/spring-core/src/main/java/org/springframework/core/annotation/MapAnnotationAttributeExtractor.java b/spring-core/src/main/java/org/springframework/core/annotation/MapAnnotationAttributeExtractor.java index 24bdb15dc1d..e88c5020831 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/MapAnnotationAttributeExtractor.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/MapAnnotationAttributeExtractor.java @@ -24,6 +24,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -52,7 +53,7 @@ class MapAnnotationAttributeExtractor extends AbstractAliasAwareAnnotationAttrib * of the supplied type; may be {@code null} if unknown */ MapAnnotationAttributeExtractor(Map attributes, Class annotationType, - AnnotatedElement annotatedElement) { + @Nullable AnnotatedElement annotatedElement) { super(annotationType, annotatedElement, enrichAndValidateAttributes(attributes, annotationType)); } diff --git a/spring-core/src/main/java/org/springframework/core/annotation/OrderUtils.java b/spring-core/src/main/java/org/springframework/core/annotation/OrderUtils.java index 5b2cf361fed..0109c39a434 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/OrderUtils.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/OrderUtils.java @@ -18,6 +18,7 @@ package org.springframework.core.annotation; import java.lang.annotation.Annotation; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -53,6 +54,7 @@ public abstract class OrderUtils { * @return the order value, or {@code null} if none can be found * @see #getPriority(Class) */ + @Nullable public static Integer getOrder(Class type) { return getOrder(type, null); } @@ -83,6 +85,7 @@ public abstract class OrderUtils { * @param type the type to handle * @return the priority value if the annotation is declared, or {@code null} if none */ + @Nullable public static Integer getPriority(Class type) { if (priorityAnnotationType != null) { Annotation priority = AnnotationUtils.findAnnotation(type, priorityAnnotationType); diff --git a/spring-core/src/main/java/org/springframework/core/annotation/package-info.java b/spring-core/src/main/java/org/springframework/core/annotation/package-info.java index 6aceac2c80c..3715a52176b 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/package-info.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/package-info.java @@ -2,4 +2,7 @@ * Core support package for annotations, meta-annotations, and composed * annotations with attribute overrides. */ +@NonNullApi package org.springframework.core.annotation; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/spring-core/src/main/java/org/springframework/core/codec/CodecException.java b/spring-core/src/main/java/org/springframework/core/codec/CodecException.java index 64ee9022384..07ef2a66f31 100644 --- a/spring-core/src/main/java/org/springframework/core/codec/CodecException.java +++ b/spring-core/src/main/java/org/springframework/core/codec/CodecException.java @@ -17,6 +17,7 @@ package org.springframework.core.codec; import org.springframework.core.NestedRuntimeException; +import org.springframework.lang.Nullable; /** * General error that indicates a problem while encoding and decoding to and @@ -42,7 +43,7 @@ public class CodecException extends NestedRuntimeException { * @param msg the detail message * @param cause root cause for the exception, if any */ - public CodecException(String msg, Throwable cause) { + public CodecException(String msg, @Nullable Throwable cause) { super(msg, cause); } diff --git a/spring-core/src/main/java/org/springframework/core/codec/Decoder.java b/spring-core/src/main/java/org/springframework/core/codec/Decoder.java index 21fce51ac4a..4f8583ef64b 100644 --- a/spring-core/src/main/java/org/springframework/core/codec/Decoder.java +++ b/spring-core/src/main/java/org/springframework/core/codec/Decoder.java @@ -25,6 +25,7 @@ import reactor.core.publisher.Mono; import org.springframework.core.ResolvableType; import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.lang.Nullable; import org.springframework.util.MimeType; /** @@ -45,7 +46,7 @@ public interface Decoder { * @param mimeType the mime type associated with the stream to decode, can be {@code null} if not specified. * @return {@code true} if supported, {@code false} otherwise */ - boolean canDecode(ResolvableType elementType, MimeType mimeType); + boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType); /** * Decode a {@link DataBuffer} input stream into a Flux of {@code T}. @@ -58,7 +59,7 @@ public interface Decoder { * @return the output stream with decoded elements */ Flux decode(Publisher inputStream, ResolvableType elementType, - MimeType mimeType, Map hints); + @Nullable MimeType mimeType, Map hints); /** * Decode a {@link DataBuffer} input stream into a Mono of {@code T}. @@ -71,7 +72,7 @@ public interface Decoder { * @return the output stream with the decoded element */ Mono decodeToMono(Publisher inputStream, ResolvableType elementType, - MimeType mimeType, Map hints); + @Nullable MimeType mimeType, Map hints); /** * Return the list of MIME types this decoder supports. diff --git a/spring-core/src/main/java/org/springframework/core/codec/DecodingException.java b/spring-core/src/main/java/org/springframework/core/codec/DecodingException.java index 3cf4b62f3e5..b49462d6792 100644 --- a/spring-core/src/main/java/org/springframework/core/codec/DecodingException.java +++ b/spring-core/src/main/java/org/springframework/core/codec/DecodingException.java @@ -15,6 +15,8 @@ */ package org.springframework.core.codec; +import org.springframework.lang.Nullable; + /** * Indicates an issue with decoding the input stream with a focus on content * related issues such as a parse failure. As opposed to more general I/O @@ -45,7 +47,7 @@ public class DecodingException extends CodecException { * @param msg the detail message * @param cause root cause for the exception, if any */ - public DecodingException(String msg, Throwable cause) { + public DecodingException(String msg, @Nullable Throwable cause) { super(msg, cause); } diff --git a/spring-core/src/main/java/org/springframework/core/codec/Encoder.java b/spring-core/src/main/java/org/springframework/core/codec/Encoder.java index 96c6352deb0..65773e4a4e3 100644 --- a/spring-core/src/main/java/org/springframework/core/codec/Encoder.java +++ b/spring-core/src/main/java/org/springframework/core/codec/Encoder.java @@ -26,6 +26,7 @@ import reactor.core.publisher.Mono; import org.springframework.core.ResolvableType; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferFactory; +import org.springframework.lang.Nullable; import org.springframework.util.MimeType; /** @@ -46,7 +47,7 @@ public interface Encoder { * @param mimeType the MIME type for the output stream, can be {@code null} if not specified. * @return {@code true} if supported, {@code false} otherwise */ - boolean canEncode(ResolvableType elementType, MimeType mimeType); + boolean canEncode(ResolvableType elementType, @Nullable MimeType mimeType); /** * Encode a stream of Objects of type {@code T} into a {@link DataBuffer} @@ -63,7 +64,7 @@ public interface Encoder { * @return the output stream */ Flux encode(Publisher inputStream, DataBufferFactory bufferFactory, - ResolvableType elementType, MimeType mimeType, Map hints); + ResolvableType elementType, @Nullable MimeType mimeType, Map hints); /** * Return the list of mime types this encoder supports. diff --git a/spring-core/src/main/java/org/springframework/core/codec/EncodingException.java b/spring-core/src/main/java/org/springframework/core/codec/EncodingException.java index f987adb1c38..9dbdb26c44a 100644 --- a/spring-core/src/main/java/org/springframework/core/codec/EncodingException.java +++ b/spring-core/src/main/java/org/springframework/core/codec/EncodingException.java @@ -15,6 +15,8 @@ */ package org.springframework.core.codec; +import org.springframework.lang.Nullable; + /** * Indicates an issue with encoding the input Object stream with a focus on * not being able to encode Objects. As opposed to a more general I/O errors @@ -41,7 +43,7 @@ public class EncodingException extends CodecException { * @param msg the detail message * @param cause root cause for the exception, if any */ - public EncodingException(String msg, Throwable cause) { + public EncodingException(String msg, @Nullable Throwable cause) { super(msg, cause); } diff --git a/spring-core/src/main/java/org/springframework/core/codec/package-info.java b/spring-core/src/main/java/org/springframework/core/codec/package-info.java index c18d25b5abd..5a35824df1a 100644 --- a/spring-core/src/main/java/org/springframework/core/codec/package-info.java +++ b/spring-core/src/main/java/org/springframework/core/codec/package-info.java @@ -3,4 +3,7 @@ * {@link org.springframework.core.codec.Decoder} abstractions to convert * between a reactive stream of bytes and Java objects. */ +@NonNullApi package org.springframework.core.codec; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/core/convert/ConversionService.java b/spring-core/src/main/java/org/springframework/core/convert/ConversionService.java index 382e5ad3536..59c8eb65d60 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/ConversionService.java +++ b/spring-core/src/main/java/org/springframework/core/convert/ConversionService.java @@ -16,6 +16,8 @@ package org.springframework.core.convert; +import org.springframework.lang.Nullable; + /** * A service interface for type conversion. This is the entry point into the convert system. * Call {@link #convert(Object, Class)} to perform a thread-safe type conversion using this system. @@ -40,7 +42,7 @@ public interface ConversionService { * @return {@code true} if a conversion can be performed, {@code false} if not * @throws IllegalArgumentException if {@code targetType} is {@code null} */ - boolean canConvert(Class sourceType, Class targetType); + boolean canConvert(@Nullable Class sourceType, Class targetType); /** * Return {@code true} if objects of {@code sourceType} can be converted to the {@code targetType}. @@ -60,7 +62,7 @@ public interface ConversionService { * {@code false} if not * @throws IllegalArgumentException if {@code targetType} is {@code null} */ - boolean canConvert(TypeDescriptor sourceType, TypeDescriptor targetType); + boolean canConvert(@Nullable TypeDescriptor sourceType, TypeDescriptor targetType); /** * Convert the given {@code source} to the specified {@code targetType}. @@ -70,7 +72,7 @@ public interface ConversionService { * @throws ConversionException if a conversion exception occurred * @throws IllegalArgumentException if targetType is {@code null} */ - T convert(Object source, Class targetType); + T convert(@Nullable Object source, Class targetType); /** * Convert the given {@code source} to the specified {@code targetType}. @@ -85,6 +87,6 @@ public interface ConversionService { * @throws IllegalArgumentException if targetType is {@code null}, * or {@code sourceType} is {@code null} but source is not {@code null} */ - Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType); + Object convert(@Nullable Object source, @Nullable TypeDescriptor sourceType, TypeDescriptor targetType); } diff --git a/spring-core/src/main/java/org/springframework/core/convert/Property.java b/spring-core/src/main/java/org/springframework/core/convert/Property.java index 86f8816cbbc..ab92578c28a 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/Property.java +++ b/spring-core/src/main/java/org/springframework/core/convert/Property.java @@ -25,6 +25,7 @@ import java.util.Map; import org.springframework.core.GenericTypeResolver; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.util.ConcurrentReferenceHashMap; import org.springframework.util.ObjectUtils; import org.springframework.util.ReflectionUtils; @@ -171,6 +172,7 @@ public final class Property { return write; } + @Nullable private MethodParameter resolveReadMethodParameter() { if (getReadMethod() == null) { return null; @@ -178,6 +180,7 @@ public final class Property { return resolveParameterType(new MethodParameter(getReadMethod(), -1)); } + @Nullable private MethodParameter resolveWriteMethodParameter() { if (getWriteMethod() == null) { return null; @@ -214,6 +217,7 @@ public final class Property { } } + @Nullable private Field getField() { String name = getName(); if (!StringUtils.hasLength(name)) { diff --git a/spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java b/spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java index 6b1a9f0e6c3..79bba139727 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java +++ b/spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java @@ -30,6 +30,7 @@ import java.util.stream.Stream; import org.springframework.core.MethodParameter; import org.springframework.core.ResolvableType; import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; @@ -117,7 +118,7 @@ public class TypeDescriptor implements Serializable { * @param annotations the type annotations * @since 4.0 */ - protected TypeDescriptor(ResolvableType resolvableType, Class type, Annotation[] annotations) { + protected TypeDescriptor(ResolvableType resolvableType, @Nullable Class type, Annotation[] annotations) { this.resolvableType = resolvableType; this.type = (type != null ? type : resolvableType.resolve(Object.class)); this.annotatedElement = new AnnotatedElementAdapter(annotations); @@ -181,7 +182,7 @@ public class TypeDescriptor implements Serializable { * @return this TypeDescriptor narrowed (returns a copy with its type updated to the * class of the provided value) */ - public TypeDescriptor narrow(Object value) { + public TypeDescriptor narrow(@Nullable Object value) { if (value == null) { return this; } @@ -197,7 +198,8 @@ public class TypeDescriptor implements Serializable { * @throws IllegalArgumentException if this type is not assignable to the super-type * @since 3.2 */ - public TypeDescriptor upcast(Class superType) { + @Nullable + public TypeDescriptor upcast(@Nullable Class superType) { if (superType == null) { return null; } @@ -250,6 +252,7 @@ public class TypeDescriptor implements Serializable { * @return the annotation, or {@code null} if no such annotation exists on this type descriptor */ @SuppressWarnings("unchecked") + @Nullable public T getAnnotation(Class annotationType) { if (this.annotatedElement.isEmpty()) { // Shortcut: AnnotatedElementUtils would have to expect AnnotatedElement.getAnnotations() @@ -323,6 +326,7 @@ public class TypeDescriptor implements Serializable { * Collection but its element type is not parameterized * @throws IllegalStateException if this type is not a {@code java.util.Collection} or array type */ + @Nullable public TypeDescriptor getElementTypeDescriptor() { if (getResolvableType().isArray()) { return new TypeDescriptor(getResolvableType().getComponentType(), null, getAnnotations()); @@ -370,6 +374,7 @@ public class TypeDescriptor implements Serializable { * but its key type is not parameterized * @throws IllegalStateException if this type is not a {@code java.util.Map} */ + @Nullable public TypeDescriptor getMapKeyTypeDescriptor() { Assert.state(isMap(), "Not a [java.util.Map]"); return getRelatedIfResolvable(this, getResolvableType().asMap().getGeneric(0)); @@ -405,6 +410,7 @@ public class TypeDescriptor implements Serializable { * but its value type is not parameterized * @throws IllegalStateException if this type is not a {@code java.util.Map} */ + @Nullable public TypeDescriptor getMapValueTypeDescriptor() { Assert.state(isMap(), "Not a [java.util.Map]"); return getRelatedIfResolvable(this, getResolvableType().asMap().getGeneric(1)); @@ -431,6 +437,7 @@ public class TypeDescriptor implements Serializable { return narrow(mapValue, getMapValueTypeDescriptor()); } + @Nullable private TypeDescriptor narrow(Object value, TypeDescriptor typeDescriptor) { if (typeDescriptor != null) { return typeDescriptor.narrow(value); @@ -517,7 +524,8 @@ public class TypeDescriptor implements Serializable { * @param source the source object * @return the type descriptor */ - public static TypeDescriptor forObject(Object source) { + @Nullable + public static TypeDescriptor forObject(@Nullable Object source) { return (source != null ? valueOf(source.getClass()) : null); } @@ -531,7 +539,7 @@ public class TypeDescriptor implements Serializable { * @param type the class (may be {@code null} to indicate {@code Object.class}) * @return the corresponding type descriptor */ - public static TypeDescriptor valueOf(Class type) { + public static TypeDescriptor valueOf(@Nullable Class type) { if (type == null) { type = Object.class; } @@ -594,7 +602,8 @@ public class TypeDescriptor implements Serializable { * @return an array {@link TypeDescriptor} or {@code null} if {@code elementTypeDescriptor} is {@code null} * @since 3.2.1 */ - public static TypeDescriptor array(TypeDescriptor elementTypeDescriptor) { + @Nullable + public static TypeDescriptor array(@Nullable TypeDescriptor elementTypeDescriptor) { if (elementTypeDescriptor == null) { return null; } @@ -624,6 +633,7 @@ public class TypeDescriptor implements Serializable { * {@link MethodParameter} argument is not 1, or if the types up to the * specified nesting level are not of collection, array, or map types */ + @Nullable public static TypeDescriptor nested(MethodParameter methodParameter, int nestingLevel) { if (methodParameter.getNestingLevel() != 1) { throw new IllegalArgumentException("MethodParameter nesting level must be 1: " + @@ -652,6 +662,7 @@ public class TypeDescriptor implements Serializable { * @throws IllegalArgumentException if the types up to the specified nesting * level are not of collection, array, or map types */ + @Nullable public static TypeDescriptor nested(Field field, int nestingLevel) { return nested(new TypeDescriptor(field), nestingLevel); } @@ -677,10 +688,12 @@ public class TypeDescriptor implements Serializable { * @throws IllegalArgumentException if the types up to the specified nesting * level are not of collection, array, or map types */ + @Nullable public static TypeDescriptor nested(Property property, int nestingLevel) { return nested(new TypeDescriptor(property), nestingLevel); } + @Nullable private static TypeDescriptor nested(TypeDescriptor typeDescriptor, int nestingLevel) { ResolvableType nested = typeDescriptor.resolvableType; for (int i = 0; i < nestingLevel; i++) { @@ -698,6 +711,7 @@ public class TypeDescriptor implements Serializable { return getRelatedIfResolvable(typeDescriptor, nested); } + @Nullable private static TypeDescriptor getRelatedIfResolvable(TypeDescriptor source, ResolvableType type) { if (type.resolve() == null) { return null; diff --git a/spring-core/src/main/java/org/springframework/core/convert/converter/Converter.java b/spring-core/src/main/java/org/springframework/core/convert/converter/Converter.java index 0d3c5dc14fa..8b931a6988d 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/converter/Converter.java +++ b/spring-core/src/main/java/org/springframework/core/convert/converter/Converter.java @@ -16,6 +16,8 @@ package org.springframework.core.convert.converter; +import org.springframework.lang.Nullable; + /** * A converter converts a source object of type {@code S} to a target of type {@code T}. * @@ -37,6 +39,7 @@ public interface Converter { * @return the converted object, which must be an instance of {@code T} (potentially {@code null}) * @throws IllegalArgumentException if the source cannot be converted to the desired target type */ + @Nullable T convert(S source); } diff --git a/spring-core/src/main/java/org/springframework/core/convert/converter/GenericConverter.java b/spring-core/src/main/java/org/springframework/core/convert/converter/GenericConverter.java index 09d3b108373..e5fc5c420c5 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/converter/GenericConverter.java +++ b/spring-core/src/main/java/org/springframework/core/convert/converter/GenericConverter.java @@ -19,6 +19,7 @@ package org.springframework.core.convert.converter; import java.util.Set; import org.springframework.core.convert.TypeDescriptor; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -52,6 +53,7 @@ public interface GenericConverter { *

For {@link ConditionalConverter conditional converters} this method may return * {@code null} to indicate all source-to-target pairs should be considered. */ + @Nullable Set getConvertibleTypes(); /** @@ -61,7 +63,8 @@ public interface GenericConverter { * @param targetType the type descriptor of the field we are converting to * @return the converted object */ - Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType); + @Nullable + Object convert(@Nullable Object source, TypeDescriptor sourceType, TypeDescriptor targetType); /** diff --git a/spring-core/src/main/java/org/springframework/core/convert/converter/package-info.java b/spring-core/src/main/java/org/springframework/core/convert/converter/package-info.java index 06374841581..d1f79c261b4 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/converter/package-info.java +++ b/spring-core/src/main/java/org/springframework/core/convert/converter/package-info.java @@ -1,4 +1,7 @@ /** * SPI to implement Converters for the type conversion system. */ +@NonNullApi package org.springframework.core.convert.converter; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/core/convert/package-info.java b/spring-core/src/main/java/org/springframework/core/convert/package-info.java index ea94c626148..b63fe0e89f0 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/package-info.java +++ b/spring-core/src/main/java/org/springframework/core/convert/package-info.java @@ -1,4 +1,7 @@ /** * Type conversion system API. */ +@NonNullApi package org.springframework.core.convert; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java b/spring-core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java index 584600659bc..d657bea97a1 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java +++ b/spring-core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java @@ -42,6 +42,7 @@ import org.springframework.core.convert.converter.ConverterFactory; import org.springframework.core.convert.converter.ConverterRegistry; import org.springframework.core.convert.converter.GenericConverter; import org.springframework.core.convert.converter.GenericConverter.ConvertiblePair; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ConcurrentReferenceHashMap; @@ -157,7 +158,7 @@ public class GenericConversionService implements ConfigurableConversionService { * @throws IllegalArgumentException if targetType is {@code null} * @since 3.2 */ - public boolean canBypassConvert(TypeDescriptor sourceType, TypeDescriptor targetType) { + public boolean canBypassConvert(@Nullable TypeDescriptor sourceType, TypeDescriptor targetType) { Assert.notNull(targetType, "Target type to convert to cannot be null"); if (sourceType == null) { return true; @@ -205,7 +206,8 @@ public class GenericConversionService implements ConfigurableConversionService { * @throws IllegalArgumentException if targetType is {@code null}, * or sourceType is {@code null} but source is not {@code null} */ - public Object convert(Object source, TypeDescriptor targetType) { + @Nullable + public Object convert(@Nullable Object source, TypeDescriptor targetType) { return convert(source, TypeDescriptor.forObject(source), targetType); } @@ -227,6 +229,7 @@ public class GenericConversionService implements ConfigurableConversionService { * @param targetType the target type to convert to * @return the converted null object */ + @Nullable protected Object convertNullSource(TypeDescriptor sourceType, TypeDescriptor targetType) { if (targetType.getObjectType() == Optional.class) { return Optional.empty(); @@ -245,6 +248,7 @@ public class GenericConversionService implements ConfigurableConversionService { * or {@code null} if no suitable converter was found * @see #getDefaultConverter(TypeDescriptor, TypeDescriptor) */ + @Nullable protected GenericConverter getConverter(TypeDescriptor sourceType, TypeDescriptor targetType) { ConverterCacheKey key = new ConverterCacheKey(sourceType, targetType); GenericConverter converter = this.converterCache.get(key); @@ -274,6 +278,7 @@ public class GenericConversionService implements ConfigurableConversionService { * @param targetType the target type to convert to * @return the default generic converter that will perform the conversion */ + @Nullable protected GenericConverter getDefaultConverter(TypeDescriptor sourceType, TypeDescriptor targetType) { return (sourceType.isAssignableTo(targetType) ? NO_OP_CONVERTER : null); } @@ -281,6 +286,7 @@ public class GenericConversionService implements ConfigurableConversionService { // Internal helpers + @Nullable private ResolvableType[] getRequiredTypeInfo(Class converterClass, Class genericIfc) { ResolvableType resolvableType = ResolvableType.forClass(converterClass).as(genericIfc); ResolvableType[] generics = resolvableType.getGenerics(); @@ -299,6 +305,7 @@ public class GenericConversionService implements ConfigurableConversionService { this.converterCache.clear(); } + @Nullable private Object handleConverterNotFound(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { if (source == null) { assertNotPrimitiveTargetType(sourceType, targetType); @@ -526,6 +533,7 @@ public class GenericConversionService implements ConfigurableConversionService { * @param targetType the target type * @return a matching {@link GenericConverter}, or {@code null} if none found */ + @Nullable public GenericConverter find(TypeDescriptor sourceType, TypeDescriptor targetType) { // Search the full type hierarchy List> sourceCandidates = getClassHierarchy(sourceType.getType()); @@ -542,6 +550,7 @@ public class GenericConversionService implements ConfigurableConversionService { return null; } + @Nullable private GenericConverter getRegisteredConverter(TypeDescriptor sourceType, TypeDescriptor targetType, ConvertiblePair convertiblePair) { @@ -647,6 +656,7 @@ public class GenericConversionService implements ConfigurableConversionService { this.converters.addFirst(converter); } + @Nullable public GenericConverter getConverter(TypeDescriptor sourceType, TypeDescriptor targetType) { for (GenericConverter converter : this.converters) { if (!(converter instanceof ConditionalGenericConverter) || diff --git a/spring-core/src/main/java/org/springframework/core/convert/support/IdToEntityConverter.java b/spring-core/src/main/java/org/springframework/core/convert/support/IdToEntityConverter.java index cd130bc319d..0f37a383790 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/support/IdToEntityConverter.java +++ b/spring-core/src/main/java/org/springframework/core/convert/support/IdToEntityConverter.java @@ -24,6 +24,7 @@ import java.util.Set; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.converter.ConditionalGenericConverter; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; @@ -71,7 +72,7 @@ final class IdToEntityConverter implements ConditionalGenericConverter { return ReflectionUtils.invokeMethod(finder, source, id); } - + @Nullable private Method getFinder(Class entityClass) { String finderMethod = "find" + getEntityName(entityClass); Method[] methods; diff --git a/spring-core/src/main/java/org/springframework/core/convert/support/package-info.java b/spring-core/src/main/java/org/springframework/core/convert/support/package-info.java index 2a23abd9f00..954c82f0686 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/support/package-info.java +++ b/spring-core/src/main/java/org/springframework/core/convert/support/package-info.java @@ -1,4 +1,7 @@ /** * Default implementation of the type conversion system. */ +@NonNullApi package org.springframework.core.convert.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/core/env/AbstractPropertyResolver.java b/spring-core/src/main/java/org/springframework/core/env/AbstractPropertyResolver.java index 32991f85c5a..4521011e18e 100644 --- a/spring-core/src/main/java/org/springframework/core/env/AbstractPropertyResolver.java +++ b/spring-core/src/main/java/org/springframework/core/env/AbstractPropertyResolver.java @@ -25,6 +25,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.support.ConfigurableConversionService; import org.springframework.core.convert.support.DefaultConversionService; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.PropertyPlaceholderHelper; @@ -267,6 +268,7 @@ public abstract class AbstractPropertyResolver implements ConfigurablePropertyRe * @param key the property name to resolve * @return the property value or {@code null} if none found */ + @Nullable protected abstract String getPropertyAsRawString(String key); } diff --git a/spring-core/src/main/java/org/springframework/core/env/CommandLineArgs.java b/spring-core/src/main/java/org/springframework/core/env/CommandLineArgs.java index 951f1cefb8d..11ee00a3da6 100644 --- a/spring-core/src/main/java/org/springframework/core/env/CommandLineArgs.java +++ b/spring-core/src/main/java/org/springframework/core/env/CommandLineArgs.java @@ -23,6 +23,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.springframework.lang.Nullable; + /** * A simple representation of command line arguments, broken into "option arguments" and * "non-option arguments". @@ -42,7 +44,7 @@ class CommandLineArgs { * The given value may be {@code null}, indicating that the option was specified * without an associated value (e.g. "--foo" vs. "--foo=bar"). */ - public void addOptionArg(String optionName, String optionValue) { + public void addOptionArg(String optionName, @Nullable String optionValue) { if (!this.optionArgs.containsKey(optionName)) { this.optionArgs.put(optionName, new ArrayList<>()); } @@ -70,6 +72,7 @@ class CommandLineArgs { * that the option was not present; empty list signifies that no values were associated * with this option. */ + @Nullable public List getOptionValues(String optionName) { return this.optionArgs.get(optionName); } diff --git a/spring-core/src/main/java/org/springframework/core/env/CommandLinePropertySource.java b/spring-core/src/main/java/org/springframework/core/env/CommandLinePropertySource.java index 1a47e0ebb5b..f4905331dad 100644 --- a/spring-core/src/main/java/org/springframework/core/env/CommandLinePropertySource.java +++ b/spring-core/src/main/java/org/springframework/core/env/CommandLinePropertySource.java @@ -19,6 +19,7 @@ package org.springframework.core.env; import java.util.Collection; import java.util.List; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -305,6 +306,7 @@ public abstract class CommandLinePropertySource extends EnumerablePropertySou *

  • if the option is not present, return {@code null}
  • * */ + @Nullable protected abstract List getOptionValues(String name); /** diff --git a/spring-core/src/main/java/org/springframework/core/env/ConfigurablePropertyResolver.java b/spring-core/src/main/java/org/springframework/core/env/ConfigurablePropertyResolver.java index bc626d64310..b8e4ec6208e 100644 --- a/spring-core/src/main/java/org/springframework/core/env/ConfigurablePropertyResolver.java +++ b/spring-core/src/main/java/org/springframework/core/env/ConfigurablePropertyResolver.java @@ -17,6 +17,7 @@ package org.springframework.core.env; import org.springframework.core.convert.support.ConfigurableConversionService; +import org.springframework.lang.Nullable; /** * Configuration interface to be implemented by most if not all {@link PropertyResolver} @@ -71,7 +72,7 @@ public interface ConfigurablePropertyResolver extends PropertyResolver { * resolver and their associated default value, or {@code null} if no such * special character should be processed as a value separator. */ - void setValueSeparator(String valueSeparator); + void setValueSeparator(@Nullable String valueSeparator); /** * Set whether to throw an exception when encountering an unresolvable placeholder diff --git a/spring-core/src/main/java/org/springframework/core/env/EnvironmentCapable.java b/spring-core/src/main/java/org/springframework/core/env/EnvironmentCapable.java index b1000487210..2880a6701d0 100644 --- a/spring-core/src/main/java/org/springframework/core/env/EnvironmentCapable.java +++ b/spring-core/src/main/java/org/springframework/core/env/EnvironmentCapable.java @@ -16,6 +16,8 @@ package org.springframework.core.env; +import org.springframework.lang.Nullable; + /** * Interface indicating a component that contains and exposes an {@link Environment} reference. * @@ -44,6 +46,7 @@ public interface EnvironmentCapable { * Return the {@link Environment} associated with this component * (may be {@code null} or a default environment). */ + @Nullable Environment getEnvironment(); } diff --git a/spring-core/src/main/java/org/springframework/core/env/MutablePropertySources.java b/spring-core/src/main/java/org/springframework/core/env/MutablePropertySources.java index 10976daf718..0317c739c32 100644 --- a/spring-core/src/main/java/org/springframework/core/env/MutablePropertySources.java +++ b/spring-core/src/main/java/org/springframework/core/env/MutablePropertySources.java @@ -23,6 +23,7 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -154,6 +155,7 @@ public class MutablePropertySources implements PropertySources { * Remove and return the property source with the given name, {@code null} if not found. * @param name the name of the property source to find and remove */ + @Nullable public PropertySource remove(String name) { if (logger.isDebugEnabled()) { logger.debug(String.format("Removing [%s] PropertySource", name)); diff --git a/spring-core/src/main/java/org/springframework/core/env/PropertyResolver.java b/spring-core/src/main/java/org/springframework/core/env/PropertyResolver.java index af8278c207f..8526ba90b34 100644 --- a/spring-core/src/main/java/org/springframework/core/env/PropertyResolver.java +++ b/spring-core/src/main/java/org/springframework/core/env/PropertyResolver.java @@ -16,6 +16,8 @@ package org.springframework.core.env; +import org.springframework.lang.Nullable; + /** * Interface for resolving properties against any underlying source. * @@ -41,6 +43,7 @@ public interface PropertyResolver { * @see #getProperty(String, Class) * @see #getRequiredProperty(String) */ + @Nullable String getProperty(String key); /** @@ -60,6 +63,7 @@ public interface PropertyResolver { * @param targetType the expected type of the property value * @see #getRequiredProperty(String, Class) */ + @Nullable T getProperty(String key, Class targetType); /** diff --git a/spring-core/src/main/java/org/springframework/core/env/PropertySource.java b/spring-core/src/main/java/org/springframework/core/env/PropertySource.java index 4d4f4ee86c6..c394fb9d898 100644 --- a/spring-core/src/main/java/org/springframework/core/env/PropertySource.java +++ b/spring-core/src/main/java/org/springframework/core/env/PropertySource.java @@ -19,6 +19,7 @@ package org.springframework.core.env; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -117,6 +118,7 @@ public abstract class PropertySource { * @param name the property to find * @see PropertyResolver#getRequiredProperty(String) */ + @Nullable public abstract Object getProperty(String name); diff --git a/spring-core/src/main/java/org/springframework/core/env/PropertySources.java b/spring-core/src/main/java/org/springframework/core/env/PropertySources.java index 90f99594a6f..b4b0d7432e8 100644 --- a/spring-core/src/main/java/org/springframework/core/env/PropertySources.java +++ b/spring-core/src/main/java/org/springframework/core/env/PropertySources.java @@ -16,6 +16,8 @@ package org.springframework.core.env; +import org.springframework.lang.Nullable; + /** * Holder containing one or more {@link PropertySource} objects. * @@ -34,6 +36,7 @@ public interface PropertySources extends Iterable> { * Return the property source with the given name, {@code null} if not found. * @param name the {@linkplain PropertySource#getName() name of the property source} to find */ + @Nullable PropertySource get(String name); } diff --git a/spring-core/src/main/java/org/springframework/core/env/PropertySourcesPropertyResolver.java b/spring-core/src/main/java/org/springframework/core/env/PropertySourcesPropertyResolver.java index c5f9073126a..424b2be4981 100644 --- a/spring-core/src/main/java/org/springframework/core/env/PropertySourcesPropertyResolver.java +++ b/spring-core/src/main/java/org/springframework/core/env/PropertySourcesPropertyResolver.java @@ -16,6 +16,8 @@ package org.springframework.core.env; +import org.springframework.lang.Nullable; + /** * {@link PropertyResolver} implementation that resolves property values against * an underlying set of {@link PropertySources}. @@ -68,6 +70,7 @@ public class PropertySourcesPropertyResolver extends AbstractPropertyResolver { return getProperty(key, String.class, false); } + @Nullable protected T getProperty(String key, Class targetValueType, boolean resolveNestedPlaceholders) { if (this.propertySources != null) { for (PropertySource propertySource : this.propertySources) { diff --git a/spring-core/src/main/java/org/springframework/core/env/SystemEnvironmentPropertySource.java b/spring-core/src/main/java/org/springframework/core/env/SystemEnvironmentPropertySource.java index d72a822e122..b6237dabcc6 100644 --- a/spring-core/src/main/java/org/springframework/core/env/SystemEnvironmentPropertySource.java +++ b/spring-core/src/main/java/org/springframework/core/env/SystemEnvironmentPropertySource.java @@ -18,6 +18,7 @@ package org.springframework.core.env; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -117,6 +118,7 @@ public class SystemEnvironmentPropertySource extends MapPropertySource { return name; } + @Nullable private String checkPropertyName(String name) { // Check name as-is if (containsKey(name)) { diff --git a/spring-core/src/main/java/org/springframework/core/env/package-info.java b/spring-core/src/main/java/org/springframework/core/env/package-info.java index b454a6c65c4..5939ffabbab 100644 --- a/spring-core/src/main/java/org/springframework/core/env/package-info.java +++ b/spring-core/src/main/java/org/springframework/core/env/package-info.java @@ -2,4 +2,7 @@ * Spring's environment abstraction consisting of bean definition * profile and hierarchical property source support. */ +@NonNullApi package org.springframework.core.env; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/core/io/ClassPathResource.java b/spring-core/src/main/java/org/springframework/core/io/ClassPathResource.java index 10a379700e6..0496c84bd7e 100644 --- a/spring-core/src/main/java/org/springframework/core/io/ClassPathResource.java +++ b/spring-core/src/main/java/org/springframework/core/io/ClassPathResource.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.io.InputStream; import java.net.URL; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; @@ -72,7 +73,7 @@ public class ClassPathResource extends AbstractFileResolvingResource { * or {@code null} for the thread context class loader * @see ClassLoader#getResourceAsStream(String) */ - public ClassPathResource(String path, ClassLoader classLoader) { + public ClassPathResource(String path, @Nullable ClassLoader classLoader) { Assert.notNull(path, "Path must not be null"); String pathToUse = StringUtils.cleanPath(path); if (pathToUse.startsWith("/")) { @@ -90,7 +91,7 @@ public class ClassPathResource extends AbstractFileResolvingResource { * @param clazz the class to load resources with * @see java.lang.Class#getResourceAsStream */ - public ClassPathResource(String path, Class clazz) { + public ClassPathResource(String path, @Nullable Class clazz) { Assert.notNull(path, "Path must not be null"); this.path = StringUtils.cleanPath(path); this.clazz = clazz; @@ -103,7 +104,7 @@ public class ClassPathResource extends AbstractFileResolvingResource { * @param classLoader the class loader to load the resource with, if any * @param clazz the class to load resources with, if any */ - protected ClassPathResource(String path, ClassLoader classLoader, Class clazz) { + protected ClassPathResource(String path, @Nullable ClassLoader classLoader, @Nullable Class clazz) { this.path = StringUtils.cleanPath(path); this.classLoader = classLoader; this.clazz = clazz; @@ -139,6 +140,7 @@ public class ClassPathResource extends AbstractFileResolvingResource { * Resolves a URL for the underlying class path resource. * @return the resolved URL, or {@code null} if not resolvable */ + @Nullable protected URL resolveURL() { if (this.clazz != null) { return this.clazz.getResource(this.path); diff --git a/spring-core/src/main/java/org/springframework/core/io/DefaultResourceLoader.java b/spring-core/src/main/java/org/springframework/core/io/DefaultResourceLoader.java index 390ed21bdcc..857dd379719 100644 --- a/spring-core/src/main/java/org/springframework/core/io/DefaultResourceLoader.java +++ b/spring-core/src/main/java/org/springframework/core/io/DefaultResourceLoader.java @@ -24,6 +24,7 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; @@ -67,7 +68,7 @@ public class DefaultResourceLoader implements ResourceLoader { * @param classLoader the ClassLoader to load class path resources with, or {@code null} * for using the thread context class loader at the time of actual resource access */ - public DefaultResourceLoader(ClassLoader classLoader) { + public DefaultResourceLoader(@Nullable ClassLoader classLoader) { this.classLoader = classLoader; } @@ -78,7 +79,7 @@ public class DefaultResourceLoader implements ResourceLoader { *

    The default is that ClassLoader access will happen using the thread context * class loader at the time of this ResourceLoader's initialization. */ - public void setClassLoader(ClassLoader classLoader) { + public void setClassLoader(@Nullable ClassLoader classLoader) { this.classLoader = classLoader; } diff --git a/spring-core/src/main/java/org/springframework/core/io/ProtocolResolver.java b/spring-core/src/main/java/org/springframework/core/io/ProtocolResolver.java index 6d808c37c36..1dc20d6ef67 100644 --- a/spring-core/src/main/java/org/springframework/core/io/ProtocolResolver.java +++ b/spring-core/src/main/java/org/springframework/core/io/ProtocolResolver.java @@ -16,6 +16,8 @@ package org.springframework.core.io; +import org.springframework.lang.Nullable; + /** * A resolution strategy for protocol-specific resource handles. * @@ -38,6 +40,7 @@ public interface ProtocolResolver { * @return a corresponding {@code Resource} handle if the given location * matches this resolver's protocol, or {@code null} otherwise */ + @Nullable Resource resolve(String location, ResourceLoader resourceLoader); } diff --git a/spring-core/src/main/java/org/springframework/core/io/Resource.java b/spring-core/src/main/java/org/springframework/core/io/Resource.java index c26c27754c8..40e7f0c13c5 100644 --- a/spring-core/src/main/java/org/springframework/core/io/Resource.java +++ b/spring-core/src/main/java/org/springframework/core/io/Resource.java @@ -24,6 +24,8 @@ import java.net.URL; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; +import org.springframework.lang.Nullable; + /** * Interface for a resource descriptor that abstracts from the actual * type of underlying resource, such as a file or class path resource. @@ -159,6 +161,7 @@ public interface Resource extends InputStreamSource { *

    Returns {@code null} if this type of resource does not * have a filename. */ + @Nullable String getFilename(); /** diff --git a/spring-core/src/main/java/org/springframework/core/io/ResourceEditor.java b/spring-core/src/main/java/org/springframework/core/io/ResourceEditor.java index d963b976f94..5e5bf190a0d 100644 --- a/spring-core/src/main/java/org/springframework/core/io/ResourceEditor.java +++ b/spring-core/src/main/java/org/springframework/core/io/ResourceEditor.java @@ -21,6 +21,7 @@ import java.io.IOException; import org.springframework.core.env.PropertyResolver; import org.springframework.core.env.StandardEnvironment; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -120,6 +121,7 @@ public class ResourceEditor extends PropertyEditorSupport { @Override + @Nullable public String getAsText() { Resource value = (Resource) getValue(); try { diff --git a/spring-core/src/main/java/org/springframework/core/io/ResourceLoader.java b/spring-core/src/main/java/org/springframework/core/io/ResourceLoader.java index 1ca7e584c97..01254a48257 100644 --- a/spring-core/src/main/java/org/springframework/core/io/ResourceLoader.java +++ b/spring-core/src/main/java/org/springframework/core/io/ResourceLoader.java @@ -16,6 +16,7 @@ package org.springframework.core.io; +import org.springframework.lang.Nullable; import org.springframework.util.ResourceUtils; /** @@ -74,6 +75,7 @@ public interface ResourceLoader { * ClassLoader isn't accessible) * @see org.springframework.util.ClassUtils#getDefaultClassLoader() */ + @Nullable ClassLoader getClassLoader(); } diff --git a/spring-core/src/main/java/org/springframework/core/io/buffer/package-info.java b/spring-core/src/main/java/org/springframework/core/io/buffer/package-info.java index 92b55d84ae2..c49eadf6f47 100644 --- a/spring-core/src/main/java/org/springframework/core/io/buffer/package-info.java +++ b/spring-core/src/main/java/org/springframework/core/io/buffer/package-info.java @@ -1,4 +1,7 @@ /** * Generic abstraction for working with byte buffer implementations. */ +@NonNullApi package org.springframework.core.io.buffer; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/core/io/package-info.java b/spring-core/src/main/java/org/springframework/core/io/package-info.java index 2d3136a7719..02a8633e5a6 100644 --- a/spring-core/src/main/java/org/springframework/core/io/package-info.java +++ b/spring-core/src/main/java/org/springframework/core/io/package-info.java @@ -1,4 +1,7 @@ /** * Generic abstraction for (file-based) resources, used throughout the framework. */ +@NonNullApi package org.springframework.core.io; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/core/io/support/EncodedResource.java b/spring-core/src/main/java/org/springframework/core/io/support/EncodedResource.java index 7f1c730517e..0ba324b4ca7 100644 --- a/spring-core/src/main/java/org/springframework/core/io/support/EncodedResource.java +++ b/spring-core/src/main/java/org/springframework/core/io/support/EncodedResource.java @@ -24,6 +24,7 @@ import java.nio.charset.Charset; import org.springframework.core.io.InputStreamSource; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -99,6 +100,7 @@ public class EncodedResource implements InputStreamSource { * Return the encoding to use for reading from the {@linkplain #getResource() resource}, * or {@code null} if none specified. */ + @Nullable public final String getEncoding() { return this.encoding; } @@ -107,6 +109,7 @@ public class EncodedResource implements InputStreamSource { * Return the {@code Charset} to use for reading from the {@linkplain #getResource() resource}, * or {@code null} if none specified. */ + @Nullable public final Charset getCharset() { return this.charset; } diff --git a/spring-core/src/main/java/org/springframework/core/io/support/LocalizedResourceHelper.java b/spring-core/src/main/java/org/springframework/core/io/support/LocalizedResourceHelper.java index 57f2645a986..994c81d0a2b 100644 --- a/spring-core/src/main/java/org/springframework/core/io/support/LocalizedResourceHelper.java +++ b/spring-core/src/main/java/org/springframework/core/io/support/LocalizedResourceHelper.java @@ -21,6 +21,7 @@ import java.util.Locale; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -86,7 +87,7 @@ public class LocalizedResourceHelper { * @return the most specific localized resource found * @see java.util.ResourceBundle */ - public Resource findLocalizedResource(String name, String extension, Locale locale) { + public Resource findLocalizedResource(String name, String extension, @Nullable Locale locale) { Assert.notNull(name, "Name must not be null"); Assert.notNull(extension, "Extension must not be null"); diff --git a/spring-core/src/main/java/org/springframework/core/io/support/PathMatchingResourcePatternResolver.java b/spring-core/src/main/java/org/springframework/core/io/support/PathMatchingResourcePatternResolver.java index 4e5da8b6777..5ee20408d68 100644 --- a/spring-core/src/main/java/org/springframework/core/io/support/PathMatchingResourcePatternResolver.java +++ b/spring-core/src/main/java/org/springframework/core/io/support/PathMatchingResourcePatternResolver.java @@ -44,6 +44,7 @@ import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.UrlResource; import org.springframework.core.io.VfsResource; +import org.springframework.lang.Nullable; import org.springframework.util.AntPathMatcher; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -229,7 +230,7 @@ public class PathMatchingResourcePatternResolver implements ResourcePatternResol * at the time of actual resource access * @see org.springframework.core.io.DefaultResourceLoader */ - public PathMatchingResourcePatternResolver(ClassLoader classLoader) { + public PathMatchingResourcePatternResolver(@Nullable ClassLoader classLoader) { this.resourceLoader = new DefaultResourceLoader(classLoader); } @@ -817,6 +818,7 @@ public class PathMatchingResourcePatternResolver implements ResourcePatternResol } @Override + @Nullable public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName = method.getName(); if (Object.class == method.getDeclaringClass()) { diff --git a/spring-core/src/main/java/org/springframework/core/io/support/PropertiesLoaderUtils.java b/spring-core/src/main/java/org/springframework/core/io/support/PropertiesLoaderUtils.java index a9fa5d6db58..86ffd881afe 100644 --- a/spring-core/src/main/java/org/springframework/core/io/support/PropertiesLoaderUtils.java +++ b/spring-core/src/main/java/org/springframework/core/io/support/PropertiesLoaderUtils.java @@ -25,6 +25,7 @@ import java.util.Enumeration; import java.util.Properties; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.DefaultPropertiesPersister; @@ -168,7 +169,7 @@ public abstract class PropertiesLoaderUtils { * @return the populated Properties instance * @throws IOException if loading failed */ - public static Properties loadAllProperties(String resourceName, ClassLoader classLoader) throws IOException { + public static Properties loadAllProperties(String resourceName, @Nullable ClassLoader classLoader) throws IOException { Assert.notNull(resourceName, "Resource name must not be null"); ClassLoader classLoaderToUse = classLoader; if (classLoaderToUse == null) { diff --git a/spring-core/src/main/java/org/springframework/core/io/support/ResourcePatternUtils.java b/spring-core/src/main/java/org/springframework/core/io/support/ResourcePatternUtils.java index e9721a95172..e9665b133e6 100644 --- a/spring-core/src/main/java/org/springframework/core/io/support/ResourcePatternUtils.java +++ b/spring-core/src/main/java/org/springframework/core/io/support/ResourcePatternUtils.java @@ -17,6 +17,7 @@ package org.springframework.core.io.support; import org.springframework.core.io.ResourceLoader; +import org.springframework.lang.Nullable; import org.springframework.util.ResourceUtils; /** @@ -57,7 +58,7 @@ public abstract class ResourcePatternUtils { * @return the ResourcePatternResolver * @see PathMatchingResourcePatternResolver */ - public static ResourcePatternResolver getResourcePatternResolver(ResourceLoader resourceLoader) { + public static ResourcePatternResolver getResourcePatternResolver(@Nullable ResourceLoader resourceLoader) { if (resourceLoader instanceof ResourcePatternResolver) { return (ResourcePatternResolver) resourceLoader; } diff --git a/spring-core/src/main/java/org/springframework/core/io/support/SpringFactoriesLoader.java b/spring-core/src/main/java/org/springframework/core/io/support/SpringFactoriesLoader.java index a3b80bfb325..c5e69cdc62d 100644 --- a/spring-core/src/main/java/org/springframework/core/io/support/SpringFactoriesLoader.java +++ b/spring-core/src/main/java/org/springframework/core/io/support/SpringFactoriesLoader.java @@ -31,6 +31,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.io.UrlResource; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ConcurrentReferenceHashMap; @@ -85,7 +86,7 @@ public abstract class SpringFactoriesLoader { * @throws IllegalArgumentException if any factory implementation class cannot * be loaded or if an error occurs while instantiating any factory */ - public static List loadFactories(Class factoryClass, ClassLoader classLoader) { + public static List loadFactories(Class factoryClass, @Nullable ClassLoader classLoader) { Assert.notNull(factoryClass, "'factoryClass' must not be null"); ClassLoader classLoaderToUse = classLoader; if (classLoaderToUse == null) { @@ -113,7 +114,7 @@ public abstract class SpringFactoriesLoader { * @see #loadFactories * @throws IllegalArgumentException if an error occurs while loading factory names */ - public static List loadFactoryNames(Class factoryClass, ClassLoader classLoader) { + public static List loadFactoryNames(Class factoryClass, @Nullable ClassLoader classLoader) { String factoryClassName = factoryClass.getName(); return loadSpringFactories(classLoader).getOrDefault(factoryClassName, Collections.emptyList()); } diff --git a/spring-core/src/main/java/org/springframework/core/io/support/package-info.java b/spring-core/src/main/java/org/springframework/core/io/support/package-info.java index ab1ad3be573..de525d5ed67 100644 --- a/spring-core/src/main/java/org/springframework/core/io/support/package-info.java +++ b/spring-core/src/main/java/org/springframework/core/io/support/package-info.java @@ -2,4 +2,7 @@ * Support classes for Spring's resource abstraction. * Includes a ResourcePatternResolver mechanism. */ +@NonNullApi package org.springframework.core.io.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/core/package-info.java b/spring-core/src/main/java/org/springframework/core/package-info.java index 01cf7600acb..f1d5c2c70b5 100644 --- a/spring-core/src/main/java/org/springframework/core/package-info.java +++ b/spring-core/src/main/java/org/springframework/core/package-info.java @@ -2,4 +2,7 @@ * Provides basic classes for exception handling and version detection, * and other core helpers that are not specific to any part of the framework. */ +@NonNullApi package org.springframework.core; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/core/serializer/package-info.java b/spring-core/src/main/java/org/springframework/core/serializer/package-info.java index cbfc8d45c86..e577036602e 100644 --- a/spring-core/src/main/java/org/springframework/core/serializer/package-info.java +++ b/spring-core/src/main/java/org/springframework/core/serializer/package-info.java @@ -3,4 +3,7 @@ * Provides an abstraction over various serialization techniques. * Includes exceptions for serialization and deserialization failures. */ +@NonNullApi package org.springframework.core.serializer; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/core/serializer/support/package-info.java b/spring-core/src/main/java/org/springframework/core/serializer/support/package-info.java index 8d1a4be73a2..bdc50c04c33 100644 --- a/spring-core/src/main/java/org/springframework/core/serializer/support/package-info.java +++ b/spring-core/src/main/java/org/springframework/core/serializer/support/package-info.java @@ -2,4 +2,7 @@ * Support classes for Spring's serializer abstraction. * Includes adapters to the Converter SPI. */ +@NonNullApi package org.springframework.core.serializer.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/core/style/ValueStyler.java b/spring-core/src/main/java/org/springframework/core/style/ValueStyler.java index 731fb3aed3d..aa8e51ef57b 100644 --- a/spring-core/src/main/java/org/springframework/core/style/ValueStyler.java +++ b/spring-core/src/main/java/org/springframework/core/style/ValueStyler.java @@ -16,6 +16,8 @@ package org.springframework.core.style; +import org.springframework.lang.Nullable; + /** * Strategy that encapsulates value String styling algorithms * according to Spring conventions. @@ -30,6 +32,6 @@ public interface ValueStyler { * @param value the Object value to style * @return the styled String */ - String style(Object value); + String style(@Nullable Object value); } diff --git a/spring-core/src/main/java/org/springframework/core/style/package-info.java b/spring-core/src/main/java/org/springframework/core/style/package-info.java index 4b10242189a..9c7abc49ef5 100644 --- a/spring-core/src/main/java/org/springframework/core/style/package-info.java +++ b/spring-core/src/main/java/org/springframework/core/style/package-info.java @@ -1,4 +1,7 @@ /** * Support for styling values as Strings, with ToStringCreator as central class. */ +@NonNullApi package org.springframework.core.style; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/core/task/SimpleAsyncTaskExecutor.java b/spring-core/src/main/java/org/springframework/core/task/SimpleAsyncTaskExecutor.java index 8d392835a92..5fecad586a8 100644 --- a/spring-core/src/main/java/org/springframework/core/task/SimpleAsyncTaskExecutor.java +++ b/spring-core/src/main/java/org/springframework/core/task/SimpleAsyncTaskExecutor.java @@ -22,6 +22,7 @@ import java.util.concurrent.Future; import java.util.concurrent.FutureTask; import java.util.concurrent.ThreadFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ConcurrencyThrottleSupport; import org.springframework.util.CustomizableThreadCreator; @@ -107,6 +108,7 @@ public class SimpleAsyncTaskExecutor extends CustomizableThreadCreator implement /** * Return the external factory to use for creating new Threads, if any. */ + @Nullable public final ThreadFactory getThreadFactory() { return this.threadFactory; } diff --git a/spring-core/src/main/java/org/springframework/core/task/package-info.java b/spring-core/src/main/java/org/springframework/core/task/package-info.java index ae0ec879054..599d6161f6e 100644 --- a/spring-core/src/main/java/org/springframework/core/task/package-info.java +++ b/spring-core/src/main/java/org/springframework/core/task/package-info.java @@ -2,4 +2,7 @@ * This package defines Spring's core TaskExecutor abstraction, * and provides SyncTaskExecutor and SimpleAsyncTaskExecutor implementations. */ +@NonNullApi package org.springframework.core.task; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/core/task/support/TaskExecutorAdapter.java b/spring-core/src/main/java/org/springframework/core/task/support/TaskExecutorAdapter.java index 2811f7f9247..72576a02e65 100644 --- a/spring-core/src/main/java/org/springframework/core/task/support/TaskExecutorAdapter.java +++ b/spring-core/src/main/java/org/springframework/core/task/support/TaskExecutorAdapter.java @@ -26,6 +26,7 @@ import java.util.concurrent.RejectedExecutionException; import org.springframework.core.task.AsyncListenableTaskExecutor; import org.springframework.core.task.TaskDecorator; import org.springframework.core.task.TaskRejectedException; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.concurrent.ListenableFuture; import org.springframework.util.concurrent.ListenableFutureTask; @@ -167,7 +168,7 @@ public class TaskExecutorAdapter implements AsyncListenableTaskExecutor { * @throws RejectedExecutionException if the given runnable cannot be accepted * @since 4.3 */ - protected void doExecute(Executor concurrentExecutor, TaskDecorator taskDecorator, Runnable runnable) + protected void doExecute(Executor concurrentExecutor, @Nullable TaskDecorator taskDecorator, Runnable runnable) throws RejectedExecutionException{ concurrentExecutor.execute(taskDecorator != null ? taskDecorator.decorate(runnable) : runnable); diff --git a/spring-core/src/main/java/org/springframework/core/task/support/package-info.java b/spring-core/src/main/java/org/springframework/core/task/support/package-info.java index 6a940a6c478..4f789307fe1 100644 --- a/spring-core/src/main/java/org/springframework/core/task/support/package-info.java +++ b/spring-core/src/main/java/org/springframework/core/task/support/package-info.java @@ -2,4 +2,7 @@ * Support classes for Spring's TaskExecutor abstraction. * Includes an adapter for the standard ExecutorService interface. */ +@NonNullApi package org.springframework.core.task.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/core/type/AnnotatedTypeMetadata.java b/spring-core/src/main/java/org/springframework/core/type/AnnotatedTypeMetadata.java index 29541e8bb1f..9a989563d6c 100644 --- a/spring-core/src/main/java/org/springframework/core/type/AnnotatedTypeMetadata.java +++ b/spring-core/src/main/java/org/springframework/core/type/AnnotatedTypeMetadata.java @@ -18,6 +18,7 @@ package org.springframework.core.type; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.util.MultiValueMap; /** @@ -58,6 +59,7 @@ public interface AnnotatedTypeMetadata { * and the defined attribute value as Map value. This return value will be * {@code null} if no matching annotation is defined. */ + @Nullable Map getAnnotationAttributes(String annotationName); /** @@ -73,6 +75,7 @@ public interface AnnotatedTypeMetadata { * and the defined attribute value as Map value. This return value will be * {@code null} if no matching annotation is defined. */ + @Nullable Map getAnnotationAttributes(String annotationName, boolean classValuesAsString); /** @@ -86,6 +89,7 @@ public interface AnnotatedTypeMetadata { * be {@code null} if no matching annotation is defined. * @see #getAllAnnotationAttributes(String, boolean) */ + @Nullable MultiValueMap getAllAnnotationAttributes(String annotationName); /** @@ -100,6 +104,7 @@ public interface AnnotatedTypeMetadata { * be {@code null} if no matching annotation is defined. * @see #getAllAnnotationAttributes(String) */ + @Nullable MultiValueMap getAllAnnotationAttributes(String annotationName, boolean classValuesAsString); } diff --git a/spring-core/src/main/java/org/springframework/core/type/ClassMetadata.java b/spring-core/src/main/java/org/springframework/core/type/ClassMetadata.java index d664198e7df..627be0f472f 100644 --- a/spring-core/src/main/java/org/springframework/core/type/ClassMetadata.java +++ b/spring-core/src/main/java/org/springframework/core/type/ClassMetadata.java @@ -16,6 +16,8 @@ package org.springframework.core.type; +import org.springframework.lang.Nullable; + /** * Interface that defines abstract metadata of a specific class, * in a form that does not require that class to be loaded yet. @@ -81,6 +83,7 @@ public interface ClassMetadata { * Return the name of the enclosing class of the underlying class, * or {@code null} if the underlying class is a top-level class. */ + @Nullable String getEnclosingClassName(); /** @@ -92,6 +95,7 @@ public interface ClassMetadata { * Return the name of the super class of the underlying class, * or {@code null} if there is no super class defined. */ + @Nullable String getSuperClassName(); /** diff --git a/spring-core/src/main/java/org/springframework/core/type/classreading/AnnotationReadingVisitorUtils.java b/spring-core/src/main/java/org/springframework/core/type/classreading/AnnotationReadingVisitorUtils.java index 079d32eab1a..afcd4b56823 100644 --- a/spring-core/src/main/java/org/springframework/core/type/classreading/AnnotationReadingVisitorUtils.java +++ b/spring-core/src/main/java/org/springframework/core/type/classreading/AnnotationReadingVisitorUtils.java @@ -26,6 +26,7 @@ import java.util.Set; import org.springframework.asm.Type; import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.lang.Nullable; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.ObjectUtils; @@ -119,6 +120,7 @@ abstract class AnnotationReadingVisitorUtils { * matching annotation is present in the {@code attributesMap} * @since 4.0.3 */ + @Nullable public static AnnotationAttributes getMergedAnnotationAttributes( LinkedMultiValueMap attributesMap, Map> metaAnnotationMap, String annotationName) { diff --git a/spring-core/src/main/java/org/springframework/core/type/classreading/package-info.java b/spring-core/src/main/java/org/springframework/core/type/classreading/package-info.java index 9c9ca0dda38..38440289089 100644 --- a/spring-core/src/main/java/org/springframework/core/type/classreading/package-info.java +++ b/spring-core/src/main/java/org/springframework/core/type/classreading/package-info.java @@ -1,4 +1,7 @@ /** * Support classes for reading annotation and class-level metadata. */ +@NonNullApi package org.springframework.core.type.classreading; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/core/type/filter/AbstractTypeHierarchyTraversingFilter.java b/spring-core/src/main/java/org/springframework/core/type/filter/AbstractTypeHierarchyTraversingFilter.java index b10db84aa6e..1981eff2a69 100644 --- a/spring-core/src/main/java/org/springframework/core/type/filter/AbstractTypeHierarchyTraversingFilter.java +++ b/spring-core/src/main/java/org/springframework/core/type/filter/AbstractTypeHierarchyTraversingFilter.java @@ -24,6 +24,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.core.type.ClassMetadata; import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; +import org.springframework.lang.Nullable; /** * Type filter that is aware of traversing over hierarchy. @@ -140,6 +141,7 @@ public abstract class AbstractTypeHierarchyTraversingFilter implements TypeFilte /** * Override this to match on super type name. */ + @Nullable protected Boolean matchSuperClass(String superClassName) { return null; } @@ -147,6 +149,7 @@ public abstract class AbstractTypeHierarchyTraversingFilter implements TypeFilte /** * Override this to match on interface type name. */ + @Nullable protected Boolean matchInterface(String interfaceName) { return null; } diff --git a/spring-core/src/main/java/org/springframework/core/type/filter/AnnotationTypeFilter.java b/spring-core/src/main/java/org/springframework/core/type/filter/AnnotationTypeFilter.java index 3e31aca1615..74fd6fab2a1 100644 --- a/spring-core/src/main/java/org/springframework/core/type/filter/AnnotationTypeFilter.java +++ b/spring-core/src/main/java/org/springframework/core/type/filter/AnnotationTypeFilter.java @@ -22,6 +22,7 @@ import java.lang.annotation.Inherited; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.classreading.MetadataReader; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -102,6 +103,7 @@ public class AnnotationTypeFilter extends AbstractTypeHierarchyTraversingFilter return hasAnnotation(interfaceName); } + @Nullable protected Boolean hasAnnotation(String typeName) { if (Object.class.getName().equals(typeName)) { return false; diff --git a/spring-core/src/main/java/org/springframework/core/type/filter/AssignableTypeFilter.java b/spring-core/src/main/java/org/springframework/core/type/filter/AssignableTypeFilter.java index d67056ff791..79665b8d3e3 100644 --- a/spring-core/src/main/java/org/springframework/core/type/filter/AssignableTypeFilter.java +++ b/spring-core/src/main/java/org/springframework/core/type/filter/AssignableTypeFilter.java @@ -16,6 +16,7 @@ package org.springframework.core.type.filter; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -63,6 +64,7 @@ public class AssignableTypeFilter extends AbstractTypeHierarchyTraversingFilter return matchTargetType(interfaceName); } + @Nullable protected Boolean matchTargetType(String typeName) { if (this.targetType.getName().equals(typeName)) { return true; diff --git a/spring-core/src/main/java/org/springframework/core/type/filter/package-info.java b/spring-core/src/main/java/org/springframework/core/type/filter/package-info.java index 6f08effe766..4eafe49ae78 100644 --- a/spring-core/src/main/java/org/springframework/core/type/filter/package-info.java +++ b/spring-core/src/main/java/org/springframework/core/type/filter/package-info.java @@ -1,4 +1,7 @@ /** * Core support package for type filtering (e.g. for classpath scanning). */ +@NonNullApi package org.springframework.core.type.filter; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/core/type/package-info.java b/spring-core/src/main/java/org/springframework/core/type/package-info.java index 00179fb526e..56b4c2ffa7a 100644 --- a/spring-core/src/main/java/org/springframework/core/type/package-info.java +++ b/spring-core/src/main/java/org/springframework/core/type/package-info.java @@ -1,4 +1,7 @@ /** * Core support package for type introspection. */ +@NonNullApi package org.springframework.core.type; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/lang/NonNullApi.java b/spring-core/src/main/java/org/springframework/lang/NonNullApi.java new file mode 100644 index 00000000000..ae95ebfa138 --- /dev/null +++ b/spring-core/src/main/java/org/springframework/lang/NonNullApi.java @@ -0,0 +1,29 @@ +package org.springframework.lang; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierDefault; + +/** + * Leverage JSR 305 meta-annotations to define that parameters and return values are + * non-nullable by default. + * + * Should be used at package level in association with {@link Nullable} parameters and + * return values level annotations. + * + * @author Sebastien Deleuze + * @since 5.0 + * @see javax.annotation.Nonnull + */ +@Documented +@Nonnull +@Target(ElementType.PACKAGE) +@TypeQualifierDefault({ElementType.METHOD, ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +public @interface NonNullApi { +} diff --git a/spring-core/src/main/java/org/springframework/lang/Nullable.java b/spring-core/src/main/java/org/springframework/lang/Nullable.java new file mode 100644 index 00000000000..ab68cb9a775 --- /dev/null +++ b/spring-core/src/main/java/org/springframework/lang/Nullable.java @@ -0,0 +1,28 @@ +package org.springframework.lang; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.annotation.meta.TypeQualifierDefault; + +/** + * Leverage JSR 305 meta-annotations to define the annotated element could be null + * under some circumstances. + * + * Should be used at parameters and return values level in association with + * {@link NonNullApi} package level annotations. + * + * @author Sebastien Deleuze + * @since 5.0 + * @see javax.annotation.Nullable + */ +@Documented +@javax.annotation.Nullable +@Target({ElementType.METHOD, ElementType.PARAMETER}) +@TypeQualifierDefault({ElementType.METHOD, ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +public @interface Nullable { +} diff --git a/spring-core/src/main/java/org/springframework/lang/package-info.java b/spring-core/src/main/java/org/springframework/lang/package-info.java index f9a01f9121a..5fddf8838d9 100644 --- a/spring-core/src/main/java/org/springframework/lang/package-info.java +++ b/spring-core/src/main/java/org/springframework/lang/package-info.java @@ -2,4 +2,6 @@ * Annotations indicating the use of core Java/JDK API beyond the API level of JDK 6 update 18. * Used descriptively within the framework codebase; validated by Animal Sniffer at build time. */ +@NonNullApi package org.springframework.lang; + diff --git a/spring-core/src/main/java/org/springframework/util/Assert.java b/spring-core/src/main/java/org/springframework/util/Assert.java index 8f60f5988df..b74b96935c7 100644 --- a/spring-core/src/main/java/org/springframework/util/Assert.java +++ b/spring-core/src/main/java/org/springframework/util/Assert.java @@ -20,6 +20,8 @@ import java.util.Collection; import java.util.Map; import java.util.function.Supplier; +import org.springframework.lang.Nullable; + /** * Assertion utility class that assists in validating arguments. * @@ -148,7 +150,7 @@ public abstract class Assert { * @param message the exception message to use if the assertion fails * @throws IllegalArgumentException if the object is not {@code null} */ - public static void isNull(Object object, String message) { + public static void isNull(@Nullable Object object, String message) { if (object != null) { throw new IllegalArgumentException(message); } @@ -165,7 +167,7 @@ public abstract class Assert { * @throws IllegalArgumentException if the object is not {@code null} * @since 5.0 */ - public static void isNull(Object object, Supplier messageSupplier) { + public static void isNull(@Nullable Object object, Supplier messageSupplier) { if (object != null) { throw new IllegalArgumentException(nullSafeGet(messageSupplier)); } @@ -175,7 +177,7 @@ public abstract class Assert { * @deprecated as of 4.3.7, in favor of {@link #isNull(Object, String)} */ @Deprecated - public static void isNull(Object object) { + public static void isNull(@Nullable Object object) { isNull(object, "[Assertion failed] - the object argument must be null"); } @@ -186,7 +188,7 @@ public abstract class Assert { * @param message the exception message to use if the assertion fails * @throws IllegalArgumentException if the object is {@code null} */ - public static void notNull(Object object, String message) { + public static void notNull(@Nullable Object object, String message) { if (object == null) { throw new IllegalArgumentException(message); } @@ -203,7 +205,7 @@ public abstract class Assert { * @throws IllegalArgumentException if the object is {@code null} * @since 5.0 */ - public static void notNull(Object object, Supplier messageSupplier) { + public static void notNull(@Nullable Object object, Supplier messageSupplier) { if (object == null) { throw new IllegalArgumentException(nullSafeGet(messageSupplier)); } @@ -213,7 +215,7 @@ public abstract class Assert { * @deprecated as of 4.3.7, in favor of {@link #notNull(Object, String)} */ @Deprecated - public static void notNull(Object object) { + public static void notNull(@Nullable Object object) { notNull(object, "[Assertion failed] - this argument is required; it must not be null"); } @@ -226,7 +228,7 @@ public abstract class Assert { * @see StringUtils#hasLength * @throws IllegalArgumentException if the text is empty */ - public static void hasLength(String text, String message) { + public static void hasLength(@Nullable String text, String message) { if (!StringUtils.hasLength(text)) { throw new IllegalArgumentException(message); } @@ -245,7 +247,7 @@ public abstract class Assert { * @throws IllegalArgumentException if the text is empty * @since 5.0 */ - public static void hasLength(String text, Supplier messageSupplier) { + public static void hasLength(@Nullable String text, Supplier messageSupplier) { if (!StringUtils.hasLength(text)) { throw new IllegalArgumentException(nullSafeGet(messageSupplier)); } @@ -255,7 +257,7 @@ public abstract class Assert { * @deprecated as of 4.3.7, in favor of {@link #hasLength(String, String)} */ @Deprecated - public static void hasLength(String text) { + public static void hasLength(@Nullable String text) { hasLength(text, "[Assertion failed] - this String argument must have length; it must not be null or empty"); } @@ -269,7 +271,7 @@ public abstract class Assert { * @see StringUtils#hasText * @throws IllegalArgumentException if the text does not contain valid text content */ - public static void hasText(String text, String message) { + public static void hasText(@Nullable String text, String message) { if (!StringUtils.hasText(text)) { throw new IllegalArgumentException(message); } @@ -288,7 +290,7 @@ public abstract class Assert { * @throws IllegalArgumentException if the text does not contain valid text content * @since 5.0 */ - public static void hasText(String text, Supplier messageSupplier) { + public static void hasText(@Nullable String text, Supplier messageSupplier) { if (!StringUtils.hasText(text)) { throw new IllegalArgumentException(nullSafeGet(messageSupplier)); } @@ -298,7 +300,7 @@ public abstract class Assert { * @deprecated as of 4.3.7, in favor of {@link #hasText(String, String)} */ @Deprecated - public static void hasText(String text) { + public static void hasText(@Nullable String text) { hasText(text, "[Assertion failed] - this String argument must have text; it must not be null, empty, or blank"); } @@ -311,7 +313,7 @@ public abstract class Assert { * @param message the exception message to use if the assertion fails * @throws IllegalArgumentException if the text contains the substring */ - public static void doesNotContain(String textToSearch, String substring, String message) { + public static void doesNotContain(@Nullable String textToSearch, String substring, String message) { if (StringUtils.hasLength(textToSearch) && StringUtils.hasLength(substring) && textToSearch.contains(substring)) { throw new IllegalArgumentException(message); @@ -330,7 +332,7 @@ public abstract class Assert { * @throws IllegalArgumentException if the text contains the substring * @since 5.0 */ - public static void doesNotContain(String textToSearch, String substring, Supplier messageSupplier) { + public static void doesNotContain(@Nullable String textToSearch, String substring, Supplier messageSupplier) { if (StringUtils.hasLength(textToSearch) && StringUtils.hasLength(substring) && textToSearch.contains(substring)) { throw new IllegalArgumentException(nullSafeGet(messageSupplier)); @@ -341,7 +343,7 @@ public abstract class Assert { * @deprecated as of 4.3.7, in favor of {@link #doesNotContain(String, String, String)} */ @Deprecated - public static void doesNotContain(String textToSearch, String substring) { + public static void doesNotContain(@Nullable String textToSearch, String substring) { doesNotContain(textToSearch, substring, () -> "[Assertion failed] - this String argument must not contain the substring [" + substring + "]"); } @@ -354,7 +356,7 @@ public abstract class Assert { * @param message the exception message to use if the assertion fails * @throws IllegalArgumentException if the object array is {@code null} or contains no elements */ - public static void notEmpty(Object[] array, String message) { + public static void notEmpty(@Nullable Object[] array, String message) { if (ObjectUtils.isEmpty(array)) { throw new IllegalArgumentException(message); } @@ -372,7 +374,7 @@ public abstract class Assert { * @throws IllegalArgumentException if the object array is {@code null} or contains no elements * @since 5.0 */ - public static void notEmpty(Object[] array, Supplier messageSupplier) { + public static void notEmpty(@Nullable Object[] array, Supplier messageSupplier) { if (ObjectUtils.isEmpty(array)) { throw new IllegalArgumentException(nullSafeGet(messageSupplier)); } @@ -382,7 +384,7 @@ public abstract class Assert { * @deprecated as of 4.3.7, in favor of {@link #notEmpty(Object[], String)} */ @Deprecated - public static void notEmpty(Object[] array) { + public static void notEmpty(@Nullable Object[] array) { notEmpty(array, "[Assertion failed] - this array must not be empty: it must contain at least 1 element"); } @@ -394,7 +396,7 @@ public abstract class Assert { * @param message the exception message to use if the assertion fails * @throws IllegalArgumentException if the object array contains a {@code null} element */ - public static void noNullElements(Object[] array, String message) { + public static void noNullElements(@Nullable Object[] array, String message) { if (array != null) { for (Object element : array) { if (element == null) { @@ -416,7 +418,7 @@ public abstract class Assert { * @throws IllegalArgumentException if the object array contains a {@code null} element * @since 5.0 */ - public static void noNullElements(Object[] array, Supplier messageSupplier) { + public static void noNullElements(@Nullable Object[] array, Supplier messageSupplier) { if (array != null) { for (Object element : array) { if (element == null) { @@ -430,7 +432,7 @@ public abstract class Assert { * @deprecated as of 4.3.7, in favor of {@link #noNullElements(Object[], String)} */ @Deprecated - public static void noNullElements(Object[] array) { + public static void noNullElements(@Nullable Object[] array) { noNullElements(array, "[Assertion failed] - this array must not contain any null elements"); } @@ -443,7 +445,7 @@ public abstract class Assert { * @throws IllegalArgumentException if the collection is {@code null} or * contains no elements */ - public static void notEmpty(Collection collection, String message) { + public static void notEmpty(@Nullable Collection collection, String message) { if (CollectionUtils.isEmpty(collection)) { throw new IllegalArgumentException(message); } @@ -462,7 +464,7 @@ public abstract class Assert { * contains no elements * @since 5.0 */ - public static void notEmpty(Collection collection, Supplier messageSupplier) { + public static void notEmpty(@Nullable Collection collection, Supplier messageSupplier) { if (CollectionUtils.isEmpty(collection)) { throw new IllegalArgumentException(nullSafeGet(messageSupplier)); } @@ -472,7 +474,7 @@ public abstract class Assert { * @deprecated as of 4.3.7, in favor of {@link #notEmpty(Collection, String)} */ @Deprecated - public static void notEmpty(Collection collection) { + public static void notEmpty(@Nullable Collection collection) { notEmpty(collection, "[Assertion failed] - this collection must not be empty: it must contain at least 1 element"); } @@ -485,7 +487,7 @@ public abstract class Assert { * @param message the exception message to use if the assertion fails * @throws IllegalArgumentException if the map is {@code null} or contains no entries */ - public static void notEmpty(Map map, String message) { + public static void notEmpty(@Nullable Map map, String message) { if (CollectionUtils.isEmpty(map)) { throw new IllegalArgumentException(message); } @@ -503,7 +505,7 @@ public abstract class Assert { * @throws IllegalArgumentException if the map is {@code null} or contains no entries * @since 5.0 */ - public static void notEmpty(Map map, Supplier messageSupplier) { + public static void notEmpty(@Nullable Map map, Supplier messageSupplier) { if (CollectionUtils.isEmpty(map)) { throw new IllegalArgumentException(nullSafeGet(messageSupplier)); } @@ -513,7 +515,7 @@ public abstract class Assert { * @deprecated as of 4.3.7, in favor of {@link #notEmpty(Map, String)} */ @Deprecated - public static void notEmpty(Map map) { + public static void notEmpty(@Nullable Map map) { notEmpty(map, "[Assertion failed] - this map must not be empty; it must contain at least one entry"); } diff --git a/spring-core/src/main/java/org/springframework/util/Base64Utils.java b/spring-core/src/main/java/org/springframework/util/Base64Utils.java index 037050df742..6ea0138881e 100644 --- a/spring-core/src/main/java/org/springframework/util/Base64Utils.java +++ b/spring-core/src/main/java/org/springframework/util/Base64Utils.java @@ -20,6 +20,8 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.Base64; +import org.springframework.lang.Nullable; + /** * A simple utility class for Base64 encoding and decoding. * @@ -42,7 +44,8 @@ public abstract class Base64Utils { * @throws IllegalStateException if Base64 encoding between byte arrays is not * supported, i.e. neither Java 8 nor Apache Commons Codec is present at runtime */ - public static byte[] encode(byte[] src) { + @Nullable + public static byte[] encode(@Nullable byte[] src) { if (src == null || src.length == 0) { return src; } @@ -56,7 +59,8 @@ public abstract class Base64Utils { * @throws IllegalStateException if Base64 encoding between byte arrays is not * supported, i.e. neither Java 8 nor Apache Commons Codec is present at runtime */ - public static byte[] decode(byte[] src) { + @Nullable + public static byte[] decode(@Nullable byte[] src) { if (src == null || src.length == 0) { return src; } @@ -72,7 +76,8 @@ public abstract class Base64Utils { * supported, i.e. neither Java 8 nor Apache Commons Codec is present at runtime * @since 4.2.4 */ - public static byte[] encodeUrlSafe(byte[] src) { + @Nullable + public static byte[] encodeUrlSafe(@Nullable byte[] src) { if (src == null || src.length == 0) { return src; } @@ -88,7 +93,8 @@ public abstract class Base64Utils { * supported, i.e. neither Java 8 nor Apache Commons Codec is present at runtime * @since 4.2.4 */ - public static byte[] decodeUrlSafe(byte[] src) { + @Nullable + public static byte[] decodeUrlSafe(@Nullable byte[] src) { if (src == null || src.length == 0) { return src; } @@ -101,7 +107,8 @@ public abstract class Base64Utils { * @return the encoded byte array as a UTF-8 String * (or {@code null} if the input was {@code null}) */ - public static String encodeToString(byte[] src) { + @Nullable + public static String encodeToString(@Nullable byte[] src) { if (src == null) { return null; } @@ -116,7 +123,8 @@ public abstract class Base64Utils { * @param src the encoded UTF-8 String (may be {@code null}) * @return the original byte array (or {@code null} if the input was {@code null}) */ - public static byte[] decodeFromString(String src) { + @Nullable + public static byte[] decodeFromString(@Nullable String src) { if (src == null) { return null; } @@ -135,7 +143,8 @@ public abstract class Base64Utils { * @throws IllegalStateException if Base64 encoding between byte arrays is not * supported, i.e. neither Java 8 nor Apache Commons Codec is present at runtime */ - public static String encodeToUrlSafeString(byte[] src) { + @Nullable + public static String encodeToUrlSafeString(@Nullable byte[] src) { return new String(encodeUrlSafe(src), DEFAULT_CHARSET); } @@ -147,7 +156,8 @@ public abstract class Base64Utils { * @throws IllegalStateException if Base64 encoding between byte arrays is not * supported, i.e. neither Java 8 nor Apache Commons Codec is present at runtime */ - public static byte[] decodeFromUrlSafeString(String src) { + @Nullable + public static byte[] decodeFromUrlSafeString(@Nullable String src) { return decodeUrlSafe(src.getBytes(DEFAULT_CHARSET)); } diff --git a/spring-core/src/main/java/org/springframework/util/ClassUtils.java b/spring-core/src/main/java/org/springframework/util/ClassUtils.java index de8124db350..9a9b0c705d3 100644 --- a/spring-core/src/main/java/org/springframework/util/ClassUtils.java +++ b/spring-core/src/main/java/org/springframework/util/ClassUtils.java @@ -33,6 +33,8 @@ import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; +import org.springframework.lang.Nullable; + /** * Miscellaneous class utility methods. * Mainly for internal use within the framework. @@ -154,6 +156,7 @@ public abstract class ClassUtils { * @see Thread#getContextClassLoader() * @see ClassLoader#getSystemClassLoader() */ + @Nullable public static ClassLoader getDefaultClassLoader() { ClassLoader cl = null; try { @@ -185,6 +188,7 @@ public abstract class ClassUtils { * @param classLoaderToUse the actual ClassLoader to use for the thread context * @return the original thread context ClassLoader, or {@code null} if not overridden */ + @Nullable public static ClassLoader overrideThreadContextClassLoader(ClassLoader classLoaderToUse) { Thread currentThread = Thread.currentThread(); ClassLoader threadContextClassLoader = currentThread.getContextClassLoader(); @@ -210,7 +214,7 @@ public abstract class ClassUtils { * @throws LinkageError if the class file could not be loaded * @see Class#forName(String, boolean, ClassLoader) */ - public static Class forName(String name, ClassLoader classLoader) throws ClassNotFoundException, LinkageError { + public static Class forName(String name, @Nullable ClassLoader classLoader) throws ClassNotFoundException, LinkageError { Assert.notNull(name, "Name must not be null"); Class clazz = resolvePrimitiveClassName(name); @@ -279,7 +283,7 @@ public abstract class ClassUtils { * (that is, the class could not be found or the class file could not be loaded) * @see #forName(String, ClassLoader) */ - public static Class resolveClassName(String className, ClassLoader classLoader) throws IllegalArgumentException { + public static Class resolveClassName(String className, @Nullable ClassLoader classLoader) throws IllegalArgumentException { try { return forName(className, classLoader); } @@ -302,6 +306,7 @@ public abstract class ClassUtils { * @return the primitive class, or {@code null} if the name does not denote * a primitive class or primitive array class */ + @Nullable public static Class resolvePrimitiveClassName(String name) { Class result = null; // Most class names will be quite long, considering that they @@ -322,7 +327,7 @@ public abstract class ClassUtils { * (may be {@code null}, which indicates the default class loader) * @return whether the specified class is present */ - public static boolean isPresent(String className, ClassLoader classLoader) { + public static boolean isPresent(String className, @Nullable ClassLoader classLoader) { try { forName(className, classLoader); return true; @@ -502,7 +507,7 @@ public abstract class ClassUtils { * @return the qualified name of the method * @since 4.3.4 */ - public static String getQualifiedMethodName(Method method, Class clazz) { + public static String getQualifiedMethodName(Method method, @Nullable Class clazz) { Assert.notNull(method, "Method must not be null"); return (clazz != null ? clazz : method.getDeclaringClass()).getName() + '.' + method.getName(); } @@ -568,6 +573,7 @@ public abstract class ClassUtils { * @return the constructor, or {@code null} if not found * @see Class#getConstructor */ + @Nullable public static Constructor getConstructorIfAvailable(Class clazz, Class... paramTypes) { Assert.notNull(clazz, "Class must not be null"); try { @@ -605,7 +611,7 @@ public abstract class ClassUtils { * @throws IllegalStateException if the method has not been found * @see Class#getMethod */ - public static Method getMethod(Class clazz, String methodName, Class... paramTypes) { + public static Method getMethod(Class clazz, String methodName, @Nullable Class... paramTypes) { Assert.notNull(clazz, "Class must not be null"); Assert.notNull(methodName, "Method name must not be null"); if (paramTypes != null) { @@ -649,7 +655,8 @@ public abstract class ClassUtils { * @return the method, or {@code null} if not found * @see Class#getMethod */ - public static Method getMethodIfAvailable(Class clazz, String methodName, Class... paramTypes) { + @Nullable + public static Method getMethodIfAvailable(Class clazz, String methodName, @Nullable Class... paramTypes) { Assert.notNull(clazz, "Class must not be null"); Assert.notNull(methodName, "Method name must not be null"); if (paramTypes != null) { @@ -748,7 +755,8 @@ public abstract class ClassUtils { * @return the specific target method, or the original method if the * {@code targetClass} doesn't implement it or is {@code null} */ - public static Method getMostSpecificMethod(Method method, Class targetClass) { + @Nullable + public static Method getMostSpecificMethod(Method method, @Nullable Class targetClass) { if (method != null && isOverridable(method, targetClass) && targetClass != null && targetClass != method.getDeclaringClass()) { try { @@ -816,6 +824,7 @@ public abstract class ClassUtils { * @return the static method, or {@code null} if no static method was found * @throws IllegalArgumentException if the method name is blank or the clazz is null */ + @Nullable public static Method getStaticMethod(Class clazz, String methodName, Class... args) { Assert.notNull(clazz, "Class must not be null"); Assert.notNull(methodName, "Method name must not be null"); @@ -987,7 +996,7 @@ public abstract class ClassUtils { * @see ClassLoader#getResource * @see Class#getResource */ - public static String classPackageAsResourcePath(Class clazz) { + public static String classPackageAsResourcePath(@Nullable Class clazz) { if (clazz == null) { return ""; } @@ -1009,7 +1018,7 @@ public abstract class ClassUtils { * @return a String of form "[com.foo.Bar, com.foo.Baz]" * @see java.util.AbstractCollection#toString() */ - public static String classNamesToString(Class... classes) { + public static String classNamesToString(@Nullable Class... classes) { return classNamesToString(Arrays.asList(classes)); } @@ -1022,7 +1031,7 @@ public abstract class ClassUtils { * @return a String of form "[com.foo.Bar, com.foo.Baz]" * @see java.util.AbstractCollection#toString() */ - public static String classNamesToString(Collection> classes) { + public static String classNamesToString(@Nullable Collection> classes) { if (CollectionUtils.isEmpty(classes)) { return "[]"; } @@ -1045,7 +1054,8 @@ public abstract class ClassUtils { * @return the Class array ({@code null} if the passed-in * Collection was {@code null}) */ - public static Class[] toClassArray(Collection> collection) { + @Nullable + public static Class[] toClassArray(@Nullable Collection> collection) { if (collection == null) { return null; } @@ -1083,7 +1093,7 @@ public abstract class ClassUtils { * (may be {@code null} when accepting all declared interfaces) * @return all interfaces that the given object implements as an array */ - public static Class[] getAllInterfacesForClass(Class clazz, ClassLoader classLoader) { + public static Class[] getAllInterfacesForClass(Class clazz, @Nullable ClassLoader classLoader) { Set> ifcs = getAllInterfacesForClassAsSet(clazz, classLoader); return ifcs.toArray(new Class[ifcs.size()]); } @@ -1119,7 +1129,7 @@ public abstract class ClassUtils { * (may be {@code null} when accepting all declared interfaces) * @return all interfaces that the given object implements as a Set */ - public static Set> getAllInterfacesForClassAsSet(Class clazz, ClassLoader classLoader) { + public static Set> getAllInterfacesForClassAsSet(Class clazz, @Nullable ClassLoader classLoader) { Assert.notNull(clazz, "Class must not be null"); if (clazz.isInterface() && isVisible(clazz, classLoader)) { return Collections.>singleton(clazz); @@ -1159,6 +1169,7 @@ public abstract class ClassUtils { * given classes is {@code null}, the other class will be returned. * @since 3.2.6 */ + @Nullable public static Class determineCommonAncestor(Class clazz1, Class clazz2) { if (clazz1 == null) { return clazz2; @@ -1189,7 +1200,7 @@ public abstract class ClassUtils { * @param classLoader the ClassLoader to check against (may be {@code null}, * in which case this method will always return {@code true}) */ - public static boolean isVisible(Class clazz, ClassLoader classLoader) { + public static boolean isVisible(Class clazz, @Nullable ClassLoader classLoader) { if (classLoader == null) { return true; } diff --git a/spring-core/src/main/java/org/springframework/util/CollectionUtils.java b/spring-core/src/main/java/org/springframework/util/CollectionUtils.java index a2d107af7a5..c53085789f5 100644 --- a/spring-core/src/main/java/org/springframework/util/CollectionUtils.java +++ b/spring-core/src/main/java/org/springframework/util/CollectionUtils.java @@ -30,6 +30,8 @@ import java.util.Map; import java.util.Properties; import java.util.Set; +import org.springframework.lang.Nullable; + /** * Miscellaneous collection utility methods. * Mainly for internal use within the framework. @@ -47,7 +49,7 @@ public abstract class CollectionUtils { * @param collection the Collection to check * @return whether the given Collection is empty */ - public static boolean isEmpty(Collection collection) { + public static boolean isEmpty(@Nullable Collection collection) { return (collection == null || collection.isEmpty()); } @@ -57,7 +59,7 @@ public abstract class CollectionUtils { * @param map the Map to check * @return whether the given Map is empty */ - public static boolean isEmpty(Map map) { + public static boolean isEmpty(@Nullable Map map) { return (map == null || map.isEmpty()); } @@ -74,7 +76,7 @@ public abstract class CollectionUtils { * @see Arrays#asList(Object[]) */ @SuppressWarnings("rawtypes") - public static List arrayToList(Object source) { + public static List arrayToList(@Nullable Object source) { return Arrays.asList(ObjectUtils.toObjectArray(source)); } @@ -84,7 +86,7 @@ public abstract class CollectionUtils { * @param collection the target Collection to merge the array into */ @SuppressWarnings("unchecked") - public static void mergeArrayIntoCollection(Object array, Collection collection) { + public static void mergeArrayIntoCollection(@Nullable Object array, Collection collection) { if (collection == null) { throw new IllegalArgumentException("Collection must not be null"); } @@ -103,7 +105,7 @@ public abstract class CollectionUtils { * @param map the target Map to merge the properties into */ @SuppressWarnings("unchecked") - public static void mergePropertiesIntoMap(Properties props, Map map) { + public static void mergePropertiesIntoMap(@Nullable Properties props, Map map) { if (map == null) { throw new IllegalArgumentException("Map must not be null"); } @@ -205,6 +207,7 @@ public abstract class CollectionUtils { * @return the first present object, or {@code null} if not found */ @SuppressWarnings("unchecked") + @Nullable public static E findFirstMatch(Collection source, Collection candidates) { if (isEmpty(source) || isEmpty(candidates)) { return null; @@ -225,6 +228,7 @@ public abstract class CollectionUtils { * or {@code null} if none or more than one such value found */ @SuppressWarnings("unchecked") + @Nullable public static T findValueOfType(Collection collection, Class type) { if (isEmpty(collection)) { return null; @@ -251,6 +255,7 @@ public abstract class CollectionUtils { * @return a value of one of the given types found if there is a clear match, * or {@code null} if none or more than one such value found */ + @Nullable public static Object findValueOfType(Collection collection, Class[] types) { if (isEmpty(collection) || ObjectUtils.isEmpty(types)) { return null; @@ -294,6 +299,7 @@ public abstract class CollectionUtils { * @return the common element type, or {@code null} if no clear * common type has been found (or the collection was empty) */ + @Nullable public static Class findCommonElementType(Collection collection) { if (isEmpty(collection)) { return null; diff --git a/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java b/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java index b394d90b3e5..794f64c3db9 100644 --- a/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java +++ b/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java @@ -33,6 +33,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.locks.ReentrantLock; +import org.springframework.lang.Nullable; + /** * A {@link ConcurrentHashMap} that uses {@link ReferenceType#SOFT soft} or * {@linkplain ReferenceType#WEAK weak} references for both {@code keys} and {@code values}. @@ -210,7 +212,7 @@ public class ConcurrentReferenceHashMap extends AbstractMap implemen * @param o the object to hash (may be null) * @return the resulting hash code */ - protected int getHash(Object o) { + protected int getHash(@Nullable Object o) { int hash = o == null ? 0 : o.hashCode(); hash += (hash << 15) ^ 0xffffcd7d; hash ^= (hash >>> 10); @@ -242,7 +244,8 @@ public class ConcurrentReferenceHashMap extends AbstractMap implemen * @param restructure types of restructure allowed during this call * @return the reference, or {@code null} if not found */ - protected final Reference getReference(Object key, Restructure restructure) { + @Nullable + protected final Reference getReference(@Nullable Object key, Restructure restructure) { int hash = getHash(key); return getSegmentForHash(hash).getReference(key, hash, restructure); } @@ -317,6 +320,7 @@ public class ConcurrentReferenceHashMap extends AbstractMap implemen } @Override + @Nullable public V replace(K key, final V value) { return doTask(key, new Task(TaskOption.RESTRUCTURE_BEFORE, TaskOption.SKIP_IF_EMPTY) { @Override @@ -443,6 +447,7 @@ public class ConcurrentReferenceHashMap extends AbstractMap implemen setReferences(createReferenceArray(this.initialSize)); } + @Nullable public Reference getReference(Object key, int hash, Restructure restructure) { if (restructure == Restructure.WHEN_NECESSARY) { restructureIfNecessary(false); @@ -582,6 +587,7 @@ public class ConcurrentReferenceHashMap extends AbstractMap implemen } } + @Nullable private Reference findInChain(Reference reference, Object key, int hash) { while (reference != null) { if (reference.getHash() == hash) { @@ -643,6 +649,7 @@ public class ConcurrentReferenceHashMap extends AbstractMap implemen * available. * @return the entry or {@code null} */ + @Nullable Entry get(); /** @@ -655,6 +662,7 @@ public class ConcurrentReferenceHashMap extends AbstractMap implemen * Returns the next reference in the chain or {@code null} * @return the next reference of {@code null} */ + @Nullable Reference getNext(); /** @@ -745,7 +753,8 @@ public class ConcurrentReferenceHashMap extends AbstractMap implemen * @return the result of the task * @see #execute(Reference, Entry) */ - protected T execute(Reference reference, Entry entry, Entries entries) { + @Nullable + protected T execute(@Nullable Reference reference, @Nullable Entry entry, Entries entries) { return execute(reference, entry); } @@ -756,7 +765,8 @@ public class ConcurrentReferenceHashMap extends AbstractMap implemen * @return the result of the task * @see #execute(Reference, Entry, Entries) */ - protected T execute(Reference reference, Entry entry) { + @Nullable + protected T execute(@Nullable Reference reference, @Nullable Entry entry) { return null; } } @@ -933,7 +943,7 @@ public class ConcurrentReferenceHashMap extends AbstractMap implemen * @param next the next reference in the chain or {@code null} * @return a new {@link Reference} */ - public Reference createReference(Entry entry, int hash, Reference next) { + public Reference createReference(Entry entry, int hash, @Nullable Reference next) { if (ConcurrentReferenceHashMap.this.referenceType == ReferenceType.WEAK) { return new WeakEntryReference<>(entry, hash, next, this.queue); } @@ -948,6 +958,7 @@ public class ConcurrentReferenceHashMap extends AbstractMap implemen * @return a reference to purge or {@code null} */ @SuppressWarnings("unchecked") + @Nullable public Reference pollForPurge() { return (Reference) this.queue.poll(); } diff --git a/spring-core/src/main/java/org/springframework/util/CustomizableThreadCreator.java b/spring-core/src/main/java/org/springframework/util/CustomizableThreadCreator.java index d8338d3bf34..5499182675e 100644 --- a/spring-core/src/main/java/org/springframework/util/CustomizableThreadCreator.java +++ b/spring-core/src/main/java/org/springframework/util/CustomizableThreadCreator.java @@ -19,6 +19,8 @@ package org.springframework.util; import java.io.Serializable; import java.util.concurrent.atomic.AtomicInteger; +import org.springframework.lang.Nullable; + /** * Simple customizable helper class for creating new {@link Thread} instances. * Provides various bean properties: thread name prefix, thread priority, etc. @@ -133,6 +135,7 @@ public class CustomizableThreadCreator implements Serializable { * Return the thread group that threads should be created in * (or {@code null} for the default group). */ + @Nullable public ThreadGroup getThreadGroup() { return this.threadGroup; } diff --git a/spring-core/src/main/java/org/springframework/util/FileCopyUtils.java b/spring-core/src/main/java/org/springframework/util/FileCopyUtils.java index 6c850619855..3c933b23b52 100644 --- a/spring-core/src/main/java/org/springframework/util/FileCopyUtils.java +++ b/spring-core/src/main/java/org/springframework/util/FileCopyUtils.java @@ -30,6 +30,8 @@ import java.io.Reader; import java.io.StringWriter; import java.io.Writer; +import org.springframework.lang.Nullable; + /** * Simple utility methods for file and stream copying. All copy methods use a block size * of 4096 bytes, and close all affected streams when done. A variation of the copy @@ -156,7 +158,7 @@ public abstract class FileCopyUtils { * @return the new byte array that has been copied to (possibly empty) * @throws IOException in case of I/O errors */ - public static byte[] copyToByteArray(InputStream in) throws IOException { + public static byte[] copyToByteArray(@Nullable InputStream in) throws IOException { if (in == null) { return new byte[0]; } @@ -238,7 +240,7 @@ public abstract class FileCopyUtils { * @return the String that has been copied to (possibly empty) * @throws IOException in case of I/O errors */ - public static String copyToString(Reader in) throws IOException { + public static String copyToString(@Nullable Reader in) throws IOException { if (in == null) { return ""; } diff --git a/spring-core/src/main/java/org/springframework/util/InstanceFilter.java b/spring-core/src/main/java/org/springframework/util/InstanceFilter.java index f97eb978470..96d71e1be20 100644 --- a/spring-core/src/main/java/org/springframework/util/InstanceFilter.java +++ b/spring-core/src/main/java/org/springframework/util/InstanceFilter.java @@ -19,6 +19,8 @@ package org.springframework.util; import java.util.Collection; import java.util.Collections; +import org.springframework.lang.Nullable; + /** * A simple instance filter that checks if a given instance match based on * a collection of includes and excludes element. @@ -101,7 +103,7 @@ public class InstanceFilter { * @param candidates a list of candidates * @return {@code true} if the instance match or the candidates collection is null */ - protected boolean match(T instance, Collection candidates) { + protected boolean match(@Nullable T instance, Collection candidates) { for (T candidate : candidates) { if (match(instance, candidate)) { return true; diff --git a/spring-core/src/main/java/org/springframework/util/LinkedCaseInsensitiveMap.java b/spring-core/src/main/java/org/springframework/util/LinkedCaseInsensitiveMap.java index 268fc112593..e5d02860c08 100644 --- a/spring-core/src/main/java/org/springframework/util/LinkedCaseInsensitiveMap.java +++ b/spring-core/src/main/java/org/springframework/util/LinkedCaseInsensitiveMap.java @@ -24,6 +24,8 @@ import java.util.Locale; import java.util.Map; import java.util.Set; +import org.springframework.lang.Nullable; + /** * {@link LinkedHashMap} variant that stores String keys in a case-insensitive * manner, for example for key-based access in a results table. @@ -134,6 +136,7 @@ public class LinkedCaseInsensitiveMap implements Map, Serializable } @Override + @Nullable public V get(Object key) { if (key instanceof String) { String caseInsensitiveKey = this.caseInsensitiveKeys.get(convertKey((String) key)); @@ -173,6 +176,7 @@ public class LinkedCaseInsensitiveMap implements Map, Serializable } @Override + @Nullable public V remove(Object key) { if (key instanceof String) { String caseInsensitiveKey = this.caseInsensitiveKeys.remove(convertKey((String) key)); diff --git a/spring-core/src/main/java/org/springframework/util/MethodInvoker.java b/spring-core/src/main/java/org/springframework/util/MethodInvoker.java index d2331caf098..9fa99c719fb 100644 --- a/spring-core/src/main/java/org/springframework/util/MethodInvoker.java +++ b/spring-core/src/main/java/org/springframework/util/MethodInvoker.java @@ -20,6 +20,8 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import org.springframework.lang.Nullable; + /** * Helper class that allows for specifying a method to invoke in a declarative * fashion, be it static or non-static. @@ -201,6 +203,7 @@ public class MethodInvoker { * @see #getTargetMethod() * @see #getArguments() */ + @Nullable protected Method findMatchingMethod() { String targetMethod = getTargetMethod(); Object[] arguments = getArguments(); @@ -258,6 +261,7 @@ public class MethodInvoker { * @throws IllegalAccessException if the target method couldn't be accessed * @see #prepare */ + @Nullable public Object invoke() throws InvocationTargetException, IllegalAccessException { // In the static case, target will simply be {@code null}. Object targetObject = getTargetObject(); diff --git a/spring-core/src/main/java/org/springframework/util/MimeType.java b/spring-core/src/main/java/org/springframework/util/MimeType.java index a2ff8055ca0..a32292c493d 100644 --- a/spring-core/src/main/java/org/springframework/util/MimeType.java +++ b/spring-core/src/main/java/org/springframework/util/MimeType.java @@ -28,6 +28,8 @@ import java.util.Locale; import java.util.Map; import java.util.TreeSet; +import org.springframework.lang.Nullable; + /** * Represents a MIME Type, as originally defined in RFC 2046 and subsequently used in * other Internet protocols including HTTP. @@ -153,7 +155,7 @@ public class MimeType implements Comparable, Serializable { * @param parameters the parameters, may be {@code null} * @throws IllegalArgumentException if any of the parameters contains illegal characters */ - public MimeType(MimeType other, Map parameters) { + public MimeType(MimeType other, @Nullable Map parameters) { this(other.getType(), other.getSubtype(), parameters); } @@ -164,7 +166,7 @@ public class MimeType implements Comparable, Serializable { * @param parameters the parameters, may be {@code null} * @throws IllegalArgumentException if any of the parameters contains illegal characters */ - public MimeType(String type, String subtype, Map parameters) { + public MimeType(String type, String subtype, @Nullable Map parameters) { Assert.hasLength(type, "'type' must not be empty"); Assert.hasLength(subtype, "'subtype' must not be empty"); checkToken(type); @@ -276,6 +278,7 @@ public class MimeType implements Comparable, Serializable { * @return the character set, or {@code null} if not available * @since 4.3 */ + @Nullable public Charset getCharset() { String charset = getParameter(PARAM_CHARSET); return (charset != null ? Charset.forName(unquote(charset)) : null); @@ -286,6 +289,7 @@ public class MimeType implements Comparable, Serializable { * @param name the parameter name * @return the parameter value, or {@code null} if not present */ + @Nullable public String getParameter(String name) { return this.parameters.get(name); } diff --git a/spring-core/src/main/java/org/springframework/util/MultiValueMap.java b/spring-core/src/main/java/org/springframework/util/MultiValueMap.java index 8076e2fc0cc..bf9791e8a69 100644 --- a/spring-core/src/main/java/org/springframework/util/MultiValueMap.java +++ b/spring-core/src/main/java/org/springframework/util/MultiValueMap.java @@ -19,6 +19,8 @@ package org.springframework.util; import java.util.List; import java.util.Map; +import org.springframework.lang.Nullable; + /** * Extension of the {@code Map} interface that stores multiple values. * @@ -32,6 +34,7 @@ public interface MultiValueMap extends Map> { * @param key the key * @return the first value for the specified key, or {@code null} */ + @Nullable V getFirst(K key); /** diff --git a/spring-core/src/main/java/org/springframework/util/ObjectUtils.java b/spring-core/src/main/java/org/springframework/util/ObjectUtils.java index f85af56978a..75d7f59f459 100644 --- a/spring-core/src/main/java/org/springframework/util/ObjectUtils.java +++ b/spring-core/src/main/java/org/springframework/util/ObjectUtils.java @@ -22,6 +22,8 @@ import java.util.Collection; import java.util.Map; import java.util.Optional; +import org.springframework.lang.Nullable; + /** * Miscellaneous object utility methods. * @@ -102,7 +104,7 @@ public abstract class ObjectUtils { * @param array the array to check * @see #isEmpty(Object) */ - public static boolean isEmpty(Object[] array) { + public static boolean isEmpty(@Nullable Object[] array) { return (array == null || array.length == 0); } @@ -129,7 +131,7 @@ public abstract class ObjectUtils { * @see CollectionUtils#isEmpty(java.util.Map) */ @SuppressWarnings("rawtypes") - public static boolean isEmpty(Object obj) { + public static boolean isEmpty(@Nullable Object obj) { if (obj == null) { return true; } @@ -161,6 +163,7 @@ public abstract class ObjectUtils { * if the {@code Optional} is empty, or simply the given object as-is * @since 5.0 */ + @Nullable public static Object unwrapOptional(Object obj) { if (obj instanceof Optional) { Optional optional = (Optional) obj; @@ -181,7 +184,7 @@ public abstract class ObjectUtils { * @param element the element to check for * @return whether the element has been found in the given array */ - public static boolean containsElement(Object[] array, Object element) { + public static boolean containsElement(@Nullable Object[] array, Object element) { if (array == null) { return false; } @@ -248,7 +251,7 @@ public abstract class ObjectUtils { * @param obj the object to append * @return the new array (of the same component type; never {@code null}) */ - public static A[] addObjectToArray(A[] array, O obj) { + public static A[] addObjectToArray(@Nullable A[] array, O obj) { Class compType = Object.class; if (array != null) { compType = array.getClass().getComponentType(); @@ -275,7 +278,7 @@ public abstract class ObjectUtils { * @return the corresponding object array (never {@code null}) * @throws IllegalArgumentException if the parameter is not an array */ - public static Object[] toObjectArray(Object source) { + public static Object[] toObjectArray(@Nullable Object source) { if (source instanceof Object[]) { return (Object[]) source; } @@ -313,7 +316,7 @@ public abstract class ObjectUtils { * @see Object#equals(Object) * @see java.util.Arrays#equals */ - public static boolean nullSafeEquals(Object o1, Object o2) { + public static boolean nullSafeEquals(@Nullable Object o1, @Nullable Object o2) { if (o1 == o2) { return true; } @@ -386,7 +389,7 @@ public abstract class ObjectUtils { * @see #nullSafeHashCode(long[]) * @see #nullSafeHashCode(short[]) */ - public static int nullSafeHashCode(Object obj) { + public static int nullSafeHashCode(@Nullable Object obj) { if (obj == null) { return 0; } @@ -426,7 +429,7 @@ public abstract class ObjectUtils { * Return a hash code based on the contents of the specified array. * If {@code array} is {@code null}, this method returns 0. */ - public static int nullSafeHashCode(Object[] array) { + public static int nullSafeHashCode(@Nullable Object[] array) { if (array == null) { return 0; } @@ -441,7 +444,7 @@ public abstract class ObjectUtils { * Return a hash code based on the contents of the specified array. * If {@code array} is {@code null}, this method returns 0. */ - public static int nullSafeHashCode(boolean[] array) { + public static int nullSafeHashCode(@Nullable boolean[] array) { if (array == null) { return 0; } @@ -456,7 +459,7 @@ public abstract class ObjectUtils { * Return a hash code based on the contents of the specified array. * If {@code array} is {@code null}, this method returns 0. */ - public static int nullSafeHashCode(byte[] array) { + public static int nullSafeHashCode(@Nullable byte[] array) { if (array == null) { return 0; } @@ -471,7 +474,7 @@ public abstract class ObjectUtils { * Return a hash code based on the contents of the specified array. * If {@code array} is {@code null}, this method returns 0. */ - public static int nullSafeHashCode(char[] array) { + public static int nullSafeHashCode(@Nullable char[] array) { if (array == null) { return 0; } @@ -486,7 +489,7 @@ public abstract class ObjectUtils { * Return a hash code based on the contents of the specified array. * If {@code array} is {@code null}, this method returns 0. */ - public static int nullSafeHashCode(double[] array) { + public static int nullSafeHashCode(@Nullable double[] array) { if (array == null) { return 0; } @@ -501,7 +504,7 @@ public abstract class ObjectUtils { * Return a hash code based on the contents of the specified array. * If {@code array} is {@code null}, this method returns 0. */ - public static int nullSafeHashCode(float[] array) { + public static int nullSafeHashCode(@Nullable float[] array) { if (array == null) { return 0; } @@ -516,7 +519,7 @@ public abstract class ObjectUtils { * Return a hash code based on the contents of the specified array. * If {@code array} is {@code null}, this method returns 0. */ - public static int nullSafeHashCode(int[] array) { + public static int nullSafeHashCode(@Nullable int[] array) { if (array == null) { return 0; } @@ -531,7 +534,7 @@ public abstract class ObjectUtils { * Return a hash code based on the contents of the specified array. * If {@code array} is {@code null}, this method returns 0. */ - public static int nullSafeHashCode(long[] array) { + public static int nullSafeHashCode(@Nullable long[] array) { if (array == null) { return 0; } @@ -546,7 +549,7 @@ public abstract class ObjectUtils { * Return a hash code based on the contents of the specified array. * If {@code array} is {@code null}, this method returns 0. */ - public static int nullSafeHashCode(short[] array) { + public static int nullSafeHashCode(@Nullable short[] array) { if (array == null) { return 0; } @@ -604,7 +607,7 @@ public abstract class ObjectUtils { * @return the object's identity as String representation, * or an empty String if the object was {@code null} */ - public static String identityToString(Object obj) { + public static String identityToString(@Nullable Object obj) { if (obj == null) { return EMPTY_STRING; } @@ -629,7 +632,7 @@ public abstract class ObjectUtils { * @return a display String representation of {@code obj} * @see #nullSafeToString(Object) */ - public static String getDisplayString(Object obj) { + public static String getDisplayString(@Nullable Object obj) { if (obj == null) { return EMPTY_STRING; } @@ -642,7 +645,7 @@ public abstract class ObjectUtils { * @param obj the object to introspect (may be {@code null}) * @return the corresponding class name */ - public static String nullSafeClassName(Object obj) { + public static String nullSafeClassName(@Nullable Object obj) { return (obj != null ? obj.getClass().getName() : NULL_STRING); } @@ -653,7 +656,7 @@ public abstract class ObjectUtils { * @param obj the object to build a String representation for * @return a String representation of {@code obj} */ - public static String nullSafeToString(Object obj) { + public static String nullSafeToString(@Nullable Object obj) { if (obj == null) { return NULL_STRING; } @@ -700,7 +703,7 @@ public abstract class ObjectUtils { * @param array the array to build a String representation for * @return a String representation of {@code array} */ - public static String nullSafeToString(Object[] array) { + public static String nullSafeToString(@Nullable Object[] array) { if (array == null) { return NULL_STRING; } @@ -731,7 +734,7 @@ public abstract class ObjectUtils { * @param array the array to build a String representation for * @return a String representation of {@code array} */ - public static String nullSafeToString(boolean[] array) { + public static String nullSafeToString(@Nullable boolean[] array) { if (array == null) { return NULL_STRING; } @@ -763,7 +766,7 @@ public abstract class ObjectUtils { * @param array the array to build a String representation for * @return a String representation of {@code array} */ - public static String nullSafeToString(byte[] array) { + public static String nullSafeToString(@Nullable byte[] array) { if (array == null) { return NULL_STRING; } @@ -794,7 +797,7 @@ public abstract class ObjectUtils { * @param array the array to build a String representation for * @return a String representation of {@code array} */ - public static String nullSafeToString(char[] array) { + public static String nullSafeToString(@Nullable char[] array) { if (array == null) { return NULL_STRING; } @@ -825,7 +828,7 @@ public abstract class ObjectUtils { * @param array the array to build a String representation for * @return a String representation of {@code array} */ - public static String nullSafeToString(double[] array) { + public static String nullSafeToString(@Nullable double[] array) { if (array == null) { return NULL_STRING; } @@ -857,7 +860,7 @@ public abstract class ObjectUtils { * @param array the array to build a String representation for * @return a String representation of {@code array} */ - public static String nullSafeToString(float[] array) { + public static String nullSafeToString(@Nullable float[] array) { if (array == null) { return NULL_STRING; } @@ -889,7 +892,7 @@ public abstract class ObjectUtils { * @param array the array to build a String representation for * @return a String representation of {@code array} */ - public static String nullSafeToString(int[] array) { + public static String nullSafeToString(@Nullable int[] array) { if (array == null) { return NULL_STRING; } @@ -920,7 +923,7 @@ public abstract class ObjectUtils { * @param array the array to build a String representation for * @return a String representation of {@code array} */ - public static String nullSafeToString(long[] array) { + public static String nullSafeToString(@Nullable long[] array) { if (array == null) { return NULL_STRING; } @@ -951,7 +954,7 @@ public abstract class ObjectUtils { * @param array the array to build a String representation for * @return a String representation of {@code array} */ - public static String nullSafeToString(short[] array) { + public static String nullSafeToString(@Nullable short[] array) { if (array == null) { return NULL_STRING; } diff --git a/spring-core/src/main/java/org/springframework/util/PropertyPlaceholderHelper.java b/spring-core/src/main/java/org/springframework/util/PropertyPlaceholderHelper.java index 553d72d7da9..233dd6d7100 100644 --- a/spring-core/src/main/java/org/springframework/util/PropertyPlaceholderHelper.java +++ b/spring-core/src/main/java/org/springframework/util/PropertyPlaceholderHelper.java @@ -25,6 +25,8 @@ import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; + /** * Utility class for working with Strings that have placeholder values in them. A placeholder takes the form * {@code ${name}}. Using {@code PropertyPlaceholderHelper} these placeholders can be substituted for @@ -79,7 +81,7 @@ public class PropertyPlaceholderHelper { * be ignored ({@code true}) or cause an exception ({@code false}) */ public PropertyPlaceholderHelper(String placeholderPrefix, String placeholderSuffix, - String valueSeparator, boolean ignoreUnresolvablePlaceholders) { + @Nullable String valueSeparator, boolean ignoreUnresolvablePlaceholders) { Assert.notNull(placeholderPrefix, "'placeholderPrefix' must not be null"); Assert.notNull(placeholderSuffix, "'placeholderSuffix' must not be null"); @@ -220,6 +222,7 @@ public class PropertyPlaceholderHelper { * @param placeholderName the name of the placeholder to resolve * @return the replacement value, or {@code null} if no replacement is to be made */ + @Nullable String resolvePlaceholder(String placeholderName); } diff --git a/spring-core/src/main/java/org/springframework/util/ReflectionUtils.java b/spring-core/src/main/java/org/springframework/util/ReflectionUtils.java index 434ce082c31..b6655ba2b9e 100644 --- a/spring-core/src/main/java/org/springframework/util/ReflectionUtils.java +++ b/spring-core/src/main/java/org/springframework/util/ReflectionUtils.java @@ -29,6 +29,8 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import org.springframework.lang.Nullable; + /** * Simple utility class for working with the reflection API and handling * reflection exceptions. @@ -75,6 +77,7 @@ public abstract class ReflectionUtils { * @param name the name of the field * @return the corresponding Field object, or {@code null} if not found */ + @Nullable public static Field findField(Class clazz, String name) { return findField(clazz, name, null); } @@ -88,7 +91,8 @@ public abstract class ReflectionUtils { * @param type the type of the field (may be {@code null} if name is specified) * @return the corresponding Field object, or {@code null} if not found */ - public static Field findField(Class clazz, String name, Class type) { + @Nullable + public static Field findField(Class clazz, @Nullable String name, @Nullable Class type) { Assert.notNull(clazz, "Class must not be null"); Assert.isTrue(name != null || type != null, "Either name or type of the field must be specified"); Class searchType = clazz; @@ -115,6 +119,7 @@ public abstract class ReflectionUtils { * @param target the target object on which to set the field * @param value the value to set (may be {@code null}) */ + @Nullable public static void setField(Field field, Object target, Object value) { try { field.set(target, value); @@ -155,6 +160,7 @@ public abstract class ReflectionUtils { * @param name the name of the method * @return the Method object, or {@code null} if none found */ + @Nullable public static Method findMethod(Class clazz, String name) { return findMethod(clazz, name, new Class[0]); } @@ -169,7 +175,8 @@ public abstract class ReflectionUtils { * (may be {@code null} to indicate any signature) * @return the Method object, or {@code null} if none found */ - public static Method findMethod(Class clazz, String name, Class... paramTypes) { + @Nullable + public static Method findMethod(Class clazz, String name, @Nullable Class... paramTypes) { Assert.notNull(clazz, "Class must not be null"); Assert.notNull(name, "Method name must not be null"); Class searchType = clazz; @@ -195,7 +202,8 @@ public abstract class ReflectionUtils { * @return the invocation result, if any * @see #invokeMethod(java.lang.reflect.Method, Object, Object[]) */ - public static Object invokeMethod(Method method, Object target) { + @Nullable + public static Object invokeMethod(Method method, @Nullable Object target) { return invokeMethod(method, target, new Object[0]); } @@ -209,7 +217,8 @@ public abstract class ReflectionUtils { * @param args the invocation arguments (may be {@code null}) * @return the invocation result, if any */ - public static Object invokeMethod(Method method, Object target, Object... args) { + @Nullable + public static Object invokeMethod(Method method, @Nullable Object target, @Nullable Object... args) { try { return method.invoke(target, args); } @@ -228,6 +237,7 @@ public abstract class ReflectionUtils { * @throws SQLException the JDBC API SQLException to rethrow (if any) * @see #invokeJdbcMethod(java.lang.reflect.Method, Object, Object[]) */ + @Nullable public static Object invokeJdbcMethod(Method method, Object target) throws SQLException { return invokeJdbcMethod(method, target, new Object[0]); } @@ -242,7 +252,8 @@ public abstract class ReflectionUtils { * @throws SQLException the JDBC API SQLException to rethrow (if any) * @see #invokeMethod(java.lang.reflect.Method, Object, Object[]) */ - public static Object invokeJdbcMethod(Method method, Object target, Object... args) throws SQLException { + @Nullable + public static Object invokeJdbcMethod(Method method, Object target, @Nullable Object... args) throws SQLException { try { return method.invoke(target, args); } diff --git a/spring-core/src/main/java/org/springframework/util/StopWatch.java b/spring-core/src/main/java/org/springframework/util/StopWatch.java index 997e7c55072..97dedce033e 100644 --- a/spring-core/src/main/java/org/springframework/util/StopWatch.java +++ b/spring-core/src/main/java/org/springframework/util/StopWatch.java @@ -20,6 +20,8 @@ import java.text.NumberFormat; import java.util.LinkedList; import java.util.List; +import org.springframework.lang.Nullable; + /** * Simple stop watch, allowing for timing of a number of tasks, * exposing total running time and running time for each named task. @@ -165,6 +167,7 @@ public class StopWatch { * @since 4.2.2 * @see #isRunning() */ + @Nullable public String currentTaskName() { return this.currentTaskName; } diff --git a/spring-core/src/main/java/org/springframework/util/StreamUtils.java b/spring-core/src/main/java/org/springframework/util/StreamUtils.java index d3374bc3ed8..227f1241411 100644 --- a/spring-core/src/main/java/org/springframework/util/StreamUtils.java +++ b/spring-core/src/main/java/org/springframework/util/StreamUtils.java @@ -28,6 +28,8 @@ import java.io.OutputStreamWriter; import java.io.Writer; import java.nio.charset.Charset; +import org.springframework.lang.Nullable; + /** * Simple utility methods for dealing with streams. The copy methods of this class are * similar to those defined in {@link FileCopyUtils} except that all affected streams are @@ -55,7 +57,7 @@ public abstract class StreamUtils { * @return the new byte array that has been copied to (possibly empty) * @throws IOException in case of I/O errors */ - public static byte[] copyToByteArray(InputStream in) throws IOException { + public static byte[] copyToByteArray(@Nullable InputStream in) throws IOException { if (in == null) { return new byte[0]; } @@ -72,7 +74,7 @@ public abstract class StreamUtils { * @return the String that has been copied to (possibly empty) * @throws IOException in case of I/O errors */ - public static String copyToString(InputStream in, Charset charset) throws IOException { + public static String copyToString(@Nullable InputStream in, Charset charset) throws IOException { if (in == null) { return ""; } diff --git a/spring-core/src/main/java/org/springframework/util/StringUtils.java b/spring-core/src/main/java/org/springframework/util/StringUtils.java index 7de1430c5d9..1cf25b37750 100644 --- a/spring-core/src/main/java/org/springframework/util/StringUtils.java +++ b/spring-core/src/main/java/org/springframework/util/StringUtils.java @@ -33,6 +33,8 @@ import java.util.Set; import java.util.StringTokenizer; import java.util.TimeZone; +import org.springframework.lang.Nullable; + /** * Miscellaneous {@link String} utility methods. * @@ -83,7 +85,7 @@ public abstract class StringUtils { * @param str the candidate String * @since 3.2.1 */ - public static boolean isEmpty(Object str) { + public static boolean isEmpty(@Nullable Object str) { return (str == null || "".equals(str)); } @@ -102,7 +104,7 @@ public abstract class StringUtils { * @return {@code true} if the {@code CharSequence} is not {@code null} and has length * @see #hasText(String) */ - public static boolean hasLength(CharSequence str) { + public static boolean hasLength(@Nullable CharSequence str) { return (str != null && str.length() > 0); } @@ -115,7 +117,7 @@ public abstract class StringUtils { * @see #hasLength(CharSequence) * @see #hasText(String) */ - public static boolean hasLength(String str) { + public static boolean hasLength(@Nullable String str) { return hasLength((CharSequence) str); } @@ -136,7 +138,7 @@ public abstract class StringUtils { * its length is greater than 0, and it does not contain whitespace only * @see Character#isWhitespace */ - public static boolean hasText(CharSequence str) { + public static boolean hasText(@Nullable CharSequence str) { if (!hasLength(str)) { return false; } @@ -160,7 +162,7 @@ public abstract class StringUtils { * length is greater than 0, and it does not contain whitespace only * @see #hasText(CharSequence) */ - public static boolean hasText(String str) { + public static boolean hasText(@Nullable String str) { return hasText((CharSequence) str); } @@ -171,7 +173,7 @@ public abstract class StringUtils { * contains at least 1 whitespace character * @see Character#isWhitespace */ - public static boolean containsWhitespace(CharSequence str) { + public static boolean containsWhitespace(@Nullable CharSequence str) { if (!hasLength(str)) { return false; } @@ -192,7 +194,7 @@ public abstract class StringUtils { * contains at least 1 whitespace character * @see #containsWhitespace(CharSequence) */ - public static boolean containsWhitespace(String str) { + public static boolean containsWhitespace(@Nullable String str) { return containsWhitespace((CharSequence) str); } @@ -381,7 +383,7 @@ public abstract class StringUtils { * @param str string to search in. Return 0 if this is {@code null}. * @param sub string to search for. Return 0 if this is {@code null}. */ - public static int countOccurrencesOf(String str, String sub) { + public static int countOccurrencesOf(@Nullable String str, @Nullable String sub) { if (!hasLength(str) || !hasLength(sub)) { return 0; } @@ -477,7 +479,8 @@ public abstract class StringUtils { * @return the quoted {@code String} (e.g. "'myString'"), * or {@code null} if the input was {@code null} */ - public static String quote(String str) { + @Nullable + public static String quote(@Nullable String str) { return (str != null ? "'" + str + "'" : null); } @@ -519,7 +522,8 @@ public abstract class StringUtils { * @return the capitalized {@code String}, or {@code null} if the supplied * string is {@code null} */ - public static String capitalize(String str) { + @Nullable + public static String capitalize(@Nullable String str) { return changeFirstCharacterCase(str, true); } @@ -531,7 +535,8 @@ public abstract class StringUtils { * @return the uncapitalized {@code String}, or {@code null} if the supplied * string is {@code null} */ - public static String uncapitalize(String str) { + @Nullable + public static String uncapitalize(@Nullable String str) { return changeFirstCharacterCase(str, false); } @@ -563,7 +568,8 @@ public abstract class StringUtils { * @param path the file path (may be {@code null}) * @return the extracted filename, or {@code null} if none */ - public static String getFilename(String path) { + @Nullable + public static String getFilename(@Nullable String path) { if (path == null) { return null; } @@ -578,7 +584,8 @@ public abstract class StringUtils { * @param path the file path (may be {@code null}) * @return the extracted filename extension, or {@code null} if none */ - public static String getFilenameExtension(String path) { + @Nullable + public static String getFilenameExtension(@Nullable String path) { if (path == null) { return null; } @@ -603,7 +610,8 @@ public abstract class StringUtils { * @return the path with stripped filename extension, * or {@code null} if none */ - public static String stripFilenameExtension(String path) { + @Nullable + public static String stripFilenameExtension(@Nullable String path) { if (path == null) { return null; } @@ -735,7 +743,8 @@ public abstract class StringUtils { * @since 5.0 * @see java.net.URLDecoder#decode(String, String) */ - public static String uriDecode(String source, Charset charset) { + @Nullable + public static String uriDecode(@Nullable String source, Charset charset) { if (source == null) { return null; } @@ -853,7 +862,7 @@ public abstract class StringUtils { * @param str the {@code String} to append * @return the new array (never {@code null}) */ - public static String[] addStringToArray(String[] array, String str) { + public static String[] addStringToArray(@Nullable String[] array, String str) { if (ObjectUtils.isEmpty(array)) { return new String[] {str}; } @@ -872,7 +881,8 @@ public abstract class StringUtils { * @param array2 the second array (can be {@code null}) * @return the new array ({@code null} if both given arrays were {@code null}) */ - public static String[] concatenateStringArrays(String[] array1, String[] array2) { + @Nullable + public static String[] concatenateStringArrays(@Nullable String[] array1, @Nullable String[] array2) { if (ObjectUtils.isEmpty(array1)) { return array2; } @@ -896,7 +906,8 @@ public abstract class StringUtils { * @param array2 the second array (can be {@code null}) * @return the new array ({@code null} if both given arrays were {@code null}) */ - public static String[] mergeStringArrays(String[] array1, String[] array2) { + @Nullable + public static String[] mergeStringArrays(@Nullable String[] array1, @Nullable String[] array2) { if (ObjectUtils.isEmpty(array1)) { return array2; } @@ -935,7 +946,8 @@ public abstract class StringUtils { * @return the {@code String} array ({@code null} if the supplied * {@code Collection} was {@code null}) */ - public static String[] toStringArray(Collection collection) { + @Nullable + public static String[] toStringArray(@Nullable Collection collection) { if (collection == null) { return null; } @@ -950,7 +962,8 @@ public abstract class StringUtils { * @return the {@code String} array ({@code null} if the passed-in * Enumeration was {@code null}) */ - public static String[] toStringArray(Enumeration enumeration) { + @Nullable + public static String[] toStringArray(@Nullable Enumeration enumeration) { if (enumeration == null) { return null; } @@ -1005,6 +1018,7 @@ public abstract class StringUtils { * index 1 being after the delimiter (neither element includes the delimiter); * or {@code null} if the delimiter wasn't found in the given input {@code String} */ + @Nullable public static String[] split(String toSplit, String delimiter) { if (!hasLength(toSplit) || !hasLength(delimiter)) { return null; @@ -1030,6 +1044,7 @@ public abstract class StringUtils { * @return a {@code Properties} instance representing the array contents, * or {@code null} if the array to process was {@code null} or empty */ + @Nullable public static Properties splitArrayElementsIntoProperties(String[] array, String delimiter) { return splitArrayElementsIntoProperties(array, delimiter, null); } @@ -1048,6 +1063,7 @@ public abstract class StringUtils { * @return a {@code Properties} instance representing the array contents, * or {@code null} if the array to process was {@code null} or empty */ + @Nullable public static Properties splitArrayElementsIntoProperties( String[] array, String delimiter, String charsToDelete) { @@ -1109,8 +1125,9 @@ public abstract class StringUtils { * @see String#trim() * @see #delimitedListToStringArray */ + @Nullable public static String[] tokenizeToStringArray( - String str, String delimiters, boolean trimTokens, boolean ignoreEmptyTokens) { + @Nullable String str, String delimiters, boolean trimTokens, boolean ignoreEmptyTokens) { if (str == null) { return null; diff --git a/spring-core/src/main/java/org/springframework/util/StringValueResolver.java b/spring-core/src/main/java/org/springframework/util/StringValueResolver.java index 8ed24ea7d24..61610cf5d42 100644 --- a/spring-core/src/main/java/org/springframework/util/StringValueResolver.java +++ b/spring-core/src/main/java/org/springframework/util/StringValueResolver.java @@ -16,6 +16,8 @@ package org.springframework.util; +import org.springframework.lang.Nullable; + /** * Simple strategy interface for resolving a String value. * Used by {@link org.springframework.beans.factory.config.ConfigurableBeanFactory}. @@ -37,6 +39,7 @@ public interface StringValueResolver { * to resolve or when ignoring unresolvable placeholders) * @throws IllegalArgumentException in case of an unresolvable String value */ - String resolveStringValue(String strVal); + @Nullable + String resolveStringValue(@Nullable String strVal); } diff --git a/spring-core/src/main/java/org/springframework/util/backoff/package-info.java b/spring-core/src/main/java/org/springframework/util/backoff/package-info.java index 6bace757236..e23152d7732 100644 --- a/spring-core/src/main/java/org/springframework/util/backoff/package-info.java +++ b/spring-core/src/main/java/org/springframework/util/backoff/package-info.java @@ -1,4 +1,7 @@ /** * A generic back-off abstraction. */ +@NonNullApi package org.springframework.util.backoff; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/util/comparator/package-info.java b/spring-core/src/main/java/org/springframework/util/comparator/package-info.java index 27b860fed4e..29821e3ae2e 100644 --- a/spring-core/src/main/java/org/springframework/util/comparator/package-info.java +++ b/spring-core/src/main/java/org/springframework/util/comparator/package-info.java @@ -2,4 +2,7 @@ * Useful generic {@code java.util.Comparator} implementations, * such as an invertible comparator and a compound comparator. */ +@NonNullApi package org.springframework.util.comparator; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/util/concurrent/package-info.java b/spring-core/src/main/java/org/springframework/util/concurrent/package-info.java index 75b626eb290..5bc5f5d0464 100644 --- a/spring-core/src/main/java/org/springframework/util/concurrent/package-info.java +++ b/spring-core/src/main/java/org/springframework/util/concurrent/package-info.java @@ -1,4 +1,7 @@ /** * Useful generic {@code java.util.concurrent.Future} extension. */ +@NonNullApi package org.springframework.util.concurrent; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/util/package-info.java b/spring-core/src/main/java/org/springframework/util/package-info.java index 7c6dd17d207..b1f68b55ab8 100644 --- a/spring-core/src/main/java/org/springframework/util/package-info.java +++ b/spring-core/src/main/java/org/springframework/util/package-info.java @@ -2,4 +2,7 @@ * Miscellaneous utility classes, such as String manipulation utilities, * a Log4J configurer, and a state holder for paged lists of objects. */ +@NonNullApi package org.springframework.util; + +import org.springframework.lang.NonNullApi; diff --git a/spring-core/src/main/java/org/springframework/util/xml/AbstractXMLEventReader.java b/spring-core/src/main/java/org/springframework/util/xml/AbstractXMLEventReader.java index 12a934b9811..79bc00a192e 100644 --- a/spring-core/src/main/java/org/springframework/util/xml/AbstractXMLEventReader.java +++ b/spring-core/src/main/java/org/springframework/util/xml/AbstractXMLEventReader.java @@ -23,6 +23,7 @@ import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Characters; import javax.xml.stream.events.XMLEvent; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -78,6 +79,7 @@ abstract class AbstractXMLEventReader implements XMLEventReader { } @Override + @Nullable public XMLEvent nextTag() throws XMLStreamException { checkIfClosed(); while (true) { diff --git a/spring-core/src/main/java/org/springframework/util/xml/AbstractXMLStreamReader.java b/spring-core/src/main/java/org/springframework/util/xml/AbstractXMLStreamReader.java index 6335ea156f6..dbb4c644a14 100644 --- a/spring-core/src/main/java/org/springframework/util/xml/AbstractXMLStreamReader.java +++ b/spring-core/src/main/java/org/springframework/util/xml/AbstractXMLStreamReader.java @@ -21,6 +21,7 @@ import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -162,6 +163,7 @@ abstract class AbstractXMLStreamReader implements XMLStreamReader { } @Override + @Nullable public String getAttributeValue(String namespaceURI, String localName) { for (int i = 0; i < getAttributeCount(); i++) { QName name = getAttributeName(i); diff --git a/spring-core/src/main/java/org/springframework/util/xml/DomUtils.java b/spring-core/src/main/java/org/springframework/util/xml/DomUtils.java index 6d2988fd738..8a6c73fdfe4 100644 --- a/spring-core/src/main/java/org/springframework/util/xml/DomUtils.java +++ b/spring-core/src/main/java/org/springframework/util/xml/DomUtils.java @@ -29,6 +29,7 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.ContentHandler; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -91,6 +92,7 @@ public abstract class DomUtils { * @param childEleName the child element name to look for * @return the {@code org.w3c.dom.Element} instance, or {@code null} if none found */ + @Nullable public static Element getChildElementByTagName(Element ele, String childEleName) { Assert.notNull(ele, "Element must not be null"); Assert.notNull(childEleName, "Element name must not be null"); @@ -110,6 +112,7 @@ public abstract class DomUtils { * @param childEleName the child element name to look for * @return the extracted text value, or {@code null} if no child element found */ + @Nullable public static String getChildElementValueByTagName(Element ele, String childEleName) { Element child = getChildElementByTagName(ele, childEleName); return (child != null ? getTextValue(child) : null); diff --git a/spring-core/src/main/java/org/springframework/util/xml/ListBasedXMLEventReader.java b/spring-core/src/main/java/org/springframework/util/xml/ListBasedXMLEventReader.java index 6abb577ea1c..f409ee0d31d 100644 --- a/spring-core/src/main/java/org/springframework/util/xml/ListBasedXMLEventReader.java +++ b/spring-core/src/main/java/org/springframework/util/xml/ListBasedXMLEventReader.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.NoSuchElementException; import javax.xml.stream.events.XMLEvent; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -58,6 +59,7 @@ class ListBasedXMLEventReader extends AbstractXMLEventReader { } @Override + @Nullable public XMLEvent peek() { if (this.cursor < this.events.size()) { return this.events.get(this.cursor); diff --git a/spring-core/src/main/java/org/springframework/util/xml/StaxResult.java b/spring-core/src/main/java/org/springframework/util/xml/StaxResult.java index a8d9bfa26f6..d805ecb7bdd 100644 --- a/spring-core/src/main/java/org/springframework/util/xml/StaxResult.java +++ b/spring-core/src/main/java/org/springframework/util/xml/StaxResult.java @@ -23,6 +23,8 @@ import javax.xml.transform.sax.SAXResult; import org.xml.sax.ContentHandler; import org.xml.sax.ext.LexicalHandler; +import org.springframework.lang.Nullable; + /** * Implementation of the {@code Result} tagging interface for StAX writers. Can be constructed with * an {@code XMLEventConsumer} or an {@code XMLStreamWriter}. @@ -80,6 +82,7 @@ class StaxResult extends SAXResult { * @return the StAX event writer used by this result * @see #StaxResult(javax.xml.stream.XMLEventWriter) */ + @Nullable public XMLEventWriter getXMLEventWriter() { return this.eventWriter; } @@ -90,6 +93,7 @@ class StaxResult extends SAXResult { * @return the StAX stream writer used by this result * @see #StaxResult(javax.xml.stream.XMLStreamWriter) */ + @Nullable public XMLStreamWriter getXMLStreamWriter() { return this.streamWriter; } diff --git a/spring-core/src/main/java/org/springframework/util/xml/StaxSource.java b/spring-core/src/main/java/org/springframework/util/xml/StaxSource.java index 5706a4317ed..bfddf82f284 100644 --- a/spring-core/src/main/java/org/springframework/util/xml/StaxSource.java +++ b/spring-core/src/main/java/org/springframework/util/xml/StaxSource.java @@ -23,6 +23,8 @@ import javax.xml.transform.sax.SAXSource; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; +import org.springframework.lang.Nullable; + /** * Implementation of the {@code Source} tagging interface for StAX readers. Can be constructed with * an {@code XMLEventReader} or an {@code XMLStreamReader}. @@ -81,6 +83,7 @@ class StaxSource extends SAXSource { * @return the StAX event reader used by this source * @see StaxSource#StaxSource(javax.xml.stream.XMLEventReader) */ + @Nullable XMLEventReader getXMLEventReader() { return this.eventReader; } @@ -91,6 +94,7 @@ class StaxSource extends SAXSource { * @return the StAX event reader used by this source * @see StaxSource#StaxSource(javax.xml.stream.XMLEventReader) */ + @Nullable XMLStreamReader getXMLStreamReader() { return this.streamReader; } diff --git a/spring-core/src/main/java/org/springframework/util/xml/XMLEventStreamReader.java b/spring-core/src/main/java/org/springframework/util/xml/XMLEventStreamReader.java index 134cbdc68d4..cd5c82ee177 100644 --- a/spring-core/src/main/java/org/springframework/util/xml/XMLEventStreamReader.java +++ b/spring-core/src/main/java/org/springframework/util/xml/XMLEventStreamReader.java @@ -29,6 +29,8 @@ import javax.xml.stream.events.ProcessingInstruction; import javax.xml.stream.events.StartDocument; import javax.xml.stream.events.XMLEvent; +import org.springframework.lang.Nullable; + /** * Implementation of the {@link javax.xml.stream.XMLStreamReader} interface that wraps a * {@link XMLEventReader}. Useful because the StAX {@link javax.xml.stream.XMLInputFactory} @@ -75,6 +77,7 @@ class XMLEventStreamReader extends AbstractXMLStreamReader { } @Override + @Nullable public String getVersion() { if (this.event.isStartDocument()) { return ((StartDocument) this.event).getVersion(); @@ -110,11 +113,13 @@ class XMLEventStreamReader extends AbstractXMLStreamReader { } @Override + @Nullable public String getEncoding() { return null; } @Override + @Nullable public String getCharacterEncodingScheme() { return null; } diff --git a/spring-core/src/main/java/org/springframework/util/xml/package-info.java b/spring-core/src/main/java/org/springframework/util/xml/package-info.java index 058f1c6411d..7189bdb565a 100644 --- a/spring-core/src/main/java/org/springframework/util/xml/package-info.java +++ b/spring-core/src/main/java/org/springframework/util/xml/package-info.java @@ -2,4 +2,7 @@ * Miscellaneous utility classes for XML parsing and transformation, * such as error handlers that log warnings via Commons Logging. */ +@NonNullApi package org.springframework.util.xml; + +import org.springframework.lang.NonNullApi; diff --git a/spring-expression/src/main/java/org/springframework/expression/ConstructorResolver.java b/spring-expression/src/main/java/org/springframework/expression/ConstructorResolver.java index 30255ac2e61..dc8e636c969 100644 --- a/spring-expression/src/main/java/org/springframework/expression/ConstructorResolver.java +++ b/spring-expression/src/main/java/org/springframework/expression/ConstructorResolver.java @@ -19,6 +19,7 @@ package org.springframework.expression; import java.util.List; import org.springframework.core.convert.TypeDescriptor; +import org.springframework.lang.Nullable; /** * A constructor resolver attempts locate a constructor and returns a ConstructorExecutor @@ -40,6 +41,7 @@ public interface ConstructorResolver { * @param argumentTypes the arguments that the constructor must be able to handle * @return a ConstructorExecutor that can invoke the constructor, or null if non found */ + @Nullable ConstructorExecutor resolve(EvaluationContext context, String typeName, List argumentTypes) throws AccessException; diff --git a/spring-expression/src/main/java/org/springframework/expression/MethodResolver.java b/spring-expression/src/main/java/org/springframework/expression/MethodResolver.java index e33dc8423fe..9871ab87942 100644 --- a/spring-expression/src/main/java/org/springframework/expression/MethodResolver.java +++ b/spring-expression/src/main/java/org/springframework/expression/MethodResolver.java @@ -19,6 +19,7 @@ package org.springframework.expression; import java.util.List; import org.springframework.core.convert.TypeDescriptor; +import org.springframework.lang.Nullable; /** * A method resolver attempts locate a method and returns a command executor that can be @@ -39,6 +40,7 @@ public interface MethodResolver { * @param argumentTypes the arguments that the constructor must be able to handle * @return a MethodExecutor that can invoke the method, or null if the method cannot be found */ + @Nullable MethodExecutor resolve(EvaluationContext context, Object targetObject, String name, List argumentTypes) throws AccessException; diff --git a/spring-expression/src/main/java/org/springframework/expression/PropertyAccessor.java b/spring-expression/src/main/java/org/springframework/expression/PropertyAccessor.java index e6c78b14de4..084a081890f 100644 --- a/spring-expression/src/main/java/org/springframework/expression/PropertyAccessor.java +++ b/spring-expression/src/main/java/org/springframework/expression/PropertyAccessor.java @@ -17,6 +17,8 @@ package org.springframework.expression; +import org.springframework.lang.Nullable; + /** * A property accessor is able to read from (and possibly write to) an object's properties. * This interface places no restrictions, and so implementors are free to access properties @@ -43,6 +45,7 @@ public interface PropertyAccessor { * @return an array of classes that this resolver is suitable for * (or {@code null} if a general resolver) */ + @Nullable Class[] getSpecificTargetClasses(); /** diff --git a/spring-expression/src/main/java/org/springframework/expression/TypeConverter.java b/spring-expression/src/main/java/org/springframework/expression/TypeConverter.java index ee78104dcad..6a012474ad1 100644 --- a/spring-expression/src/main/java/org/springframework/expression/TypeConverter.java +++ b/spring-expression/src/main/java/org/springframework/expression/TypeConverter.java @@ -17,6 +17,7 @@ package org.springframework.expression; import org.springframework.core.convert.TypeDescriptor; +import org.springframework.lang.Nullable; /** * A type converter can convert values between different types encountered during @@ -53,6 +54,7 @@ public interface TypeConverter { * @return the converted value * @throws EvaluationException if conversion failed or is not possible to begin with */ + @Nullable Object convertValue(Object value, TypeDescriptor sourceType, TypeDescriptor targetType); } diff --git a/spring-expression/src/main/java/org/springframework/expression/common/package-info.java b/spring-expression/src/main/java/org/springframework/expression/common/package-info.java index 7cf633a44bc..c572c5bdd12 100644 --- a/spring-expression/src/main/java/org/springframework/expression/common/package-info.java +++ b/spring-expression/src/main/java/org/springframework/expression/common/package-info.java @@ -1,4 +1,7 @@ /** * Common utility classes behind the Spring Expression Language. */ +@NonNullApi package org.springframework.expression.common; + +import org.springframework.lang.NonNullApi; diff --git a/spring-expression/src/main/java/org/springframework/expression/package-info.java b/spring-expression/src/main/java/org/springframework/expression/package-info.java index e7631cc36bc..b01674cf183 100644 --- a/spring-expression/src/main/java/org/springframework/expression/package-info.java +++ b/spring-expression/src/main/java/org/springframework/expression/package-info.java @@ -1,4 +1,7 @@ /** * Core abstractions behind the Spring Expression Language. */ +@NonNullApi package org.springframework.expression; + +import org.springframework.lang.NonNullApi; diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/CodeFlow.java b/spring-expression/src/main/java/org/springframework/expression/spel/CodeFlow.java index 259215d052f..9672f4cff32 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/CodeFlow.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/CodeFlow.java @@ -25,6 +25,7 @@ import java.util.Stack; import org.springframework.asm.ClassWriter; import org.springframework.asm.MethodVisitor; import org.springframework.asm.Opcodes; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -148,6 +149,7 @@ public class CodeFlow implements Opcodes { /** * Return the descriptor for the item currently on top of the stack (in the current scope). */ + @Nullable public String lastDescriptor() { if (this.compilationScopes.peek().isEmpty()) { return null; @@ -508,7 +510,8 @@ public class CodeFlow implements Opcodes { * @return the type descriptor for the object * (descriptor is "Ljava/lang/Object" for {@code null} value) */ - public static String toDescriptorFromObject(Object value) { + @Nullable + public static String toDescriptorFromObject(@Nullable Object value) { if (value == null) { return "Ljava/lang/Object"; } @@ -768,6 +771,7 @@ public class CodeFlow implements Opcodes { * @param type the type (may be primitive) for which to determine the descriptor * @return the descriptor */ + @Nullable public static String toDescriptor(Class type) { String name = type.getName(); if (type.isPrimitive()) { diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/ExpressionState.java b/spring-expression/src/main/java/org/springframework/expression/spel/ExpressionState.java index 7b45e34ba53..e1cbfbd4530 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/ExpressionState.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/ExpressionState.java @@ -31,6 +31,7 @@ import org.springframework.expression.PropertyAccessor; import org.springframework.expression.TypeComparator; import org.springframework.expression.TypeConverter; import org.springframework.expression.TypedValue; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -204,6 +205,7 @@ public class ExpressionState { this.variableScopes.peek().setVariable(name, value); } + @Nullable public Object lookupLocalVariable(String name) { ensureVariableScopesInitialized(); int scopeNumber = this.variableScopes.size() - 1; diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/SpelNode.java b/spring-expression/src/main/java/org/springframework/expression/spel/SpelNode.java index 1088a98e4fa..fd527c93ed4 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/SpelNode.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/SpelNode.java @@ -18,6 +18,7 @@ package org.springframework.expression.spel; import org.springframework.expression.EvaluationException; import org.springframework.expression.TypedValue; +import org.springframework.lang.Nullable; /** * Represents a node in the Ast for a parsed expression. @@ -85,6 +86,7 @@ public interface SpelNode { * @return the class of the object if it is not already a class object, * or {@code null} if the object is {@code null} */ + @Nullable Class getObjectClass(Object obj); /** diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/ast/ConstructorReference.java b/spring-expression/src/main/java/org/springframework/expression/spel/ast/ConstructorReference.java index 70cf696b89f..fa56e3aba8a 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/ast/ConstructorReference.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/ast/ConstructorReference.java @@ -39,6 +39,7 @@ import org.springframework.expression.spel.SpelEvaluationException; import org.springframework.expression.spel.SpelMessage; import org.springframework.expression.spel.SpelNode; import org.springframework.expression.spel.support.ReflectiveConstructorExecutor; +import org.springframework.lang.Nullable; /** * Represents the invocation of a constructor. Either a constructor on a regular type or @@ -178,6 +179,7 @@ public class ConstructorReference extends SpelNodeImpl { * @return a reusable ConstructorExecutor that can be invoked to run the constructor or null * @throws SpelEvaluationException if there is a problem locating the constructor */ + @Nullable private ConstructorExecutor findExecutorForConstructor(String typeName, List argumentTypes, ExpressionState state) throws SpelEvaluationException { diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/ast/MethodReference.java b/spring-expression/src/main/java/org/springframework/expression/spel/ast/MethodReference.java index 63831a5ab0e..7618c2f7efb 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/ast/MethodReference.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/ast/MethodReference.java @@ -38,6 +38,7 @@ import org.springframework.expression.spel.SpelEvaluationException; import org.springframework.expression.spel.SpelMessage; import org.springframework.expression.spel.support.ReflectiveMethodExecutor; import org.springframework.expression.spel.support.ReflectiveMethodResolver; +import org.springframework.lang.Nullable; /** * Expression language AST node that represents a method reference. @@ -168,6 +169,7 @@ public class MethodReference extends SpelNodeImpl { return Collections.unmodifiableList(descriptors); } + @Nullable private MethodExecutor getCachedExecutor(EvaluationContext evaluationContext, Object value, TypeDescriptor target, List argumentTypes) { diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/ast/Operator.java b/spring-expression/src/main/java/org/springframework/expression/spel/ast/Operator.java index f033519e5af..c5103011d71 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/ast/Operator.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/ast/Operator.java @@ -23,6 +23,7 @@ import org.springframework.asm.Label; import org.springframework.asm.MethodVisitor; import org.springframework.expression.EvaluationContext; import org.springframework.expression.spel.CodeFlow; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.NumberUtils; import org.springframework.util.ObjectUtils; @@ -61,6 +62,7 @@ public abstract class Operator extends SpelNodeImpl { return this.children[0]; } + @Nullable public SpelNodeImpl getRightOperand() { return this.children[1]; } diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/ast/package-info.java b/spring-expression/src/main/java/org/springframework/expression/spel/ast/package-info.java index d601d80eeed..d7fdffbbaf6 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/ast/package-info.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/ast/package-info.java @@ -1,4 +1,7 @@ /** * SpEL's abstract syntax tree. */ +@NonNullApi package org.springframework.expression.spel.ast; + +import org.springframework.lang.NonNullApi; diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/package-info.java b/spring-expression/src/main/java/org/springframework/expression/spel/package-info.java index 89c07e63b14..7f1ca0322f2 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/package-info.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/package-info.java @@ -1,4 +1,7 @@ /** * SpEL's central implementation package. */ +@NonNullApi package org.springframework.expression.spel; + +import org.springframework.lang.NonNullApi; diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/standard/InternalSpelExpressionParser.java b/spring-expression/src/main/java/org/springframework/expression/spel/standard/InternalSpelExpressionParser.java index 0f09391bce7..16465eedbdc 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/standard/InternalSpelExpressionParser.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/standard/InternalSpelExpressionParser.java @@ -72,6 +72,7 @@ import org.springframework.expression.spel.ast.StringLiteral; import org.springframework.expression.spel.ast.Ternary; import org.springframework.expression.spel.ast.TypeReference; import org.springframework.expression.spel.ast.VariableReference; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -374,6 +375,7 @@ class InternalSpelExpressionParser extends TemplateAwareExpressionParser { } // nonDottedNode: indexer; + @Nullable private SpelNodeImpl maybeEatNonDottedNode() { if (peekToken(TokenKind.LSQUARE)) { if (maybeEatIndexer()) { @@ -392,6 +394,7 @@ class InternalSpelExpressionParser extends TemplateAwareExpressionParser { // | lastSelection // )) // ; + @Nullable private SpelNodeImpl eatDottedNode() { Token t = nextToken(); // it was a '.' or a '?.' boolean nullSafeNavigation = (t.kind == TokenKind.SAFE_NAVI); @@ -434,6 +437,7 @@ class InternalSpelExpressionParser extends TemplateAwareExpressionParser { } // methodArgs : LPAREN! (argument (COMMA! argument)* (COMMA!)?)? RPAREN!; + @Nullable private SpelNodeImpl[] maybeEatMethodArgs() { if (!peekToken(TokenKind.LPAREN)) { return null; @@ -497,6 +501,7 @@ class InternalSpelExpressionParser extends TemplateAwareExpressionParser { // | lastSelection // | indexer // | constructor + @Nullable private SpelNodeImpl eatStartNode() { if (maybeEatLiteral()) { return pop(); @@ -888,6 +893,7 @@ class InternalSpelExpressionParser extends TemplateAwareExpressionParser { // relationalOperator // : EQUAL | NOT_EQUAL | LESS_THAN | LESS_THAN_OR_EQUAL | GREATER_THAN // | GREATER_THAN_OR_EQUAL | INSTANCEOF | BETWEEN | MATCHES + @Nullable private Token maybeEatRelationalOperator() { Token t = peekToken(); if (t == null) { @@ -988,6 +994,7 @@ class InternalSpelExpressionParser extends TemplateAwareExpressionParser { return this.tokenStreamPointer= this.tokenStreamLength) { return null; @@ -995,6 +1002,7 @@ class InternalSpelExpressionParser extends TemplateAwareExpressionParser { return this.tokenStream.get(this.tokenStreamPointer++); } + @Nullable private Token peekToken() { if (this.tokenStreamPointer >= this.tokenStreamLength) { return null; diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/standard/SpelCompiler.java b/spring-expression/src/main/java/org/springframework/expression/spel/standard/SpelCompiler.java index 9d29944c340..ff79a7fa54c 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/standard/SpelCompiler.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/standard/SpelCompiler.java @@ -35,6 +35,7 @@ import org.springframework.expression.spel.CodeFlow; import org.springframework.expression.spel.CompiledExpression; import org.springframework.expression.spel.SpelParserConfiguration; import org.springframework.expression.spel.ast.SpelNodeImpl; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ConcurrentReferenceHashMap; import org.springframework.util.ReflectionUtils; @@ -97,6 +98,7 @@ public class SpelCompiler implements Opcodes { * @return an instance of the class implementing the compiled expression, or null * if compilation is not possible */ + @Nullable public CompiledExpression compile(SpelNodeImpl expression) { if (expression.isCompilable()) { if (logger.isDebugEnabled()) { @@ -130,6 +132,7 @@ public class SpelCompiler implements Opcodes { * @return the expression call, or {@code null} if the decision was to opt out of * compilation during code generation */ + @Nullable private Class createExpressionClass(SpelNodeImpl expressionToCompile) { // Create class outline 'spel/ExNNN extends org.springframework.expression.spel.CompiledExpression' String clazzName = "spel/Ex" + getNextSuffix(); diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/standard/package-info.java b/spring-expression/src/main/java/org/springframework/expression/spel/standard/package-info.java index a7f7fd14f59..a33e8e3f66e 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/standard/package-info.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/standard/package-info.java @@ -1,4 +1,7 @@ /** * SpEL's standard parser implementation. */ +@NonNullApi package org.springframework.expression.spel.standard; + +import org.springframework.lang.NonNullApi; diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectionHelper.java b/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectionHelper.java index e4a1613370b..ef7843a90fc 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectionHelper.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectionHelper.java @@ -26,6 +26,7 @@ import org.springframework.core.convert.TypeDescriptor; import org.springframework.expression.EvaluationException; import org.springframework.expression.TypeConverter; import org.springframework.expression.spel.SpelEvaluationException; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.MethodInvoker; @@ -50,6 +51,7 @@ public class ReflectionHelper { * @return a MatchInfo object indicating what kind of match it was, * or {@code null} if it was not a match */ + @Nullable static ArgumentsMatchInfo compareArguments( List expectedArgTypes, List suppliedArgTypes, TypeConverter typeConverter) { @@ -139,6 +141,7 @@ public class ReflectionHelper { * @return a MatchInfo object indicating what kind of match it was, * or {@code null} if it was not a match */ + @Nullable static ArgumentsMatchInfo compareArgumentsVarargs( List expectedArgTypes, List suppliedArgTypes, TypeConverter typeConverter) { @@ -257,8 +260,9 @@ public class ReflectionHelper { * @return {@code true} if some kind of conversion occurred on an argument * @throws EvaluationException if a problem occurs during conversion */ + @Nullable static boolean convertArguments(TypeConverter converter, Object[] arguments, Executable executable, - Integer varargsPosition) throws EvaluationException { + @Nullable Integer varargsPosition) throws EvaluationException { boolean conversionOccurred = false; if (varargsPosition == null) { diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectiveMethodExecutor.java b/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectiveMethodExecutor.java index b2798c3ddab..1a038be186e 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectiveMethodExecutor.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectiveMethodExecutor.java @@ -25,6 +25,7 @@ import org.springframework.expression.AccessException; import org.springframework.expression.EvaluationContext; import org.springframework.expression.MethodExecutor; import org.springframework.expression.TypedValue; +import org.springframework.lang.Nullable; import org.springframework.util.ReflectionUtils; /** @@ -75,6 +76,7 @@ public class ReflectiveMethodExecutor implements MethodExecutor { return this.publicDeclaringClass; } + @Nullable private Class discoverPublicClass(Method method, Class clazz) { if (Modifier.isPublic(clazz.getModifiers())) { try { diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectivePropertyAccessor.java b/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectivePropertyAccessor.java index 1841995d781..9be665ece2c 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectivePropertyAccessor.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectivePropertyAccessor.java @@ -40,6 +40,7 @@ import org.springframework.expression.PropertyAccessor; import org.springframework.expression.TypedValue; import org.springframework.expression.spel.CodeFlow; import org.springframework.expression.spel.CompilablePropertyAccessor; +import org.springframework.lang.Nullable; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; @@ -367,6 +368,7 @@ public class ReflectivePropertyAccessor implements PropertyAccessor { "set", clazz, mustBeStatic, 1, ANY_TYPES); } + @Nullable private Method findMethodForProperty(String[] methodSuffixes, String prefix, Class clazz, boolean mustBeStatic, int numberOfParams, Set> requiredReturnTypes) { @@ -427,6 +429,7 @@ public class ReflectivePropertyAccessor implements PropertyAccessor { /** * Find a field of a certain name on a specified class. */ + @Nullable protected Field findField(String name, Class clazz, boolean mustBeStatic) { Field[] fields = clazz.getFields(); for (Field field : fields) { diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/support/package-info.java b/spring-expression/src/main/java/org/springframework/expression/spel/support/package-info.java index d5503bc8704..513c0656726 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/support/package-info.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/support/package-info.java @@ -1,4 +1,7 @@ /** * SpEL's default implementations for various core abstractions. */ +@NonNullApi package org.springframework.expression.spel.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/config/DatabasePopulatorConfigUtils.java b/spring-jdbc/src/main/java/org/springframework/jdbc/config/DatabasePopulatorConfigUtils.java index 276b8bfa0c3..5c32c678d7c 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/config/DatabasePopulatorConfigUtils.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/config/DatabasePopulatorConfigUtils.java @@ -27,6 +27,7 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.ManagedList; import org.springframework.jdbc.datasource.init.CompositeDatabasePopulator; import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; @@ -82,6 +83,7 @@ class DatabasePopulatorConfigUtils { return builder.getBeanDefinition(); } + @Nullable private static String getSeparator(Element element, Element scriptElement) { String scriptSeparator = scriptElement.getAttribute("separator"); if (StringUtils.hasLength(scriptSeparator)) { diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/config/package-info.java b/spring-jdbc/src/main/java/org/springframework/jdbc/config/package-info.java index 26bc92c9c31..770d44e0a11 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/config/package-info.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/config/package-info.java @@ -1,4 +1,7 @@ /** * Defines the Spring JDBC configuration namespace. */ +@NonNullApi package org.springframework.jdbc.config; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/BeanPropertyRowMapper.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/BeanPropertyRowMapper.java index 51833133f13..c7f2b2eb49a 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/BeanPropertyRowMapper.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/BeanPropertyRowMapper.java @@ -39,6 +39,7 @@ import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.dao.DataRetrievalFailureException; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.jdbc.support.JdbcUtils; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; @@ -192,7 +193,7 @@ public class BeanPropertyRowMapper implements RowMapper { * @since 4.3 * @see #initBeanWrapper(BeanWrapper) */ - public void setConversionService(ConversionService conversionService) { + public void setConversionService(@Nullable ConversionService conversionService) { this.conversionService = conversionService; } @@ -201,6 +202,7 @@ public class BeanPropertyRowMapper implements RowMapper { * or {@code null} if none. * @since 4.3 */ + @Nullable public ConversionService getConversionService() { return this.conversionService; } @@ -366,7 +368,7 @@ public class BeanPropertyRowMapper implements RowMapper { * @throws SQLException in case of extraction failure * @see org.springframework.jdbc.support.JdbcUtils#getResultSetValue(java.sql.ResultSet, int, Class) */ - protected Object getColumnValue(ResultSet rs, int index, PropertyDescriptor pd) throws SQLException { + protected Object getColumnValue(ResultSet rs, int index, @Nullable PropertyDescriptor pd) throws SQLException { return JdbcUtils.getResultSetValue(rs, index, pd.getPropertyType()); } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/CallableStatementCallback.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/CallableStatementCallback.java index 434e243737b..166fbaefde9 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/CallableStatementCallback.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/CallableStatementCallback.java @@ -20,6 +20,7 @@ import java.sql.CallableStatement; import java.sql.SQLException; import org.springframework.dao.DataAccessException; +import org.springframework.lang.Nullable; /** * Generic callback interface for code that operates on a CallableStatement. @@ -73,6 +74,7 @@ public interface CallableStatementCallback { * into a DataAccessException by a SQLExceptionTranslator * @throws DataAccessException in case of custom exceptions */ + @Nullable T doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException; } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/CallableStatementCreatorFactory.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/CallableStatementCreatorFactory.java index ffe32040d3b..92b40555d00 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/CallableStatementCreatorFactory.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/CallableStatementCreatorFactory.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Map; import org.springframework.dao.InvalidDataAccessApiUsageException; +import org.springframework.lang.Nullable; /** * Helper class that efficiently creates multiple {@link CallableStatementCreator} @@ -102,7 +103,7 @@ public class CallableStatementCreatorFactory { * Return a new CallableStatementCreator instance given this parameters. * @param params list of parameters (may be {@code null}) */ - public CallableStatementCreator newCallableStatementCreator(Map params) { + public CallableStatementCreator newCallableStatementCreator(@Nullable Map params) { return new CallableStatementCreatorImpl(params != null ? params : new HashMap<>()); } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/ConnectionCallback.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/ConnectionCallback.java index 7c99bdc01a8..8a0f50d2908 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/ConnectionCallback.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/ConnectionCallback.java @@ -20,6 +20,7 @@ import java.sql.Connection; import java.sql.SQLException; import org.springframework.dao.DataAccessException; +import org.springframework.lang.Nullable; /** * Generic callback interface for code that operates on a JDBC Connection. @@ -62,6 +63,7 @@ public interface ConnectionCallback { * @see JdbcTemplate#queryForObject(String, Class) * @see JdbcTemplate#queryForRowSet(String) */ + @Nullable T doInConnection(Connection con) throws SQLException, DataAccessException; } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcOperations.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcOperations.java index 8f403c8f3d2..c9d25bdfe6b 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcOperations.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcOperations.java @@ -24,6 +24,7 @@ import org.springframework.dao.DataAccessException; import org.springframework.dao.IncorrectResultSizeDataAccessException; import org.springframework.jdbc.support.KeyHolder; import org.springframework.jdbc.support.rowset.SqlRowSet; +import org.springframework.lang.Nullable; /** * Interface specifying a basic set of JDBC operations. @@ -59,6 +60,7 @@ public interface JdbcOperations { * @return a result object returned by the action, or {@code null} * @throws DataAccessException if there is any problem */ + @Nullable T execute(ConnectionCallback action) throws DataAccessException; @@ -78,6 +80,7 @@ public interface JdbcOperations { * @return a result object returned by the action, or {@code null} * @throws DataAccessException if there is any problem */ + @Nullable T execute(StatementCallback action) throws DataAccessException; /** @@ -162,6 +165,7 @@ public interface JdbcOperations { * @throws DataAccessException if there is any problem executing the query * @see #queryForObject(String, Object[], Class) */ + @Nullable T queryForObject(String sql, Class requiredType) throws DataAccessException; /** @@ -288,6 +292,7 @@ public interface JdbcOperations { * @return a result object returned by the action, or {@code null} * @throws DataAccessException if there is any problem */ + @Nullable T execute(String sql, PreparedStatementCallback action) throws DataAccessException; /** @@ -315,7 +320,7 @@ public interface JdbcOperations { * @return an arbitrary result object, as returned by the ResultSetExtractor * @throws DataAccessException if there is any problem */ - T query(String sql, PreparedStatementSetter pss, ResultSetExtractor rse) throws DataAccessException; + T query(String sql, @Nullable PreparedStatementSetter pss, ResultSetExtractor rse) throws DataAccessException; /** * Query given SQL to create a prepared statement from SQL and a list @@ -360,7 +365,7 @@ public interface JdbcOperations { * @return an arbitrary result object, as returned by the ResultSetExtractor * @throws DataAccessException if the query fails */ - T query(String sql, ResultSetExtractor rse, Object... args) throws DataAccessException; + T query(String sql, ResultSetExtractor rse, @Nullable Object... args) throws DataAccessException; /** * Query using a prepared statement, reading the ResultSet on a per-row @@ -387,7 +392,7 @@ public interface JdbcOperations { * @param rch object that will extract results, one row at a time * @throws DataAccessException if the query fails */ - void query(String sql, PreparedStatementSetter pss, RowCallbackHandler rch) throws DataAccessException; + void query(String sql, @Nullable PreparedStatementSetter pss, RowCallbackHandler rch) throws DataAccessException; /** * Query given SQL to create a prepared statement from SQL and a list of @@ -429,7 +434,7 @@ public interface JdbcOperations { * only the argument value but also the SQL type and optionally the scale * @throws DataAccessException if the query fails */ - void query(String sql, RowCallbackHandler rch, Object... args) throws DataAccessException; + void query(String sql, RowCallbackHandler rch, @Nullable Object... args) throws DataAccessException; /** * Query using a prepared statement, mapping each row to a Java object @@ -457,7 +462,7 @@ public interface JdbcOperations { * @return the result List, containing mapped objects * @throws DataAccessException if the query fails */ - List query(String sql, PreparedStatementSetter pss, RowMapper rowMapper) throws DataAccessException; + List query(String sql, @Nullable PreparedStatementSetter pss, RowMapper rowMapper) throws DataAccessException; /** * Query given SQL to create a prepared statement from SQL and a list @@ -502,7 +507,7 @@ public interface JdbcOperations { * @return the result List, containing mapped objects * @throws DataAccessException if the query fails */ - List query(String sql, RowMapper rowMapper, Object... args) throws DataAccessException; + List query(String sql, RowMapper rowMapper, @Nullable Object... args) throws DataAccessException; /** * Query given SQL to create a prepared statement from SQL and a list @@ -554,7 +559,7 @@ public interface JdbcOperations { * return exactly one row * @throws DataAccessException if the query fails */ - T queryForObject(String sql, RowMapper rowMapper, Object... args) throws DataAccessException; + T queryForObject(String sql, RowMapper rowMapper, @Nullable Object... args) throws DataAccessException; /** * Query given SQL to create a prepared statement from SQL and a @@ -573,6 +578,7 @@ public interface JdbcOperations { * @see #queryForObject(String, Class) * @see java.sql.Types */ + @Nullable T queryForObject(String sql, Object[] args, int[] argTypes, Class requiredType) throws DataAccessException; @@ -593,6 +599,7 @@ public interface JdbcOperations { * @throws DataAccessException if the query fails * @see #queryForObject(String, Class) */ + @Nullable T queryForObject(String sql, Object[] args, Class requiredType) throws DataAccessException; /** @@ -612,7 +619,8 @@ public interface JdbcOperations { * @throws DataAccessException if the query fails * @see #queryForObject(String, Class) */ - T queryForObject(String sql, Class requiredType, Object... args) throws DataAccessException; + @Nullable + T queryForObject(String sql, Class requiredType, @Nullable Object... args) throws DataAccessException; /** * Query given SQL to create a prepared statement from SQL and a @@ -655,7 +663,7 @@ public interface JdbcOperations { * @see #queryForMap(String) * @see ColumnMapRowMapper */ - Map queryForMap(String sql, Object... args) throws DataAccessException; + Map queryForMap(String sql, @Nullable Object... args) throws DataAccessException; /** * Query given SQL to create a prepared statement from SQL and a @@ -712,7 +720,7 @@ public interface JdbcOperations { * @see #queryForList(String, Class) * @see SingleColumnRowMapper */ - List queryForList(String sql, Class elementType, Object... args) throws DataAccessException; + List queryForList(String sql, Class elementType, @Nullable Object... args) throws DataAccessException; /** * Query given SQL to create a prepared statement from SQL and a @@ -748,7 +756,7 @@ public interface JdbcOperations { * @throws DataAccessException if the query fails * @see #queryForList(String) */ - List> queryForList(String sql, Object... args) throws DataAccessException; + List> queryForList(String sql, @Nullable Object... args) throws DataAccessException; /** * Query given SQL to create a prepared statement from SQL and a @@ -794,7 +802,7 @@ public interface JdbcOperations { * @see SqlRowSetResultSetExtractor * @see javax.sql.rowset.CachedRowSet */ - SqlRowSet queryForRowSet(String sql, Object... args) throws DataAccessException; + SqlRowSet queryForRowSet(String sql, @Nullable Object... args) throws DataAccessException; /** * Issue a single SQL update operation (such as an insert, update or delete statement) @@ -834,7 +842,7 @@ public interface JdbcOperations { * @return the number of rows affected * @throws DataAccessException if there is any problem issuing the update */ - int update(String sql, PreparedStatementSetter pss) throws DataAccessException; + int update(String sql, @Nullable PreparedStatementSetter pss) throws DataAccessException; /** * Issue a single SQL update operation (such as an insert, update or delete statement) @@ -860,7 +868,7 @@ public interface JdbcOperations { * @return the number of rows affected * @throws DataAccessException if there is any problem issuing the update */ - int update(String sql, Object... args) throws DataAccessException; + int update(String sql, @Nullable Object... args) throws DataAccessException; /** * Issue multiple update statements on a single PreparedStatement, @@ -926,6 +934,7 @@ public interface JdbcOperations { * @return a result object returned by the action, or {@code null} * @throws DataAccessException if there is any problem */ + @Nullable T execute(CallableStatementCreator csc, CallableStatementCallback action) throws DataAccessException; /** @@ -941,6 +950,7 @@ public interface JdbcOperations { * @return a result object returned by the action, or {@code null} * @throws DataAccessException if there is any problem */ + @Nullable T execute(String callString, CallableStatementCallback action) throws DataAccessException; /** diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java index 73739eaf35e..3ec3998315a 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/JdbcTemplate.java @@ -35,6 +35,7 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; + import javax.sql.DataSource; import org.springframework.dao.DataAccessException; @@ -47,6 +48,7 @@ import org.springframework.jdbc.support.JdbcAccessor; import org.springframework.jdbc.support.JdbcUtils; import org.springframework.jdbc.support.KeyHolder; import org.springframework.jdbc.support.rowset.SqlRowSet; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.LinkedCaseInsensitiveMap; import org.springframework.util.StringUtils; @@ -1349,7 +1351,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations { * May be {@code null}, in which case this method does nothing. * @throws SQLWarningException in case of an actual warning to be raised */ - protected void handleWarnings(SQLWarning warning) throws SQLWarningException { + protected void handleWarnings(@Nullable SQLWarning warning) throws SQLWarningException { if (warning != null) { throw new SQLWarningException("Warning not ignored", warning); } @@ -1361,6 +1363,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations { * @return the SQL string, or {@code null} * @see SqlProvider */ + @Nullable private static String getSql(Object sqlProvider) { if (sqlProvider instanceof SqlProvider) { return ((SqlProvider) sqlProvider).getSql(); @@ -1385,6 +1388,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations { } @Override + @Nullable public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // Invocation on ConnectionProxy interface coming in... diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/ParameterMapper.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/ParameterMapper.java index 8198084ee22..0c7833ad8cf 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/ParameterMapper.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/ParameterMapper.java @@ -20,6 +20,8 @@ import java.sql.Connection; import java.sql.SQLException; import java.util.Map; +import org.springframework.lang.Nullable; + /** * Implement this interface when parameters need to be customized based * on the connection. We might need to do this to make use of proprietary @@ -43,6 +45,7 @@ public interface ParameterMapper { * parameter values (that is, there's no need to catch SQLException) * @return Map of input parameters, keyed by name (never {@code null}) */ + @Nullable Map createMap(Connection con) throws SQLException; } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/PreparedStatementCallback.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/PreparedStatementCallback.java index 3db375c7b95..5025f7fc2d0 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/PreparedStatementCallback.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/PreparedStatementCallback.java @@ -20,6 +20,7 @@ import java.sql.PreparedStatement; import java.sql.SQLException; import org.springframework.dao.DataAccessException; +import org.springframework.lang.Nullable; /** * Generic callback interface for code that operates on a PreparedStatement. @@ -72,6 +73,7 @@ public interface PreparedStatementCallback { * @see JdbcTemplate#queryForObject(String, Object[], Class) * @see JdbcTemplate#queryForList(String, Object[]) */ + @Nullable T doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException; } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/PreparedStatementCreatorFactory.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/PreparedStatementCreatorFactory.java index 22e59af455d..72768bcbc72 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/PreparedStatementCreatorFactory.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/PreparedStatementCreatorFactory.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Set; import org.springframework.dao.InvalidDataAccessApiUsageException; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -135,7 +136,7 @@ public class PreparedStatementCreatorFactory { * Return a new PreparedStatementSetter for the given parameters. * @param params list of parameters (may be {@code null}) */ - public PreparedStatementSetter newPreparedStatementSetter(List params) { + public PreparedStatementSetter newPreparedStatementSetter(@Nullable List params) { return new PreparedStatementCreatorImpl(params != null ? params : Collections.emptyList()); } @@ -143,7 +144,7 @@ public class PreparedStatementCreatorFactory { * Return a new PreparedStatementSetter for the given parameters. * @param params the parameter array (may be {@code null}) */ - public PreparedStatementSetter newPreparedStatementSetter(Object[] params) { + public PreparedStatementSetter newPreparedStatementSetter(@Nullable Object[] params) { return new PreparedStatementCreatorImpl(params != null ? Arrays.asList(params) : Collections.emptyList()); } @@ -151,7 +152,7 @@ public class PreparedStatementCreatorFactory { * Return a new PreparedStatementCreator for the given parameters. * @param params list of parameters (may be {@code null}) */ - public PreparedStatementCreator newPreparedStatementCreator(List params) { + public PreparedStatementCreator newPreparedStatementCreator(@Nullable List params) { return new PreparedStatementCreatorImpl(params != null ? params : Collections.emptyList()); } @@ -159,7 +160,7 @@ public class PreparedStatementCreatorFactory { * Return a new PreparedStatementCreator for the given parameters. * @param params the parameter array (may be {@code null}) */ - public PreparedStatementCreator newPreparedStatementCreator(Object[] params) { + public PreparedStatementCreator newPreparedStatementCreator(@Nullable Object[] params) { return new PreparedStatementCreatorImpl(params != null ? Arrays.asList(params) : Collections.emptyList()); } @@ -169,7 +170,7 @@ public class PreparedStatementCreatorFactory { * the factory's, for example because of named parameter expanding) * @param params the parameter array (may be {@code null}) */ - public PreparedStatementCreator newPreparedStatementCreator(String sqlToUse, Object[] params) { + public PreparedStatementCreator newPreparedStatementCreator(String sqlToUse, @Nullable Object[] params) { return new PreparedStatementCreatorImpl( sqlToUse, params != null ? Arrays.asList(params) : Collections.emptyList()); } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/ResultSetExtractor.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/ResultSetExtractor.java index 7ada08f7899..87ab2f31d51 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/ResultSetExtractor.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/ResultSetExtractor.java @@ -20,6 +20,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import org.springframework.dao.DataAccessException; +import org.springframework.lang.Nullable; /** * Callback interface used by {@link JdbcTemplate}'s query methods. @@ -59,6 +60,7 @@ public interface ResultSetExtractor { * values or navigating (that is, there's no need to catch SQLException) * @throws DataAccessException in case of custom exceptions */ + @Nullable T extractData(ResultSet rs) throws SQLException, DataAccessException; } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/ResultSetSupportingSqlParameter.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/ResultSetSupportingSqlParameter.java index ca515b5bbc8..5d56a100c92 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/ResultSetSupportingSqlParameter.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/ResultSetSupportingSqlParameter.java @@ -16,6 +16,8 @@ package org.springframework.jdbc.core; +import org.springframework.lang.Nullable; + /** * Common base class for ResultSet-supporting SqlParameters like * {@link SqlOutParameter} and {@link SqlReturnResultSet}. @@ -107,6 +109,7 @@ public class ResultSetSupportingSqlParameter extends SqlParameter { /** * Return the ResultSetExtractor held by this parameter, if any. */ + @Nullable public ResultSetExtractor getResultSetExtractor() { return this.resultSetExtractor; } @@ -114,6 +117,7 @@ public class ResultSetSupportingSqlParameter extends SqlParameter { /** * Return the RowCallbackHandler held by this parameter, if any. */ + @Nullable public RowCallbackHandler getRowCallbackHandler() { return this.rowCallbackHandler; } @@ -121,6 +125,7 @@ public class ResultSetSupportingSqlParameter extends SqlParameter { /** * Return the RowMapper held by this parameter, if any. */ + @Nullable public RowMapper getRowMapper() { return this.rowMapper; } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/SingleColumnRowMapper.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/SingleColumnRowMapper.java index 25456d9e927..b60e5257867 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/SingleColumnRowMapper.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/SingleColumnRowMapper.java @@ -23,6 +23,7 @@ import java.sql.SQLException; import org.springframework.dao.TypeMismatchDataAccessException; import org.springframework.jdbc.IncorrectResultSetColumnCountException; import org.springframework.jdbc.support.JdbcUtils; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.NumberUtils; @@ -125,7 +126,7 @@ public class SingleColumnRowMapper implements RowMapper { * @see org.springframework.jdbc.support.JdbcUtils#getResultSetValue(java.sql.ResultSet, int, Class) * @see #getColumnValue(java.sql.ResultSet, int) */ - protected Object getColumnValue(ResultSet rs, int index, Class requiredType) throws SQLException { + protected Object getColumnValue(ResultSet rs, int index, @Nullable Class requiredType) throws SQLException { if (requiredType != null) { return JdbcUtils.getResultSetValue(rs, index, requiredType); } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/SqlOutParameter.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/SqlOutParameter.java index 0baba25d2f3..2b164a04788 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/SqlOutParameter.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/SqlOutParameter.java @@ -16,6 +16,8 @@ package org.springframework.jdbc.core; +import org.springframework.lang.Nullable; + /** * Subclass of SqlParameter to represent an output parameter. * No additional properties: instanceof will be used to check @@ -111,6 +113,7 @@ public class SqlOutParameter extends ResultSetSupportingSqlParameter { /** * Return the custom return type, if any. */ + @Nullable public SqlReturnType getSqlReturnType() { return this.sqlReturnType; } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/SqlParameter.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/SqlParameter.java index 929b6c39605..850c13c4310 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/SqlParameter.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/SqlParameter.java @@ -19,6 +19,7 @@ package org.springframework.jdbc.core; import java.util.LinkedList; import java.util.List; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -127,6 +128,7 @@ public class SqlParameter { /** * Return the name of the parameter, or {@code null} if anonymous. */ + @Nullable public String getName() { return this.name; } @@ -141,6 +143,7 @@ public class SqlParameter { /** * Return the type name of the parameter, if any. */ + @Nullable public String getTypeName() { return this.typeName; } @@ -148,6 +151,7 @@ public class SqlParameter { /** * Return the scale of the parameter, if any. */ + @Nullable public Integer getScale() { return this.scale; } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/SqlProvider.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/SqlProvider.java index 34b7dbb8923..279f3814741 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/SqlProvider.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/SqlProvider.java @@ -16,6 +16,8 @@ package org.springframework.jdbc.core; +import org.springframework.lang.Nullable; + /** * Interface to be implemented by objects that can provide SQL strings. * @@ -36,6 +38,7 @@ public interface SqlProvider { * typically the SQL used for creating statements. * @return the SQL string, or {@code null} */ + @Nullable String getSql(); } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/StatementCallback.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/StatementCallback.java index 7fdb7101924..227886f99f9 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/StatementCallback.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/StatementCallback.java @@ -20,6 +20,7 @@ import java.sql.SQLException; import java.sql.Statement; import org.springframework.dao.DataAccessException; +import org.springframework.lang.Nullable; /** * Generic callback interface for code that operates on a JDBC Statement. @@ -65,6 +66,7 @@ public interface StatementCallback { * @see JdbcTemplate#queryForObject(String, Class) * @see JdbcTemplate#queryForRowSet(String) */ + @Nullable T doInStatement(Statement stmt) throws SQLException, DataAccessException; } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/StatementCreatorUtils.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/StatementCreatorUtils.java index 91f593bc70a..3182c6dfc80 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/StatementCreatorUtils.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/StatementCreatorUtils.java @@ -37,6 +37,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.core.SpringProperties; import org.springframework.jdbc.support.SqlValue; +import org.springframework.lang.Nullable; /** * Utility methods for PreparedStatementSetter/Creator and CallableStatementCreator @@ -111,6 +112,7 @@ public abstract class StatementCreatorUtils { * @param javaType the Java type to translate * @return the corresponding SQL type, or {@code null} if none found */ + @Nullable public static int javaTypeToSqlParameterType(Class javaType) { Integer sqlType = javaTypeToSqlTypeMap.get(javaType); if (sqlType != null) { @@ -422,7 +424,7 @@ public abstract class StatementCreatorUtils { * @see DisposableSqlTypeValue#cleanup() * @see org.springframework.jdbc.core.support.SqlLobValue#cleanup() */ - public static void cleanupParameters(Object... paramValues) { + public static void cleanupParameters(@Nullable Object... paramValues) { if (paramValues != null) { cleanupParameters(Arrays.asList(paramValues)); } @@ -435,7 +437,7 @@ public abstract class StatementCreatorUtils { * @see DisposableSqlTypeValue#cleanup() * @see org.springframework.jdbc.core.support.SqlLobValue#cleanup() */ - public static void cleanupParameters(Collection paramValues) { + public static void cleanupParameters(@Nullable Collection paramValues) { if (paramValues != null) { for (Object inValue : paramValues) { if (inValue instanceof DisposableSqlTypeValue) { diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/CallMetaDataProvider.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/CallMetaDataProvider.java index 2991c6d55cd..fee434e247b 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/CallMetaDataProvider.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/CallMetaDataProvider.java @@ -21,6 +21,7 @@ import java.sql.SQLException; import java.util.List; import org.springframework.jdbc.core.SqlParameter; +import org.springframework.lang.Nullable; /** * Interface specifying the API to be implemented by a class providing call metadata. @@ -52,25 +53,28 @@ public interface CallMetaDataProvider { * @see org.springframework.jdbc.core.simple.SimpleJdbcCall#withoutProcedureColumnMetaDataAccess() */ void initializeWithProcedureColumnMetaData( - DatabaseMetaData databaseMetaData, String catalogName, String schemaName, String procedureName) + DatabaseMetaData databaseMetaData, @Nullable String catalogName, @Nullable String schemaName, String procedureName) throws SQLException; /** * Provide any modification of the procedure name passed in to match the meta data currently used. * This could include altering the case. */ + @Nullable String procedureNameToUse(String procedureName); /** * Provide any modification of the catalog name passed in to match the meta data currently used. * This could include altering the case. */ + @Nullable String catalogNameToUse(String catalogName); /** * Provide any modification of the schema name passed in to match the meta data currently used. * This could include altering the case. */ + @Nullable String schemaNameToUse(String schemaName); /** @@ -78,6 +82,7 @@ public interface CallMetaDataProvider { * The returned value will be used for meta data lookups. This could include altering the case * used or providing a base catalog if none is provided. */ + @Nullable String metaDataCatalogNameToUse(String catalogName) ; /** @@ -85,6 +90,7 @@ public interface CallMetaDataProvider { * The returned value will be used for meta data lookups. This could include altering the case * used or providing a base schema if none is provided. */ + @Nullable String metaDataSchemaNameToUse(String schemaName) ; /** diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/TableMetaDataProvider.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/TableMetaDataProvider.java index 746fe515d03..92b5c9d7238 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/TableMetaDataProvider.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/TableMetaDataProvider.java @@ -20,6 +20,8 @@ import java.sql.DatabaseMetaData; import java.sql.SQLException; import java.util.List; +import org.springframework.lang.Nullable; + /** * Interface specifying the API to be implemented by a class providing table metadata. * This is intended for internal use by the Simple JDBC classes. @@ -46,7 +48,7 @@ public interface TableMetaDataProvider { * @throws SQLException in case of initialization failure */ void initializeWithTableColumnMetaData( - DatabaseMetaData databaseMetaData, String catalogName, String schemaName, String tableName) + DatabaseMetaData databaseMetaData, @Nullable String catalogName, @Nullable String schemaName, String tableName) throws SQLException; /** @@ -99,6 +101,7 @@ public interface TableMetaDataProvider { /** * Get the simple query to retrieve a generated key */ + @Nullable String getSimpleQueryForGetGeneratedKey(String tableName, String keyColumnName); /** diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/package-info.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/package-info.java index 7ad1eaee190..41e1f0010bc 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/package-info.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/package-info.java @@ -1,4 +1,7 @@ /** * Context metadata abstraction for the configuration and execution of a stored procedure call. */ +@NonNullApi package org.springframework.jdbc.core.metadata; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/MapSqlParameterSource.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/MapSqlParameterSource.java index 53dd6eca6fb..88df516c582 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/MapSqlParameterSource.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/MapSqlParameterSource.java @@ -21,6 +21,7 @@ import java.util.LinkedHashMap; import java.util.Map; import org.springframework.jdbc.core.SqlParameterValue; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -69,7 +70,7 @@ public class MapSqlParameterSource extends AbstractSqlParameterSource { * Create a new MapSqlParameterSource based on a Map. * @param values a Map holding existing parameter values (can be {@code null}) */ - public MapSqlParameterSource(Map values) { + public MapSqlParameterSource(@Nullable Map values) { addValues(values); } @@ -128,7 +129,7 @@ public class MapSqlParameterSource extends AbstractSqlParameterSource { * @return a reference to this parameter source, * so it's possible to chain several calls together */ - public MapSqlParameterSource addValues(Map values) { + public MapSqlParameterSource addValues(@Nullable Map values) { if (values != null) { for (Map.Entry entry : values.entrySet()) { this.values.put(entry.getKey(), entry.getValue()); diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcOperations.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcOperations.java index 33adeed0886..81b92a223bc 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcOperations.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterJdbcOperations.java @@ -27,6 +27,7 @@ import org.springframework.jdbc.core.RowCallbackHandler; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.KeyHolder; import org.springframework.jdbc.support.rowset.SqlRowSet; +import org.springframework.lang.Nullable; /** * Interface specifying a basic set of JDBC operations allowing the use @@ -67,6 +68,7 @@ public interface NamedParameterJdbcOperations { * @return a result object returned by the action, or {@code null} * @throws DataAccessException if there is any problem */ + @Nullable T execute(String sql, SqlParameterSource paramSource, PreparedStatementCallback action) throws DataAccessException; @@ -85,6 +87,7 @@ public interface NamedParameterJdbcOperations { * @return a result object returned by the action, or {@code null} * @throws DataAccessException if there is any problem */ + @Nullable T execute(String sql, Map paramMap, PreparedStatementCallback action) throws DataAccessException; @@ -101,6 +104,7 @@ public interface NamedParameterJdbcOperations { * @return a result object returned by the action, or {@code null} * @throws DataAccessException if there is any problem */ + @Nullable T execute(String sql, PreparedStatementCallback action) throws DataAccessException; /** @@ -267,6 +271,7 @@ public interface NamedParameterJdbcOperations { * @throws org.springframework.dao.DataAccessException if the query fails * @see org.springframework.jdbc.core.JdbcTemplate#queryForObject(String, Class) */ + @Nullable T queryForObject(String sql, SqlParameterSource paramSource, Class requiredType) throws DataAccessException; @@ -286,6 +291,7 @@ public interface NamedParameterJdbcOperations { * @throws org.springframework.dao.DataAccessException if the query fails * @see org.springframework.jdbc.core.JdbcTemplate#queryForObject(String, Class) */ + @Nullable T queryForObject(String sql, Map paramMap, Class requiredType) throws DataAccessException; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java index 065a254bed4..2d27c89d3a1 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/NamedParameterUtils.java @@ -28,6 +28,7 @@ import java.util.Set; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.jdbc.core.SqlParameter; import org.springframework.jdbc.core.SqlParameterValue; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -319,7 +320,7 @@ public abstract class NamedParameterUtils { * @return the array of values */ public static Object[] buildValueArray( - ParsedSql parsedSql, SqlParameterSource paramSource, List declaredParams) { + ParsedSql parsedSql, SqlParameterSource paramSource, @Nullable List declaredParams) { Object[] paramArray = new Object[parsedSql.getTotalParameterCount()]; if (parsedSql.getNamedParameterCount() > 0 && parsedSql.getUnnamedParameterCount() > 0) { @@ -352,6 +353,7 @@ public abstract class NamedParameterUtils { * @param paramIndex the index of the desired parameter * @return the declared SqlParameter, or {@code null} if none found */ + @Nullable private static SqlParameter findParameter(List declaredParams, String paramName, int paramIndex) { if (declaredParams != null) { // First pass: Look for named parameter match. diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/SqlParameterSource.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/SqlParameterSource.java index bdba8e44383..cd8e8cc5191 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/SqlParameterSource.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/SqlParameterSource.java @@ -17,6 +17,7 @@ package org.springframework.jdbc.core.namedparam; import org.springframework.jdbc.support.JdbcUtils; +import org.springframework.lang.Nullable; /** * Interface that defines common functionality for objects that can @@ -79,6 +80,7 @@ public interface SqlParameterSource { * @return the type name of the specified parameter, * or {@code null} if not known */ + @Nullable String getTypeName(String paramName); } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/package-info.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/package-info.java index 50928e43b1a..5ea4238dce6 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/package-info.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/namedparam/package-info.java @@ -10,4 +10,7 @@ * the {@code getJdbcOperations()} method of NamedParameterJdbcTemplate and * work with the returned classic template, or use a JdbcTemplate instance directly. */ +@NonNullApi package org.springframework.jdbc.core.namedparam; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/package-info.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/package-info.java index 2a769e03357..5591e5419e2 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/package-info.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/package-info.java @@ -2,4 +2,7 @@ * Provides the core JDBC framework, based on JdbcTemplate * and its associated callback interfaces and helper objects. */ +@NonNullApi package org.springframework.jdbc.core; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/package-info.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/package-info.java index d9403a2c9b4..c70d9d97d20 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/package-info.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/package-info.java @@ -5,4 +5,7 @@ * of database metadata provided by the JDBC driver to simplify the application code. Much of the * parameter specification becomes unnecessary since it can be looked up in the metadata. */ +@NonNullApi package org.springframework.jdbc.core.simple; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/support/package-info.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/support/package-info.java index 8f3b9a2a062..44b556fee4f 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/support/package-info.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/support/package-info.java @@ -2,4 +2,7 @@ * Classes supporting the {@code org.springframework.jdbc.core} package. * Contains a DAO base class for JdbcTemplate usage. */ +@NonNullApi package org.springframework.jdbc.core.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/AbstractDriverBasedDataSource.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/AbstractDriverBasedDataSource.java index 11558ddb112..e9d721dc5c3 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/AbstractDriverBasedDataSource.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/AbstractDriverBasedDataSource.java @@ -20,6 +20,7 @@ import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -105,6 +106,7 @@ public abstract class AbstractDriverBasedDataSource extends AbstractDataSource { * Return the database catalog to be applied to each Connection, if any. * @since 4.3.2 */ + @Nullable public String getCatalog() { return this.catalog; } @@ -122,6 +124,7 @@ public abstract class AbstractDriverBasedDataSource extends AbstractDataSource { * Return the database schema to be applied to each Connection, if any. * @since 4.3.2 */ + @Nullable public String getSchema() { return this.schema; } @@ -141,6 +144,7 @@ public abstract class AbstractDriverBasedDataSource extends AbstractDataSource { /** * Return the connection properties to be passed to the Driver, if any. */ + @Nullable public Properties getConnectionProperties() { return this.connectionProperties; } @@ -178,7 +182,7 @@ public abstract class AbstractDriverBasedDataSource extends AbstractDataSource { * @throws SQLException in case of failure * @see java.sql.Driver#connect(String, java.util.Properties) */ - protected Connection getConnectionFromDriver(String username, String password) throws SQLException { + protected Connection getConnectionFromDriver(@Nullable String username, @Nullable String password) throws SQLException { Properties mergedProps = new Properties(); Properties connProps = getConnectionProperties(); if (connProps != null) { diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/ConnectionHolder.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/ConnectionHolder.java index 26dcbda8ccc..82bfe63e930 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/ConnectionHolder.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/ConnectionHolder.java @@ -20,6 +20,7 @@ import java.sql.Connection; import java.sql.SQLException; import java.sql.Savepoint; +import org.springframework.lang.Nullable; import org.springframework.transaction.support.ResourceHolderSupport; import org.springframework.util.Assert; @@ -125,7 +126,7 @@ public class ConnectionHolder extends ResourceHolderSupport { *

    Used for releasing the Connection on suspend (with a {@code null} * argument) and setting a fresh Connection on resume. */ - protected void setConnection(Connection connection) { + protected void setConnection(@Nullable Connection connection) { if (this.currentConnection != null) { this.connectionHandle.releaseConnection(this.currentConnection); this.currentConnection = null; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceUtils.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceUtils.java index eb766badbbf..89030b3988f 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceUtils.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceUtils.java @@ -19,12 +19,14 @@ package org.springframework.jdbc.datasource; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; + import javax.sql.DataSource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.jdbc.CannotGetJdbcConnectionException; +import org.springframework.lang.Nullable; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.support.TransactionSynchronizationAdapter; import org.springframework.transaction.support.TransactionSynchronizationManager; @@ -141,6 +143,7 @@ public abstract class DataSourceUtils { * @throws SQLException if thrown by JDBC methods * @see #resetConnectionAfterTransaction */ + @Nullable public static Integer prepareConnectionForTransaction(Connection con, TransactionDefinition definition) throws SQLException { @@ -192,7 +195,7 @@ public abstract class DataSourceUtils { * @param previousIsolationLevel the isolation level to restore, if any * @see #prepareConnectionForTransaction */ - public static void resetConnectionAfterTransaction(Connection con, Integer previousIsolationLevel) { + public static void resetConnectionAfterTransaction(Connection con, @Nullable Integer previousIsolationLevel) { Assert.notNull(con, "No Connection specified"); try { // Reset transaction isolation to previous value, if changed for the transaction. @@ -225,7 +228,7 @@ public abstract class DataSourceUtils { * (may be {@code null}) * @return whether the Connection is transactional */ - public static boolean isConnectionTransactional(Connection con, DataSource dataSource) { + public static boolean isConnectionTransactional(Connection con, @Nullable DataSource dataSource) { if (dataSource == null) { return false; } @@ -277,7 +280,7 @@ public abstract class DataSourceUtils { * (may be {@code null}) * @see #getConnection */ - public static void releaseConnection(Connection con, DataSource dataSource) { + public static void releaseConnection(Connection con, @Nullable DataSource dataSource) { try { doReleaseConnection(con, dataSource); } @@ -300,7 +303,7 @@ public abstract class DataSourceUtils { * @throws SQLException if thrown by JDBC methods * @see #doGetConnection */ - public static void doReleaseConnection(Connection con, DataSource dataSource) throws SQLException { + public static void doReleaseConnection(Connection con, @Nullable DataSource dataSource) throws SQLException { if (con == null) { return; } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/IsolationLevelDataSourceAdapter.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/IsolationLevelDataSourceAdapter.java index 30f64d47a23..8feb983a7e0 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/IsolationLevelDataSourceAdapter.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/IsolationLevelDataSourceAdapter.java @@ -20,6 +20,7 @@ import java.sql.Connection; import java.sql.SQLException; import org.springframework.core.Constants; +import org.springframework.lang.Nullable; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.support.DefaultTransactionDefinition; import org.springframework.transaction.support.TransactionSynchronizationManager; @@ -111,6 +112,7 @@ public class IsolationLevelDataSourceAdapter extends UserCredentialsDataSourceAd * Return the statically specified isolation level, * or {@code null} if none. */ + @Nullable protected Integer getIsolationLevel() { return this.isolationLevel; } @@ -143,6 +145,7 @@ public class IsolationLevelDataSourceAdapter extends UserCredentialsDataSourceAd * @see org.springframework.transaction.support.TransactionSynchronizationManager#getCurrentTransactionIsolationLevel() * @see #setIsolationLevel */ + @Nullable protected Integer getCurrentIsolationLevel() { Integer isolationLevelToUse = TransactionSynchronizationManager.getCurrentTransactionIsolationLevel(); if (isolationLevelToUse == null) { diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/LazyConnectionDataSourceProxy.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/LazyConnectionDataSourceProxy.java index 8396d1be5bb..1ab0613b0b3 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/LazyConnectionDataSourceProxy.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/LazyConnectionDataSourceProxy.java @@ -28,6 +28,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.core.Constants; +import org.springframework.lang.Nullable; /** * Proxy for a target DataSource, fetching actual JDBC Connections lazily, @@ -271,6 +272,7 @@ public class LazyConnectionDataSourceProxy extends DelegatingDataSource { } @Override + @Nullable public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // Invocation on ConnectionProxy interface coming in... diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/SingleConnectionDataSource.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/SingleConnectionDataSource.java index b7bd8df0df2..613441014b7 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/SingleConnectionDataSource.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/SingleConnectionDataSource.java @@ -24,6 +24,7 @@ import java.sql.Connection; import java.sql.SQLException; import org.springframework.beans.factory.DisposableBean; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -146,6 +147,7 @@ public class SingleConnectionDataSource extends DriverManagerDataSource implemen * Return whether the returned Connection's "autoCommit" setting should be overridden. * @return the "autoCommit" value, or {@code null} if none to be applied */ + @Nullable protected Boolean getAutoCommitValue() { return this.autoCommit; } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy.java index f90b9bdb42f..78269ba5a82 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy.java @@ -25,6 +25,7 @@ import java.sql.SQLException; import java.sql.Statement; import javax.sql.DataSource; +import org.springframework.lang.Nullable; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.Assert; @@ -171,6 +172,7 @@ public class TransactionAwareDataSourceProxy extends DelegatingDataSource { } @Override + @Nullable public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // Invocation on ConnectionProxy interface coming in... diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/WebSphereDataSourceAdapter.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/WebSphereDataSourceAdapter.java index 42b47d85c08..31d7a80a3d3 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/WebSphereDataSourceAdapter.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/WebSphereDataSourceAdapter.java @@ -19,11 +19,13 @@ package org.springframework.jdbc.datasource; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.SQLException; + import javax.sql.DataSource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; @@ -157,7 +159,7 @@ public class WebSphereDataSourceAdapter extends IsolationLevelDataSourceAdapter * @see com.ibm.websphere.rsadapter.JDBCConnectionSpec */ protected Object createConnectionSpec( - Integer isolationLevel, Boolean readOnlyFlag, String username, String password) throws SQLException { + @Nullable Integer isolationLevel, @Nullable Boolean readOnlyFlag, @Nullable String username, @Nullable String password) throws SQLException { Object connSpec = ReflectionUtils.invokeJdbcMethod(this.newJdbcConnSpecMethod, null); if (isolationLevel != null) { diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/EmbeddedDatabaseFactory.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/EmbeddedDatabaseFactory.java index baf30e4052c..fa3ad1a688d 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/EmbeddedDatabaseFactory.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/EmbeddedDatabaseFactory.java @@ -21,6 +21,7 @@ import java.sql.Connection; import java.sql.SQLException; import java.util.UUID; import java.util.logging.Logger; + import javax.sql.DataSource; import org.apache.commons.logging.Log; @@ -29,6 +30,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.jdbc.datasource.SimpleDriverDataSource; import org.springframework.jdbc.datasource.init.DatabasePopulator; import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -234,6 +236,7 @@ public class EmbeddedDatabaseFactory { * or if the database has been shut down. Subclasses may call this method to * access the {@code DataSource} instance directly. */ + @Nullable protected final DataSource getDataSource() { return this.dataSource; } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/package-info.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/package-info.java index 4cb074c5753..18e1a703379 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/package-info.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/package-info.java @@ -1,4 +1,7 @@ /** * Provides extensible support for creating embedded database instances. */ +@NonNullApi package org.springframework.jdbc.datasource.embedded; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/init/ResourceDatabasePopulator.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/init/ResourceDatabasePopulator.java index 43d51decb99..192fd96e831 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/init/ResourceDatabasePopulator.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/init/ResourceDatabasePopulator.java @@ -20,10 +20,12 @@ import java.sql.Connection; import java.util.ArrayList; import java.util.Arrays; import java.util.List; + import javax.sql.DataSource; import org.springframework.core.io.Resource; import org.springframework.core.io.support.EncodedResource; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -102,7 +104,7 @@ public class ResourceDatabasePopulator implements DatabasePopulator { * @since 4.0.3 */ public ResourceDatabasePopulator(boolean continueOnError, boolean ignoreFailedDrops, - String sqlScriptEncoding, Resource... scripts) { + @Nullable String sqlScriptEncoding, Resource... scripts) { this(scripts); this.continueOnError = continueOnError; @@ -152,7 +154,7 @@ public class ResourceDatabasePopulator implements DatabasePopulator { * or empty to indicate platform encoding * @see #addScript(Resource) */ - public void setSqlScriptEncoding(String sqlScriptEncoding) { + public void setSqlScriptEncoding(@Nullable String sqlScriptEncoding) { this.sqlScriptEncoding = StringUtils.hasText(sqlScriptEncoding) ? sqlScriptEncoding : null; } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/init/package-info.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/init/package-info.java index ff831a91f8a..ffe50577379 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/init/package-info.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/init/package-info.java @@ -1,4 +1,7 @@ /** * Provides extensible support for initializing databases through scripts. */ +@NonNullApi package org.springframework.jdbc.datasource.init; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/lookup/MapDataSourceLookup.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/lookup/MapDataSourceLookup.java index 24cfdfbe789..49aa557fa52 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/lookup/MapDataSourceLookup.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/lookup/MapDataSourceLookup.java @@ -19,8 +19,10 @@ package org.springframework.jdbc.datasource.lookup; import java.util.Collections; import java.util.HashMap; import java.util.Map; + import javax.sql.DataSource; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -71,7 +73,7 @@ public class MapDataSourceLookup implements DataSourceLookup { * call effectively has no effect. * @param dataSources said {@link Map} of {@link DataSource DataSources} */ - public void setDataSources(Map dataSources) { + public void setDataSources(@Nullable Map dataSources) { if (dataSources != null) { this.dataSources.putAll(dataSources); } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/lookup/package-info.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/lookup/package-info.java index e7f32d33e4c..2c20a49426e 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/lookup/package-info.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/lookup/package-info.java @@ -1,4 +1,7 @@ /** * Provides a strategy for looking up JDBC DataSources by name. */ +@NonNullApi package org.springframework.jdbc.datasource.lookup; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/package-info.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/package-info.java index 9dce44a2c4d..6dce266ab40 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/package-info.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/package-info.java @@ -3,4 +3,7 @@ * a PlatformTransactionManager for a single DataSource, * and various simple DataSource implementations. */ +@NonNullApi package org.springframework.jdbc.datasource; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/object/MappingSqlQueryWithParameters.java b/spring-jdbc/src/main/java/org/springframework/jdbc/object/MappingSqlQueryWithParameters.java index ae0b5fc32b5..f6fd55637bc 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/object/MappingSqlQueryWithParameters.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/object/MappingSqlQueryWithParameters.java @@ -19,9 +19,11 @@ package org.springframework.jdbc.object; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Map; + import javax.sql.DataSource; import org.springframework.jdbc.core.RowMapper; +import org.springframework.lang.Nullable; /** * Reusable RDBMS query in which concrete subclasses must implement @@ -89,7 +91,7 @@ public abstract class MappingSqlQueryWithParameters extends SqlQuery { * Subclasses can simply not catch SQLExceptions, relying on the * framework to clean up. */ - protected abstract T mapRow(ResultSet rs, int rowNum, Object[] parameters, Map context) + protected abstract T mapRow(ResultSet rs, int rowNum, @Nullable Object[] parameters, @Nullable Map context) throws SQLException; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/object/RdbmsOperation.java b/spring-jdbc/src/main/java/org/springframework/jdbc/object/RdbmsOperation.java index a1d71e1ff60..557fbd6eb26 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/object/RdbmsOperation.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/object/RdbmsOperation.java @@ -23,6 +23,7 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; + import javax.sql.DataSource; import org.apache.commons.logging.Log; @@ -32,6 +33,7 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.SqlParameter; +import org.springframework.lang.Nullable; /** * An "RDBMS operation" is a multi-threaded, reusable object representing a query, @@ -376,7 +378,7 @@ public abstract class RdbmsOperation implements InitializingBean { * @param parameters parameters supplied (may be {@code null}) * @throws InvalidDataAccessApiUsageException if the parameters are invalid */ - protected void validateParameters(Object[] parameters) throws InvalidDataAccessApiUsageException { + protected void validateParameters(@Nullable Object[] parameters) throws InvalidDataAccessApiUsageException { checkCompiled(); int declaredInParameters = 0; for (SqlParameter param : this.declaredParameters) { @@ -399,7 +401,7 @@ public abstract class RdbmsOperation implements InitializingBean { * @param parameters parameter Map supplied. May be {@code null}. * @throws InvalidDataAccessApiUsageException if the parameters are invalid */ - protected void validateNamedParameters(Map parameters) throws InvalidDataAccessApiUsageException { + protected void validateNamedParameters(@Nullable Map parameters) throws InvalidDataAccessApiUsageException { checkCompiled(); Map paramsToUse = (parameters != null ? parameters : Collections. emptyMap()); int declaredInParameters = 0; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/object/SqlCall.java b/spring-jdbc/src/main/java/org/springframework/jdbc/object/SqlCall.java index 6420802d3ff..31964999108 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/object/SqlCall.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/object/SqlCall.java @@ -18,12 +18,14 @@ package org.springframework.jdbc.object; import java.util.List; import java.util.Map; + import javax.sql.DataSource; import org.springframework.jdbc.core.CallableStatementCreator; import org.springframework.jdbc.core.CallableStatementCreatorFactory; import org.springframework.jdbc.core.ParameterMapper; import org.springframework.jdbc.core.SqlParameter; +import org.springframework.lang.Nullable; /** * RdbmsOperation using a JdbcTemplate and representing a SQL-based @@ -180,7 +182,7 @@ public abstract class SqlCall extends RdbmsOperation { * with this parameters. * @param inParams parameters. May be {@code null}. */ - protected CallableStatementCreator newCallableStatementCreator(Map inParams) { + protected CallableStatementCreator newCallableStatementCreator(@Nullable Map inParams) { return this.callableStatementFactory.newCallableStatementCreator(inParams); } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/object/SqlOperation.java b/spring-jdbc/src/main/java/org/springframework/jdbc/object/SqlOperation.java index bc85ae180b8..01cad6dd316 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/object/SqlOperation.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/object/SqlOperation.java @@ -21,6 +21,7 @@ import org.springframework.jdbc.core.PreparedStatementCreatorFactory; import org.springframework.jdbc.core.PreparedStatementSetter; import org.springframework.jdbc.core.namedparam.NamedParameterUtils; import org.springframework.jdbc.core.namedparam.ParsedSql; +import org.springframework.lang.Nullable; /** * Operation object representing a SQL-based operation such as a query or update, @@ -91,7 +92,7 @@ public abstract class SqlOperation extends RdbmsOperation { * with the given parameters. * @param params the parameter array (may be {@code null}) */ - protected final PreparedStatementSetter newPreparedStatementSetter(Object[] params) { + protected final PreparedStatementSetter newPreparedStatementSetter(@Nullable Object[] params) { return this.preparedStatementFactory.newPreparedStatementSetter(params); } @@ -100,7 +101,7 @@ public abstract class SqlOperation extends RdbmsOperation { * with the given parameters. * @param params the parameter array (may be {@code null}) */ - protected final PreparedStatementCreator newPreparedStatementCreator(Object[] params) { + protected final PreparedStatementCreator newPreparedStatementCreator(@Nullable Object[] params) { return this.preparedStatementFactory.newPreparedStatementCreator(params); } @@ -111,7 +112,7 @@ public abstract class SqlOperation extends RdbmsOperation { * the factory's, for example because of named parameter expanding) * @param params the parameter array (may be {@code null}) */ - protected final PreparedStatementCreator newPreparedStatementCreator(String sqlToUse, Object[] params) { + protected final PreparedStatementCreator newPreparedStatementCreator(String sqlToUse, @Nullable Object[] params) { return this.preparedStatementFactory.newPreparedStatementCreator(sqlToUse, params); } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/object/SqlQuery.java b/spring-jdbc/src/main/java/org/springframework/jdbc/object/SqlQuery.java index 93bbc680779..2c02e55cdbb 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/object/SqlQuery.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/object/SqlQuery.java @@ -18,6 +18,7 @@ package org.springframework.jdbc.object; import java.util.List; import java.util.Map; + import javax.sql.DataSource; import org.springframework.dao.DataAccessException; @@ -26,6 +27,7 @@ import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterUtils; import org.springframework.jdbc.core.namedparam.ParsedSql; +import org.springframework.lang.Nullable; /** * Reusable operation object representing a SQL query. @@ -247,6 +249,7 @@ public abstract class SqlQuery extends SqlOperation { * choose to treat this as an error and throw an exception. * @see org.springframework.dao.support.DataAccessUtils#singleResult */ + @Nullable public T findObject(Object[] params, Map context) throws DataAccessException { List results = execute(params, context); return DataAccessUtils.singleResult(results); @@ -357,6 +360,6 @@ public abstract class SqlQuery extends SqlOperation { * but it can be useful for creating the objects of the result list. * @see #execute */ - protected abstract RowMapper newRowMapper(Object[] parameters, Map context); + protected abstract RowMapper newRowMapper(@Nullable Object[] parameters, Map context); } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/object/StoredProcedure.java b/spring-jdbc/src/main/java/org/springframework/jdbc/object/StoredProcedure.java index 30e08b29e7f..8a71bf511b4 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/object/StoredProcedure.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/object/StoredProcedure.java @@ -18,6 +18,7 @@ package org.springframework.jdbc.object; import java.util.HashMap; import java.util.Map; + import javax.sql.DataSource; import org.springframework.dao.DataAccessException; @@ -25,6 +26,7 @@ import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.ParameterMapper; import org.springframework.jdbc.core.SqlParameter; +import org.springframework.lang.Nullable; /** * Superclass for object abstractions of RDBMS stored procedures. @@ -109,7 +111,7 @@ public abstract class StoredProcedure extends SqlCall { * Output parameters will appear here, with their values after the * stored procedure has been called. */ - public Map execute(Object... inParams) { + public Map execute(@Nullable Object... inParams) { Map paramsToUse = new HashMap<>(); validateParameters(inParams); int i = 0; @@ -137,7 +139,7 @@ public abstract class StoredProcedure extends SqlCall { * Output parameters will appear here, with their values after the * stored procedure has been called. */ - public Map execute(Map inParams) throws DataAccessException { + public Map execute(@Nullable Map inParams) throws DataAccessException { validateParameters(inParams.values().toArray()); return getJdbcTemplate().call(newCallableStatementCreator(inParams), getDeclaredParameters()); } @@ -158,7 +160,7 @@ public abstract class StoredProcedure extends SqlCall { * Output parameters will appear here, with their values after the * stored procedure has been called. */ - public Map execute(ParameterMapper inParamMapper) throws DataAccessException { + public Map execute(@Nullable ParameterMapper inParamMapper) throws DataAccessException { checkCompiled(); return getJdbcTemplate().call(newCallableStatementCreator(inParamMapper), getDeclaredParameters()); } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/object/UpdatableSqlQuery.java b/spring-jdbc/src/main/java/org/springframework/jdbc/object/UpdatableSqlQuery.java index 081504f94fa..326b2eaf180 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/object/UpdatableSqlQuery.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/object/UpdatableSqlQuery.java @@ -19,9 +19,11 @@ package org.springframework.jdbc.object; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Map; + import javax.sql.DataSource; import org.springframework.jdbc.core.RowMapper; +import org.springframework.lang.Nullable; /** * Reusable RDBMS query in which concrete subclasses must implement @@ -78,7 +80,7 @@ public abstract class UpdatableSqlQuery extends SqlQuery { * Subclasses can simply not catch SQLExceptions, relying on the * framework to clean up. */ - protected abstract T updateRow(ResultSet rs, int rowNum, Map context) throws SQLException; + protected abstract T updateRow(ResultSet rs, int rowNum, @Nullable Map context) throws SQLException; /** diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/object/package-info.java b/spring-jdbc/src/main/java/org/springframework/jdbc/object/package-info.java index 6bbe5166b95..8a511307bf9 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/object/package-info.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/object/package-info.java @@ -14,4 +14,7 @@ * Expert One-On-One J2EE Design and Development * by Rod Johnson (Wrox, 2002). */ +@NonNullApi package org.springframework.jdbc.object; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/package-info.java b/spring-jdbc/src/main/java/org/springframework/jdbc/package-info.java index 1a05b52b1b2..ec5e65fd6af 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/package-info.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/package-info.java @@ -17,4 +17,7 @@ * Expert One-On-One J2EE Design and Development * by Rod Johnson (Wrox, 2002). */ +@NonNullApi package org.springframework.jdbc; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/AbstractFallbackSQLExceptionTranslator.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/AbstractFallbackSQLExceptionTranslator.java index 6e4c548eab2..639f374f0ae 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/AbstractFallbackSQLExceptionTranslator.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/AbstractFallbackSQLExceptionTranslator.java @@ -23,6 +23,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.UncategorizedSQLException; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -51,6 +52,7 @@ public abstract class AbstractFallbackSQLExceptionTranslator implements SQLExcep /** * Return the fallback exception translator, if any. */ + @Nullable public SQLExceptionTranslator getFallbackTranslator() { return this.fallbackTranslator; } @@ -95,7 +97,8 @@ public abstract class AbstractFallbackSQLExceptionTranslator implements SQLExcep * @return the DataAccessException, wrapping the {@code SQLException}; * or {@code null} if no exception match found */ - protected abstract DataAccessException doTranslate(String task, String sql, SQLException ex); + @Nullable + protected abstract DataAccessException doTranslate(String task, @Nullable String sql, SQLException ex); /** @@ -107,7 +110,7 @@ public abstract class AbstractFallbackSQLExceptionTranslator implements SQLExcep * @param ex the offending {@code SQLException} * @return the message {@code String} to use */ - protected String buildMessage(String task, String sql, SQLException ex) { + protected String buildMessage(String task, @Nullable String sql, SQLException ex) { return task + "; SQL [" + sql + "]; " + ex.getMessage(); } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistry.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistry.java index 19801eb5920..928f3102731 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistry.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistry.java @@ -22,6 +22,8 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; + /** * Registry for custom {@link org.springframework.jdbc.support.SQLExceptionTranslator} instances associated with * specific databases allowing for overriding translation based on values contained in the configuration file @@ -86,6 +88,7 @@ public class CustomSQLExceptionTranslatorRegistry { * @param dbName the database name * @return the custom translator, or {@code null} if none found */ + @Nullable public SQLExceptionTranslator findTranslatorForDatabase(String dbName) { return this.translatorMap.get(dbName); } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/JdbcUtils.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/JdbcUtils.java index 0ed787eaf7e..4b7640df90f 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/JdbcUtils.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/JdbcUtils.java @@ -29,6 +29,7 @@ import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.sql.Statement; import java.sql.Types; + import javax.sql.DataSource; import org.apache.commons.logging.Log; @@ -36,6 +37,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.jdbc.CannotGetJdbcConnectionException; import org.springframework.jdbc.datasource.DataSourceUtils; +import org.springframework.lang.Nullable; import org.springframework.util.NumberUtils; /** @@ -61,7 +63,7 @@ public abstract class JdbcUtils { * This is useful for typical finally blocks in manual JDBC code. * @param con the JDBC Connection to close (may be {@code null}) */ - public static void closeConnection(Connection con) { + public static void closeConnection(@Nullable Connection con) { if (con != null) { try { con.close(); @@ -81,7 +83,7 @@ public abstract class JdbcUtils { * This is useful for typical finally blocks in manual JDBC code. * @param stmt the JDBC Statement to close (may be {@code null}) */ - public static void closeStatement(Statement stmt) { + public static void closeStatement(@Nullable Statement stmt) { if (stmt != null) { try { stmt.close(); @@ -101,7 +103,7 @@ public abstract class JdbcUtils { * This is useful for typical finally blocks in manual JDBC code. * @param rs the JDBC ResultSet to close (may be {@code null}) */ - public static void closeResultSet(ResultSet rs) { + public static void closeResultSet(@Nullable ResultSet rs) { if (rs != null) { try { rs.close(); @@ -131,7 +133,7 @@ public abstract class JdbcUtils { * @throws SQLException if thrown by the JDBC API * @see #getResultSetValue(ResultSet, int) */ - public static Object getResultSetValue(ResultSet rs, int index, Class requiredType) throws SQLException { + public static Object getResultSetValue(ResultSet rs, int index, @Nullable Class requiredType) throws SQLException { if (requiredType == null) { return getResultSetValue(rs, index); } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/KeyHolder.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/KeyHolder.java index b917ecb95d3..e71725bd10d 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/KeyHolder.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/KeyHolder.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.Map; import org.springframework.dao.InvalidDataAccessApiUsageException; +import org.springframework.lang.Nullable; /** * Interface for retrieving keys, typically used for auto-generated keys @@ -54,6 +55,7 @@ public interface KeyHolder { * @return the generated key * @throws InvalidDataAccessApiUsageException if multiple keys are encountered. */ + @Nullable Number getKey() throws InvalidDataAccessApiUsageException; /** @@ -63,6 +65,7 @@ public interface KeyHolder { * @return the Map of generated keys * @throws InvalidDataAccessApiUsageException if keys for multiple rows are encountered */ + @Nullable Map getKeys() throws InvalidDataAccessApiUsageException; /** diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/SQLErrorCodeSQLExceptionTranslator.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/SQLErrorCodeSQLExceptionTranslator.java index d9afb8837fe..77b54ba5ce0 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/SQLErrorCodeSQLExceptionTranslator.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/SQLErrorCodeSQLExceptionTranslator.java @@ -20,6 +20,7 @@ import java.lang.reflect.Constructor; import java.sql.BatchUpdateException; import java.sql.SQLException; import java.util.Arrays; + import javax.sql.DataSource; import org.springframework.dao.CannotAcquireLockException; @@ -33,6 +34,7 @@ import org.springframework.dao.PermissionDeniedDataAccessException; import org.springframework.dao.TransientDataAccessResourceException; import org.springframework.jdbc.BadSqlGrammarException; import org.springframework.jdbc.InvalidResultSetAccessException; +import org.springframework.lang.Nullable; /** * Implementation of {@link SQLExceptionTranslator} that analyzes vendor-specific error codes. @@ -295,7 +297,7 @@ public class SQLErrorCodeSQLExceptionTranslator extends AbstractFallbackSQLExcep * as a nested root cause. This implementation always returns null, meaning that * the translator always falls back to the default error codes. */ - protected DataAccessException customTranslate(String task, String sql, SQLException sqlEx) { + protected DataAccessException customTranslate(String task, @Nullable String sql, SQLException sqlEx) { return null; } @@ -313,7 +315,7 @@ public class SQLErrorCodeSQLExceptionTranslator extends AbstractFallbackSQLExcep * @see CustomSQLErrorCodesTranslation#setExceptionClass */ protected DataAccessException createCustomException( - String task, String sql, SQLException sqlEx, Class exceptionClass) { + String task, @Nullable String sql, SQLException sqlEx, Class exceptionClass) { // find appropriate constructor try { diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/SQLErrorCodesFactory.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/SQLErrorCodesFactory.java index 476c1915e14..f5a433740fe 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/SQLErrorCodesFactory.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/SQLErrorCodesFactory.java @@ -18,6 +18,7 @@ package org.springframework.jdbc.support; import java.util.Collections; import java.util.Map; + import javax.sql.DataSource; import org.apache.commons.logging.Log; @@ -28,6 +29,7 @@ import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ConcurrentReferenceHashMap; import org.springframework.util.PatternMatchUtils; @@ -145,6 +147,7 @@ public class SQLErrorCodesFactory { * @return the resource, or {@code null} if the resource wasn't found * @see #getInstance */ + @Nullable protected Resource loadResource(String path) { return new ClassPathResource(path, getClass().getClassLoader()); } @@ -255,6 +258,7 @@ public class SQLErrorCodesFactory { * @since 4.3.5 * @see #registerDatabase(DataSource, String) */ + @Nullable public SQLErrorCodes unregisterDatabase(DataSource dataSource) { return this.dataSourceCache.remove(dataSource); } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/SQLExceptionTranslator.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/SQLExceptionTranslator.java index 193b1e1b1f4..082e856c0ec 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/SQLExceptionTranslator.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/SQLExceptionTranslator.java @@ -19,6 +19,7 @@ package org.springframework.jdbc.support; import java.sql.SQLException; import org.springframework.dao.DataAccessException; +import org.springframework.lang.Nullable; /** * Strategy interface for translating between {@link SQLException SQLExceptions} @@ -50,6 +51,7 @@ public interface SQLExceptionTranslator { * @return the DataAccessException, wrapping the {@code SQLException} * @see org.springframework.dao.DataAccessException#getRootCause() */ - DataAccessException translate(String task, String sql, SQLException ex); + @Nullable + DataAccessException translate(String task, @Nullable String sql, SQLException ex); } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/lob/LobCreator.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/lob/LobCreator.java index 2a937089794..77d9352650f 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/lob/LobCreator.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/lob/LobCreator.java @@ -22,6 +22,8 @@ import java.io.Reader; import java.sql.PreparedStatement; import java.sql.SQLException; +import org.springframework.lang.Nullable; + /** * Interface that abstracts potentially database-specific creation of large binary * fields and large text fields. Does not work with {@code java.sql.Blob} @@ -68,7 +70,7 @@ public interface LobCreator extends Closeable { * @throws SQLException if thrown by JDBC methods * @see java.sql.PreparedStatement#setBytes */ - void setBlobAsBytes(PreparedStatement ps, int paramIndex, byte[] content) + void setBlobAsBytes(PreparedStatement ps, int paramIndex, @Nullable byte[] content) throws SQLException; /** @@ -82,7 +84,7 @@ public interface LobCreator extends Closeable { * @see java.sql.PreparedStatement#setBinaryStream */ void setBlobAsBinaryStream( - PreparedStatement ps, int paramIndex, InputStream contentStream, int contentLength) + PreparedStatement ps, int paramIndex, @Nullable InputStream contentStream, int contentLength) throws SQLException; /** @@ -95,7 +97,7 @@ public interface LobCreator extends Closeable { * @throws SQLException if thrown by JDBC methods * @see java.sql.PreparedStatement#setBytes */ - void setClobAsString(PreparedStatement ps, int paramIndex, String content) + void setClobAsString(PreparedStatement ps, int paramIndex, @Nullable String content) throws SQLException; /** @@ -109,7 +111,7 @@ public interface LobCreator extends Closeable { * @see java.sql.PreparedStatement#setAsciiStream */ void setClobAsAsciiStream( - PreparedStatement ps, int paramIndex, InputStream asciiStream, int contentLength) + PreparedStatement ps, int paramIndex, @Nullable InputStream asciiStream, int contentLength) throws SQLException; /** @@ -123,7 +125,7 @@ public interface LobCreator extends Closeable { * @see java.sql.PreparedStatement#setCharacterStream */ void setClobAsCharacterStream( - PreparedStatement ps, int paramIndex, Reader characterStream, int contentLength) + PreparedStatement ps, int paramIndex, @Nullable Reader characterStream, int contentLength) throws SQLException; /** diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/lob/LobHandler.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/lob/LobHandler.java index 83b4367d5c8..0aef08ef1ca 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/lob/LobHandler.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/lob/LobHandler.java @@ -21,6 +21,8 @@ import java.io.Reader; import java.sql.ResultSet; import java.sql.SQLException; +import org.springframework.lang.Nullable; + /** * Abstraction for handling large binary fields and large text fields in * specific databases, no matter if represented as simple types or Large OBjects. @@ -83,6 +85,7 @@ public interface LobHandler { * @throws SQLException if thrown by JDBC methods * @see java.sql.ResultSet#getBytes */ + @Nullable byte[] getBlobAsBytes(ResultSet rs, String columnName) throws SQLException; /** @@ -95,6 +98,7 @@ public interface LobHandler { * @throws SQLException if thrown by JDBC methods * @see java.sql.ResultSet#getBytes */ + @Nullable byte[] getBlobAsBytes(ResultSet rs, int columnIndex) throws SQLException; /** @@ -107,6 +111,7 @@ public interface LobHandler { * @throws SQLException if thrown by JDBC methods * @see java.sql.ResultSet#getBinaryStream */ + @Nullable InputStream getBlobAsBinaryStream(ResultSet rs, String columnName) throws SQLException; /** @@ -119,6 +124,7 @@ public interface LobHandler { * @throws SQLException if thrown by JDBC methods * @see java.sql.ResultSet#getBinaryStream */ + @Nullable InputStream getBlobAsBinaryStream(ResultSet rs, int columnIndex) throws SQLException; /** @@ -131,6 +137,7 @@ public interface LobHandler { * @throws SQLException if thrown by JDBC methods * @see java.sql.ResultSet#getString */ + @Nullable String getClobAsString(ResultSet rs, String columnName) throws SQLException; /** @@ -143,6 +150,7 @@ public interface LobHandler { * @throws SQLException if thrown by JDBC methods * @see java.sql.ResultSet#getString */ + @Nullable String getClobAsString(ResultSet rs, int columnIndex) throws SQLException; /** @@ -155,6 +163,7 @@ public interface LobHandler { * @throws SQLException if thrown by JDBC methods * @see java.sql.ResultSet#getAsciiStream */ + @Nullable InputStream getClobAsAsciiStream(ResultSet rs, String columnName) throws SQLException; /** @@ -167,6 +176,7 @@ public interface LobHandler { * @throws SQLException if thrown by JDBC methods * @see java.sql.ResultSet#getAsciiStream */ + @Nullable InputStream getClobAsAsciiStream(ResultSet rs, int columnIndex) throws SQLException; /** diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/lob/package-info.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/lob/package-info.java index 4ae1cfe995d..6b2fa416988 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/lob/package-info.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/lob/package-info.java @@ -2,4 +2,7 @@ * Provides a strategy interface for Large OBject handling, * as well as a customizable default implementation. */ +@NonNullApi package org.springframework.jdbc.support.lob; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/package-info.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/package-info.java index ecd758ee014..6814d37a595 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/package-info.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/package-info.java @@ -6,4 +6,7 @@ *

    Can be used independently, for example in custom JDBC access code, * or in JDBC-based O/R mapping layers. */ +@NonNullApi package org.springframework.jdbc.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/rowset/package-info.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/rowset/package-info.java index b3d8f6c9869..4d18ce41d75 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/rowset/package-info.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/rowset/package-info.java @@ -2,4 +2,7 @@ * Provides a convenient holder for disconnected result sets. * Supported by JdbcTemplate, but can be used independently too. */ +@NonNullApi package org.springframework.jdbc.support.rowset; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/xml/SqlXmlHandler.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/xml/SqlXmlHandler.java index 320a3bd9772..c557bb9fb41 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/xml/SqlXmlHandler.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/xml/SqlXmlHandler.java @@ -20,11 +20,14 @@ import java.io.InputStream; import java.io.Reader; import java.sql.ResultSet; import java.sql.SQLException; + import javax.xml.transform.Result; import javax.xml.transform.Source; import org.w3c.dom.Document; +import org.springframework.lang.Nullable; + /** * Abstraction for handling XML fields in specific databases. Its main purpose * is to isolate database-specific handling of XML stored in the database. @@ -61,6 +64,7 @@ public interface SqlXmlHandler { * @see java.sql.ResultSet#getString * @see java.sql.ResultSet#getSQLXML */ + @Nullable String getXmlAsString(ResultSet rs, String columnName) throws SQLException; /** @@ -75,6 +79,7 @@ public interface SqlXmlHandler { * @see java.sql.ResultSet#getString * @see java.sql.ResultSet#getSQLXML */ + @Nullable String getXmlAsString(ResultSet rs, int columnIndex) throws SQLException; /** @@ -89,6 +94,7 @@ public interface SqlXmlHandler { * @see java.sql.ResultSet#getSQLXML * @see java.sql.SQLXML#getBinaryStream */ + @Nullable InputStream getXmlAsBinaryStream(ResultSet rs, String columnName) throws SQLException; /** @@ -103,6 +109,7 @@ public interface SqlXmlHandler { * @see java.sql.ResultSet#getSQLXML * @see java.sql.SQLXML#getBinaryStream */ + @Nullable InputStream getXmlAsBinaryStream(ResultSet rs, int columnIndex) throws SQLException; /** @@ -117,6 +124,7 @@ public interface SqlXmlHandler { * @see java.sql.ResultSet#getSQLXML * @see java.sql.SQLXML#getCharacterStream */ + @Nullable Reader getXmlAsCharacterStream(ResultSet rs, String columnName) throws SQLException; /** @@ -131,6 +139,7 @@ public interface SqlXmlHandler { * @see java.sql.ResultSet#getSQLXML * @see java.sql.SQLXML#getCharacterStream */ + @Nullable Reader getXmlAsCharacterStream(ResultSet rs, int columnIndex) throws SQLException; /** @@ -146,6 +155,7 @@ public interface SqlXmlHandler { * @see java.sql.ResultSet#getSQLXML * @see java.sql.SQLXML#getSource */ + @Nullable Source getXmlAsSource(ResultSet rs, String columnName, Class sourceClass) throws SQLException; /** @@ -161,6 +171,7 @@ public interface SqlXmlHandler { * @see java.sql.ResultSet#getSQLXML * @see java.sql.SQLXML#getSource */ + @Nullable Source getXmlAsSource(ResultSet rs, int columnIndex, Class sourceClass) throws SQLException; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/xml/SqlXmlObjectMappingHandler.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/xml/SqlXmlObjectMappingHandler.java index 6e55f1ec88a..1f8d4f7418c 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/xml/SqlXmlObjectMappingHandler.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/xml/SqlXmlObjectMappingHandler.java @@ -19,6 +19,8 @@ package org.springframework.jdbc.support.xml; import java.sql.ResultSet; import java.sql.SQLException; +import org.springframework.lang.Nullable; + /** * Abstraction for handling XML object mapping to fields in a database. * @@ -43,6 +45,7 @@ public interface SqlXmlObjectMappingHandler extends SqlXmlHandler { * @throws java.sql.SQLException if thrown by JDBC methods * @see java.sql.ResultSet#getSQLXML */ + @Nullable Object getXmlAsObject(ResultSet rs, String columnName) throws SQLException; /** @@ -55,6 +58,7 @@ public interface SqlXmlObjectMappingHandler extends SqlXmlHandler { * @throws java.sql.SQLException if thrown by JDBC methods * @see java.sql.ResultSet#getSQLXML */ + @Nullable Object getXmlAsObject(ResultSet rs, int columnIndex) throws SQLException; /** diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/xml/package-info.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/xml/package-info.java index a6e46df0bf8..14bfdee577b 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/xml/package-info.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/xml/package-info.java @@ -1,4 +1,7 @@ /** * Abstraction for handling fields of SQLXML data type. */ +@NonNullApi package org.springframework.jdbc.support.xml; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jdbc/src/main/kotlin/org/springframework/jdbc/core/JdbcOperationsExtensions.kt b/spring-jdbc/src/main/kotlin/org/springframework/jdbc/core/JdbcOperationsExtensions.kt index 9b2fb62c60d..d28fcf6a707 100644 --- a/spring-jdbc/src/main/kotlin/org/springframework/jdbc/core/JdbcOperationsExtensions.kt +++ b/spring-jdbc/src/main/kotlin/org/springframework/jdbc/core/JdbcOperationsExtensions.kt @@ -26,7 +26,7 @@ import kotlin.reflect.KClass * @author Mario Arias * @since 5.0 */ -fun JdbcOperations.queryForObject(sql: String, elementType: KClass): T = queryForObject(sql, elementType.java) +fun JdbcOperations.queryForObject(sql: String, elementType: KClass): T? = queryForObject(sql, elementType.java) /** * Extension for [JdbcOperations.queryForObject] providing a `queryForObject("...")` variant @@ -34,7 +34,7 @@ fun JdbcOperations.queryForObject(sql: String, elementType: KClass) * @author Mario Arias * @since 5.0 */ -inline fun JdbcOperations.queryForObject(sql: String): T = queryForObject(sql, T::class.java) +inline fun JdbcOperations.queryForObject(sql: String): T? = queryForObject(sql, T::class.java) /** * Extensions for [JdbcOperations.queryForObject] providing a RowMapper-like function variant: `queryForObject("...", arg1, argN){ rs, i -> }`. @@ -51,7 +51,7 @@ fun JdbcOperations.queryForObject(sql: String, vararg args: Any, funct * @author Mario Arias * @since 5.0 */ -fun JdbcOperations.queryForObject(sql: String, args: Array, argTypes: IntArray, requiredType: KClass): T = +fun JdbcOperations.queryForObject(sql: String, args: Array, argTypes: IntArray, requiredType: KClass): T? = queryForObject(sql, args, argTypes, requiredType.java) /** @@ -60,7 +60,7 @@ fun JdbcOperations.queryForObject(sql: String, args: Array, a * @author Mario Arias * @since 5.0 */ -inline fun JdbcOperations.queryForObject(sql: String, args: Array, argTypes: IntArray): T = +inline fun JdbcOperations.queryForObject(sql: String, args: Array, argTypes: IntArray): T? = queryForObject(sql, args, argTypes, T::class.java) /** @@ -69,7 +69,7 @@ inline fun JdbcOperations.queryForObject(sql: String, args: Ar * @author Mario Arias * @since 5.0 */ -fun JdbcOperations.queryForObject(sql: String, args: Array, requiredType: KClass): T = +fun JdbcOperations.queryForObject(sql: String, args: Array, requiredType: KClass): T? = queryForObject(sql, args, requiredType.java) /** @@ -78,7 +78,7 @@ fun JdbcOperations.queryForObject(sql: String, args: Array, r * @author Mario Arias * @since 5.0 */ -inline fun JdbcOperations.queryForObject(sql: String, args: Array): T = +inline fun JdbcOperations.queryForObject(sql: String, args: Array): T? = queryForObject(sql, args, T::class.java) /** @@ -87,7 +87,7 @@ inline fun JdbcOperations.queryForObject(sql: String, args: Ar * @author Mario Arias * @since 5.0 */ -fun JdbcOperations.queryForObject(sql: String, requiredType: KClass, vararg args: Any): T = +fun JdbcOperations.queryForObject(sql: String, requiredType: KClass, vararg args: Any): T? = queryForObject(sql, requiredType.java, *args) diff --git a/spring-jdbc/src/test/kotlin/org/springframework/jdbc/core/JdbcOperationsExtensionsTests.kt b/spring-jdbc/src/test/kotlin/org/springframework/jdbc/core/JdbcOperationsExtensionsTests.kt index 9b9718844f6..9f7cb441e94 100644 --- a/spring-jdbc/src/test/kotlin/org/springframework/jdbc/core/JdbcOperationsExtensionsTests.kt +++ b/spring-jdbc/src/test/kotlin/org/springframework/jdbc/core/JdbcOperationsExtensionsTests.kt @@ -82,7 +82,7 @@ class JdbcOperationsExtensionsTests { @Test fun `queryForObject with reified type`() { - val i: Int = template.queryForObject("select age from customer where id = 3") + val i: Int? = template.queryForObject("select age from customer where id = 3") assertEquals(22, i) } @@ -103,7 +103,7 @@ class JdbcOperationsExtensionsTests { @Test fun `queryForObject with reified type and argTypes`() { - val i: Int = template.queryForObject("select age from customer where id = ?", arrayOf(3), + val i: Int? = template.queryForObject("select age from customer where id = ?", arrayOf(3), intArrayOf(JDBCType.INTEGER.vendorTypeNumber)) assertEquals(22, i) } @@ -116,7 +116,7 @@ class JdbcOperationsExtensionsTests { @Test fun `queryForObject with reified type and args`() { - val i: Int = template.queryForObject("select age from customer where id = ?", arrayOf(3)) + val i: Int? = template.queryForObject("select age from customer where id = ?", arrayOf(3)) assertEquals(22, i) } diff --git a/spring-jms/src/main/java/org/springframework/jms/JmsException.java b/spring-jms/src/main/java/org/springframework/jms/JmsException.java index b2d3a6f4426..5449776d56e 100644 --- a/spring-jms/src/main/java/org/springframework/jms/JmsException.java +++ b/spring-jms/src/main/java/org/springframework/jms/JmsException.java @@ -19,6 +19,7 @@ package org.springframework.jms; import javax.jms.JMSException; import org.springframework.core.NestedRuntimeException; +import org.springframework.lang.Nullable; /** * Base class for exception thrown by the framework whenever it @@ -67,6 +68,7 @@ public abstract class JmsException extends NestedRuntimeException { * @return a string specifying the vendor-specific error code if the * root cause is an instance of JMSException, or {@code null} */ + @Nullable public String getErrorCode() { Throwable cause = getCause(); if (cause instanceof JMSException) { diff --git a/spring-jms/src/main/java/org/springframework/jms/annotation/package-info.java b/spring-jms/src/main/java/org/springframework/jms/annotation/package-info.java index 1255e309aff..665ecd621a7 100644 --- a/spring-jms/src/main/java/org/springframework/jms/annotation/package-info.java +++ b/spring-jms/src/main/java/org/springframework/jms/annotation/package-info.java @@ -1,4 +1,7 @@ /** * Annotations and support classes for declarative JMS listener endpoints. */ +@NonNullApi package org.springframework.jms.annotation; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jms/src/main/java/org/springframework/jms/config/AbstractJmsListenerEndpoint.java b/spring-jms/src/main/java/org/springframework/jms/config/AbstractJmsListenerEndpoint.java index 21ae508db88..dcdef2aaea2 100644 --- a/spring-jms/src/main/java/org/springframework/jms/config/AbstractJmsListenerEndpoint.java +++ b/spring-jms/src/main/java/org/springframework/jms/config/AbstractJmsListenerEndpoint.java @@ -22,6 +22,7 @@ import org.springframework.jms.listener.AbstractMessageListenerContainer; import org.springframework.jms.listener.MessageListenerContainer; import org.springframework.jms.listener.endpoint.JmsActivationSpecConfig; import org.springframework.jms.listener.endpoint.JmsMessageEndpointManager; +import org.springframework.lang.Nullable; /** * Base model for a JMS listener endpoint @@ -64,6 +65,7 @@ public abstract class AbstractJmsListenerEndpoint implements JmsListenerEndpoint /** * Return the name of the destination for this endpoint. */ + @Nullable public String getDestination() { return this.destination; } @@ -78,6 +80,7 @@ public abstract class AbstractJmsListenerEndpoint implements JmsListenerEndpoint /** * Return the name for the durable subscription, if any. */ + @Nullable public String getSubscription() { return this.subscription; } @@ -93,6 +96,7 @@ public abstract class AbstractJmsListenerEndpoint implements JmsListenerEndpoint /** * Return the JMS message selector expression, if any. */ + @Nullable public String getSelector() { return this.selector; } @@ -111,6 +115,7 @@ public abstract class AbstractJmsListenerEndpoint implements JmsListenerEndpoint /** * Return the concurrency for the listener, if any. */ + @Nullable public String getConcurrency() { return this.concurrency; } diff --git a/spring-jms/src/main/java/org/springframework/jms/config/AbstractListenerContainerParser.java b/spring-jms/src/main/java/org/springframework/jms/config/AbstractListenerContainerParser.java index f2d33d30235..62f41cf8807 100644 --- a/spring-jms/src/main/java/org/springframework/jms/config/AbstractListenerContainerParser.java +++ b/spring-jms/src/main/java/org/springframework/jms/config/AbstractListenerContainerParser.java @@ -32,6 +32,7 @@ import org.springframework.beans.factory.parsing.CompositeComponentDefinition; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -313,6 +314,7 @@ abstract class AbstractListenerContainerParser implements BeanDefinitionParser { * Create the {@link BeanDefinition} for the container factory using the specified * shared property values. */ + @Nullable protected abstract RootBeanDefinition createContainerFactory(String factoryId, Element containerEle, ParserContext parserContext, PropertyValues commonContainerProperties, PropertyValues specificContainerProperties); @@ -323,6 +325,7 @@ abstract class AbstractListenerContainerParser implements BeanDefinitionParser { PropertyValues commonContainerProperties, PropertyValues specificContainerProperties); + @Nullable protected Integer parseAcknowledgeMode(Element ele, ParserContext parserContext) { String acknowledge = ele.getAttribute(ACKNOWLEDGE_ATTRIBUTE); if (StringUtils.hasText(acknowledge)) { diff --git a/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerEndpointRegistrar.java b/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerEndpointRegistrar.java index 49d5eaf94ee..a836bf2404d 100644 --- a/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerEndpointRegistrar.java +++ b/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerEndpointRegistrar.java @@ -23,6 +23,7 @@ import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.lang.Nullable; import org.springframework.messaging.handler.annotation.support.DefaultMessageHandlerMethodFactory; import org.springframework.messaging.handler.annotation.support.MessageHandlerMethodFactory; import org.springframework.util.Assert; @@ -65,6 +66,7 @@ public class JmsListenerEndpointRegistrar implements BeanFactoryAware, Initializ * Return the {@link JmsListenerEndpointRegistry} instance for this * registrar, may be {@code null}. */ + @Nullable public JmsListenerEndpointRegistry getEndpointRegistry() { return this.endpointRegistry; } @@ -84,6 +86,7 @@ public class JmsListenerEndpointRegistrar implements BeanFactoryAware, Initializ /** * Return the custom {@link MessageHandlerMethodFactory} to use, if any. */ + @Nullable public MessageHandlerMethodFactory getMessageHandlerMethodFactory() { return this.messageHandlerMethodFactory; } @@ -164,7 +167,7 @@ public class JmsListenerEndpointRegistrar implements BeanFactoryAware, Initializ *

    The {@code factory} may be {@code null} if the default factory has to be * used for that endpoint. */ - public void registerEndpoint(JmsListenerEndpoint endpoint, JmsListenerContainerFactory factory) { + public void registerEndpoint(JmsListenerEndpoint endpoint, @Nullable JmsListenerContainerFactory factory) { Assert.notNull(endpoint, "Endpoint must be set"); Assert.hasText(endpoint.getId(), "Endpoint id must be set"); diff --git a/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerEndpointRegistry.java b/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerEndpointRegistry.java index f6d798c8dd3..2b3897ec7e0 100644 --- a/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerEndpointRegistry.java +++ b/spring-jms/src/main/java/org/springframework/jms/config/JmsListenerEndpointRegistry.java @@ -35,6 +35,7 @@ import org.springframework.context.ApplicationListener; import org.springframework.context.SmartLifecycle; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.jms.listener.MessageListenerContainer; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -93,6 +94,7 @@ public class JmsListenerEndpointRegistry implements DisposableBean, SmartLifecyc * @see JmsListenerEndpoint#getId() * @see #getListenerContainerIds() */ + @Nullable public MessageListenerContainer getListenerContainer(String id) { Assert.notNull(id, "Container identifier must not be null"); return this.listenerContainers.get(id); diff --git a/spring-jms/src/main/java/org/springframework/jms/config/MethodJmsListenerEndpoint.java b/spring-jms/src/main/java/org/springframework/jms/config/MethodJmsListenerEndpoint.java index 21eda3484d5..e90d7b7b4de 100644 --- a/spring-jms/src/main/java/org/springframework/jms/config/MethodJmsListenerEndpoint.java +++ b/spring-jms/src/main/java/org/springframework/jms/config/MethodJmsListenerEndpoint.java @@ -31,6 +31,7 @@ import org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter; import org.springframework.jms.support.QosSettings; import org.springframework.jms.support.converter.MessageConverter; import org.springframework.jms.support.destination.DestinationResolver; +import org.springframework.lang.Nullable; import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.messaging.handler.annotation.support.MessageHandlerMethodFactory; import org.springframework.messaging.handler.invocation.InvocableHandlerMethod; @@ -124,7 +125,7 @@ public class MethodJmsListenerEndpoint extends AbstractJmsListenerEndpoint imple * Set the {@link BeanFactory} to use to resolve expressions (may be {@code null}). */ @Override - public void setBeanFactory(BeanFactory beanFactory) { + public void setBeanFactory(@Nullable BeanFactory beanFactory) { if (this.embeddedValueResolver == null && beanFactory instanceof ConfigurableBeanFactory) { this.embeddedValueResolver = new EmbeddedValueResolver((ConfigurableBeanFactory) beanFactory); } @@ -174,6 +175,7 @@ public class MethodJmsListenerEndpoint extends AbstractJmsListenerEndpoint imple /** * Return the default response destination, if any. */ + @Nullable protected String getDefaultResponseDestination() { Method specificMethod = getMostSpecificMethod(); SendTo ann = getSendTo(specificMethod); diff --git a/spring-jms/src/main/java/org/springframework/jms/config/package-info.java b/spring-jms/src/main/java/org/springframework/jms/config/package-info.java index e9b696d3cbd..9ef34e73c45 100644 --- a/spring-jms/src/main/java/org/springframework/jms/config/package-info.java +++ b/spring-jms/src/main/java/org/springframework/jms/config/package-info.java @@ -2,4 +2,7 @@ * Support package for declarative messaging configuration, * with Java configuration and XML schema support. */ +@NonNullApi package org.springframework.jms.config; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jms/src/main/java/org/springframework/jms/connection/CachingConnectionFactory.java b/spring-jms/src/main/java/org/springframework/jms/connection/CachingConnectionFactory.java index ff70aef60cd..06337af7986 100644 --- a/spring-jms/src/main/java/org/springframework/jms/connection/CachingConnectionFactory.java +++ b/spring-jms/src/main/java/org/springframework/jms/connection/CachingConnectionFactory.java @@ -39,6 +39,7 @@ import javax.jms.TemporaryTopic; import javax.jms.Topic; import javax.jms.TopicSession; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -278,6 +279,7 @@ public class CachingConnectionFactory extends SingleConnectionFactory { } @Override + @Nullable public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName = method.getName(); if (methodName.equals("equals")) { diff --git a/spring-jms/src/main/java/org/springframework/jms/connection/ConnectionFactoryUtils.java b/spring-jms/src/main/java/org/springframework/jms/connection/ConnectionFactoryUtils.java index 97fc2997b1b..1418433d334 100644 --- a/spring-jms/src/main/java/org/springframework/jms/connection/ConnectionFactoryUtils.java +++ b/spring-jms/src/main/java/org/springframework/jms/connection/ConnectionFactoryUtils.java @@ -30,6 +30,7 @@ import javax.jms.TopicSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.transaction.support.ResourceHolderSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.Assert; @@ -64,7 +65,7 @@ public abstract class ConnectionFactoryUtils { * @see SmartConnectionFactory#shouldStop * @see org.springframework.jms.support.JmsUtils#closeConnection */ - public static void releaseConnection(Connection con, ConnectionFactory cf, boolean started) { + public static void releaseConnection(Connection con, @Nullable ConnectionFactory cf, boolean started) { if (con == null) { return; } @@ -131,8 +132,9 @@ public abstract class ConnectionFactoryUtils { * @return the transactional Session, or {@code null} if none found * @throws JMSException in case of JMS failure */ + @Nullable public static Session getTransactionalSession(final ConnectionFactory cf, - final Connection existingCon, final boolean synchedLocalTransactionAllowed) + @Nullable final Connection existingCon, final boolean synchedLocalTransactionAllowed) throws JMSException { return doGetTransactionalSession(cf, new ResourceFactory() { @@ -173,8 +175,9 @@ public abstract class ConnectionFactoryUtils { * @return the transactional Session, or {@code null} if none found * @throws JMSException in case of JMS failure */ + @Nullable public static QueueSession getTransactionalQueueSession(final QueueConnectionFactory cf, - final QueueConnection existingCon, final boolean synchedLocalTransactionAllowed) + @Nullable final QueueConnection existingCon, final boolean synchedLocalTransactionAllowed) throws JMSException { return (QueueSession) doGetTransactionalSession(cf, new ResourceFactory() { @@ -215,8 +218,9 @@ public abstract class ConnectionFactoryUtils { * @return the transactional Session, or {@code null} if none found * @throws JMSException in case of JMS failure */ + @Nullable public static TopicSession getTransactionalTopicSession(final TopicConnectionFactory cf, - final TopicConnection existingCon, final boolean synchedLocalTransactionAllowed) + @Nullable final TopicConnection existingCon, final boolean synchedLocalTransactionAllowed) throws JMSException { return (TopicSession) doGetTransactionalSession(cf, new ResourceFactory() { @@ -256,6 +260,7 @@ public abstract class ConnectionFactoryUtils { * @throws JMSException in case of JMS failure * @see #doGetTransactionalSession(javax.jms.ConnectionFactory, ResourceFactory, boolean) */ + @Nullable public static Session doGetTransactionalSession( ConnectionFactory connectionFactory, ResourceFactory resourceFactory) throws JMSException { @@ -274,6 +279,7 @@ public abstract class ConnectionFactoryUtils { * @return the transactional Session, or {@code null} if none found * @throws JMSException in case of JMS failure */ + @Nullable public static Session doGetTransactionalSession( ConnectionFactory connectionFactory, ResourceFactory resourceFactory, boolean startConnection) throws JMSException { @@ -361,6 +367,7 @@ public abstract class ConnectionFactoryUtils { * @return an appropriate Session fetched from the holder, * or {@code null} if none found */ + @Nullable Session getSession(JmsResourceHolder holder); /** @@ -369,6 +376,7 @@ public abstract class ConnectionFactoryUtils { * @return an appropriate Connection fetched from the holder, * or {@code null} if none found */ + @Nullable Connection getConnection(JmsResourceHolder holder); /** diff --git a/spring-jms/src/main/java/org/springframework/jms/connection/JmsResourceHolder.java b/spring-jms/src/main/java/org/springframework/jms/connection/JmsResourceHolder.java index b97a8a26dad..e8119a8015a 100644 --- a/spring-jms/src/main/java/org/springframework/jms/connection/JmsResourceHolder.java +++ b/spring-jms/src/main/java/org/springframework/jms/connection/JmsResourceHolder.java @@ -21,6 +21,7 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; + import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.JMSException; @@ -30,6 +31,7 @@ import javax.jms.TransactionInProgressException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.transaction.support.ResourceHolderSupport; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.Assert; @@ -77,7 +79,7 @@ public class JmsResourceHolder extends ResourceHolderSupport { * @param connectionFactory the JMS ConnectionFactory that this * resource holder is associated with (may be {@code null}) */ - public JmsResourceHolder(ConnectionFactory connectionFactory) { + public JmsResourceHolder(@Nullable ConnectionFactory connectionFactory) { this.connectionFactory = connectionFactory; } @@ -108,7 +110,7 @@ public class JmsResourceHolder extends ResourceHolderSupport { * @param connection the JMS Connection * @param session the JMS Session */ - public JmsResourceHolder(ConnectionFactory connectionFactory, Connection connection, Session session) { + public JmsResourceHolder(@Nullable ConnectionFactory connectionFactory, Connection connection, Session session) { this.connectionFactory = connectionFactory; addConnection(connection); addSession(session, connection); diff --git a/spring-jms/src/main/java/org/springframework/jms/connection/SingleConnectionFactory.java b/spring-jms/src/main/java/org/springframework/jms/connection/SingleConnectionFactory.java index 7790c5d7b19..e58ed4c356b 100644 --- a/spring-jms/src/main/java/org/springframework/jms/connection/SingleConnectionFactory.java +++ b/spring-jms/src/main/java/org/springframework/jms/connection/SingleConnectionFactory.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; + import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.ExceptionListener; @@ -40,6 +41,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -144,6 +146,7 @@ public class SingleConnectionFactory implements ConnectionFactory, QueueConnecti * Return the target ConnectionFactory which will be used to lazily * create a single Connection, if any. */ + @org.springframework.lang.Nullable public ConnectionFactory getTargetConnectionFactory() { return this.targetConnectionFactory; } @@ -165,6 +168,7 @@ public class SingleConnectionFactory implements ConnectionFactory, QueueConnecti * Return a JMS client ID for the single Connection created and exposed * by this ConnectionFactory, if any. */ + @org.springframework.lang.Nullable protected String getClientId() { return this.clientId; } @@ -182,6 +186,7 @@ public class SingleConnectionFactory implements ConnectionFactory, QueueConnecti * Return the JMS ExceptionListener implementation that should be registered * with the single Connection created by this factory, if any. */ + @Nullable protected ExceptionListener getExceptionListener() { return this.exceptionListener; } @@ -436,6 +441,7 @@ public class SingleConnectionFactory implements ConnectionFactory, QueueConnecti * creation of a raw standard Session * @throws JMSException if thrown by the JMS API */ + @Nullable protected Session getSession(Connection con, Integer mode) throws JMSException { return null; } diff --git a/spring-jms/src/main/java/org/springframework/jms/connection/package-info.java b/spring-jms/src/main/java/org/springframework/jms/connection/package-info.java index e6c2254c3ac..24f972498a2 100644 --- a/spring-jms/src/main/java/org/springframework/jms/connection/package-info.java +++ b/spring-jms/src/main/java/org/springframework/jms/connection/package-info.java @@ -2,4 +2,7 @@ * Provides a PlatformTransactionManager implementation for a single * JMS ConnectionFactory, and a SingleConnectionFactory adapter. */ +@NonNullApi package org.springframework.jms.connection; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jms/src/main/java/org/springframework/jms/core/BrowserCallback.java b/spring-jms/src/main/java/org/springframework/jms/core/BrowserCallback.java index 3a544cb4958..8b55d0010e5 100644 --- a/spring-jms/src/main/java/org/springframework/jms/core/BrowserCallback.java +++ b/spring-jms/src/main/java/org/springframework/jms/core/BrowserCallback.java @@ -20,6 +20,8 @@ import javax.jms.JMSException; import javax.jms.QueueBrowser; import javax.jms.Session; +import org.springframework.lang.Nullable; + /** * Callback for browsing the messages in a JMS queue. * @@ -44,6 +46,7 @@ public interface BrowserCallback { * (or {@code null} if none) * @throws javax.jms.JMSException if thrown by JMS API methods */ + @Nullable T doInJms(Session session, QueueBrowser browser) throws JMSException; } diff --git a/spring-jms/src/main/java/org/springframework/jms/core/JmsMessageOperations.java b/spring-jms/src/main/java/org/springframework/jms/core/JmsMessageOperations.java index c861d4503f4..0840b5a6553 100644 --- a/spring-jms/src/main/java/org/springframework/jms/core/JmsMessageOperations.java +++ b/spring-jms/src/main/java/org/springframework/jms/core/JmsMessageOperations.java @@ -17,8 +17,10 @@ package org.springframework.jms.core; import java.util.Map; + import javax.jms.Destination; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessagingException; import org.springframework.messaging.core.MessagePostProcessor; @@ -100,6 +102,7 @@ public interface JmsMessageOperations extends MessageSendingOperations receive(String destinationName) throws MessagingException; /** @@ -110,6 +113,7 @@ public interface JmsMessageOperations extends MessageSendingOperations T receiveAndConvert(String destinationName, Class targetClass) throws MessagingException; /** @@ -119,6 +123,7 @@ public interface JmsMessageOperations extends MessageSendingOperations sendAndReceive(String destinationName, Message requestMessage) throws MessagingException; /** @@ -132,6 +137,7 @@ public interface JmsMessageOperations extends MessageSendingOperations T convertSendAndReceive(String destinationName, Object request, Class targetClass) throws MessagingException; /** @@ -146,6 +152,7 @@ public interface JmsMessageOperations extends MessageSendingOperations T convertSendAndReceive(String destinationName, Object request, Map headers, Class targetClass) throws MessagingException; @@ -162,6 +169,7 @@ public interface JmsMessageOperations extends MessageSendingOperations T convertSendAndReceive(String destinationName, Object request, Class targetClass, MessagePostProcessor requestPostProcessor) throws MessagingException; @@ -178,6 +186,7 @@ public interface JmsMessageOperations extends MessageSendingOperations T convertSendAndReceive(String destinationName, Object request, Map headers, Class targetClass, MessagePostProcessor requestPostProcessor) throws MessagingException; diff --git a/spring-jms/src/main/java/org/springframework/jms/core/JmsOperations.java b/spring-jms/src/main/java/org/springframework/jms/core/JmsOperations.java index ba66ef695f8..895dc50af02 100644 --- a/spring-jms/src/main/java/org/springframework/jms/core/JmsOperations.java +++ b/spring-jms/src/main/java/org/springframework/jms/core/JmsOperations.java @@ -21,6 +21,7 @@ import javax.jms.Message; import javax.jms.Queue; import org.springframework.jms.JmsException; +import org.springframework.lang.Nullable; /** * Specifies a basic set of JMS operations. @@ -202,6 +203,7 @@ public interface JmsOperations { * @return the message received by the consumer, or {@code null} if the timeout expires * @throws JmsException checked JMSException converted to unchecked */ + @Nullable Message receive() throws JmsException; /** @@ -213,6 +215,7 @@ public interface JmsOperations { * @return the message received by the consumer, or {@code null} if the timeout expires * @throws JmsException checked JMSException converted to unchecked */ + @Nullable Message receive(Destination destination) throws JmsException; /** @@ -225,6 +228,7 @@ public interface JmsOperations { * @return the message received by the consumer, or {@code null} if the timeout expires * @throws JmsException checked JMSException converted to unchecked */ + @Nullable Message receive(String destinationName) throws JmsException; /** @@ -238,6 +242,7 @@ public interface JmsOperations { * @return the message received by the consumer, or {@code null} if the timeout expires * @throws JmsException checked JMSException converted to unchecked */ + @Nullable Message receiveSelected(String messageSelector) throws JmsException; /** @@ -251,6 +256,7 @@ public interface JmsOperations { * @return the message received by the consumer, or {@code null} if the timeout expires * @throws JmsException checked JMSException converted to unchecked */ + @Nullable Message receiveSelected(Destination destination, String messageSelector) throws JmsException; /** @@ -265,6 +271,7 @@ public interface JmsOperations { * @return the message received by the consumer, or {@code null} if the timeout expires * @throws JmsException checked JMSException converted to unchecked */ + @Nullable Message receiveSelected(String destinationName, String messageSelector) throws JmsException; @@ -282,6 +289,7 @@ public interface JmsOperations { * @return the message produced for the consumer or {@code null} if the timeout expires. * @throws JmsException checked JMSException converted to unchecked */ + @Nullable Object receiveAndConvert() throws JmsException; /** @@ -294,6 +302,7 @@ public interface JmsOperations { * @return the message produced for the consumer or {@code null} if the timeout expires. * @throws JmsException checked JMSException converted to unchecked */ + @Nullable Object receiveAndConvert(Destination destination) throws JmsException; /** @@ -307,6 +316,7 @@ public interface JmsOperations { * @return the message produced for the consumer or {@code null} if the timeout expires. * @throws JmsException checked JMSException converted to unchecked */ + @Nullable Object receiveAndConvert(String destinationName) throws JmsException; /** @@ -321,6 +331,7 @@ public interface JmsOperations { * @return the message produced for the consumer or {@code null} if the timeout expires. * @throws JmsException checked JMSException converted to unchecked */ + @Nullable Object receiveSelectedAndConvert(String messageSelector) throws JmsException; /** @@ -335,6 +346,7 @@ public interface JmsOperations { * @return the message produced for the consumer or {@code null} if the timeout expires. * @throws JmsException checked JMSException converted to unchecked */ + @Nullable Object receiveSelectedAndConvert(Destination destination, String messageSelector) throws JmsException; /** @@ -350,6 +362,7 @@ public interface JmsOperations { * @return the message produced for the consumer or {@code null} if the timeout expires. * @throws JmsException checked JMSException converted to unchecked */ + @Nullable Object receiveSelectedAndConvert(String destinationName, String messageSelector) throws JmsException; @@ -369,6 +382,7 @@ public interface JmsOperations { * @throws JmsException checked JMSException converted to unchecked * @since 4.1 */ + @Nullable Message sendAndReceive(MessageCreator messageCreator) throws JmsException; /** @@ -383,6 +397,7 @@ public interface JmsOperations { * @throws JmsException checked JMSException converted to unchecked * @since 4.1 */ + @Nullable Message sendAndReceive(Destination destination, MessageCreator messageCreator) throws JmsException; /** @@ -398,6 +413,7 @@ public interface JmsOperations { * @throws JmsException checked JMSException converted to unchecked * @since 4.1 */ + @Nullable Message sendAndReceive(String destinationName, MessageCreator messageCreator) throws JmsException; diff --git a/spring-jms/src/main/java/org/springframework/jms/core/JmsTemplate.java b/spring-jms/src/main/java/org/springframework/jms/core/JmsTemplate.java index 825879f295e..bfe43e242cf 100644 --- a/spring-jms/src/main/java/org/springframework/jms/core/JmsTemplate.java +++ b/spring-jms/src/main/java/org/springframework/jms/core/JmsTemplate.java @@ -17,6 +17,7 @@ package org.springframework.jms.core; import java.lang.reflect.Method; + import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.DeliveryMode; @@ -38,6 +39,7 @@ import org.springframework.jms.support.QosSettings; import org.springframework.jms.support.converter.MessageConverter; import org.springframework.jms.support.converter.SimpleMessageConverter; import org.springframework.jms.support.destination.JmsDestinationAccessor; +import org.springframework.lang.Nullable; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -786,7 +788,8 @@ public class JmsTemplate extends JmsDestinationAccessor implements JmsOperations * @return the JMS Message received, or {@code null} if none * @throws JMSException if thrown by JMS API methods */ - protected Message doReceive(Session session, Destination destination, String messageSelector) + @Nullable + protected Message doReceive(Session session, Destination destination, @Nullable String messageSelector) throws JMSException { return doReceive(session, createConsumer(session, destination, messageSelector)); @@ -799,6 +802,7 @@ public class JmsTemplate extends JmsDestinationAccessor implements JmsOperations * @return the JMS Message received, or {@code null} if none * @throws JMSException if thrown by JMS API methods */ + @Nullable protected Message doReceive(Session session, MessageConsumer consumer) throws JMSException { try { // Use transaction timeout (if available). @@ -869,7 +873,8 @@ public class JmsTemplate extends JmsDestinationAccessor implements JmsOperations * @param message the JMS Message to convert (can be {@code null}) * @return the content of the message, or {@code null} if none */ - protected Object doConvertFromMessage(Message message) { + @Nullable + protected Object doConvertFromMessage(@Nullable Message message) { if (message != null) { try { return getRequiredMessageConverter().fromMessage(message); @@ -924,6 +929,7 @@ public class JmsTemplate extends JmsDestinationAccessor implements JmsOperations *

    Return the response message or {@code null} if no message has * @throws JMSException if thrown by JMS API methods */ + @Nullable protected Message doSendAndReceive(Session session, Destination destination, MessageCreator messageCreator) throws JMSException { @@ -1065,6 +1071,7 @@ public class JmsTemplate extends JmsDestinationAccessor implements JmsOperations * @return an appropriate Connection fetched from the holder, * or {@code null} if none found */ + @Nullable protected Connection getConnection(JmsResourceHolder holder) { return holder.getConnection(); } @@ -1076,6 +1083,7 @@ public class JmsTemplate extends JmsDestinationAccessor implements JmsOperations * @return an appropriate Session fetched from the holder, * or {@code null} if none found */ + @Nullable protected Session getSession(JmsResourceHolder holder) { return holder.getSession(); } @@ -1141,7 +1149,7 @@ public class JmsTemplate extends JmsDestinationAccessor implements JmsOperations * @return the new JMS MessageConsumer * @throws JMSException if thrown by JMS API methods */ - protected MessageConsumer createConsumer(Session session, Destination destination, String messageSelector) + protected MessageConsumer createConsumer(Session session, Destination destination, @Nullable String messageSelector) throws JMSException { // Only pass in the NoLocal flag in case of a Topic: @@ -1168,7 +1176,7 @@ public class JmsTemplate extends JmsDestinationAccessor implements JmsOperations * @see #setMessageIdEnabled * @see #setMessageTimestampEnabled */ - protected QueueBrowser createBrowser(Session session, Queue queue, String messageSelector) + protected QueueBrowser createBrowser(Session session, Queue queue, @Nullable String messageSelector) throws JMSException { return session.createBrowser(queue, messageSelector); diff --git a/spring-jms/src/main/java/org/springframework/jms/core/ProducerCallback.java b/spring-jms/src/main/java/org/springframework/jms/core/ProducerCallback.java index e1edfbf5b4f..d81480565a9 100644 --- a/spring-jms/src/main/java/org/springframework/jms/core/ProducerCallback.java +++ b/spring-jms/src/main/java/org/springframework/jms/core/ProducerCallback.java @@ -20,6 +20,8 @@ import javax.jms.JMSException; import javax.jms.MessageProducer; import javax.jms.Session; +import org.springframework.lang.Nullable; + /** * Callback for sending a message to a JMS destination. * @@ -49,6 +51,7 @@ public interface ProducerCallback { * (or {@code null} if none) * @throws javax.jms.JMSException if thrown by JMS API methods */ + @Nullable T doInJms(Session session, MessageProducer producer) throws JMSException; } diff --git a/spring-jms/src/main/java/org/springframework/jms/core/SessionCallback.java b/spring-jms/src/main/java/org/springframework/jms/core/SessionCallback.java index 1a7a171b1b2..5b8b76e0774 100644 --- a/spring-jms/src/main/java/org/springframework/jms/core/SessionCallback.java +++ b/spring-jms/src/main/java/org/springframework/jms/core/SessionCallback.java @@ -19,6 +19,8 @@ package org.springframework.jms.core; import javax.jms.JMSException; import javax.jms.Session; +import org.springframework.lang.Nullable; + /** * Callback for executing any number of operations on a provided {@link Session}. * @@ -40,6 +42,7 @@ public interface SessionCallback { * (or {@code null} if none) * @throws javax.jms.JMSException if thrown by JMS API methods */ + @Nullable T doInJms(Session session) throws JMSException; } diff --git a/spring-jms/src/main/java/org/springframework/jms/core/package-info.java b/spring-jms/src/main/java/org/springframework/jms/core/package-info.java index 6be99ccf7ef..48276a94b53 100644 --- a/spring-jms/src/main/java/org/springframework/jms/core/package-info.java +++ b/spring-jms/src/main/java/org/springframework/jms/core/package-info.java @@ -2,4 +2,7 @@ * Core package of the JMS support. * Provides a JmsTemplate class and various callback interfaces. */ +@NonNullApi package org.springframework.jms.core; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jms/src/main/java/org/springframework/jms/core/support/package-info.java b/spring-jms/src/main/java/org/springframework/jms/core/support/package-info.java index 19ae921bead..443ae9fa9ca 100644 --- a/spring-jms/src/main/java/org/springframework/jms/core/support/package-info.java +++ b/spring-jms/src/main/java/org/springframework/jms/core/support/package-info.java @@ -2,4 +2,7 @@ * Classes supporting the {@code org.springframework.jms.core} package. * Contains a base class for JmsTemplate usage. */ +@NonNullApi package org.springframework.jms.core.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/AbstractJmsListeningContainer.java b/spring-jms/src/main/java/org/springframework/jms/listener/AbstractJmsListeningContainer.java index 6083cdaa343..14eae39fbc0 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/AbstractJmsListeningContainer.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/AbstractJmsListeningContainer.java @@ -29,6 +29,7 @@ import org.springframework.jms.JmsException; import org.springframework.jms.connection.ConnectionFactoryUtils; import org.springframework.jms.support.JmsUtils; import org.springframework.jms.support.destination.JmsDestinationAccessor; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -100,6 +101,7 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess * Return the JMS client ID for the shared Connection created and used * by this container, if any. */ + @Nullable public String getClientId() { return this.clientId; } @@ -146,6 +148,7 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess * Return the bean name that this listener container has been assigned * in its containing bean factory, if any. */ + @Nullable protected final String getBeanName() { return this.beanName; } diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/AbstractMessageListenerContainer.java b/spring-jms/src/main/java/org/springframework/jms/listener/AbstractMessageListenerContainer.java index 49e4c8766fb..6c6a5af1883 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/AbstractMessageListenerContainer.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/AbstractMessageListenerContainer.java @@ -18,6 +18,7 @@ package org.springframework.jms.listener; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; + import javax.jms.Connection; import javax.jms.Destination; import javax.jms.ExceptionListener; @@ -32,6 +33,7 @@ import javax.jms.Topic; import org.springframework.jms.support.JmsUtils; import org.springframework.jms.support.QosSettings; import org.springframework.jms.support.converter.MessageConverter; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ErrorHandler; @@ -213,6 +215,7 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen * if the configured destination is not an actual {@link Destination} type; * c.f. {@link #setDestinationName(String) when the destination is a String}. */ + @Nullable public Destination getDestination() { return (this.destination instanceof Destination ? (Destination) this.destination : null); } @@ -229,7 +232,7 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen * @param destinationName the desired destination (can be {@code null}) * @see #setDestination(javax.jms.Destination) */ - public void setDestinationName(String destinationName) { + public void setDestinationName(@Nullable String destinationName) { Assert.notNull(destinationName, "'destinationName' must not be null"); this.destination = destinationName; } @@ -240,6 +243,7 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen * {@link String} type; c.f. {@link #setDestination(Destination) when * it is an actual Destination}. */ + @Nullable public String getDestinationName() { return (this.destination instanceof String ? (String) this.destination : null); } @@ -261,13 +265,14 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen * DefaultMessageListenerContainer, as long as the cache level is less than * CACHE_CONSUMER). However, this is considered advanced usage; use it with care! */ - public void setMessageSelector(String messageSelector) { + public void setMessageSelector(@Nullable String messageSelector) { this.messageSelector = messageSelector; } /** * Return the JMS message selector expression (or {@code null} if none). */ + @Nullable public String getMessageSelector() { return this.messageSelector; } @@ -415,6 +420,7 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen * Return the name of a subscription to create, if any. * @since 4.1 */ + @Nullable public String getSubscriptionName() { return this.subscriptionName; } @@ -441,6 +447,7 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen /** * Return the name of a durable subscription to create, if any. */ + @Nullable public String getDurableSubscriptionName() { return (this.subscriptionDurable ? this.subscriptionName : null); } @@ -500,7 +507,7 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen * to use the default vas. * @since 5.0 */ - public void setReplyQosSettings(QosSettings replyQosSettings) { + public void setReplyQosSettings(@Nullable QosSettings replyQosSettings) { this.replyQosSettings = replyQosSettings; } @@ -534,6 +541,7 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen * Return the JMS ExceptionListener to notify in case of a JMSException thrown * by the registered message listener or the invocation infrastructure, if any. */ + @Nullable public ExceptionListener getExceptionListener() { return this.exceptionListener; } @@ -553,6 +561,7 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen * while processing a Message. * @since 4.1 */ + @Nullable public ErrorHandler getErrorHandler() { return this.errorHandler; } @@ -864,6 +873,7 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen * @return the new JMS MessageConsumer * @throws javax.jms.JMSException if thrown by JMS API methods */ + @Nullable protected MessageConsumer createConsumer(Session session, Destination destination) throws JMSException { if (isPubSubDomain() && destination instanceof Topic) { if (isSubscriptionShared()) { diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/AbstractPollingMessageListenerContainer.java b/spring-jms/src/main/java/org/springframework/jms/listener/AbstractPollingMessageListenerContainer.java index 910125f80a6..7205e6481a9 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/AbstractPollingMessageListenerContainer.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/AbstractPollingMessageListenerContainer.java @@ -27,6 +27,7 @@ import org.springframework.jms.connection.ConnectionFactoryUtils; import org.springframework.jms.connection.JmsResourceHolder; import org.springframework.jms.connection.SingleConnectionFactory; import org.springframework.jms.support.JmsUtils; +import org.springframework.lang.Nullable; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; @@ -267,7 +268,7 @@ public abstract class AbstractPollingMessageListenerContainer extends AbstractMe * @see #doExecuteListener(javax.jms.Session, javax.jms.Message) */ protected boolean doReceiveAndExecute( - Object invoker, Session session, MessageConsumer consumer, TransactionStatus status) + Object invoker, Session session, MessageConsumer consumer, @Nullable TransactionStatus status) throws JMSException { Connection conToClose = null; @@ -443,6 +444,7 @@ public abstract class AbstractPollingMessageListenerContainer extends AbstractMe * @return an appropriate Connection fetched from the holder, * or {@code null} if none found */ + @Nullable protected Connection getConnection(JmsResourceHolder holder) { return holder.getConnection(); } @@ -454,6 +456,7 @@ public abstract class AbstractPollingMessageListenerContainer extends AbstractMe * @return an appropriate Session fetched from the holder, * or {@code null} if none found */ + @Nullable protected Session getSession(JmsResourceHolder holder) { return holder.getSession(); } diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/MessageListenerContainer.java b/spring-jms/src/main/java/org/springframework/jms/listener/MessageListenerContainer.java index ac21ec9de74..cf8efd41150 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/MessageListenerContainer.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/MessageListenerContainer.java @@ -20,6 +20,7 @@ import org.springframework.context.SmartLifecycle; import org.springframework.jms.support.QosSettings; import org.springframework.jms.support.converter.MessageConverter; import org.springframework.jms.support.destination.DestinationResolver; +import org.springframework.lang.Nullable; /** * Internal abstraction used by the framework representing a message @@ -41,12 +42,14 @@ public interface MessageListenerContainer extends SmartLifecycle { * Return the {@link MessageConverter} that can be used to * convert {@link javax.jms.Message}, if any. */ + @Nullable MessageConverter getMessageConverter(); /** * Return the {@link DestinationResolver} to use to resolve * destinations by names. */ + @Nullable DestinationResolver getDestinationResolver(); /** @@ -68,6 +71,7 @@ public interface MessageListenerContainer extends SmartLifecycle { * if the broker's defaults should be used. * @since 5.0 */ + @Nullable QosSettings getReplyQosSettings(); } diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/adapter/AbstractAdaptableMessageListener.java b/spring-jms/src/main/java/org/springframework/jms/listener/adapter/AbstractAdaptableMessageListener.java index d68de9bdaa5..ede0ea17a3b 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/adapter/AbstractAdaptableMessageListener.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/adapter/AbstractAdaptableMessageListener.java @@ -40,6 +40,7 @@ import org.springframework.jms.support.converter.SimpleMessageConverter; import org.springframework.jms.support.converter.SmartMessageConverter; import org.springframework.jms.support.destination.DestinationResolver; import org.springframework.jms.support.destination.DynamicDestinationResolver; +import org.springframework.lang.Nullable; import org.springframework.messaging.MessageHeaders; import org.springframework.util.Assert; @@ -176,7 +177,7 @@ public abstract class AbstractAdaptableMessageListener * {@code null} to use the default values. * @since 5.0 */ - public void setResponseQosSettings(QosSettings responseQosSettings) { + public void setResponseQosSettings(@Nullable QosSettings responseQosSettings) { this.responseQosSettings = responseQosSettings; } @@ -184,6 +185,7 @@ public abstract class AbstractAdaptableMessageListener * Return the {@link QosSettings} to use when sending a response or {@code null} if * the defaults should be used. */ + @Nullable protected QosSettings getResponseQosSettings() { return this.responseQosSettings; } @@ -256,7 +258,7 @@ public abstract class AbstractAdaptableMessageListener * @see #getResponseDestination * @see #sendResponse */ - protected void handleResult(Object result, Message request, Session session) { + protected void handleResult(Object result, Message request, @Nullable Session session) { if (session != null) { if (logger.isDebugEnabled()) { logger.debug("Listener method returned result [" + result + @@ -394,6 +396,7 @@ public abstract class AbstractAdaptableMessageListener * @see #setDefaultResponseTopicName * @see #setDestinationResolver */ + @Nullable protected Destination resolveDefaultResponseDestination(Session session) throws JMSException { if (this.defaultResponseDestination instanceof Destination) { return (Destination) this.defaultResponseDestination; diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/adapter/JmsResponse.java b/spring-jms/src/main/java/org/springframework/jms/listener/adapter/JmsResponse.java index 02f45670ed5..b5df11e9d9d 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/adapter/JmsResponse.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/adapter/JmsResponse.java @@ -21,6 +21,7 @@ import javax.jms.JMSException; import javax.jms.Session; import org.springframework.jms.support.destination.DestinationResolver; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -86,6 +87,7 @@ public class JmsResponse { * @return the {@link Destination} to use * @throws JMSException if the DestinationResolver failed to resolve the destination */ + @Nullable public Destination resolveDestination(DestinationResolver destinationResolver, Session session) throws JMSException { diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/adapter/package-info.java b/spring-jms/src/main/java/org/springframework/jms/listener/adapter/package-info.java index be184c52040..0d5bfba59f8 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/adapter/package-info.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/adapter/package-info.java @@ -3,4 +3,7 @@ * methods, converting messages to appropriate message content types * (such as String or byte array) that get passed into listener methods. */ +@NonNullApi package org.springframework.jms.listener.adapter; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/JmsActivationSpecConfig.java b/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/JmsActivationSpecConfig.java index f2a647d07ce..3bbb78806d9 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/JmsActivationSpecConfig.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/JmsActivationSpecConfig.java @@ -21,6 +21,7 @@ import javax.jms.Session; import org.springframework.core.Constants; import org.springframework.jms.support.QosSettings; import org.springframework.jms.support.converter.MessageConverter; +import org.springframework.lang.Nullable; /** * Common configuration object for activating a JMS message endpoint. @@ -267,6 +268,7 @@ public class JmsActivationSpecConfig { /** * Return the {@link MessageConverter} to use, if any. */ + @Nullable public MessageConverter getMessageConverter() { return this.messageConverter; } diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/JmsMessageEndpointManager.java b/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/JmsMessageEndpointManager.java index 509d4e31705..f1c7e12ddbb 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/JmsMessageEndpointManager.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/JmsMessageEndpointManager.java @@ -25,6 +25,7 @@ import org.springframework.jms.listener.MessageListenerContainer; import org.springframework.jms.support.QosSettings; import org.springframework.jms.support.converter.MessageConverter; import org.springframework.jms.support.destination.DestinationResolver; +import org.springframework.lang.Nullable; /** * Extension of the generic JCA 1.5 @@ -144,6 +145,7 @@ public class JmsMessageEndpointManager extends GenericMessageEndpointManager * Return the {@link JmsActivationSpecConfig} object that this endpoint manager * should use for activating its listener. Return {@code null} if none is set. */ + @Nullable public JmsActivationSpecConfig getActivationSpecConfig() { return this.activationSpecConfig; } diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/StandardJmsActivationSpecFactory.java b/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/StandardJmsActivationSpecFactory.java index 4cc2bd97d70..ba4e4fb2ec7 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/StandardJmsActivationSpecFactory.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/StandardJmsActivationSpecFactory.java @@ -17,6 +17,7 @@ package org.springframework.jms.listener.endpoint; import java.util.Map; + import javax.jms.JMSException; import javax.jms.Queue; import javax.jms.Session; @@ -29,6 +30,7 @@ import org.springframework.beans.BeanWrapper; import org.springframework.beans.PropertyAccessorFactory; import org.springframework.jms.support.destination.DestinationResolutionException; import org.springframework.jms.support.destination.DestinationResolver; +import org.springframework.lang.Nullable; /** * Standard implementation of the {@link JmsActivationSpecFactory} interface. @@ -124,6 +126,7 @@ public class StandardJmsActivationSpecFactory implements JmsActivationSpecFactor * if not determinable * @see #setActivationSpecClass */ + @Nullable protected Class determineActivationSpecClass(ResourceAdapter adapter) { return null; } diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/package-info.java b/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/package-info.java index a46729830a3..c0723c40e43 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/package-info.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/package-info.java @@ -1,4 +1,7 @@ /** * This package provides JCA-based endpoint management for JMS message listeners. */ +@NonNullApi package org.springframework.jms.listener.endpoint; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/package-info.java b/spring-jms/src/main/java/org/springframework/jms/listener/package-info.java index e5086fce4e5..99bf952e689 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/package-info.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/package-info.java @@ -3,4 +3,7 @@ * It also offers the DefaultMessageListenerContainer and SimpleMessageListenerContainer * implementations, based on the plain JMS client API. */ +@NonNullApi package org.springframework.jms.listener; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jms/src/main/java/org/springframework/jms/package-info.java b/spring-jms/src/main/java/org/springframework/jms/package-info.java index d6e972d7d2b..2d3d230d26b 100644 --- a/spring-jms/src/main/java/org/springframework/jms/package-info.java +++ b/spring-jms/src/main/java/org/springframework/jms/package-info.java @@ -2,4 +2,7 @@ * This package contains integration classes for JMS, * allowing for Spring-style JMS access. */ +@NonNullApi package org.springframework.jms; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jms/src/main/java/org/springframework/jms/remoting/JmsInvokerServiceExporter.java b/spring-jms/src/main/java/org/springframework/jms/remoting/JmsInvokerServiceExporter.java index 8d5ba01cead..a2d8ca298c0 100644 --- a/spring-jms/src/main/java/org/springframework/jms/remoting/JmsInvokerServiceExporter.java +++ b/spring-jms/src/main/java/org/springframework/jms/remoting/JmsInvokerServiceExporter.java @@ -27,6 +27,7 @@ import org.springframework.jms.listener.SessionAwareMessageListener; import org.springframework.jms.support.JmsUtils; import org.springframework.jms.support.converter.MessageConverter; import org.springframework.jms.support.converter.SimpleMessageConverter; +import org.springframework.lang.Nullable; import org.springframework.remoting.support.RemoteInvocation; import org.springframework.remoting.support.RemoteInvocationBasedExporter; import org.springframework.remoting.support.RemoteInvocationResult; @@ -111,6 +112,7 @@ public class JmsInvokerServiceExporter extends RemoteInvocationBasedExporter * in case of an invalid message that will simply be ignored) * @throws javax.jms.JMSException in case of message access failure */ + @Nullable protected RemoteInvocation readRemoteInvocation(Message requestMessage) throws JMSException { Object content = this.messageConverter.fromMessage(requestMessage); if (content instanceof RemoteInvocation) { @@ -178,6 +180,7 @@ public class JmsInvokerServiceExporter extends RemoteInvocationBasedExporter * @see #readRemoteInvocation * @see #setIgnoreInvalidRequests */ + @Nullable protected RemoteInvocation onInvalidRequest(Message requestMessage) throws JMSException { if (this.ignoreInvalidRequests) { if (logger.isWarnEnabled()) { diff --git a/spring-jms/src/main/java/org/springframework/jms/remoting/package-info.java b/spring-jms/src/main/java/org/springframework/jms/remoting/package-info.java index c203a9b061e..1cb05b0e9fe 100644 --- a/spring-jms/src/main/java/org/springframework/jms/remoting/package-info.java +++ b/spring-jms/src/main/java/org/springframework/jms/remoting/package-info.java @@ -5,4 +5,7 @@ * receivers, and provides a level of indirection between the client and the * service: They only need to agree on a queue name and a service interface. */ +@NonNullApi package org.springframework.jms.remoting; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jms/src/main/java/org/springframework/jms/support/JmsUtils.java b/spring-jms/src/main/java/org/springframework/jms/support/JmsUtils.java index 7f9212a80bf..15c761fad35 100644 --- a/spring-jms/src/main/java/org/springframework/jms/support/JmsUtils.java +++ b/spring-jms/src/main/java/org/springframework/jms/support/JmsUtils.java @@ -40,6 +40,7 @@ import org.springframework.jms.ResourceAllocationException; import org.springframework.jms.TransactionInProgressException; import org.springframework.jms.TransactionRolledBackException; import org.springframework.jms.UncategorizedJmsException; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -59,7 +60,7 @@ public abstract class JmsUtils { * This is useful for typical {@code finally} blocks in manual JMS code. * @param con the JMS Connection to close (may be {@code null}) */ - public static void closeConnection(Connection con) { + public static void closeConnection(@Nullable Connection con) { closeConnection(con, false); } @@ -69,7 +70,7 @@ public abstract class JmsUtils { * @param con the JMS Connection to close (may be {@code null}) * @param stop whether to call {@code stop()} before closing */ - public static void closeConnection(Connection con, boolean stop) { + public static void closeConnection(@Nullable Connection con, boolean stop) { if (con != null) { try { if (stop) { @@ -102,7 +103,7 @@ public abstract class JmsUtils { * This is useful for typical {@code finally} blocks in manual JMS code. * @param session the JMS Session to close (may be {@code null}) */ - public static void closeSession(Session session) { + public static void closeSession(@Nullable Session session) { if (session != null) { try { session.close(); @@ -122,7 +123,7 @@ public abstract class JmsUtils { * This is useful for typical {@code finally} blocks in manual JMS code. * @param producer the JMS MessageProducer to close (may be {@code null}) */ - public static void closeMessageProducer(MessageProducer producer) { + public static void closeMessageProducer(@Nullable MessageProducer producer) { if (producer != null) { try { producer.close(); @@ -142,7 +143,7 @@ public abstract class JmsUtils { * This is useful for typical {@code finally} blocks in manual JMS code. * @param consumer the JMS MessageConsumer to close (may be {@code null}) */ - public static void closeMessageConsumer(MessageConsumer consumer) { + public static void closeMessageConsumer(@Nullable MessageConsumer consumer) { if (consumer != null) { // Clear interruptions to ensure that the consumer closes successfully... // (working around misbehaving JMS providers such as ActiveMQ) @@ -171,7 +172,7 @@ public abstract class JmsUtils { * This is useful for typical {@code finally} blocks in manual JMS code. * @param browser the JMS QueueBrowser to close (may be {@code null}) */ - public static void closeQueueBrowser(QueueBrowser browser) { + public static void closeQueueBrowser(@Nullable QueueBrowser browser) { if (browser != null) { try { browser.close(); @@ -191,7 +192,7 @@ public abstract class JmsUtils { * This is useful for typical {@code finally} blocks in manual JMS code. * @param requestor the JMS QueueRequestor to close (may be {@code null}) */ - public static void closeQueueRequestor(QueueRequestor requestor) { + public static void closeQueueRequestor(@Nullable QueueRequestor requestor) { if (requestor != null) { try { requestor.close(); diff --git a/spring-jms/src/main/java/org/springframework/jms/support/converter/MappingJackson2MessageConverter.java b/spring-jms/src/main/java/org/springframework/jms/support/converter/MappingJackson2MessageConverter.java index 3285b655ad4..41ffe651e90 100644 --- a/spring-jms/src/main/java/org/springframework/jms/support/converter/MappingJackson2MessageConverter.java +++ b/spring-jms/src/main/java/org/springframework/jms/support/converter/MappingJackson2MessageConverter.java @@ -23,6 +23,7 @@ import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; + import javax.jms.BytesMessage; import javax.jms.JMSException; import javax.jms.Message; @@ -38,6 +39,7 @@ import com.fasterxml.jackson.databind.ObjectWriter; import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -456,6 +458,7 @@ public class MappingJackson2MessageConverter implements SmartMessageConverter, B * converter for the current conversion attempt * @return the serialization view class, or {@code null} if none */ + @Nullable protected Class getSerializationView(Object conversionHint) { if (conversionHint instanceof MethodParameter) { MethodParameter methodParam = (MethodParameter) conversionHint; diff --git a/spring-jms/src/main/java/org/springframework/jms/support/converter/MessageConversionException.java b/spring-jms/src/main/java/org/springframework/jms/support/converter/MessageConversionException.java index c4fa6183535..f152d4fb050 100644 --- a/spring-jms/src/main/java/org/springframework/jms/support/converter/MessageConversionException.java +++ b/spring-jms/src/main/java/org/springframework/jms/support/converter/MessageConversionException.java @@ -17,6 +17,7 @@ package org.springframework.jms.support.converter; import org.springframework.jms.JmsException; +import org.springframework.lang.Nullable; /** * Thrown by {@link MessageConverter} implementations when the conversion @@ -42,7 +43,7 @@ public class MessageConversionException extends JmsException { * @param msg the detail message * @param cause the root cause (if any) */ - public MessageConversionException(String msg, Throwable cause) { + public MessageConversionException(String msg, @Nullable Throwable cause) { super(msg, cause); } diff --git a/spring-jms/src/main/java/org/springframework/jms/support/converter/MessageConverter.java b/spring-jms/src/main/java/org/springframework/jms/support/converter/MessageConverter.java index b4661008301..a4282d35a79 100644 --- a/spring-jms/src/main/java/org/springframework/jms/support/converter/MessageConverter.java +++ b/spring-jms/src/main/java/org/springframework/jms/support/converter/MessageConverter.java @@ -20,6 +20,8 @@ import javax.jms.JMSException; import javax.jms.Message; import javax.jms.Session; +import org.springframework.lang.Nullable; + /** * Strategy interface that specifies a converter between Java objects and JMS messages. * @@ -54,6 +56,7 @@ public interface MessageConverter { * @throws javax.jms.JMSException if thrown by JMS API methods * @throws MessageConversionException in case of conversion failure */ + @Nullable Object fromMessage(Message message) throws JMSException, MessageConversionException; } diff --git a/spring-jms/src/main/java/org/springframework/jms/support/converter/SmartMessageConverter.java b/spring-jms/src/main/java/org/springframework/jms/support/converter/SmartMessageConverter.java index 2fb5cd734e8..2b51febcebe 100644 --- a/spring-jms/src/main/java/org/springframework/jms/support/converter/SmartMessageConverter.java +++ b/spring-jms/src/main/java/org/springframework/jms/support/converter/SmartMessageConverter.java @@ -20,6 +20,8 @@ import javax.jms.JMSException; import javax.jms.Message; import javax.jms.Session; +import org.springframework.lang.Nullable; + /** * An extended {@link MessageConverter} SPI with conversion hint support. * @@ -45,7 +47,7 @@ public interface SmartMessageConverter extends MessageConverter { * @throws MessageConversionException in case of conversion failure * @see #toMessage(Object, Session) */ - Message toMessage(Object object, Session session, Object conversionHint) + Message toMessage(Object object, Session session, @Nullable Object conversionHint) throws JMSException, MessageConversionException; } diff --git a/spring-jms/src/main/java/org/springframework/jms/support/converter/package-info.java b/spring-jms/src/main/java/org/springframework/jms/support/converter/package-info.java index 419a774b101..bef53603d3d 100644 --- a/spring-jms/src/main/java/org/springframework/jms/support/converter/package-info.java +++ b/spring-jms/src/main/java/org/springframework/jms/support/converter/package-info.java @@ -2,4 +2,7 @@ * Provides a MessageConverter abstraction to convert * between Java objects and JMS messages. */ +@NonNullApi package org.springframework.jms.support.converter; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jms/src/main/java/org/springframework/jms/support/destination/DestinationResolutionException.java b/spring-jms/src/main/java/org/springframework/jms/support/destination/DestinationResolutionException.java index e5be7c7297d..72dcd54675c 100644 --- a/spring-jms/src/main/java/org/springframework/jms/support/destination/DestinationResolutionException.java +++ b/spring-jms/src/main/java/org/springframework/jms/support/destination/DestinationResolutionException.java @@ -17,6 +17,7 @@ package org.springframework.jms.support.destination; import org.springframework.jms.JmsException; +import org.springframework.lang.Nullable; /** * Thrown by a DestinationResolver when it cannot resolve a destination name. @@ -41,7 +42,7 @@ public class DestinationResolutionException extends JmsException { * @param msg the detail message * @param cause the root cause (if any) */ - public DestinationResolutionException(String msg, Throwable cause) { + public DestinationResolutionException(String msg, @Nullable Throwable cause) { super(msg, cause); } diff --git a/spring-jms/src/main/java/org/springframework/jms/support/destination/DestinationResolver.java b/spring-jms/src/main/java/org/springframework/jms/support/destination/DestinationResolver.java index 4a0d2cde4ed..a51d795d784 100644 --- a/spring-jms/src/main/java/org/springframework/jms/support/destination/DestinationResolver.java +++ b/spring-jms/src/main/java/org/springframework/jms/support/destination/DestinationResolver.java @@ -20,6 +20,8 @@ import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Session; +import org.springframework.lang.Nullable; + /** * Strategy interface for resolving JMS destinations. * @@ -52,7 +54,7 @@ public interface DestinationResolver { * @throws javax.jms.JMSException if the JMS Session failed to resolve the destination * @throws DestinationResolutionException in case of general destination resolution failure */ - Destination resolveDestinationName(Session session, String destinationName, boolean pubSubDomain) + Destination resolveDestinationName(@Nullable Session session, String destinationName, boolean pubSubDomain) throws JMSException; } diff --git a/spring-jms/src/main/java/org/springframework/jms/support/destination/JmsDestinationAccessor.java b/spring-jms/src/main/java/org/springframework/jms/support/destination/JmsDestinationAccessor.java index 0093f86faa3..9885b66cc4c 100644 --- a/spring-jms/src/main/java/org/springframework/jms/support/destination/JmsDestinationAccessor.java +++ b/spring-jms/src/main/java/org/springframework/jms/support/destination/JmsDestinationAccessor.java @@ -23,6 +23,7 @@ import javax.jms.MessageConsumer; import javax.jms.Session; import org.springframework.jms.support.JmsAccessor; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -125,6 +126,7 @@ public abstract class JmsDestinationAccessor extends JmsAccessor { * @see #RECEIVE_TIMEOUT_NO_WAIT * @see #RECEIVE_TIMEOUT_INDEFINITE_WAIT */ + @Nullable protected Message receiveFromConsumer(MessageConsumer consumer, long timeout) throws JMSException { if (timeout > 0) { return consumer.receive(timeout); diff --git a/spring-jms/src/main/java/org/springframework/jms/support/destination/package-info.java b/spring-jms/src/main/java/org/springframework/jms/support/destination/package-info.java index 16b5d900db7..3326d0c7040 100644 --- a/spring-jms/src/main/java/org/springframework/jms/support/destination/package-info.java +++ b/spring-jms/src/main/java/org/springframework/jms/support/destination/package-info.java @@ -1,4 +1,7 @@ /** * Support classes for Spring's JMS framework. */ +@NonNullApi package org.springframework.jms.support.destination; + +import org.springframework.lang.NonNullApi; diff --git a/spring-jms/src/main/java/org/springframework/jms/support/package-info.java b/spring-jms/src/main/java/org/springframework/jms/support/package-info.java index fd367be264b..b20dce21d83 100644 --- a/spring-jms/src/main/java/org/springframework/jms/support/package-info.java +++ b/spring-jms/src/main/java/org/springframework/jms/support/package-info.java @@ -2,4 +2,7 @@ * This package provides generic JMS support classes, * to be used by higher-level classes like JmsTemplate. */ +@NonNullApi package org.springframework.jms.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/MessageHeaders.java b/spring-messaging/src/main/java/org/springframework/messaging/MessageHeaders.java index dfce6979041..e7d0b082f52 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/MessageHeaders.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/MessageHeaders.java @@ -31,6 +31,7 @@ import java.util.UUID; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.AlternativeJdkIdGenerator; import org.springframework.util.IdGenerator; @@ -164,24 +165,29 @@ public class MessageHeaders implements Map, Serializable { return (idGenerator != null ? idGenerator : defaultIdGenerator); } + @Nullable public UUID getId() { return get(ID, UUID.class); } + @Nullable public Long getTimestamp() { return get(TIMESTAMP, Long.class); } + @Nullable public Object getReplyChannel() { return get(REPLY_CHANNEL); } + @Nullable public Object getErrorChannel() { return get(ERROR_CHANNEL); } @SuppressWarnings("unchecked") + @Nullable public T get(Object key, Class type) { Object value = this.headers.get(key); if (value == null) { @@ -209,6 +215,7 @@ public class MessageHeaders implements Map, Serializable { return Collections.unmodifiableMap(this.headers).entrySet(); } + @Nullable public Object get(Object key) { return this.headers.get(key); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/PollableChannel.java b/spring-messaging/src/main/java/org/springframework/messaging/PollableChannel.java index eb5aafc8e29..a1861471ecc 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/PollableChannel.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/PollableChannel.java @@ -16,6 +16,8 @@ package org.springframework.messaging; +import org.springframework.lang.Nullable; + /** * A {@link MessageChannel} from which messages may be actively received through polling. * @@ -28,6 +30,7 @@ public interface PollableChannel extends MessageChannel { * Receive a message from this channel, blocking indefinitely if necessary. * @return the next available {@link Message} or {@code null} if interrupted */ + @Nullable Message receive(); /** @@ -37,6 +40,7 @@ public interface PollableChannel extends MessageChannel { * @return the next available {@link Message} or {@code null} if the specified timeout * period elapses or the message reception is interrupted */ + @Nullable Message receive(long timeout); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/converter/AbstractMessageConverter.java b/spring-messaging/src/main/java/org/springframework/messaging/converter/AbstractMessageConverter.java index 9f30bcbe48b..77cac863864 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/converter/AbstractMessageConverter.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/converter/AbstractMessageConverter.java @@ -24,6 +24,7 @@ import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.support.MessageBuilder; @@ -157,6 +158,7 @@ public abstract class AbstractMessageConverter implements SmartMessageConverter * @param payload the payload being converted to message * @return the content type, or {@code null} if not known */ + @Nullable protected MimeType getDefaultContentType(Object payload) { List mimeTypes = getSupportedMimeTypes(); return (!mimeTypes.isEmpty() ? mimeTypes.get(0) : null); @@ -255,7 +257,8 @@ public abstract class AbstractMessageConverter implements SmartMessageConverter * perform the conversion * @since 4.2 */ - protected Object convertFromInternal(Message message, Class targetClass, Object conversionHint) { + @Nullable + protected Object convertFromInternal(Message message, Class targetClass, @Nullable Object conversionHint) { return null; } @@ -269,7 +272,8 @@ public abstract class AbstractMessageConverter implements SmartMessageConverter * cannot perform the conversion * @since 4.2 */ - protected Object convertToInternal(Object payload, MessageHeaders headers, Object conversionHint) { + @Nullable + protected Object convertToInternal(Object payload, @Nullable MessageHeaders headers, @Nullable Object conversionHint) { return null; } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/converter/ContentTypeResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/converter/ContentTypeResolver.java index afd7b7002c3..17665b80136 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/converter/ContentTypeResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/converter/ContentTypeResolver.java @@ -16,6 +16,7 @@ package org.springframework.messaging.converter; +import org.springframework.lang.Nullable; import org.springframework.messaging.MessageHeaders; import org.springframework.util.MimeType; @@ -32,13 +33,14 @@ public interface ContentTypeResolver { * Determine the {@link MimeType} of a message from the given MessageHeaders. * * @param headers the headers to use for the resolution - * @return the resolved {@code MimeType} of {@code null} if none found + * @return the resolved {@code MimeType} or {@code null} if none found * * @throws org.springframework.util.InvalidMimeTypeException if the content type * is a String that cannot be parsed * @throws java.lang.IllegalArgumentException if there is a content type but * its type is unknown */ + @Nullable MimeType resolve(MessageHeaders headers); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/converter/MappingJackson2MessageConverter.java b/spring-messaging/src/main/java/org/springframework/messaging/converter/MappingJackson2MessageConverter.java index 7535a4139a5..9b478691587 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/converter/MappingJackson2MessageConverter.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/converter/MappingJackson2MessageConverter.java @@ -38,6 +38,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; import org.springframework.util.Assert; @@ -266,6 +267,7 @@ public class MappingJackson2MessageConverter extends AbstractMessageConverter { * @return the serialization view class, or {@code null} if none * @since 4.2 */ + @Nullable protected Class getSerializationView(Object conversionHint) { if (conversionHint instanceof MethodParameter) { MethodParameter param = (MethodParameter) conversionHint; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/converter/MessageConverter.java b/spring-messaging/src/main/java/org/springframework/messaging/converter/MessageConverter.java index d86ee9fe2f0..8bd848e5f44 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/converter/MessageConverter.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/converter/MessageConverter.java @@ -16,6 +16,7 @@ package org.springframework.messaging.converter; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; @@ -41,6 +42,7 @@ public interface MessageConverter { * @return the result of the conversion, or {@code null} if the converter cannot * perform the conversion */ + @Nullable Object fromMessage(Message message, Class targetClass); /** @@ -56,6 +58,7 @@ public interface MessageConverter { * @return the new message, or {@code null} if the converter does not support the * Object type or the target media type */ - Message toMessage(Object payload, MessageHeaders headers); + @Nullable + Message toMessage(Object payload, @Nullable MessageHeaders headers); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/converter/SmartMessageConverter.java b/spring-messaging/src/main/java/org/springframework/messaging/converter/SmartMessageConverter.java index f36f2ac68fc..f3b4cbcd4ae 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/converter/SmartMessageConverter.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/converter/SmartMessageConverter.java @@ -16,6 +16,7 @@ package org.springframework.messaging.converter; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; @@ -43,7 +44,8 @@ public interface SmartMessageConverter extends MessageConverter { * perform the conversion * @see #fromMessage(Message, Class) */ - Object fromMessage(Message message, Class targetClass, Object conversionHint); + @Nullable + Object fromMessage(Message message, Class targetClass, @Nullable Object conversionHint); /** * A variant of {@link #toMessage(Object, MessageHeaders)} which takes an extra @@ -57,6 +59,7 @@ public interface SmartMessageConverter extends MessageConverter { * Object type or the target media type * @see #toMessage(Object, MessageHeaders) */ - Message toMessage(Object payload, MessageHeaders headers, Object conversionHint); + @Nullable + Message toMessage(Object payload, @Nullable MessageHeaders headers, @Nullable Object conversionHint); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/converter/package-info.java b/spring-messaging/src/main/java/org/springframework/messaging/converter/package-info.java index ff66959a6b4..26d62314c25 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/converter/package-info.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/converter/package-info.java @@ -1,4 +1,7 @@ /** * Provides support for message conversion. */ +@NonNullApi package org.springframework.messaging.converter; + +import org.springframework.lang.NonNullApi; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessageReceivingTemplate.java b/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessageReceivingTemplate.java index 56e85c99259..09f757fe089 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessageReceivingTemplate.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessageReceivingTemplate.java @@ -16,6 +16,7 @@ package org.springframework.messaging.core; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.converter.MessageConversionException; import org.springframework.messaging.converter.MessageConverter; @@ -48,6 +49,7 @@ public abstract class AbstractMessageReceivingTemplate extends AbstractMessag * @return the received message, possibly {@code null} if the message could not * be received, for example due to a timeout */ + @Nullable protected abstract Message doReceive(D destination); @@ -74,6 +76,7 @@ public abstract class AbstractMessageReceivingTemplate extends AbstractMessag * @return the converted payload of the reply message (never {@code null}) */ @SuppressWarnings("unchecked") + @Nullable protected T doConvert(Message message, Class targetClass) { MessageConverter messageConverter = getMessageConverter(); T value = (T) messageConverter.fromMessage(message, targetClass); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessageSendingTemplate.java b/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessageSendingTemplate.java index 2475de7fd70..0fa76798a67 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessageSendingTemplate.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/core/AbstractMessageSendingTemplate.java @@ -21,6 +21,7 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.MessagingException; @@ -189,7 +190,8 @@ public abstract class AbstractMessageSendingTemplate implements MessageSendin * @param headers the headers to send (or {@code null} if none) * @return the actual headers to send (or {@code null} if none) */ - protected Map processHeadersToSend(Map headers) { + @Nullable + protected Map processHeadersToSend(@Nullable Map headers) { return headers; } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/core/DestinationResolvingMessageRequestReplyOperations.java b/spring-messaging/src/main/java/org/springframework/messaging/core/DestinationResolvingMessageRequestReplyOperations.java index 4c4a89f4f31..4b8d2ca5d81 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/core/DestinationResolvingMessageRequestReplyOperations.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/core/DestinationResolvingMessageRequestReplyOperations.java @@ -18,6 +18,7 @@ package org.springframework.messaging.core; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessagingException; @@ -40,6 +41,7 @@ public interface DestinationResolvingMessageRequestReplyOperations extends Me * @return the received message, possibly {@code null} if the message could not * be received, for example due to a timeout */ + @Nullable Message sendAndReceive(String destinationName, Message requestMessage) throws MessagingException; /** @@ -54,6 +56,7 @@ public interface DestinationResolvingMessageRequestReplyOperations extends Me * @return the converted payload of the reply message, possibly {@code null} if * the message could not be received, for example due to a timeout */ + @Nullable T convertSendAndReceive(String destinationName, Object request, Class targetClass) throws MessagingException; @@ -70,6 +73,7 @@ public interface DestinationResolvingMessageRequestReplyOperations extends Me * @return the converted payload of the reply message, possibly {@code null} if * the message could not be received, for example due to a timeout */ + @Nullable T convertSendAndReceive(String destinationName, Object request, Map headers, Class targetClass) throws MessagingException; @@ -87,6 +91,7 @@ public interface DestinationResolvingMessageRequestReplyOperations extends Me * @return the converted payload of the reply message, possibly {@code null} if * the message could not be received, for example due to a timeout */ + @Nullable T convertSendAndReceive(String destinationName, Object request, Class targetClass, MessagePostProcessor requestPostProcessor) throws MessagingException; @@ -105,6 +110,7 @@ public interface DestinationResolvingMessageRequestReplyOperations extends Me * @return the converted payload of the reply message, possibly {@code null} if * the message could not be received, for example due to a timeout */ + @Nullable T convertSendAndReceive(String destinationName, Object request, Map headers, Class targetClass, MessagePostProcessor requestPostProcessor) throws MessagingException; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/core/MessageReceivingOperations.java b/spring-messaging/src/main/java/org/springframework/messaging/core/MessageReceivingOperations.java index d9bf600b72f..ba158731577 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/core/MessageReceivingOperations.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/core/MessageReceivingOperations.java @@ -16,6 +16,7 @@ package org.springframework.messaging.core; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessagingException; @@ -35,6 +36,7 @@ public interface MessageReceivingOperations { * @return the received message, possibly {@code null} if the message could not * be received, for example due to a timeout */ + @Nullable Message receive() throws MessagingException; /** @@ -43,6 +45,7 @@ public interface MessageReceivingOperations { * @return the received message, possibly {@code null} if the message could not * be received, for example due to a timeout */ + @Nullable Message receive(D destination) throws MessagingException; /** @@ -52,6 +55,7 @@ public interface MessageReceivingOperations { * @return the converted payload of the reply message, possibly {@code null} if * the message could not be received, for example due to a timeout */ + @Nullable T receiveAndConvert(Class targetClass) throws MessagingException; /** @@ -62,6 +66,7 @@ public interface MessageReceivingOperations { * @return the converted payload of the reply message, possibly {@code null} if * the message could not be received, for example due to a timeout */ + @Nullable T receiveAndConvert(D destination, Class targetClass) throws MessagingException; } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/core/MessageRequestReplyOperations.java b/spring-messaging/src/main/java/org/springframework/messaging/core/MessageRequestReplyOperations.java index 3037cb820fa..c4a0c0be9a2 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/core/MessageRequestReplyOperations.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/core/MessageRequestReplyOperations.java @@ -18,6 +18,7 @@ package org.springframework.messaging.core; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessagingException; @@ -38,6 +39,7 @@ public interface MessageRequestReplyOperations { * @return the reply, possibly {@code null} if the message could not be received, * for example due to a timeout */ + @Nullable Message sendAndReceive(Message requestMessage) throws MessagingException; /** @@ -47,6 +49,7 @@ public interface MessageRequestReplyOperations { * @return the reply, possibly {@code null} if the message could not be received, * for example due to a timeout */ + @Nullable Message sendAndReceive(D destination, Message requestMessage) throws MessagingException; /** @@ -59,6 +62,7 @@ public interface MessageRequestReplyOperations { * @return the payload of the reply message, possibly {@code null} if the message * could not be received, for example due to a timeout */ + @Nullable T convertSendAndReceive(Object request, Class targetClass) throws MessagingException; /** @@ -72,6 +76,7 @@ public interface MessageRequestReplyOperations { * @return the payload of the reply message, possibly {@code null} if the message * could not be received, for example due to a timeout */ + @Nullable T convertSendAndReceive(D destination, Object request, Class targetClass) throws MessagingException; /** @@ -86,6 +91,7 @@ public interface MessageRequestReplyOperations { * @return the payload of the reply message, possibly {@code null} if the message * could not be received, for example due to a timeout */ + @Nullable T convertSendAndReceive(D destination, Object request, Map headers, Class targetClass) throws MessagingException; @@ -101,6 +107,7 @@ public interface MessageRequestReplyOperations { * @return the payload of the reply message, possibly {@code null} if the message * could not be received, for example due to a timeout */ + @Nullable T convertSendAndReceive(Object request, Class targetClass, MessagePostProcessor requestPostProcessor) throws MessagingException; @@ -117,6 +124,7 @@ public interface MessageRequestReplyOperations { * @return the payload of the reply message, possibly {@code null} if the message * could not be received, for example due to a timeout */ + @Nullable T convertSendAndReceive(D destination, Object request, Class targetClass, MessagePostProcessor requestPostProcessor) throws MessagingException; @@ -133,6 +141,7 @@ public interface MessageRequestReplyOperations { * @return the payload of the reply message, possibly {@code null} if the message * could not be received, for example due to a timeout */ + @Nullable T convertSendAndReceive(D destination, Object request, Map headers, Class targetClass, MessagePostProcessor requestPostProcessor) throws MessagingException; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/core/package-info.java b/spring-messaging/src/main/java/org/springframework/messaging/core/package-info.java index f72acc70eae..ec6b8ec107c 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/core/package-info.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/core/package-info.java @@ -1,4 +1,7 @@ /** * Defines interfaces and implementation classes for messaging templates. */ +@NonNullApi package org.springframework.messaging.core; + +import org.springframework.lang.NonNullApi; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/MessageCondition.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/MessageCondition.java index 0d4769f3879..7095ee7c5a3 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/MessageCondition.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/MessageCondition.java @@ -16,6 +16,7 @@ package org.springframework.messaging.handler; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; /** @@ -46,6 +47,7 @@ public interface MessageCondition { * condition with sorted, matching patterns only. * @return a condition instance in case of a match; or {@code null} if there is no match. */ + @Nullable T getMatchingCondition(Message message); /** diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/package-info.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/package-info.java index 533f25c2b27..0e46b794a67 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/package-info.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/package-info.java @@ -1,4 +1,7 @@ /** * Annotations and support classes for handling messages. */ +@NonNullApi package org.springframework.messaging.handler.annotation; + +import org.springframework.lang.NonNullApi; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/AbstractNamedValueMethodArgumentResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/AbstractNamedValueMethodArgumentResolver.java index 65ac468a389..1c460b4bca1 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/AbstractNamedValueMethodArgumentResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/AbstractNamedValueMethodArgumentResolver.java @@ -27,6 +27,7 @@ import org.springframework.core.MethodParameter; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.support.DefaultConversionService; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.handler.annotation.ValueConstants; import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver; @@ -75,7 +76,7 @@ public abstract class AbstractNamedValueMethodArgumentResolver implements Handle * and {@code #{...}} SpEL expressions in default values, or {@code null} if default * values are not expected to contain expressions */ - protected AbstractNamedValueMethodArgumentResolver(ConversionService cs, ConfigurableBeanFactory beanFactory) { + protected AbstractNamedValueMethodArgumentResolver(ConversionService cs, @Nullable ConfigurableBeanFactory beanFactory) { this.conversionService = (cs != null ? cs : DefaultConversionService.getSharedInstance()); this.configurableBeanFactory = beanFactory; this.expressionContext = (beanFactory != null ? new BeanExpressionContext(beanFactory, null) : null); @@ -177,6 +178,7 @@ public abstract class AbstractNamedValueMethodArgumentResolver implements Handle * @return the resolved argument. May be {@code null} * @throws Exception in case of errors */ + @Nullable protected abstract Object resolveArgumentInternal(MethodParameter parameter, Message message, String name) throws Exception; @@ -194,7 +196,7 @@ public abstract class AbstractNamedValueMethodArgumentResolver implements Handle * A {@code null} results in a {@code false} value for {@code boolean}s or an * exception for other primitives. */ - private Object handleNullValue(String name, Object value, Class paramType) { + private Object handleNullValue(String name, @Nullable Object value, Class paramType) { if (value == null) { if (Boolean.TYPE.equals(paramType)) { return Boolean.FALSE; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/HeaderMethodArgumentResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/HeaderMethodArgumentResolver.java index e32de6fa5ef..a08db6058cf 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/HeaderMethodArgumentResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/HeaderMethodArgumentResolver.java @@ -25,6 +25,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.core.MethodParameter; import org.springframework.core.convert.ConversionService; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHandlingException; import org.springframework.messaging.handler.annotation.Header; @@ -76,6 +77,7 @@ public class HeaderMethodArgumentResolver extends AbstractNamedValueMethodArgume return (headerValue != null ? headerValue : nativeHeaderValue); } + @Nullable private Object getNativeHeaderValue(Message message, String name) { Map> nativeHeaders = getNativeHeaders(message); if (name.startsWith("nativeHeaders.")) { diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/MessageMethodArgumentResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/MessageMethodArgumentResolver.java index e247cd9bd16..d1c8bc9bf1d 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/MessageMethodArgumentResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/MessageMethodArgumentResolver.java @@ -20,6 +20,7 @@ import java.lang.reflect.Type; import org.springframework.core.MethodParameter; import org.springframework.core.ResolvableType; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.converter.MessageConversionException; import org.springframework.messaging.converter.MessageConverter; @@ -57,7 +58,7 @@ public class MessageMethodArgumentResolver implements HandlerMethodArgumentResol * @param converter the MessageConverter to use (may be {@code null}) * @since 4.3 */ - public MessageMethodArgumentResolver(MessageConverter converter) { + public MessageMethodArgumentResolver(@Nullable MessageConverter converter) { this.converter = converter; } @@ -103,7 +104,7 @@ public class MessageMethodArgumentResolver implements HandlerMethodArgumentResol * Check if the given {@code payload} is empty. * @param payload the payload to check (can be {@code null}) */ - protected boolean isEmptyPayload(Object payload) { + protected boolean isEmptyPayload(@Nullable Object payload) { if (payload == null) { return true; } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/MethodArgumentNotValidException.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/MethodArgumentNotValidException.java index 37960a97dab..e043070fca3 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/MethodArgumentNotValidException.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/MethodArgumentNotValidException.java @@ -17,6 +17,7 @@ package org.springframework.messaging.handler.annotation.support; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.handler.invocation.MethodArgumentResolutionException; import org.springframework.validation.BindingResult; @@ -57,6 +58,7 @@ public class MethodArgumentNotValidException extends MethodArgumentResolutionExc * Return the BindingResult if the failure is validation-related, * or {@code null} if none. */ + @Nullable public final BindingResult getBindingResult() { return this.bindingResult; } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/PayloadArgumentResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/PayloadArgumentResolver.java index 72303952434..df31202e234 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/PayloadArgumentResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/PayloadArgumentResolver.java @@ -20,6 +20,7 @@ import java.lang.annotation.Annotation; import org.springframework.core.MethodParameter; import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.converter.MessageConversionException; import org.springframework.messaging.converter.MessageConverter; @@ -155,7 +156,7 @@ public class PayloadArgumentResolver implements HandlerMethodArgumentResolver { * Specify if the given {@code payload} is empty. * @param payload the payload to check (can be {@code null}) */ - protected boolean isEmptyPayload(Object payload) { + protected boolean isEmptyPayload(@Nullable Object payload) { if (payload == null) { return true; } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractExceptionHandlerMethodResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractExceptionHandlerMethodResolver.java index 723d7f25d94..576093ee38c 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractExceptionHandlerMethodResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractExceptionHandlerMethodResolver.java @@ -24,6 +24,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.springframework.core.ExceptionDepthComparator; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -84,6 +85,7 @@ public abstract class AbstractExceptionHandlerMethodResolver { * @param exception the exception * @return a Method to handle the exception, or {@code null} if none found */ + @Nullable public Method resolveMethod(Exception exception) { Method method = resolveMethodByExceptionType(exception.getClass()); if (method == null) { @@ -102,6 +104,7 @@ public abstract class AbstractExceptionHandlerMethodResolver { * @return a Method to handle the exception, or {@code null} if none found * @since 4.3.1 */ + @Nullable public Method resolveMethodByExceptionType(Class exceptionType) { Method method = this.exceptionLookupCache.get(exceptionType); if (method == null) { @@ -114,6 +117,7 @@ public abstract class AbstractExceptionHandlerMethodResolver { /** * Return the {@link Method} mapped to the given exception type, or {@code null} if none. */ + @Nullable private Method getMappedMethod(Class exceptionType) { List> matches = new ArrayList<>(); for (Class mappedException : this.mappedMethods.keySet()) { diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractMethodMessageHandler.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractMethodMessageHandler.java index fa923770d75..add2f87eb72 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractMethodMessageHandler.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractMethodMessageHandler.java @@ -35,6 +35,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.core.MethodIntrospector; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHandler; import org.springframework.messaging.MessagingException; @@ -304,6 +305,7 @@ public abstract class AbstractMethodMessageHandler * @param handlerType the handler type, possibly a sub-type of the method's declaring class * @return the mapping, or {@code null} if the method is not mapped */ + @Nullable protected abstract T getMappingForMethod(Method method, Class handlerType); /** @@ -409,6 +411,7 @@ public abstract class AbstractMethodMessageHandler *

    If there are no matching prefixes, return {@code null}. *

    If there are no destination prefixes, return the destination as is. */ + @Nullable protected String getLookupDestination(String destination) { if (destination == null) { return null; @@ -477,6 +480,7 @@ public abstract class AbstractMethodMessageHandler * @param message the message being handled * @return the match or {@code null} if there is no match */ + @Nullable protected abstract T getMatchingMapping(T mapping, Message message); protected void handleNoMatch(Set ts, String lookupDestination, Message message) { @@ -559,6 +563,7 @@ public abstract class AbstractMethodMessageHandler * @return a method to handle the exception, or {@code null} * @since 4.2 */ + @Nullable protected InvocableHandlerMethod getExceptionHandlerMethod(HandlerMethod handlerMethod, Exception exception) { if (logger.isDebugEnabled()) { logger.debug("Searching methods to handle " + exception.getClass().getSimpleName()); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AsyncHandlerMethodReturnValueHandler.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AsyncHandlerMethodReturnValueHandler.java index 5da73ba3f6e..96afc09cd05 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AsyncHandlerMethodReturnValueHandler.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AsyncHandlerMethodReturnValueHandler.java @@ -17,6 +17,7 @@ package org.springframework.messaging.handler.invocation; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.util.concurrent.ListenableFuture; /** @@ -61,6 +62,7 @@ public interface AsyncHandlerMethodReturnValueHandler extends HandlerMethodRetur * @return the resulting ListenableFuture or {@code null} in which case no * further handling will be performed. */ + @Nullable ListenableFuture toListenableFuture(Object returnValue, MethodParameter returnType); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodArgumentResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodArgumentResolver.java index 28d6b45c164..317b1b61fe7 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodArgumentResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodArgumentResolver.java @@ -17,6 +17,7 @@ package org.springframework.messaging.handler.invocation; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; /** @@ -47,6 +48,7 @@ public interface HandlerMethodArgumentResolver { * @return the resolved argument value, or {@code null} * @throws Exception in case of errors with the preparation of argument values */ + @Nullable Object resolveArgument(MethodParameter parameter, Message message) throws Exception; } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodReturnValueHandlerComposite.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodReturnValueHandlerComposite.java index 99ff814643d..0899d434ff8 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodReturnValueHandlerComposite.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodReturnValueHandlerComposite.java @@ -24,6 +24,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.util.Assert; import org.springframework.util.concurrent.ListenableFuture; @@ -80,6 +81,7 @@ public class HandlerMethodReturnValueHandlerComposite implements AsyncHandlerMet return getReturnValueHandler(returnType) != null; } + @Nullable private HandlerMethodReturnValueHandler getReturnValueHandler(MethodParameter returnType) { for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) { if (handler.supportsReturnType(returnType)) { diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java index 8cab1fde98f..3ab2a202e0d 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java @@ -25,6 +25,7 @@ import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.MethodParameter; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.core.ResolvableType; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.handler.HandlerMethod; import org.springframework.util.ClassUtils; @@ -158,6 +159,7 @@ public class InvocableHandlerMethod extends HandlerMethod { /** * Attempt to resolve a method parameter from the list of provided argument values. */ + @Nullable private Object resolveProvidedArgument(MethodParameter parameter, Object... providedArgs) { if (providedArgs == null) { return null; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/package-info.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/package-info.java index a05588b7925..b1593a3fdb5 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/package-info.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/package-info.java @@ -1,4 +1,7 @@ /** * Common infrastructure for invoking message handler methods. */ +@NonNullApi package org.springframework.messaging.handler.invocation; + +import org.springframework.lang.NonNullApi; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/package-info.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/package-info.java index 481a9d7fb45..e9e183387d3 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/package-info.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/package-info.java @@ -1,4 +1,7 @@ /** * Basic abstractions for working with message handler methods. */ +@NonNullApi package org.springframework.messaging.handler; + +import org.springframework.lang.NonNullApi; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/package-info.java b/spring-messaging/src/main/java/org/springframework/messaging/package-info.java index 4836526c7a3..bcf02caca34 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/package-info.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/package-info.java @@ -1,4 +1,7 @@ /** * Support for working with messaging APIs and protocols. */ +@NonNullApi package org.springframework.messaging; + +import org.springframework.lang.NonNullApi; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpAttributes.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpAttributes.java index bc50bfa146f..b2f4e97e3a4 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpAttributes.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpAttributes.java @@ -21,6 +21,7 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; import org.springframework.util.Assert; @@ -70,6 +71,7 @@ public class SimpAttributes { * @param name the name of the attribute * @return the current attribute value, or {@code null} if not found */ + @Nullable public Object getAttribute(String name) { return this.attributes.get(name); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpAttributesContextHolder.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpAttributesContextHolder.java index 512641d2c71..d6265f74566 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpAttributesContextHolder.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpAttributesContextHolder.java @@ -17,6 +17,7 @@ package org.springframework.messaging.simp; import org.springframework.core.NamedThreadLocal; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; @@ -66,6 +67,7 @@ public abstract class SimpAttributesContextHolder { * Return the SimpAttributes currently bound to the thread. * @return the attributes or {@code null} if not bound */ + @Nullable public static SimpAttributes getAttributes() { return attributesHolder.get(); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageSendingOperations.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageSendingOperations.java index 953d8715605..28b6f8083f0 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageSendingOperations.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageSendingOperations.java @@ -18,6 +18,7 @@ package org.springframework.messaging.simp; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.messaging.MessagingException; import org.springframework.messaging.core.MessagePostProcessor; import org.springframework.messaging.core.MessageSendingOperations; @@ -83,7 +84,7 @@ public interface SimpMessageSendingOperations extends MessageSendingOperations headers) + void convertAndSendToUser(String user, String destination, @Nullable Object payload, @Nullable Map headers) throws MessagingException; /** @@ -93,7 +94,7 @@ public interface SimpMessageSendingOperations extends MessageSendingOperations message, MessageHeaders headers) { Principal principal = SimpMessageHeaderAccessor.getUser(headers); if (principal != null) { diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/package-info.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/package-info.java index 2cddb57e4e7..c195345070c 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/package-info.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/package-info.java @@ -2,4 +2,7 @@ * Support classes for handling messages from simple messaging protocols * (like STOMP). */ +@NonNullApi package org.springframework.messaging.simp.annotation.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistry.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistry.java index fed76b4230e..45777103db2 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistry.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistry.java @@ -35,6 +35,7 @@ import org.springframework.expression.TypedValue; import org.springframework.expression.spel.SpelEvaluationException; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.simp.SimpMessageHeaderAccessor; @@ -428,6 +429,7 @@ public class DefaultSubscriptionRegistry extends AbstractSubscriptionRegistry { return this.destinationLookup.get(destination); } + @Nullable public Subscription getSubscription(String subscriptionId) { for (Map.Entry> destinationEntry : this.destinationLookup.entrySet()) { Set subs = destinationEntry.getValue(); @@ -456,6 +458,7 @@ public class DefaultSubscriptionRegistry extends AbstractSubscriptionRegistry { subs.add(new Subscription(subscriptionId, selectorExpression)); } + @Nullable public String removeSubscription(String subscriptionId) { for (Map.Entry> destinationEntry : this.destinationLookup.entrySet()) { Set subs = destinationEntry.getValue(); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/package-info.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/package-info.java index 46e45bb9447..177abfe7a56 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/package-info.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/broker/package-info.java @@ -2,4 +2,7 @@ * Provides a "simple" message broker implementation along with an abstract base * class and other supporting types such as a registry for subscriptions. */ +@NonNullApi package org.springframework.messaging.simp.broker; + +import org.springframework.lang.NonNullApi; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/config/AbstractMessageBrokerConfiguration.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/config/AbstractMessageBrokerConfiguration.java index 95c483c66d2..67308863576 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/config/AbstractMessageBrokerConfiguration.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/config/AbstractMessageBrokerConfiguration.java @@ -26,6 +26,7 @@ import org.springframework.beans.factory.BeanInitializationException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHandler; import org.springframework.messaging.converter.ByteArrayMessageConverter; @@ -447,6 +448,7 @@ public abstract class AbstractMessageBrokerConfiguration implements ApplicationC * Override this method to provide a custom {@link Validator}. * @since 4.0.1 */ + @Nullable public Validator getValidator() { return null; } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/config/MessageBrokerRegistry.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/config/MessageBrokerRegistry.java index 5267b0ffffa..9dd0dd8550f 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/config/MessageBrokerRegistry.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/config/MessageBrokerRegistry.java @@ -19,6 +19,7 @@ package org.springframework.messaging.simp.config; import java.util.Arrays; import java.util.Collection; +import org.springframework.lang.Nullable; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.SubscribableChannel; import org.springframework.messaging.simp.broker.SimpleBrokerMessageHandler; @@ -188,6 +189,7 @@ public class MessageBrokerRegistry { } + @Nullable protected SimpleBrokerMessageHandler getSimpleBroker(SubscribableChannel brokerChannel) { if (this.simpleBrokerRegistration == null && this.brokerRelayRegistration == null) { enableSimpleBroker(); @@ -201,6 +203,7 @@ public class MessageBrokerRegistry { return null; } + @Nullable protected StompBrokerRelayMessageHandler getStompBrokerRelay(SubscribableChannel brokerChannel) { if (this.brokerRelayRegistration != null) { return this.brokerRelayRegistration.getMessageHandler(brokerChannel); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/config/package-info.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/config/package-info.java index b679aa38bba..856966dc0ed 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/config/package-info.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/config/package-info.java @@ -1,4 +1,7 @@ /** * Configuration support for WebSocket messaging using higher level messaging protocols. */ +@NonNullApi package org.springframework.messaging.simp.config; + +import org.springframework.lang.NonNullApi; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/package-info.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/package-info.java index 343b07c30e7..b9f3ef39bda 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/package-info.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/package-info.java @@ -1,4 +1,7 @@ /** * Generic support for SImple Messaging Protocols including protocols such as STOMP. */ +@NonNullApi package org.springframework.messaging.simp; + +import org.springframework.lang.NonNullApi; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompDecoder.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompDecoder.java index d7ab7a80aeb..b97f73d045f 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompDecoder.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompDecoder.java @@ -26,6 +26,7 @@ import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.support.MessageBuilder; import org.springframework.messaging.support.MessageHeaderInitializer; @@ -66,6 +67,7 @@ public class StompDecoder { /** * Return the configured {@code MessageHeaderInitializer}, if any. */ + @Nullable public MessageHeaderInitializer getHeaderInitializer() { return this.headerInitializer; } @@ -80,6 +82,7 @@ public class StompDecoder { * @return the decoded messages, or an empty list if none * @throws StompConversionException raised in case of decoding issues */ + @Nullable public List> decode(ByteBuffer byteBuffer) { return decode(byteBuffer, null); } @@ -285,6 +288,7 @@ public class StompDecoder { return sb.toString(); } + @Nullable private byte[] readPayload(ByteBuffer byteBuffer, StompHeaderAccessor headerAccessor) { Integer contentLength; try { diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompFrameHandler.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompFrameHandler.java index fc2f98c5488..d1968c15205 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompFrameHandler.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompFrameHandler.java @@ -18,6 +18,8 @@ package org.springframework.messaging.simp.stomp; import java.lang.reflect.Type; +import org.springframework.lang.Nullable; + /** * Contract to handle a STOMP frame. * @@ -39,6 +41,6 @@ public interface StompFrameHandler { * @param headers the headers of the frame * @param payload the payload or {@code null} if there was no payload */ - void handleFrame(StompHeaders headers, Object payload); + void handleFrame(StompHeaders headers, @Nullable Object payload); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompHeaderAccessor.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompHeaderAccessor.java index d135257eb77..2dc707db955 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompHeaderAccessor.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompHeaderAccessor.java @@ -25,6 +25,7 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicLong; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.simp.SimpMessageHeaderAccessor; import org.springframework.messaging.simp.SimpMessageType; @@ -219,6 +220,7 @@ public class StompHeaderAccessor extends SimpMessageHeaderAccessor { /** * Return the STOMP command, or {@code null} if not yet set. */ + @Nullable public StompCommand getCommand() { return (StompCommand) getHeader(COMMAND_HEADER); } @@ -286,6 +288,7 @@ public class StompHeaderAccessor extends SimpMessageHeaderAccessor { } } + @Nullable public Integer getContentLength() { if (containsNativeHeader(STOMP_CONTENT_LENGTH_HEADER)) { return Integer.valueOf(getFirstNativeHeader(STOMP_CONTENT_LENGTH_HEADER)); @@ -341,6 +344,7 @@ public class StompHeaderAccessor extends SimpMessageHeaderAccessor { /** * Return the passcode header value, or {@code null} if not set. */ + @Nullable public String getPasscode() { StompPasscode credentials = (StompPasscode) getHeader(CREDENTIALS_HEADER); return (credentials != null ? credentials.passcode : null); @@ -490,6 +494,7 @@ public class StompHeaderAccessor extends SimpMessageHeaderAccessor { /** * Return the STOMP command from the given headers, or {@code null} if not set. */ + @Nullable public static StompCommand getCommand(Map headers) { return (StompCommand) headers.get(COMMAND_HEADER); } @@ -497,6 +502,7 @@ public class StompHeaderAccessor extends SimpMessageHeaderAccessor { /** * Return the passcode header value, or {@code null} if not set. */ + @Nullable public static String getPasscode(Map headers) { StompPasscode credentials = (StompPasscode) headers.get(CREDENTIALS_HEADER); return (credentials != null ? credentials.passcode : null); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompSession.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompSession.java index b348da11a36..ef2a8563c4e 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompSession.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompSession.java @@ -16,6 +16,8 @@ package org.springframework.messaging.simp.stomp; +import org.springframework.lang.Nullable; + /** * Represents a STOMP session with operations to send messages, create * subscriptions and receive messages on those subscriptions. @@ -115,6 +117,7 @@ public interface StompSession { * Return the receipt id, or {@code null} if the STOMP frame for which * the handle was returned did not have a "receipt" header. */ + @Nullable String getReceiptId(); /** diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/package-info.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/package-info.java index df73ffeb652..44ea22128b8 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/package-info.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/package-info.java @@ -1,4 +1,7 @@ /** * Generic support for simple messaging protocols (like STOMP). */ +@NonNullApi package org.springframework.messaging.simp.stomp; + +import org.springframework.lang.NonNullApi; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/DefaultUserDestinationResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/DefaultUserDestinationResolver.java index 291fc585e7e..a7193e8e861 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/DefaultUserDestinationResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/DefaultUserDestinationResolver.java @@ -24,6 +24,7 @@ import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.simp.SimpMessageHeaderAccessor; @@ -138,6 +139,7 @@ public class DefaultUserDestinationResolver implements UserDestinationResolver { return new UserDestinationResult(sourceDestination, targetSet, subscribeDestination, user); } + @Nullable private ParseResult parse(Message message) { MessageHeaders headers = message.getHeaders(); String destination = SimpMessageHeaderAccessor.getDestination(headers); @@ -215,8 +217,9 @@ public class DefaultUserDestinationResolver implements UserDestinationResolver { * @return a target destination, or {@code null} if none */ @SuppressWarnings("unused") + @Nullable protected String getTargetDestination(String sourceDestination, String actualDestination, - String sessionId, String user) { + String sessionId, @Nullable String user) { return actualDestination + "-user" + sessionId; } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/SimpUser.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/SimpUser.java index fd3a1806d22..c1de43b77ce 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/SimpUser.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/SimpUser.java @@ -18,6 +18,8 @@ package org.springframework.messaging.simp.user; import java.util.Set; +import org.springframework.lang.Nullable; + /** * Represents a connected user. * @@ -39,8 +41,9 @@ public interface SimpUser { /** * Look up the session for the given id. * @param sessionId the session id - * @return the matching session of {@code null}. + * @return the matching session or {@code null}. */ + @Nullable SimpSession getSession(String sessionId); /** diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/SimpUserRegistry.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/SimpUserRegistry.java index ea5f9ab3422..f1aba53c19b 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/SimpUserRegistry.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/SimpUserRegistry.java @@ -18,6 +18,8 @@ package org.springframework.messaging.simp.user; import java.util.Set; +import org.springframework.lang.Nullable; + /** * A registry of currently connected users. * @@ -31,6 +33,7 @@ public interface SimpUserRegistry { * @param userName the name of the user to look up * @return the user, or {@code null} if not connected */ + @Nullable SimpUser getUser(String userName); /** diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationMessageHandler.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationMessageHandler.java index 77a35289832..9d8783e5de6 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationMessageHandler.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationMessageHandler.java @@ -23,6 +23,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.context.SmartLifecycle; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHandler; import org.springframework.messaging.MessageHeaders; @@ -253,6 +254,7 @@ public class UserDestinationMessageHandler implements MessageHandler, SmartLifec return this.broadcastDestination; } + @Nullable public Message preHandle(Message message) throws MessagingException { String destination = SimpMessageHeaderAccessor.getDestination(message.getHeaders()); if (!getBroadcastDestination().equals(destination)) { diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationResolver.java index 722067611a5..a79aec5a8a9 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationResolver.java @@ -16,6 +16,7 @@ package org.springframework.messaging.simp.user; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; /** @@ -44,6 +45,7 @@ public interface UserDestinationResolver { * @return 0 or more target messages (one for each active session), or * {@code null} if the source message does not contain a user destination. */ + @Nullable UserDestinationResult resolveDestination(Message message); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationResult.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationResult.java index 7e2d8503e63..1c9ce376eda 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationResult.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/UserDestinationResult.java @@ -18,6 +18,7 @@ package org.springframework.messaging.simp.user; import java.util.Set; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -89,6 +90,7 @@ public class UserDestinationResult { * sessionId in place of a user name thus removing the need for a user-to-session * lookup via {@link SimpUserRegistry}. */ + @Nullable public String getUser() { return this.user; } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/package-info.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/package-info.java index 9cf68e14592..cea4c996bb3 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/package-info.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/package-info.java @@ -6,4 +6,7 @@ *

    Also included is {@link org.springframework.messaging.simp.user.SimpUserRegistry} * for keeping track of connected user sessions. */ +@NonNullApi package org.springframework.messaging.simp.user; + +import org.springframework.lang.NonNullApi; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/AbstractHeaderMapper.java b/spring-messaging/src/main/java/org/springframework/messaging/support/AbstractHeaderMapper.java index 5d9b4d9415a..3503c6e8f90 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/AbstractHeaderMapper.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/AbstractHeaderMapper.java @@ -21,6 +21,7 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.messaging.MessageHeaders; import org.springframework.util.StringUtils; @@ -88,6 +89,7 @@ public abstract class AbstractHeaderMapper implements HeaderMapper { * Return the header value, or {@code null} if it does not exist * or does not match the requested {@code type}. */ + @Nullable protected V getHeaderIfAvailable(Map headers, String name, Class type) { Object value = headers.get(name); if (value == null) { diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/AbstractMessageChannel.java b/spring-messaging/src/main/java/org/springframework/messaging/support/AbstractMessageChannel.java index 0f48b50fe48..58444f77d03 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/AbstractMessageChannel.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/AbstractMessageChannel.java @@ -24,6 +24,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.BeanNameAware; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageDeliveryException; @@ -152,6 +153,7 @@ public abstract class AbstractMessageChannel implements MessageChannel, Intercep private int receiveInterceptorIndex = -1; + @Nullable public Message applyPreSend(Message message, MessageChannel channel) { Message messageToUse = message; for (ChannelInterceptor interceptor : interceptors) { @@ -199,6 +201,7 @@ public abstract class AbstractMessageChannel implements MessageChannel, Intercep return true; } + @Nullable public Message applyPostReceive(Message message, MessageChannel channel) { for (ChannelInterceptor interceptor : interceptors) { message = interceptor.postReceive(message, channel); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/ChannelInterceptor.java b/spring-messaging/src/main/java/org/springframework/messaging/support/ChannelInterceptor.java index fb28d1bbad9..5e85cc494f3 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/ChannelInterceptor.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/ChannelInterceptor.java @@ -16,6 +16,7 @@ package org.springframework.messaging.support; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; @@ -36,6 +37,7 @@ public interface ChannelInterceptor { * If this method returns {@code null} then the actual * send invocation will not occur. */ + @Nullable Message preSend(Message message, MessageChannel channel); /** diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/ExecutorChannelInterceptor.java b/spring-messaging/src/main/java/org/springframework/messaging/support/ExecutorChannelInterceptor.java index cb6b993678b..3300e505b29 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/ExecutorChannelInterceptor.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/ExecutorChannelInterceptor.java @@ -16,6 +16,7 @@ package org.springframework.messaging.support; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHandler; @@ -42,6 +43,7 @@ public interface ExecutorChannelInterceptor extends ChannelInterceptor { * @param handler the target handler to handle the message * @return the input message, or a new instance, or {@code null} */ + @Nullable Message beforeHandle(Message message, MessageChannel channel, MessageHandler handler); /** diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/ExecutorSubscribableChannel.java b/spring-messaging/src/main/java/org/springframework/messaging/support/ExecutorSubscribableChannel.java index 75db9919896..8aaa06c45f7 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/ExecutorSubscribableChannel.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/ExecutorSubscribableChannel.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executor; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageDeliveryException; import org.springframework.messaging.MessageHandler; @@ -54,7 +55,7 @@ public class ExecutorSubscribableChannel extends AbstractSubscribableChannel { * @param executor the executor used to send the message, * or {@code null} to execute in the callers thread. */ - public ExecutorSubscribableChannel(Executor executor) { + public ExecutorSubscribableChannel(@Nullable Executor executor) { this.executor = executor; } @@ -151,6 +152,7 @@ public class ExecutorSubscribableChannel extends AbstractSubscribableChannel { } } + @Nullable private Message applyBeforeHandle(Message message) { for (ExecutorChannelInterceptor interceptor : executorInterceptors) { message = interceptor.beforeHandle(message, ExecutorSubscribableChannel.this, this.messageHandler); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/IdTimestampMessageHeaderInitializer.java b/spring-messaging/src/main/java/org/springframework/messaging/support/IdTimestampMessageHeaderInitializer.java index b21d7d9776d..526981200b6 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/IdTimestampMessageHeaderInitializer.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/IdTimestampMessageHeaderInitializer.java @@ -18,6 +18,7 @@ package org.springframework.messaging.support; import java.util.UUID; +import org.springframework.lang.Nullable; import org.springframework.messaging.MessageHeaders; import org.springframework.util.IdGenerator; @@ -57,6 +58,7 @@ public class IdTimestampMessageHeaderInitializer implements MessageHeaderInitial /** * Return the configured {@code IdGenerator}, if any. */ + @Nullable public IdGenerator getIdGenerator() { return this.idGenerator; } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/MessageBuilder.java b/spring-messaging/src/main/java/org/springframework/messaging/support/MessageBuilder.java index c198748eef8..615db544748 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/MessageBuilder.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/MessageBuilder.java @@ -18,6 +18,7 @@ package org.springframework.messaging.support; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHeaders; @@ -73,7 +74,7 @@ public final class MessageBuilder { * Set the value for the given header name. If the provided value is {@code null}, * the header will be removed. */ - public MessageBuilder setHeader(String headerName, Object headerValue) { + public MessageBuilder setHeader(String headerName, @Nullable Object headerValue) { this.headerAccessor.setHeader(headerName, headerValue); return this; } @@ -187,7 +188,7 @@ public final class MessageBuilder { * @since 4.1 */ @SuppressWarnings("unchecked") - public static Message createMessage(T payload, MessageHeaders messageHeaders) { + public static Message createMessage(@Nullable T payload, MessageHeaders messageHeaders) { Assert.notNull(payload, "Payload must not be null"); Assert.notNull(messageHeaders, "MessageHeaders must not be null"); if (payload instanceof Throwable) { diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java b/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java index 07be82ad608..da6ab0043cc 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHeaders; @@ -143,7 +144,7 @@ public class MessageHeaderAccessor { * A constructor accepting the headers of an existing message to copy. * @param message a message to copy the headers from, or {@code null} if none */ - public MessageHeaderAccessor(Message message) { + public MessageHeaderAccessor(@Nullable Message message) { this.headers = new MutableMessageHeaders(message != null ? message.getHeaders() : null); } @@ -284,6 +285,7 @@ public class MessageHeaderAccessor { * @param headerName the name of the header * @return the associated value, or {@code null} if none found */ + @Nullable public Object getHeader(String headerName) { return this.headers.get(headerName); } @@ -292,7 +294,7 @@ public class MessageHeaderAccessor { * Set the value for the given header name. *

    If the provided value is {@code null}, the header will be removed. */ - public void setHeader(String name, Object value) { + public void setHeader(String name, @Nullable Object value) { if (isReadOnly(name)) { throw new IllegalArgumentException("'" + name + "' header is read-only"); } @@ -414,6 +416,7 @@ public class MessageHeaderAccessor { // Specific header accessors + @Nullable public UUID getId() { Object value = getHeader(MessageHeaders.ID); if (value == null) { @@ -422,6 +425,7 @@ public class MessageHeaderAccessor { return (value instanceof UUID ? (UUID) value : UUID.fromString(value.toString())); } + @Nullable public Long getTimestamp() { Object value = getHeader(MessageHeaders.TIMESTAMP); if (value == null) { @@ -434,6 +438,7 @@ public class MessageHeaderAccessor { setHeader(MessageHeaders.CONTENT_TYPE, contentType); } + @Nullable public MimeType getContentType() { Object value = getHeader(MessageHeaders.CONTENT_TYPE); if (value == null) { @@ -561,6 +566,7 @@ public class MessageHeaderAccessor { * @return an accessor instance of the specified type, or {@code null} if none * @since 4.1 */ + @Nullable public static T getAccessor(Message message, Class requiredType) { return getAccessor(message.getHeaders(), requiredType); } @@ -573,6 +579,7 @@ public class MessageHeaderAccessor { * @since 4.1 */ @SuppressWarnings("unchecked") + @Nullable public static T getAccessor( MessageHeaders messageHeaders, Class requiredType) { diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/NativeMessageHeaderAccessor.java b/spring-messaging/src/main/java/org/springframework/messaging/support/NativeMessageHeaderAccessor.java index 3d706005d34..b31a14415d4 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/NativeMessageHeaderAccessor.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/NativeMessageHeaderAccessor.java @@ -21,6 +21,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -62,7 +63,7 @@ public class NativeMessageHeaderAccessor extends MessageHeaderAccessor { * A protected constructor to create new headers. * @param nativeHeaders native headers to create the message with (may be {@code null}) */ - protected NativeMessageHeaderAccessor(Map> nativeHeaders) { + protected NativeMessageHeaderAccessor(@Nullable Map> nativeHeaders) { if (!CollectionUtils.isEmpty(nativeHeaders)) { setHeader(NATIVE_HEADERS, new LinkedMultiValueMap<>(nativeHeaders)); } @@ -121,14 +122,16 @@ public class NativeMessageHeaderAccessor extends MessageHeaderAccessor { /** * @return all values for the specified native header or {@code null}. */ + @Nullable public List getNativeHeader(String headerName) { Map> map = getNativeHeaders(); return (map != null ? map.get(headerName) : null); } /** - * @return the first value for the specified native header of {@code null}. + * @return the first value for the specified native header or {@code null}. */ + @Nullable public String getFirstNativeHeader(String headerName) { Map> map = getNativeHeaders(); if (map != null) { @@ -198,6 +201,7 @@ public class NativeMessageHeaderAccessor extends MessageHeaderAccessor { } } + @Nullable public List removeNativeHeader(String name) { Assert.state(isMutable(), "Already immutable"); Map> nativeHeaders = getNativeHeaders(); @@ -208,6 +212,7 @@ public class NativeMessageHeaderAccessor extends MessageHeaderAccessor { } @SuppressWarnings("unchecked") + @Nullable public static String getFirstNativeHeader(String headerName, Map headers) { Map> map = (Map>) headers.get(NATIVE_HEADERS); if (map != null) { diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/package-info.java b/spring-messaging/src/main/java/org/springframework/messaging/support/package-info.java index 2d62461fdef..4b3967dccfe 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/package-info.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/package-info.java @@ -4,4 +4,7 @@ * message headers, as well as various {@link org.springframework.messaging.MessageChannel} * implementations and channel interceptor support. */ +@NonNullApi package org.springframework.messaging.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/tcp/ReconnectStrategy.java b/spring-messaging/src/main/java/org/springframework/messaging/tcp/ReconnectStrategy.java index e5a6c4fe18f..33ea377d556 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/tcp/ReconnectStrategy.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/tcp/ReconnectStrategy.java @@ -16,6 +16,8 @@ package org.springframework.messaging.tcp; +import org.springframework.lang.Nullable; + /** * A contract to determine the frequency of reconnect attempts after connection failure. * @@ -30,6 +32,7 @@ public interface ReconnectStrategy { * @param attemptCount how many reconnect attempts have been made already * @return the amount of time in milliseconds or {@code null} to stop */ + @Nullable Long getTimeToNextAttempt(int attemptCount); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/tcp/package-info.java b/spring-messaging/src/main/java/org/springframework/messaging/tcp/package-info.java index 4e13d2e88c0..736265af227 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/tcp/package-info.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/tcp/package-info.java @@ -6,4 +6,7 @@ * as well as sending messages via * {@link org.springframework.messaging.tcp.TcpConnection TcpConnection}. */ +@NonNullApi package org.springframework.messaging.tcp; + +import org.springframework.lang.NonNullApi; diff --git a/spring-messaging/src/main/java/org/springframework/messaging/tcp/reactor/package-info.java b/spring-messaging/src/main/java/org/springframework/messaging/tcp/reactor/package-info.java index e80e0a4c944..0d7ef61f3f0 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/tcp/reactor/package-info.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/tcp/reactor/package-info.java @@ -1,4 +1,7 @@ /** * Contains support for TCP messaging based on Reactor. */ +@NonNullApi package org.springframework.messaging.tcp.reactor; + +import org.springframework.lang.NonNullApi; diff --git a/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateCallback.java b/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateCallback.java index d9a836db6d6..6af5f1f3131 100644 --- a/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateCallback.java +++ b/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateCallback.java @@ -19,6 +19,8 @@ package org.springframework.orm.hibernate5; import org.hibernate.HibernateException; import org.hibernate.Session; +import org.springframework.lang.Nullable; + /** * Callback interface for Hibernate code. To be used with {@link HibernateTemplate}'s * execution methods, often as anonymous classes within a method implementation. @@ -46,6 +48,7 @@ public interface HibernateCallback { * @throws HibernateException if thrown by the Hibernate API * @see HibernateTemplate#execute */ + @Nullable T doInHibernate(Session session) throws HibernateException; } diff --git a/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateOperations.java b/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateOperations.java index d3ae8d7f0be..08f0baa2d0f 100644 --- a/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateOperations.java +++ b/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateOperations.java @@ -27,6 +27,7 @@ import org.hibernate.ReplicationMode; import org.hibernate.criterion.DetachedCriteria; import org.springframework.dao.DataAccessException; +import org.springframework.lang.Nullable; /** * Interface that specifies a basic set of Hibernate operations, @@ -64,6 +65,7 @@ public interface HibernateOperations { * @see HibernateTransactionManager * @see org.hibernate.Session */ + @Nullable T execute(HibernateCallback action) throws DataAccessException; @@ -84,6 +86,7 @@ public interface HibernateOperations { * @throws DataAccessException in case of Hibernate errors * @see org.hibernate.Session#get(Class, Serializable) */ + @Nullable T get(Class entityClass, Serializable id) throws DataAccessException; /** @@ -101,6 +104,7 @@ public interface HibernateOperations { * @throws DataAccessException in case of Hibernate errors * @see org.hibernate.Session#get(Class, Serializable, LockMode) */ + @Nullable T get(Class entityClass, Serializable id, LockMode lockMode) throws DataAccessException; /** @@ -116,6 +120,7 @@ public interface HibernateOperations { * @throws DataAccessException in case of Hibernate errors * @see org.hibernate.Session#get(Class, Serializable) */ + @Nullable Object get(String entityName, Serializable id) throws DataAccessException; /** @@ -133,6 +138,7 @@ public interface HibernateOperations { * @throws DataAccessException in case of Hibernate errors * @see org.hibernate.Session#get(Class, Serializable, LockMode) */ + @Nullable Object get(String entityName, Serializable id, LockMode lockMode) throws DataAccessException; /** diff --git a/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateTemplate.java b/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateTemplate.java index b671231f7f8..df5f1bdee95 100644 --- a/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateTemplate.java +++ b/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateTemplate.java @@ -24,6 +24,7 @@ import java.lang.reflect.Proxy; import java.util.Collection; import java.util.Iterator; import java.util.List; + import javax.persistence.PersistenceException; import org.apache.commons.logging.Log; @@ -44,6 +45,7 @@ import org.hibernate.criterion.Example; import org.springframework.beans.factory.InitializingBean; import org.springframework.dao.DataAccessException; import org.springframework.dao.InvalidDataAccessApiUsageException; +import org.springframework.lang.Nullable; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.Assert; import org.springframework.util.ReflectionUtils; @@ -170,6 +172,7 @@ public class HibernateTemplate implements HibernateOperations, InitializingBean /** * Return the names of Hibernate filters to be activated, if any. */ + @Nullable public String[] getFilterNames() { return this.filterNames; } @@ -322,6 +325,7 @@ public class HibernateTemplate implements HibernateOperations, InitializingBean * @return a result object returned by the action, or {@code null} * @throws DataAccessException in case of Hibernate errors */ + @Nullable public T executeWithNativeSession(HibernateCallback action) { return doExecute(action, true); } @@ -335,6 +339,7 @@ public class HibernateTemplate implements HibernateOperations, InitializingBean * @throws DataAccessException in case of Hibernate errors */ @SuppressWarnings("deprecation") + @Nullable protected T doExecute(HibernateCallback action, boolean enforceNativeSession) throws DataAccessException { Assert.notNull(action, "Callback object must not be null"); diff --git a/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateTransactionManager.java b/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateTransactionManager.java index 746d70c24d2..325abb24df0 100644 --- a/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateTransactionManager.java +++ b/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateTransactionManager.java @@ -18,6 +18,7 @@ package org.springframework.orm.hibernate5; import java.sql.Connection; import java.sql.ResultSet; + import javax.persistence.PersistenceException; import javax.sql.DataSource; @@ -41,6 +42,7 @@ import org.springframework.jdbc.datasource.ConnectionHolder; import org.springframework.jdbc.datasource.DataSourceUtils; import org.springframework.jdbc.datasource.JdbcTransactionObjectSupport; import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; +import org.springframework.lang.Nullable; import org.springframework.transaction.CannotCreateTransactionException; import org.springframework.transaction.IllegalTransactionStateException; import org.springframework.transaction.InvalidIsolationLevelException; @@ -313,6 +315,7 @@ public class HibernateTransactionManager extends AbstractPlatformTransactionMana * @see #setEntityInterceptorBeanName * @see #setBeanFactory */ + @Nullable public Interceptor getEntityInterceptor() throws IllegalStateException, BeansException { if (this.entityInterceptor instanceof Interceptor) { return (Interceptor) entityInterceptor; diff --git a/spring-orm/src/main/java/org/springframework/orm/hibernate5/LocalSessionFactoryBuilder.java b/spring-orm/src/main/java/org/springframework/orm/hibernate5/LocalSessionFactoryBuilder.java index 1736a575ceb..b6058d19060 100644 --- a/spring-orm/src/main/java/org/springframework/orm/hibernate5/LocalSessionFactoryBuilder.java +++ b/spring-orm/src/main/java/org/springframework/orm/hibernate5/LocalSessionFactoryBuilder.java @@ -27,6 +27,7 @@ import java.util.TreeSet; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; + import javax.persistence.AttributeConverter; import javax.persistence.Converter; import javax.persistence.Embeddable; @@ -58,6 +59,7 @@ import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.core.type.filter.TypeFilter; +import org.springframework.lang.Nullable; import org.springframework.transaction.jta.JtaTransactionManager; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -101,7 +103,7 @@ public class LocalSessionFactoryBuilder extends Configuration { * @param dataSource the JDBC DataSource that the resulting Hibernate SessionFactory should be using * (may be {@code null}) */ - public LocalSessionFactoryBuilder(DataSource dataSource) { + public LocalSessionFactoryBuilder(@Nullable DataSource dataSource) { this(dataSource, new PathMatchingResourcePatternResolver()); } @@ -111,7 +113,7 @@ public class LocalSessionFactoryBuilder extends Configuration { * (may be {@code null}) * @param classLoader the ClassLoader to load application classes from */ - public LocalSessionFactoryBuilder(DataSource dataSource, ClassLoader classLoader) { + public LocalSessionFactoryBuilder(@Nullable DataSource dataSource, ClassLoader classLoader) { this(dataSource, new PathMatchingResourcePatternResolver(classLoader)); } @@ -121,7 +123,7 @@ public class LocalSessionFactoryBuilder extends Configuration { * (may be {@code null}) * @param resourceLoader the ResourceLoader to load application classes from */ - public LocalSessionFactoryBuilder(DataSource dataSource, ResourceLoader resourceLoader) { + public LocalSessionFactoryBuilder(@Nullable DataSource dataSource, ResourceLoader resourceLoader) { this(dataSource, resourceLoader, new MetadataSources( new BootstrapServiceRegistryBuilder().applyClassLoader(resourceLoader.getClassLoader()).build())); } @@ -134,7 +136,7 @@ public class LocalSessionFactoryBuilder extends Configuration { * @param metadataSources the Hibernate MetadataSources service to use (e.g. reusing an existing one) * @since 4.3 */ - public LocalSessionFactoryBuilder(DataSource dataSource, ResourceLoader resourceLoader, MetadataSources metadataSources) { + public LocalSessionFactoryBuilder(@Nullable DataSource dataSource, ResourceLoader resourceLoader, MetadataSources metadataSources) { super(metadataSources); getProperties().put(AvailableSettings.CURRENT_SESSION_CONTEXT_CLASS, SpringSessionContext.class.getName()); diff --git a/spring-orm/src/main/java/org/springframework/orm/hibernate5/SessionFactoryUtils.java b/spring-orm/src/main/java/org/springframework/orm/hibernate5/SessionFactoryUtils.java index fafa3f6b784..be1c99f508e 100644 --- a/spring-orm/src/main/java/org/springframework/orm/hibernate5/SessionFactoryUtils.java +++ b/spring-orm/src/main/java/org/springframework/orm/hibernate5/SessionFactoryUtils.java @@ -18,6 +18,7 @@ package org.springframework.orm.hibernate5; import java.lang.reflect.Method; import java.util.Map; + import javax.persistence.PersistenceException; import javax.sql.DataSource; @@ -63,6 +64,7 @@ import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.dao.InvalidDataAccessResourceUsageException; import org.springframework.dao.PessimisticLockingFailureException; import org.springframework.jdbc.datasource.DataSourceUtils; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; @@ -161,7 +163,7 @@ public abstract class SessionFactoryUtils { * @param session the Hibernate Session to close (may be {@code null}) * @see Session#close() */ - public static void closeSession(Session session) { + public static void closeSession(@Nullable Session session) { if (session != null) { try { session.close(); @@ -181,6 +183,7 @@ public abstract class SessionFactoryUtils { * @return the DataSource, or {@code null} if none found * @see ConnectionProvider */ + @Nullable public static DataSource getDataSource(SessionFactory sessionFactory) { Method getProperties = ClassUtils.getMethodIfAvailable(sessionFactory.getClass(), "getProperties"); if (getProperties != null) { diff --git a/spring-orm/src/main/java/org/springframework/orm/hibernate5/package-info.java b/spring-orm/src/main/java/org/springframework/orm/hibernate5/package-info.java index 12f5d47003c..1aa35f6d9c1 100644 --- a/spring-orm/src/main/java/org/springframework/orm/hibernate5/package-info.java +++ b/spring-orm/src/main/java/org/springframework/orm/hibernate5/package-info.java @@ -10,4 +10,7 @@ * *

    This package supports Hibernate 5.x only. */ +@NonNullApi package org.springframework.orm.hibernate5; + +import org.springframework.lang.NonNullApi; diff --git a/spring-orm/src/main/java/org/springframework/orm/hibernate5/support/package-info.java b/spring-orm/src/main/java/org/springframework/orm/hibernate5/support/package-info.java index 7c7c5a9efca..1b458ddb7bf 100644 --- a/spring-orm/src/main/java/org/springframework/orm/hibernate5/support/package-info.java +++ b/spring-orm/src/main/java/org/springframework/orm/hibernate5/support/package-info.java @@ -1,4 +1,7 @@ /** * Classes supporting the {@code org.springframework.orm.hibernate5} package. */ +@NonNullApi package org.springframework.orm.hibernate5.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/AbstractEntityManagerFactoryBean.java b/spring-orm/src/main/java/org/springframework/orm/jpa/AbstractEntityManagerFactoryBean.java index 4a898b37108..15b985a35a9 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/AbstractEntityManagerFactoryBean.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/AbstractEntityManagerFactoryBean.java @@ -33,6 +33,7 @@ import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; + import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.PersistenceException; @@ -55,6 +56,7 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.dao.DataAccessException; import org.springframework.dao.support.PersistenceExceptionTranslator; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; @@ -267,6 +269,7 @@ public abstract class AbstractEntityManagerFactoryBean implements * Return the JpaVendorAdapter implementation for this * EntityManagerFactory, or {@code null} if not known. */ + @Nullable public JpaVendorAdapter getJpaVendorAdapter() { return this.jpaVendorAdapter; } @@ -291,6 +294,7 @@ public abstract class AbstractEntityManagerFactoryBean implements * Return the asynchronous executor for background bootstrapping, if any. * @since 4.3 */ + @Nullable public AsyncTaskExecutor getBootstrapExecutor() { return this.bootstrapExecutor; } diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryAccessor.java b/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryAccessor.java index 5fd48d9563d..5f71fe5acd2 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryAccessor.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryAccessor.java @@ -19,6 +19,7 @@ package org.springframework.orm.jpa; import java.util.HashMap; import java.util.Map; import java.util.Properties; + import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; @@ -29,6 +30,7 @@ import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.ListableBeanFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -85,6 +87,7 @@ public abstract class EntityManagerFactoryAccessor implements BeanFactoryAware { /** * Return the name of the persistence unit to access the EntityManagerFactory for, if any. */ + @Nullable public String getPersistenceUnitName() { return this.persistenceUnitName; } @@ -106,7 +109,7 @@ public abstract class EntityManagerFactoryAccessor implements BeanFactoryAware { *

    Can be populated with a "map" or "props" element in XML bean definitions. * @see javax.persistence.EntityManagerFactory#createEntityManager(java.util.Map) */ - public void setJpaPropertyMap(Map jpaProperties) { + public void setJpaPropertyMap(@Nullable Map jpaProperties) { if (jpaProperties != null) { this.jpaPropertyMap.putAll(jpaProperties); } @@ -161,6 +164,7 @@ public abstract class EntityManagerFactoryAccessor implements BeanFactoryAware { * @see EntityManagerFactoryUtils#getTransactionalEntityManager(javax.persistence.EntityManagerFactory) * @see EntityManagerFactoryUtils#getTransactionalEntityManager(javax.persistence.EntityManagerFactory, java.util.Map) */ + @Nullable protected EntityManager getTransactionalEntityManager() throws IllegalStateException{ EntityManagerFactory emf = getEntityManagerFactory(); Assert.state(emf != null, "No EntityManagerFactory specified"); diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryInfo.java b/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryInfo.java index bdb38dcd664..16114ac9306 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryInfo.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryInfo.java @@ -22,6 +22,8 @@ import javax.persistence.spi.PersistenceProvider; import javax.persistence.spi.PersistenceUnitInfo; import javax.sql.DataSource; +import org.springframework.lang.Nullable; + /** * Metadata interface for a Spring-managed JPA {@link EntityManagerFactory}. * @@ -47,6 +49,7 @@ public interface EntityManagerFactoryInfo { * or {@code null} if the standard JPA provider autodetection process * was used to configure the EntityManagerFactory */ + @Nullable PersistenceProvider getPersistenceProvider(); /** @@ -56,6 +59,7 @@ public interface EntityManagerFactoryInfo { * or {@code null} if the in-container contract was not used to * configure the EntityManagerFactory */ + @Nullable PersistenceUnitInfo getPersistenceUnitInfo(); /** @@ -67,6 +71,7 @@ public interface EntityManagerFactoryInfo { * @see #getPersistenceUnitInfo() * @see javax.persistence.spi.PersistenceUnitInfo#getPersistenceUnitName() */ + @Nullable String getPersistenceUnitName(); /** @@ -74,6 +79,7 @@ public interface EntityManagerFactoryInfo { * obtains its JDBC Connections from. * @return the JDBC DataSource, or {@code null} if not known */ + @Nullable DataSource getDataSource(); /** @@ -83,12 +89,14 @@ public interface EntityManagerFactoryInfo { * to happen: either based on a target {@code EntityManager} instance * or simply defaulting to {@code javax.persistence.EntityManager}. */ + @Nullable Class getEntityManagerInterface(); /** * Return the vendor-specific JpaDialect implementation for this * EntityManagerFactory, or {@code null} if not known. */ + @Nullable JpaDialect getJpaDialect(); /** diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryUtils.java b/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryUtils.java index 43e98f3c423..12d4ccbc255 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryUtils.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerFactoryUtils.java @@ -17,6 +17,7 @@ package org.springframework.orm.jpa; import java.util.Map; + import javax.persistence.EntityExistsException; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; @@ -48,6 +49,7 @@ import org.springframework.dao.IncorrectResultSizeDataAccessException; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.dao.PessimisticLockingFailureException; import org.springframework.jdbc.datasource.DataSourceUtils; +import org.springframework.lang.Nullable; import org.springframework.transaction.support.ResourceHolderSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.Assert; @@ -96,7 +98,7 @@ public abstract class EntityManagerFactoryUtils { * @see EntityManagerFactoryInfo#getPersistenceUnitName() */ public static EntityManagerFactory findEntityManagerFactory( - ListableBeanFactory beanFactory, String unitName) throws NoSuchBeanDefinitionException { + ListableBeanFactory beanFactory, @Nullable String unitName) throws NoSuchBeanDefinitionException { Assert.notNull(beanFactory, "ListableBeanFactory must not be null"); if (StringUtils.hasLength(unitName)) { @@ -130,6 +132,7 @@ public abstract class EntityManagerFactoryUtils { * @throws DataAccessResourceFailureException if the EntityManager couldn't be obtained * @see JpaTransactionManager */ + @Nullable public static EntityManager getTransactionalEntityManager(EntityManagerFactory emf) throws DataAccessResourceFailureException { @@ -147,7 +150,8 @@ public abstract class EntityManagerFactoryUtils { * @throws DataAccessResourceFailureException if the EntityManager couldn't be obtained * @see JpaTransactionManager */ - public static EntityManager getTransactionalEntityManager(EntityManagerFactory emf, Map properties) + @Nullable + public static EntityManager getTransactionalEntityManager(EntityManagerFactory emf, @Nullable Map properties) throws DataAccessResourceFailureException { try { return doGetTransactionalEntityManager(emf, properties, true); @@ -169,6 +173,7 @@ public abstract class EntityManagerFactoryUtils { * @see #getTransactionalEntityManager(javax.persistence.EntityManagerFactory) * @see JpaTransactionManager */ + @Nullable public static EntityManager doGetTransactionalEntityManager(EntityManagerFactory emf, Map properties) throws PersistenceException { @@ -189,8 +194,9 @@ public abstract class EntityManagerFactoryUtils { * @see #getTransactionalEntityManager(javax.persistence.EntityManagerFactory) * @see JpaTransactionManager */ + @Nullable public static EntityManager doGetTransactionalEntityManager( - EntityManagerFactory emf, Map properties, boolean synchronizedWithTransaction) throws PersistenceException { + EntityManagerFactory emf, @Nullable Map properties, boolean synchronizedWithTransaction) throws PersistenceException { Assert.notNull(emf, "No EntityManagerFactory specified"); @@ -289,6 +295,7 @@ public abstract class EntityManagerFactoryUtils { * (to be passed into cleanupTransaction) * @see JpaDialect#prepareTransaction */ + @Nullable private static Object prepareTransaction(EntityManager em, EntityManagerFactory emf) { if (emf instanceof EntityManagerFactoryInfo) { EntityManagerFactoryInfo emfInfo = (EntityManagerFactoryInfo) emf; @@ -350,6 +357,7 @@ public abstract class EntityManagerFactoryUtils { * @return the corresponding DataAccessException instance, * or {@code null} if the exception should not be translated */ + @Nullable public static DataAccessException convertJpaAccessExceptionIfPossible(RuntimeException ex) { // Following the JPA specification, a persistence provider can also // throw these two exceptions, besides PersistenceException. @@ -406,7 +414,7 @@ public abstract class EntityManagerFactoryUtils { * @param em the JPA EntityManager to close (may be {@code null}) * @see javax.persistence.EntityManager#close() */ - public static void closeEntityManager(EntityManager em) { + public static void closeEntityManager(@Nullable EntityManager em) { if (em != null) { logger.debug("Closing JPA EntityManager"); try { diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/ExtendedEntityManagerCreator.java b/spring-orm/src/main/java/org/springframework/orm/jpa/ExtendedEntityManagerCreator.java index cc7bde2aee4..af2f6eeb177 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/ExtendedEntityManagerCreator.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/ExtendedEntityManagerCreator.java @@ -24,6 +24,7 @@ import java.lang.reflect.Proxy; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; + import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; @@ -37,6 +38,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.core.Ordered; import org.springframework.dao.DataAccessException; import org.springframework.dao.support.PersistenceExceptionTranslator; +import org.springframework.lang.Nullable; import org.springframework.transaction.support.ResourceHolderSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.Assert; @@ -141,7 +143,7 @@ public abstract class ExtendedEntityManagerCreator { * in any managed transaction * @see javax.persistence.EntityManagerFactory#createEntityManager(java.util.Map) */ - public static EntityManager createContainerManagedEntityManager(EntityManagerFactory emf, Map properties) { + public static EntityManager createContainerManagedEntityManager(EntityManagerFactory emf, @Nullable Map properties) { return createContainerManagedEntityManager(emf, properties, true); } @@ -160,7 +162,7 @@ public abstract class ExtendedEntityManagerCreator { * @since 4.0 */ public static EntityManager createContainerManagedEntityManager( - EntityManagerFactory emf, Map properties, boolean synchronizedWithTransaction) { + EntityManagerFactory emf, @Nullable Map properties, boolean synchronizedWithTransaction) { Assert.notNull(emf, "EntityManagerFactory must not be null"); if (emf instanceof EntityManagerFactoryInfo) { @@ -216,8 +218,8 @@ public abstract class ExtendedEntityManagerCreator { * @return the EntityManager proxy */ private static EntityManager createProxy( - EntityManager rawEm, Class emIfc, ClassLoader cl, - PersistenceExceptionTranslator exceptionTranslator, Boolean jta, + EntityManager rawEm, @Nullable Class emIfc, @Nullable ClassLoader cl, + PersistenceExceptionTranslator exceptionTranslator, @Nullable Boolean jta, boolean containerManaged, boolean synchronizedWithTransaction) { Assert.notNull(rawEm, "EntityManager must not be null"); @@ -278,6 +280,7 @@ public abstract class ExtendedEntityManagerCreator { } @Override + @Nullable public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // Invocation on EntityManager interface coming in... diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/JpaDialect.java b/spring-orm/src/main/java/org/springframework/orm/jpa/JpaDialect.java index e37b55aed95..f69ef565967 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/JpaDialect.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/JpaDialect.java @@ -17,11 +17,13 @@ package org.springframework.orm.jpa; import java.sql.SQLException; + import javax.persistence.EntityManager; import javax.persistence.PersistenceException; import org.springframework.dao.support.PersistenceExceptionTranslator; import org.springframework.jdbc.datasource.ConnectionHandle; +import org.springframework.lang.Nullable; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionException; @@ -78,6 +80,7 @@ public interface JpaDialect extends PersistenceExceptionTranslator { * @see javax.persistence.EntityTransaction#begin * @see org.springframework.jdbc.datasource.DataSourceUtils#prepareConnectionForTransaction */ + @Nullable Object beginTransaction(EntityManager entityManager, TransactionDefinition definition) throws PersistenceException, SQLException, TransactionException; @@ -100,6 +103,7 @@ public interface JpaDialect extends PersistenceExceptionTranslator { * @throws javax.persistence.PersistenceException if thrown by JPA methods * @see #cleanupTransaction */ + @Nullable Object prepareTransaction(EntityManager entityManager, boolean readOnly, String name) throws PersistenceException; @@ -114,7 +118,7 @@ public interface JpaDialect extends PersistenceExceptionTranslator { * @see #beginTransaction * @see org.springframework.jdbc.datasource.DataSourceUtils#resetConnectionAfterTransaction */ - void cleanupTransaction(Object transactionData); + void cleanupTransaction(@Nullable Object transactionData); /** * Retrieve the JDBC Connection that the given JPA EntityManager uses underneath, @@ -146,6 +150,7 @@ public interface JpaDialect extends PersistenceExceptionTranslator { * @see org.springframework.jdbc.datasource.SimpleConnectionHandle * @see JpaTransactionManager#setDataSource */ + @Nullable ConnectionHandle getJdbcConnection(EntityManager entityManager, boolean readOnly) throws PersistenceException, SQLException; diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/JpaTransactionManager.java b/spring-orm/src/main/java/org/springframework/orm/jpa/JpaTransactionManager.java index 37febe21dc6..ebd234f795b 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/JpaTransactionManager.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/JpaTransactionManager.java @@ -37,6 +37,7 @@ import org.springframework.jdbc.datasource.ConnectionHandle; import org.springframework.jdbc.datasource.ConnectionHolder; import org.springframework.jdbc.datasource.JdbcTransactionObjectSupport; import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; +import org.springframework.lang.Nullable; import org.springframework.transaction.CannotCreateTransactionException; import org.springframework.transaction.IllegalTransactionStateException; import org.springframework.transaction.NestedTransactionNotSupportedException; @@ -175,6 +176,7 @@ public class JpaTransactionManager extends AbstractPlatformTransactionManager /** * Return the name of the persistence unit to manage transactions for, if any. */ + @Nullable public String getPersistenceUnitName() { return this.persistenceUnitName; } @@ -186,7 +188,7 @@ public class JpaTransactionManager extends AbstractPlatformTransactionManager * or a "props" element in XML bean definitions. * @see javax.persistence.EntityManagerFactory#createEntityManager(java.util.Map) */ - public void setJpaProperties(Properties jpaProperties) { + public void setJpaProperties(@Nullable Properties jpaProperties) { CollectionUtils.mergePropertiesIntoMap(jpaProperties, this.jpaPropertyMap); } @@ -196,7 +198,7 @@ public class JpaTransactionManager extends AbstractPlatformTransactionManager *

    Can be populated with a "map" or "props" element in XML bean definitions. * @see javax.persistence.EntityManagerFactory#createEntityManager(java.util.Map) */ - public void setJpaPropertyMap(Map jpaProperties) { + public void setJpaPropertyMap(@Nullable Map jpaProperties) { if (jpaProperties != null) { this.jpaPropertyMap.putAll(jpaProperties); } diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/JpaVendorAdapter.java b/spring-orm/src/main/java/org/springframework/orm/jpa/JpaVendorAdapter.java index 84923cf260c..6809c907464 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/JpaVendorAdapter.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/JpaVendorAdapter.java @@ -17,10 +17,13 @@ package org.springframework.orm.jpa; import java.util.Map; + import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.spi.PersistenceProvider; +import org.springframework.lang.Nullable; + /** * SPI interface that allows to plug in vendor-specific behavior * into Spring's EntityManagerFactory creators. Serves as single @@ -44,6 +47,7 @@ public interface JpaVendorAdapter { * excluding provider classes from temporary class overriding. * @since 2.5.2 */ + @Nullable String getPersistenceProviderRootPackage(); /** @@ -58,12 +62,14 @@ public interface JpaVendorAdapter { * @see javax.persistence.Persistence#createEntityManagerFactory(String, java.util.Map) * @see javax.persistence.spi.PersistenceProvider#createContainerEntityManagerFactory(javax.persistence.spi.PersistenceUnitInfo, java.util.Map) */ + @Nullable Map getJpaPropertyMap(); /** * Return the vendor-specific JpaDialect implementation for this * provider, or {@code null} if there is none. */ + @Nullable JpaDialect getJpaDialect(); /** diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/SharedEntityManagerCreator.java b/spring-orm/src/main/java/org/springframework/orm/jpa/SharedEntityManagerCreator.java index 9582c8f7953..1f52818259d 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/SharedEntityManagerCreator.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/SharedEntityManagerCreator.java @@ -26,6 +26,7 @@ import java.lang.reflect.Proxy; import java.util.HashSet; import java.util.Map; import java.util.Set; + import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Query; @@ -34,6 +35,7 @@ import javax.persistence.TransactionRequiredException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; @@ -100,7 +102,7 @@ public abstract class SharedEntityManagerCreator { * {@code createEntityManager} call (may be {@code null}) * @return a shareable transaction EntityManager proxy */ - public static EntityManager createSharedEntityManager(EntityManagerFactory emf, Map properties) { + public static EntityManager createSharedEntityManager(EntityManagerFactory emf, @Nullable Map properties) { return createSharedEntityManager(emf, properties, true); } @@ -115,7 +117,7 @@ public abstract class SharedEntityManagerCreator { * @since 4.0 */ public static EntityManager createSharedEntityManager( - EntityManagerFactory emf, Map properties, boolean synchronizedWithTransaction) { + EntityManagerFactory emf, @Nullable Map properties, boolean synchronizedWithTransaction) { Class emIfc = (emf instanceof EntityManagerFactoryInfo ? ((EntityManagerFactoryInfo) emf).getEntityManagerInterface() : EntityManager.class); @@ -133,7 +135,7 @@ public abstract class SharedEntityManagerCreator { * @return a shareable transactional EntityManager proxy */ public static EntityManager createSharedEntityManager( - EntityManagerFactory emf, Map properties, Class... entityManagerInterfaces) { + EntityManagerFactory emf, @Nullable Map properties, Class... entityManagerInterfaces) { return createSharedEntityManager(emf, properties, true, entityManagerInterfaces); } @@ -150,7 +152,7 @@ public abstract class SharedEntityManagerCreator { * @return a shareable transactional EntityManager proxy * @since 4.0 */ - public static EntityManager createSharedEntityManager(EntityManagerFactory emf, Map properties, + public static EntityManager createSharedEntityManager(EntityManagerFactory emf, @Nullable Map properties, boolean synchronizedWithTransaction, Class... entityManagerInterfaces) { ClassLoader cl = null; @@ -202,6 +204,7 @@ public abstract class SharedEntityManagerCreator { } @Override + @Nullable public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // Invocation on EntityManager interface coming in... diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/package-info.java b/spring-orm/src/main/java/org/springframework/orm/jpa/package-info.java index f7f42087e9c..9d1058b4a55 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/package-info.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/package-info.java @@ -3,4 +3,7 @@ * Contains EntityManagerFactory helper classes, a template plus callback for JPA access, * and an implementation of Spring's transaction SPI for local JPA transactions. */ +@NonNullApi package org.springframework.orm.jpa; + +import org.springframework.lang.NonNullApi; diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/ClassFileTransformerAdapter.java b/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/ClassFileTransformerAdapter.java index 9db7454c434..370427379a0 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/ClassFileTransformerAdapter.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/ClassFileTransformerAdapter.java @@ -23,6 +23,7 @@ import javax.persistence.spi.ClassTransformer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -52,6 +53,7 @@ class ClassFileTransformerAdapter implements ClassFileTransformer { @Override + @Nullable public byte[] transform( ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) { diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/DefaultPersistenceUnitManager.java b/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/DefaultPersistenceUnitManager.java index bf9283eae2e..77a8435d292 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/DefaultPersistenceUnitManager.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/DefaultPersistenceUnitManager.java @@ -25,6 +25,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; + import javax.persistence.Converter; import javax.persistence.Embeddable; import javax.persistence.Entity; @@ -58,6 +59,7 @@ import org.springframework.instrument.classloading.LoadTimeWeaver; import org.springframework.jdbc.datasource.lookup.DataSourceLookup; import org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup; import org.springframework.jdbc.datasource.lookup.MapDataSourceLookup; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.ResourceUtils; @@ -610,6 +612,7 @@ public class DefaultPersistenceUnitManager * @return the persistence unit root URL to pass to the JPA PersistenceProvider * @see #setDefaultPersistenceUnitRootLocation */ + @Nullable private URL determineDefaultPersistenceUnitRootUrl() { if (this.defaultPersistenceUnitRootLocation == null) { return null; @@ -629,6 +632,7 @@ public class DefaultPersistenceUnitManager *

    Checks whether a "META-INF/orm.xml" file exists in the classpath and uses it * if it is not co-located with a "META-INF/persistence.xml" file. */ + @Nullable private Resource getOrmXmlForDefaultPersistenceUnit() { Resource ormXml = this.resourcePatternResolver.getResource( this.defaultPersistenceUnitRootLocation + DEFAULT_ORM_XML_RESOURCE); @@ -657,6 +661,7 @@ public class DefaultPersistenceUnitManager * @param persistenceUnitName the name of the desired persistence unit * @return the PersistenceUnitInfo in mutable form, or {@code null} if not available */ + @Nullable protected final MutablePersistenceUnitInfo getPersistenceUnitInfo(String persistenceUnitName) { PersistenceUnitInfo pui = this.persistenceUnitInfos.get(persistenceUnitName); return (MutablePersistenceUnitInfo) pui; diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/PersistenceUnitReader.java b/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/PersistenceUnitReader.java index 30b038fef6f..e947803d6b2 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/PersistenceUnitReader.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/PersistenceUnitReader.java @@ -38,6 +38,7 @@ import org.xml.sax.SAXException; import org.springframework.core.io.Resource; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.jdbc.datasource.lookup.DataSourceLookup; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ResourceUtils; import org.springframework.util.StringUtils; @@ -332,6 +333,7 @@ final class PersistenceUnitReader { * @return the corresponding persistence unit root URL * @throws IOException if the checking failed */ + @Nullable static URL determinePersistenceUnitRootUrl(Resource resource) throws IOException { URL originalURL = resource.getURL(); diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/package-info.java b/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/package-info.java index aab558ab605..3f6597093f2 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/package-info.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/package-info.java @@ -1,4 +1,7 @@ /** * Internal support for managing JPA persistence units. */ +@NonNullApi package org.springframework.orm.jpa.persistenceunit; + +import org.springframework.lang.NonNullApi; diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/support/OpenEntityManagerInViewFilter.java b/spring-orm/src/main/java/org/springframework/orm/jpa/support/OpenEntityManagerInViewFilter.java index c69d69b4af0..1ac2421fdcc 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/support/OpenEntityManagerInViewFilter.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/support/OpenEntityManagerInViewFilter.java @@ -26,6 +26,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.dao.DataAccessResourceFailureException; +import org.springframework.lang.Nullable; import org.springframework.orm.jpa.EntityManagerFactoryUtils; import org.springframework.orm.jpa.EntityManagerHolder; import org.springframework.transaction.support.TransactionSynchronizationManager; @@ -116,6 +117,7 @@ public class OpenEntityManagerInViewFilter extends OncePerRequestFilter { /** * Return the name of the persistence unit to access the EntityManagerFactory for, if any. */ + @Nullable protected String getPersistenceUnitName() { return this.persistenceUnitName; } diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java b/spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java index 93ff738fde2..05d9eb53b24 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java @@ -27,6 +27,7 @@ import java.util.LinkedList; import java.util.Map; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; + import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.PersistenceContext; @@ -56,6 +57,7 @@ import org.springframework.core.Ordered; import org.springframework.core.PriorityOrdered; import org.springframework.jndi.JndiLocatorDelegate; import org.springframework.jndi.JndiTemplate; +import org.springframework.lang.Nullable; import org.springframework.orm.jpa.EntityManagerFactoryInfo; import org.springframework.orm.jpa.EntityManagerFactoryUtils; import org.springframework.orm.jpa.EntityManagerProxy; @@ -302,7 +304,7 @@ public class PersistenceAnnotationBeanPostProcessor * such factories, either specify this default persistence unit name * or explicitly refer to named persistence units in your annotations. */ - public void setDefaultPersistenceUnitName(String unitName) { + public void setDefaultPersistenceUnitName(@Nullable String unitName) { this.defaultPersistenceUnitName = (unitName != null ? unitName : ""); } @@ -456,6 +458,7 @@ public class PersistenceAnnotationBeanPostProcessor * or {@code null} if none found * @see #setPersistenceUnits */ + @Nullable protected EntityManagerFactory getPersistenceUnit(String unitName) { if (this.persistenceUnits != null) { String unitNameForLookup = (unitName != null ? unitName : ""); @@ -487,6 +490,7 @@ public class PersistenceAnnotationBeanPostProcessor * @see #setPersistenceContexts * @see #setExtendedPersistenceContexts */ + @Nullable protected EntityManager getPersistenceContext(String unitName, boolean extended) { Map contexts = (extended ? this.extendedPersistenceContexts : this.persistenceContexts); if (contexts != null) { @@ -519,7 +523,7 @@ public class PersistenceAnnotationBeanPostProcessor * @return the EntityManagerFactory * @throws NoSuchBeanDefinitionException if there is no such EntityManagerFactory in the context */ - protected EntityManagerFactory findEntityManagerFactory(String unitName, String requestingBeanName) + protected EntityManagerFactory findEntityManagerFactory(@Nullable String unitName, String requestingBeanName) throws NoSuchBeanDefinitionException { if (this.beanFactory == null) { diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/support/package-info.java b/spring-orm/src/main/java/org/springframework/orm/jpa/support/package-info.java index 4b36a106bb1..81c5526ba35 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/support/package-info.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/support/package-info.java @@ -1,4 +1,7 @@ /** * Classes supporting the {@code org.springframework.orm.jpa} package. */ +@NonNullApi package org.springframework.orm.jpa.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/EclipseLinkJpaVendorAdapter.java b/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/EclipseLinkJpaVendorAdapter.java index d845df0ccc6..f8d437740e1 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/EclipseLinkJpaVendorAdapter.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/EclipseLinkJpaVendorAdapter.java @@ -19,6 +19,7 @@ package org.springframework.orm.jpa.vendor; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; + import javax.persistence.EntityManager; import javax.persistence.spi.PersistenceProvider; @@ -26,6 +27,8 @@ import org.eclipse.persistence.config.PersistenceUnitProperties; import org.eclipse.persistence.config.TargetDatabase; import org.eclipse.persistence.jpa.JpaEntityManager; +import org.springframework.lang.Nullable; + /** * {@link org.springframework.orm.jpa.JpaVendorAdapter} implementation for Eclipse * Persistence Services (EclipseLink). Developed and tested against EclipseLink 2.4. @@ -88,6 +91,7 @@ public class EclipseLinkJpaVendorAdapter extends AbstractJpaVendorAdapter { * @param database the specified database * @return the EclipseLink target database name, or {@code null} if none found */ + @Nullable protected String determineTargetDatabaseName(Database database) { switch (database) { case DB2: return TargetDatabase.DB2; diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/HibernateJpaDialect.java b/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/HibernateJpaDialect.java index 93458e7bdd3..5e2db941402 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/HibernateJpaDialect.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/HibernateJpaDialect.java @@ -58,6 +58,7 @@ import org.springframework.dao.InvalidDataAccessResourceUsageException; import org.springframework.dao.PessimisticLockingFailureException; import org.springframework.jdbc.datasource.ConnectionHandle; import org.springframework.jdbc.datasource.DataSourceUtils; +import org.springframework.lang.Nullable; import org.springframework.orm.ObjectOptimisticLockingFailureException; import org.springframework.orm.ObjectRetrievalFailureException; import org.springframework.orm.jpa.DefaultJpaDialect; @@ -177,6 +178,7 @@ public class HibernateJpaDialect extends DefaultJpaDialect { } @SuppressWarnings("deprecation") + @Nullable protected FlushMode prepareFlushMode(Session session, boolean readOnly) throws PersistenceException { FlushMode flushMode = (FlushMode) ReflectionUtils.invokeMethod(getFlushMode, session); if (readOnly) { diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/HibernateJpaVendorAdapter.java b/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/HibernateJpaVendorAdapter.java index 302dfd4a531..5a919c70fb9 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/HibernateJpaVendorAdapter.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/HibernateJpaVendorAdapter.java @@ -18,6 +18,7 @@ package org.springframework.orm.jpa.vendor; import java.util.HashMap; import java.util.Map; + import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.spi.PersistenceProvider; @@ -34,6 +35,8 @@ import org.hibernate.dialect.PostgreSQL95Dialect; import org.hibernate.dialect.SQLServer2012Dialect; import org.hibernate.dialect.SybaseDialect; +import org.springframework.lang.Nullable; + /** * {@link org.springframework.orm.jpa.JpaVendorAdapter} implementation for Hibernate * EntityManager. Developed and tested against Hibernate 5.0, 5.1 and 5.2; @@ -155,6 +158,7 @@ public class HibernateJpaVendorAdapter extends AbstractJpaVendorAdapter { * @param database the target database * @return the Hibernate database dialect class, or {@code null} if none found */ + @Nullable protected Class determineDatabaseDialectClass(Database database) { switch (database) { case DB2: return DB2Dialect.class; diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/package-info.java b/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/package-info.java index 2ae28634172..9a73ca97383 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/package-info.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/vendor/package-info.java @@ -1,4 +1,7 @@ /** * Support classes for adapting to specific JPA vendors. */ +@NonNullApi package org.springframework.orm.jpa.vendor; + +import org.springframework.lang.NonNullApi; diff --git a/spring-orm/src/main/java/org/springframework/orm/package-info.java b/spring-orm/src/main/java/org/springframework/orm/package-info.java index 7583db4a5a9..54db68c8951 100644 --- a/spring-orm/src/main/java/org/springframework/orm/package-info.java +++ b/spring-orm/src/main/java/org/springframework/orm/package-info.java @@ -2,4 +2,7 @@ * Root package for Spring's O/R Mapping integration classes. * Contains generic DataAccessExceptions related to O/R Mapping. */ +@NonNullApi package org.springframework.orm; + +import org.springframework.lang.NonNullApi; diff --git a/spring-oxm/src/main/java/org/springframework/oxm/castor/package-info.java b/spring-oxm/src/main/java/org/springframework/oxm/castor/package-info.java index 3c019402923..e923e079bb9 100644 --- a/spring-oxm/src/main/java/org/springframework/oxm/castor/package-info.java +++ b/spring-oxm/src/main/java/org/springframework/oxm/castor/package-info.java @@ -2,4 +2,7 @@ * Package providing integration of Castor * within Spring's O/X Mapping support. */ +@NonNullApi package org.springframework.oxm.castor; + +import org.springframework.lang.NonNullApi; diff --git a/spring-oxm/src/main/java/org/springframework/oxm/config/package-info.java b/spring-oxm/src/main/java/org/springframework/oxm/config/package-info.java index ed05ef9c6f9..b91bda602bf 100644 --- a/spring-oxm/src/main/java/org/springframework/oxm/config/package-info.java +++ b/spring-oxm/src/main/java/org/springframework/oxm/config/package-info.java @@ -1,4 +1,7 @@ /** * Provides an namespace handler for the Spring Object/XML namespace. */ +@NonNullApi package org.springframework.oxm.config; + +import org.springframework.lang.NonNullApi; diff --git a/spring-oxm/src/main/java/org/springframework/oxm/jaxb/package-info.java b/spring-oxm/src/main/java/org/springframework/oxm/jaxb/package-info.java index 8d0d6c2457a..67aa0c81744 100644 --- a/spring-oxm/src/main/java/org/springframework/oxm/jaxb/package-info.java +++ b/spring-oxm/src/main/java/org/springframework/oxm/jaxb/package-info.java @@ -2,4 +2,7 @@ * Package providing integration of JAXB * with Spring's O/X Mapping support. */ +@NonNullApi package org.springframework.oxm.jaxb; + +import org.springframework.lang.NonNullApi; diff --git a/spring-oxm/src/main/java/org/springframework/oxm/jibx/package-info.java b/spring-oxm/src/main/java/org/springframework/oxm/jibx/package-info.java index 5d669ca5eef..2e4f6205708 100644 --- a/spring-oxm/src/main/java/org/springframework/oxm/jibx/package-info.java +++ b/spring-oxm/src/main/java/org/springframework/oxm/jibx/package-info.java @@ -2,4 +2,7 @@ * Package providing integration of JiBX * with Spring's O/X Mapping support. */ +@NonNullApi package org.springframework.oxm.jibx; + +import org.springframework.lang.NonNullApi; diff --git a/spring-oxm/src/main/java/org/springframework/oxm/mime/MimeContainer.java b/spring-oxm/src/main/java/org/springframework/oxm/mime/MimeContainer.java index f7535781b3a..003f4362742 100644 --- a/spring-oxm/src/main/java/org/springframework/oxm/mime/MimeContainer.java +++ b/spring-oxm/src/main/java/org/springframework/oxm/mime/MimeContainer.java @@ -18,6 +18,8 @@ package org.springframework.oxm.mime; import javax.activation.DataHandler; +import org.springframework.lang.Nullable; + /** * Represents a container for MIME attachments * Concrete implementations might adapt a SOAPMessage or an email message. @@ -56,6 +58,7 @@ public interface MimeContainer { * @param contentId the content id * @return the attachment, as a data handler */ + @Nullable DataHandler getAttachment(String contentId); } diff --git a/spring-oxm/src/main/java/org/springframework/oxm/mime/package-info.java b/spring-oxm/src/main/java/org/springframework/oxm/mime/package-info.java index 8a431da7bd1..edffe672863 100644 --- a/spring-oxm/src/main/java/org/springframework/oxm/mime/package-info.java +++ b/spring-oxm/src/main/java/org/springframework/oxm/mime/package-info.java @@ -1,4 +1,7 @@ /** * Contains (un)marshallers optimized to store binary data in MIME attachments. */ +@NonNullApi package org.springframework.oxm.mime; + +import org.springframework.lang.NonNullApi; diff --git a/spring-oxm/src/main/java/org/springframework/oxm/package-info.java b/spring-oxm/src/main/java/org/springframework/oxm/package-info.java index 4f26b7be8b0..d85077c13fb 100644 --- a/spring-oxm/src/main/java/org/springframework/oxm/package-info.java +++ b/spring-oxm/src/main/java/org/springframework/oxm/package-info.java @@ -3,4 +3,7 @@ * Contains generic Marshaller and Unmarshaller interfaces, * and XmlMappingExceptions related to O/X Mapping */ +@NonNullApi package org.springframework.oxm; + +import org.springframework.lang.NonNullApi; diff --git a/spring-oxm/src/main/java/org/springframework/oxm/support/AbstractMarshaller.java b/spring-oxm/src/main/java/org/springframework/oxm/support/AbstractMarshaller.java index 6a396708c81..918a58d7724 100644 --- a/spring-oxm/src/main/java/org/springframework/oxm/support/AbstractMarshaller.java +++ b/spring-oxm/src/main/java/org/springframework/oxm/support/AbstractMarshaller.java @@ -22,6 +22,7 @@ import java.io.OutputStream; import java.io.Reader; import java.io.StringReader; import java.io.Writer; + import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -50,6 +51,7 @@ import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.ext.LexicalHandler; +import org.springframework.lang.Nullable; import org.springframework.oxm.Marshaller; import org.springframework.oxm.Unmarshaller; import org.springframework.oxm.UnmarshallingFailureException; @@ -199,6 +201,7 @@ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { * a byte stream, or {@code null} if none. *

    The default implementation returns {@code null}. */ + @Nullable protected String getDefaultEncoding() { return null; } @@ -519,7 +522,7 @@ public abstract class AbstractMarshaller implements Marshaller, Unmarshaller { * @throws XmlMappingException if the given object cannot be marshalled to the handlers */ protected abstract void marshalSaxHandlers( - Object graph, ContentHandler contentHandler, LexicalHandler lexicalHandler) + Object graph, ContentHandler contentHandler, @Nullable LexicalHandler lexicalHandler) throws XmlMappingException; /** diff --git a/spring-oxm/src/main/java/org/springframework/oxm/support/SaxResourceUtils.java b/spring-oxm/src/main/java/org/springframework/oxm/support/SaxResourceUtils.java index 881a3ca20ba..bced1a45ccc 100644 --- a/spring-oxm/src/main/java/org/springframework/oxm/support/SaxResourceUtils.java +++ b/spring-oxm/src/main/java/org/springframework/oxm/support/SaxResourceUtils.java @@ -21,6 +21,7 @@ import java.io.IOException; import org.xml.sax.InputSource; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; /** * Convenient utility methods for dealing with SAX. @@ -50,6 +51,7 @@ public abstract class SaxResourceUtils { * Retrieve the URL from the given resource as System ID. *

    Returns {@code null} if it cannot be opened. */ + @Nullable private static String getSystemId(Resource resource) { try { return resource.getURI().toString(); diff --git a/spring-oxm/src/main/java/org/springframework/oxm/support/package-info.java b/spring-oxm/src/main/java/org/springframework/oxm/support/package-info.java index 248820f37e3..d9f01a48c5b 100644 --- a/spring-oxm/src/main/java/org/springframework/oxm/support/package-info.java +++ b/spring-oxm/src/main/java/org/springframework/oxm/support/package-info.java @@ -4,4 +4,7 @@ * with TrAX, MarshallingView for use withing Spring Web MVC, and the * MarshallingMessageConverter for use within Spring's JMS support. */ +@NonNullApi package org.springframework.oxm.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-oxm/src/main/java/org/springframework/oxm/xstream/package-info.java b/spring-oxm/src/main/java/org/springframework/oxm/xstream/package-info.java index 5a4ab71cf5f..490e696cfef 100644 --- a/spring-oxm/src/main/java/org/springframework/oxm/xstream/package-info.java +++ b/spring-oxm/src/main/java/org/springframework/oxm/xstream/package-info.java @@ -2,4 +2,7 @@ * Package providing integration of XStream * with Spring's O/X Mapping support. */ +@NonNullApi package org.springframework.oxm.xstream; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/mock/env/package-info.java b/spring-test/src/main/java/org/springframework/mock/env/package-info.java index 1772b5c90e8..b91f00c11b1 100644 --- a/spring-test/src/main/java/org/springframework/mock/env/package-info.java +++ b/spring-test/src/main/java/org/springframework/mock/env/package-info.java @@ -7,4 +7,7 @@ *

    These mocks are useful for developing out-of-container * unit tests for code that depends on environment-specific properties. */ +@NonNullApi package org.springframework.mock.env; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/mock/http/client/package-info.java b/spring-test/src/main/java/org/springframework/mock/http/client/package-info.java index 1d2a2c0c838..f0b355ea37c 100644 --- a/spring-test/src/main/java/org/springframework/mock/http/client/package-info.java +++ b/spring-test/src/main/java/org/springframework/mock/http/client/package-info.java @@ -3,4 +3,7 @@ * This package contains {@code MockClientHttpRequest} and * {@code MockClientHttpResponse}. */ +@NonNullApi package org.springframework.mock.http.client; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/mock/http/client/reactive/package-info.java b/spring-test/src/main/java/org/springframework/mock/http/client/reactive/package-info.java index 09ce8aec5ce..04b01c2be03 100644 --- a/spring-test/src/main/java/org/springframework/mock/http/client/reactive/package-info.java +++ b/spring-test/src/main/java/org/springframework/mock/http/client/reactive/package-info.java @@ -1,4 +1,7 @@ /** * Mock implementations of reactive HTTP client contracts. */ +@NonNullApi package org.springframework.mock.http.client.reactive; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/mock/http/package-info.java b/spring-test/src/main/java/org/springframework/mock/http/package-info.java index aa81f7f8dcd..62341effdb9 100644 --- a/spring-test/src/main/java/org/springframework/mock/http/package-info.java +++ b/spring-test/src/main/java/org/springframework/mock/http/package-info.java @@ -3,4 +3,7 @@ * This package contains {@code MockHttpInputMessage} and * {@code MockHttpOutputMessage}. */ +@NonNullApi package org.springframework.mock.http; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/mock/http/server/reactive/package-info.java b/spring-test/src/main/java/org/springframework/mock/http/server/reactive/package-info.java index 5336e97cedd..3b93b279e4f 100644 --- a/spring-test/src/main/java/org/springframework/mock/http/server/reactive/package-info.java +++ b/spring-test/src/main/java/org/springframework/mock/http/server/reactive/package-info.java @@ -1,4 +1,7 @@ /** * Mock implementations of reactive HTTP server contracts. */ +@NonNullApi package org.springframework.mock.http.server.reactive; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/mock/jndi/SimpleNamingContextBuilder.java b/spring-test/src/main/java/org/springframework/mock/jndi/SimpleNamingContextBuilder.java index 9c96648cd37..58027c99e07 100644 --- a/spring-test/src/main/java/org/springframework/mock/jndi/SimpleNamingContextBuilder.java +++ b/spring-test/src/main/java/org/springframework/mock/jndi/SimpleNamingContextBuilder.java @@ -17,6 +17,7 @@ package org.springframework.mock.jndi; import java.util.Hashtable; + import javax.naming.Context; import javax.naming.NamingException; import javax.naming.spi.InitialContextFactory; @@ -26,6 +27,7 @@ import javax.naming.spi.NamingManager; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; @@ -95,6 +97,7 @@ public class SimpleNamingContextBuilder implements InitialContextFactoryBuilder * @return the current SimpleNamingContextBuilder instance, * or {@code null} if none */ + @Nullable public static SimpleNamingContextBuilder getCurrentContextBuilder() { return activated; } diff --git a/spring-test/src/main/java/org/springframework/mock/jndi/package-info.java b/spring-test/src/main/java/org/springframework/mock/jndi/package-info.java index 13871e6e04f..5aab8baf961 100644 --- a/spring-test/src/main/java/org/springframework/mock/jndi/package-info.java +++ b/spring-test/src/main/java/org/springframework/mock/jndi/package-info.java @@ -6,4 +6,7 @@ * same JNDI names as within a Java EE container, both application code and * configuration can be reused without changes. */ +@NonNullApi package org.springframework.mock.jndi; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/mock/web/HeaderValueHolder.java b/spring-test/src/main/java/org/springframework/mock/web/HeaderValueHolder.java index 9ef95c60b04..8cbd8a3cc53 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/HeaderValueHolder.java +++ b/spring-test/src/main/java/org/springframework/mock/web/HeaderValueHolder.java @@ -23,6 +23,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -88,6 +89,7 @@ class HeaderValueHolder { * @return the corresponding HeaderValueHolder, * or {@code null} if none found */ + @Nullable public static HeaderValueHolder getByName(Map headers, String name) { Assert.notNull(name, "Header name must not be null"); for (String headerName : headers.keySet()) { diff --git a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java index 5997ddd730a..3dcca7305f3 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java +++ b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java @@ -41,6 +41,7 @@ import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TimeZone; + import javax.servlet.AsyncContext; import javax.servlet.DispatcherType; import javax.servlet.RequestDispatcher; @@ -58,6 +59,7 @@ import javax.servlet.http.Part; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.LinkedCaseInsensitiveMap; import org.springframework.util.LinkedMultiValueMap; @@ -272,7 +274,7 @@ public class MockHttpServletRequest implements HttpServletRequest { * @see #setRequestURI * @see #MockHttpServletRequest(ServletContext, String, String) */ - public MockHttpServletRequest(String method, String requestURI) { + public MockHttpServletRequest(@Nullable String method, @Nullable String requestURI) { this(null, method, requestURI); } @@ -282,7 +284,7 @@ public class MockHttpServletRequest implements HttpServletRequest { * (may be {@code null} to use a default {@link MockServletContext}) * @see #MockHttpServletRequest(ServletContext, String, String) */ - public MockHttpServletRequest(ServletContext servletContext) { + public MockHttpServletRequest(@Nullable ServletContext servletContext) { this(servletContext, "", ""); } @@ -299,7 +301,7 @@ public class MockHttpServletRequest implements HttpServletRequest { * @see #setPreferredLocales * @see MockServletContext */ - public MockHttpServletRequest(ServletContext servletContext, String method, String requestURI) { + public MockHttpServletRequest(@Nullable ServletContext servletContext, @Nullable String method, @Nullable String requestURI) { this.servletContext = (servletContext != null ? servletContext : new MockServletContext()); this.method = method; this.requestURI = requestURI; @@ -409,6 +411,7 @@ public class MockHttpServletRequest implements HttpServletRequest { * @see #setContent(byte[]) * @see #getContentAsString() */ + @Nullable public byte[] getContentAsByteArray() { return this.content; } @@ -424,6 +427,7 @@ public class MockHttpServletRequest implements HttpServletRequest { * @see #setCharacterEncoding(String) * @see #getContentAsByteArray() */ + @Nullable public String getContentAsString() throws IllegalStateException, UnsupportedEncodingException { Assert.state(this.characterEncoding != null, "Cannot get content as a String for a null character encoding. " + diff --git a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java index 28a5da0d121..2a85175e598 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java +++ b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java @@ -33,12 +33,14 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TimeZone; + import javax.servlet.ServletOutputStream; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.LinkedCaseInsensitiveMap; import org.springframework.util.StringUtils; @@ -390,6 +392,7 @@ public class MockHttpServletResponse implements HttpServletResponse { * @return the associated header value, or {@code null} if none */ @Override + @Nullable public String getHeader(String name) { HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); return (header != null ? header.getStringValue() : null); @@ -420,6 +423,7 @@ public class MockHttpServletResponse implements HttpServletResponse { * @param name the name of the header * @return the associated header value, or {@code null} if none */ + @Nullable public Object getHeaderValue(String name) { HeaderValueHolder header = HeaderValueHolder.getByName(this.headers, name); return (header != null ? header.getValue() : null); diff --git a/spring-test/src/main/java/org/springframework/mock/web/MockMultipartHttpServletRequest.java b/spring-test/src/main/java/org/springframework/mock/web/MockMultipartHttpServletRequest.java index bb47c6112d3..49f9c1246c9 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/MockMultipartHttpServletRequest.java +++ b/spring-test/src/main/java/org/springframework/mock/web/MockMultipartHttpServletRequest.java @@ -21,10 +21,12 @@ import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.Map; + import javax.servlet.ServletContext; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @@ -65,7 +67,7 @@ public class MockMultipartHttpServletRequest extends MockHttpServletRequest impl * @param servletContext the ServletContext that the request runs in * (may be {@code null} to use a default {@link MockServletContext}) */ - public MockMultipartHttpServletRequest(ServletContext servletContext) { + public MockMultipartHttpServletRequest(@Nullable ServletContext servletContext) { super(servletContext); setMethod("POST"); setContentType("multipart/form-data"); diff --git a/spring-test/src/main/java/org/springframework/mock/web/MockServletContext.java b/spring-test/src/main/java/org/springframework/mock/web/MockServletContext.java index ecab0ecf3ce..1857c5144a9 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/MockServletContext.java +++ b/spring-test/src/main/java/org/springframework/mock/web/MockServletContext.java @@ -29,6 +29,7 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; + import javax.servlet.Filter; import javax.servlet.FilterRegistration; import javax.servlet.RequestDispatcher; @@ -48,6 +49,7 @@ import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.http.MediaType; import org.springframework.http.MediaTypeFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.MimeType; @@ -165,7 +167,7 @@ public class MockServletContext implements ServletContext { * and no base path. * @param resourceLoader the ResourceLoader to use (or null for the default) */ - public MockServletContext(ResourceLoader resourceLoader) { + public MockServletContext(@Nullable ResourceLoader resourceLoader) { this("", resourceLoader); } @@ -178,7 +180,7 @@ public class MockServletContext implements ServletContext { * @param resourceLoader the ResourceLoader to use (or null for the default) * @see #registerNamedDispatcher */ - public MockServletContext(String resourceBasePath, ResourceLoader resourceLoader) { + public MockServletContext(String resourceBasePath, @Nullable ResourceLoader resourceLoader) { this.resourceLoader = (resourceLoader != null ? resourceLoader : new DefaultResourceLoader()); this.resourceBasePath = (resourceBasePath != null ? resourceBasePath : ""); @@ -630,6 +632,7 @@ public class MockServletContext implements ServletContext { * @see javax.servlet.ServletContext#getServletRegistration(java.lang.String) */ @Override + @Nullable public ServletRegistration getServletRegistration(String servletName) { return null; } @@ -668,6 +671,7 @@ public class MockServletContext implements ServletContext { * @see javax.servlet.ServletContext#getFilterRegistration(java.lang.String) */ @Override + @Nullable public FilterRegistration getFilterRegistration(String filterName) { return null; } diff --git a/spring-test/src/main/java/org/springframework/mock/web/package-info.java b/spring-test/src/main/java/org/springframework/mock/web/package-info.java index 720f52f5afb..74414ef0589 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/package-info.java +++ b/spring-test/src/main/java/org/springframework/mock/web/package-info.java @@ -9,4 +9,7 @@ * existing Servlet API mock objects * (MockObjects). */ +@NonNullApi package org.springframework.mock.web; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/annotation/ProfileValueSource.java b/spring-test/src/main/java/org/springframework/test/annotation/ProfileValueSource.java index 05ee407f5f1..e7427077b9e 100644 --- a/spring-test/src/main/java/org/springframework/test/annotation/ProfileValueSource.java +++ b/spring-test/src/main/java/org/springframework/test/annotation/ProfileValueSource.java @@ -16,6 +16,8 @@ package org.springframework.test.annotation; +import org.springframework.lang.Nullable; + /** *

    * Strategy interface for retrieving profile values for a given @@ -47,6 +49,7 @@ public interface ProfileValueSource { * @return the String value of the profile value, or {@code null} * if there is no profile value with that key */ + @Nullable String get(String key); } diff --git a/spring-test/src/main/java/org/springframework/test/annotation/ProfileValueUtils.java b/spring-test/src/main/java/org/springframework/test/annotation/ProfileValueUtils.java index 21cfcb14c85..c7dd1a2c1e3 100644 --- a/spring-test/src/main/java/org/springframework/test/annotation/ProfileValueUtils.java +++ b/spring-test/src/main/java/org/springframework/test/annotation/ProfileValueUtils.java @@ -23,6 +23,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.util.ReflectionUtils; @@ -176,7 +177,7 @@ public abstract class ProfileValueUtils { * {@code null} */ private static boolean isTestEnabledInThisEnvironment(ProfileValueSource profileValueSource, - IfProfileValue ifProfileValue) { + @Nullable IfProfileValue ifProfileValue) { if (ifProfileValue == null) { return true; diff --git a/spring-test/src/main/java/org/springframework/test/annotation/package-info.java b/spring-test/src/main/java/org/springframework/test/annotation/package-info.java index 1f1f199a660..b2ab125dc2c 100644 --- a/spring-test/src/main/java/org/springframework/test/annotation/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/annotation/package-info.java @@ -1,4 +1,7 @@ /** * Support classes for annotation-driven tests. */ +@NonNullApi package org.springframework.test.annotation; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/context/BootstrapUtils.java b/spring-test/src/main/java/org/springframework/test/context/BootstrapUtils.java index 5b81650b7dc..4fb45ea5393 100644 --- a/spring-test/src/main/java/org/springframework/test/context/BootstrapUtils.java +++ b/spring-test/src/main/java/org/springframework/test/context/BootstrapUtils.java @@ -25,6 +25,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeanUtils; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.AnnotationAttributes; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -147,6 +148,7 @@ abstract class BootstrapUtils { } } + @Nullable private static Class resolveExplicitTestContextBootstrapper(Class testClass) { Set annotations = AnnotatedElementUtils.findAllMergedAnnotations(testClass, BootstrapWith.class); if (annotations.size() < 1) { diff --git a/spring-test/src/main/java/org/springframework/test/context/CacheAwareContextLoaderDelegate.java b/spring-test/src/main/java/org/springframework/test/context/CacheAwareContextLoaderDelegate.java index 2771e514930..af10f3890a9 100644 --- a/spring-test/src/main/java/org/springframework/test/context/CacheAwareContextLoaderDelegate.java +++ b/spring-test/src/main/java/org/springframework/test/context/CacheAwareContextLoaderDelegate.java @@ -18,6 +18,7 @@ package org.springframework.test.context; import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.lang.Nullable; import org.springframework.test.annotation.DirtiesContext.HierarchyMode; /** @@ -69,6 +70,6 @@ public interface CacheAwareContextLoaderDelegate { * is not part of a hierarchy * @since 4.1 */ - void closeContext(MergedContextConfiguration mergedContextConfiguration, HierarchyMode hierarchyMode); + void closeContext(MergedContextConfiguration mergedContextConfiguration, @Nullable HierarchyMode hierarchyMode); } diff --git a/spring-test/src/main/java/org/springframework/test/context/ContextConfigurationAttributes.java b/spring-test/src/main/java/org/springframework/test/context/ContextConfigurationAttributes.java index f32731dfa5b..58f0713e667 100644 --- a/spring-test/src/main/java/org/springframework/test/context/ContextConfigurationAttributes.java +++ b/spring-test/src/main/java/org/springframework/test/context/ContextConfigurationAttributes.java @@ -25,6 +25,7 @@ import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.style.ToStringCreator; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -202,6 +203,7 @@ public class ContextConfigurationAttributes { * @see ContextConfiguration#classes * @see #setClasses(Class[]) */ + @Nullable public Class[] getClasses() { return this.classes; } @@ -237,6 +239,7 @@ public class ContextConfigurationAttributes { * @see ContextConfiguration#locations * @see #setLocations(String[]) */ + @Nullable public String[] getLocations() { return this.locations; } @@ -301,6 +304,7 @@ public class ContextConfigurationAttributes { * @see ContextConfiguration#name() * @since 3.2.2 */ + @Nullable public String getName() { return this.name; } diff --git a/spring-test/src/main/java/org/springframework/test/context/ContextCustomizerFactory.java b/spring-test/src/main/java/org/springframework/test/context/ContextCustomizerFactory.java index 3f8113a6f1c..8e0939f34af 100644 --- a/spring-test/src/main/java/org/springframework/test/context/ContextCustomizerFactory.java +++ b/spring-test/src/main/java/org/springframework/test/context/ContextCustomizerFactory.java @@ -18,6 +18,8 @@ package org.springframework.test.context; import java.util.List; +import org.springframework.lang.Nullable; + /** * Factory for creating {@link ContextCustomizer ContextCustomizers}. * @@ -48,6 +50,7 @@ public interface ContextCustomizerFactory { * @return a {@link ContextCustomizer} or {@code null} if no customizer should * be used */ + @Nullable ContextCustomizer createContextCustomizer(Class testClass, List configAttributes); } diff --git a/spring-test/src/main/java/org/springframework/test/context/ContextLoader.java b/spring-test/src/main/java/org/springframework/test/context/ContextLoader.java index 3a2b0c300e7..49b97a94aa5 100644 --- a/spring-test/src/main/java/org/springframework/test/context/ContextLoader.java +++ b/spring-test/src/main/java/org/springframework/test/context/ContextLoader.java @@ -17,6 +17,7 @@ package org.springframework.test.context; import org.springframework.context.ApplicationContext; +import org.springframework.lang.Nullable; /** * Strategy interface for loading an {@link ApplicationContext application context} @@ -59,7 +60,7 @@ public interface ContextLoader { * application context (can be {@code null} or empty) * @return an array of application context resource locations */ - String[] processLocations(Class clazz, String... locations); + String[] processLocations(Class clazz, @Nullable String... locations); /** * Loads a new {@link ApplicationContext context} based on the supplied diff --git a/spring-test/src/main/java/org/springframework/test/context/MergedContextConfiguration.java b/spring-test/src/main/java/org/springframework/test/context/MergedContextConfiguration.java index c49bbd4579a..22aabbcf907 100644 --- a/spring-test/src/main/java/org/springframework/test/context/MergedContextConfiguration.java +++ b/spring-test/src/main/java/org/springframework/test/context/MergedContextConfiguration.java @@ -26,6 +26,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.style.ToStringCreator; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -134,9 +135,10 @@ public class MergedContextConfiguration implements Serializable { /** * Generate a null-safe {@link String} representation of the supplied * {@link ContextLoader} based solely on the fully qualified name of the - * loader or "null" if the supplied loaded is {@code null}. + * loader or "null" if the supplied loader is {@code null}. */ - protected static String nullSafeToString(ContextLoader contextLoader) { + @Nullable + protected static String nullSafeToString(@Nullable ContextLoader contextLoader) { return (contextLoader != null ? contextLoader.getClass().getName() : "null"); } @@ -197,7 +199,7 @@ public class MergedContextConfiguration implements Serializable { public MergedContextConfiguration(Class testClass, String[] locations, Class[] classes, Set>> contextInitializerClasses, String[] activeProfiles, ContextLoader contextLoader, - CacheAwareContextLoaderDelegate cacheAwareContextLoaderDelegate, MergedContextConfiguration parent) { + CacheAwareContextLoaderDelegate cacheAwareContextLoaderDelegate, @Nullable MergedContextConfiguration parent) { this(testClass, locations, classes, contextInitializerClasses, activeProfiles, null, null, contextLoader, cacheAwareContextLoaderDelegate, parent); @@ -238,11 +240,11 @@ public class MergedContextConfiguration implements Serializable { * @param parent the parent configuration or {@code null} if there is no parent * @since 4.1 */ - public MergedContextConfiguration(Class testClass, String[] locations, Class[] classes, - Set>> contextInitializerClasses, - String[] activeProfiles, String[] propertySourceLocations, String[] propertySourceProperties, + public MergedContextConfiguration(Class testClass, @Nullable String[] locations, @Nullable Class[] classes, + @Nullable Set>> contextInitializerClasses, + @Nullable String[] activeProfiles, @Nullable String[] propertySourceLocations, @Nullable String[] propertySourceProperties, ContextLoader contextLoader, CacheAwareContextLoaderDelegate cacheAwareContextLoaderDelegate, - MergedContextConfiguration parent) { + @Nullable MergedContextConfiguration parent) { this(testClass, locations, classes, contextInitializerClasses, activeProfiles, propertySourceLocations, propertySourceProperties, EMPTY_CONTEXT_CUSTOMIZERS, contextLoader, @@ -273,11 +275,11 @@ public class MergedContextConfiguration implements Serializable { * @param parent the parent configuration or {@code null} if there is no parent * @since 4.3 */ - public MergedContextConfiguration(Class testClass, String[] locations, Class[] classes, - Set>> contextInitializerClasses, - String[] activeProfiles, String[] propertySourceLocations, String[] propertySourceProperties, - Set contextCustomizers, ContextLoader contextLoader, - CacheAwareContextLoaderDelegate cacheAwareContextLoaderDelegate, MergedContextConfiguration parent) { + public MergedContextConfiguration(Class testClass, @Nullable String[] locations, @Nullable Class[] classes, + @Nullable Set>> contextInitializerClasses, + @Nullable String[] activeProfiles, @Nullable String[] propertySourceLocations, @Nullable String[] propertySourceProperties, + @Nullable Set contextCustomizers, ContextLoader contextLoader, + CacheAwareContextLoaderDelegate cacheAwareContextLoaderDelegate, @Nullable MergedContextConfiguration parent) { this.testClass = testClass; this.locations = processStrings(locations); @@ -416,6 +418,7 @@ public class MergedContextConfiguration implements Serializable { * @see #getParentApplicationContext() * @since 3.2.2 */ + @Nullable public MergedContextConfiguration getParent() { return this.parent; } @@ -429,6 +432,7 @@ public class MergedContextConfiguration implements Serializable { * @see #getParent() * @since 3.2.2 */ + @Nullable public ApplicationContext getParentApplicationContext() { if (this.parent == null) { return null; diff --git a/spring-test/src/main/java/org/springframework/test/context/TestContext.java b/spring-test/src/main/java/org/springframework/test/context/TestContext.java index 01d9c856585..fa4ae784135 100644 --- a/spring-test/src/main/java/org/springframework/test/context/TestContext.java +++ b/spring-test/src/main/java/org/springframework/test/context/TestContext.java @@ -21,6 +21,7 @@ import java.lang.reflect.Method; import org.springframework.context.ApplicationContext; import org.springframework.core.AttributeAccessor; +import org.springframework.lang.Nullable; import org.springframework.test.annotation.DirtiesContext.HierarchyMode; /** @@ -64,6 +65,7 @@ public interface TestContext extends AttributeAccessor, Serializable { * @return the current test instance (may be {@code null}) * @see #updateState(Object, Method, Throwable) */ + @Nullable Object getTestInstance(); /** @@ -72,6 +74,7 @@ public interface TestContext extends AttributeAccessor, Serializable { * @return the current test method (may be {@code null}) * @see #updateState(Object, Method, Throwable) */ + @Nullable Method getTestMethod(); /** @@ -82,6 +85,7 @@ public interface TestContext extends AttributeAccessor, Serializable { * exception was thrown * @see #updateState(Object, Method, Throwable) */ + @Nullable Throwable getTestException(); /** @@ -94,7 +98,7 @@ public interface TestContext extends AttributeAccessor, Serializable { * @param hierarchyMode the context cache clearing mode to be applied if the * context is part of a hierarchy (may be {@code null}) */ - void markApplicationContextDirty(HierarchyMode hierarchyMode); + void markApplicationContextDirty(@Nullable HierarchyMode hierarchyMode); /** * Update this test context to reflect the state of the currently executing @@ -106,6 +110,6 @@ public interface TestContext extends AttributeAccessor, Serializable { * @param testException the exception that was thrown in the test method, or * {@code null} if no exception was thrown */ - void updateState(Object testInstance, Method testMethod, Throwable testException); + void updateState(@Nullable Object testInstance, @Nullable Method testMethod, @Nullable Throwable testException); } diff --git a/spring-test/src/main/java/org/springframework/test/context/TestContextManager.java b/spring-test/src/main/java/org/springframework/test/context/TestContextManager.java index 1d625d4a935..aa73e664dd5 100644 --- a/spring-test/src/main/java/org/springframework/test/context/TestContextManager.java +++ b/spring-test/src/main/java/org/springframework/test/context/TestContextManager.java @@ -25,6 +25,7 @@ import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; @@ -364,7 +365,7 @@ public class TestContextManager { * @see #getTestExecutionListeners() * @see Throwable#addSuppressed(Throwable) */ - public void afterTestExecution(Object testInstance, Method testMethod, Throwable exception) throws Exception { + public void afterTestExecution(Object testInstance, Method testMethod, @Nullable Throwable exception) throws Exception { String callbackName = "afterTestExecution"; prepareForAfterCallback(callbackName, testInstance, testMethod, exception); @@ -424,7 +425,7 @@ public class TestContextManager { * @see #getTestExecutionListeners() * @see Throwable#addSuppressed(Throwable) */ - public void afterTestMethod(Object testInstance, Method testMethod, Throwable exception) throws Exception { + public void afterTestMethod(Object testInstance, Method testMethod, @Nullable Throwable exception) throws Exception { String callbackName = "afterTestMethod"; prepareForAfterCallback(callbackName, testInstance, testMethod, exception); diff --git a/spring-test/src/main/java/org/springframework/test/context/cache/ContextCache.java b/spring-test/src/main/java/org/springframework/test/context/cache/ContextCache.java index 1f15c763011..ea7f5605f8c 100644 --- a/spring-test/src/main/java/org/springframework/test/context/cache/ContextCache.java +++ b/spring-test/src/main/java/org/springframework/test/context/cache/ContextCache.java @@ -17,6 +17,7 @@ package org.springframework.test.context.cache; import org.springframework.context.ApplicationContext; +import org.springframework.lang.Nullable; import org.springframework.test.annotation.DirtiesContext.HierarchyMode; import org.springframework.test.context.MergedContextConfiguration; @@ -88,6 +89,7 @@ public interface ContextCache { * if not found in the cache * @see #remove */ + @Nullable ApplicationContext get(MergedContextConfiguration key); /** @@ -112,7 +114,7 @@ public interface ContextCache { * @param hierarchyMode the hierarchy mode; may be {@code null} if the context * is not part of a hierarchy */ - void remove(MergedContextConfiguration key, HierarchyMode hierarchyMode); + void remove(MergedContextConfiguration key, @Nullable HierarchyMode hierarchyMode); /** * Determine the number of contexts currently stored in the cache. diff --git a/spring-test/src/main/java/org/springframework/test/context/cache/package-info.java b/spring-test/src/main/java/org/springframework/test/context/cache/package-info.java index 85fa1784501..5529d083ba7 100644 --- a/spring-test/src/main/java/org/springframework/test/context/cache/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/context/cache/package-info.java @@ -1,4 +1,7 @@ /** * Support for context caching within the Spring TestContext Framework. */ +@NonNullApi package org.springframework.test.context.cache; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/context/jdbc/package-info.java b/spring-test/src/main/java/org/springframework/test/context/jdbc/package-info.java index eb004d39318..3f3151110b6 100644 --- a/spring-test/src/main/java/org/springframework/test/context/jdbc/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/context/jdbc/package-info.java @@ -2,4 +2,7 @@ * JDBC support classes for the Spring TestContext Framework, * including support for declarative SQL script execution via {@code @Sql}. */ +@NonNullApi package org.springframework.test.context.jdbc; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/context/junit/jupiter/ParameterAutowireUtils.java b/spring-test/src/main/java/org/springframework/test/context/junit/jupiter/ParameterAutowireUtils.java index c0fe2c00000..502393e98f6 100644 --- a/spring-test/src/main/java/org/springframework/test/context/junit/jupiter/ParameterAutowireUtils.java +++ b/spring-test/src/main/java/org/springframework/test/context/junit/jupiter/ParameterAutowireUtils.java @@ -31,6 +31,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.core.MethodParameter; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.SynthesizingMethodParameter; +import org.springframework.lang.Nullable; /** * Collection of utilities related to autowiring of individual method parameters. @@ -88,6 +89,7 @@ abstract class ParameterAutowireUtils { * @see SynthesizingMethodParameter#forParameter(Parameter) * @see AutowireCapableBeanFactory#resolveDependency(DependencyDescriptor, String) */ + @Nullable static Object resolveDependency(Parameter parameter, Class containingClass, ApplicationContext applicationContext) { boolean required = findMergedAnnotation(parameter, Autowired.class).map(Autowired::required).orElse(true); MethodParameter methodParameter = SynthesizingMethodParameter.forParameter(parameter); diff --git a/spring-test/src/main/java/org/springframework/test/context/junit/jupiter/package-info.java b/spring-test/src/main/java/org/springframework/test/context/junit/jupiter/package-info.java index ceba54b4f71..d84c10f7697 100644 --- a/spring-test/src/main/java/org/springframework/test/context/junit/jupiter/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/context/junit/jupiter/package-info.java @@ -2,4 +2,7 @@ * Core support for integrating the Spring TestContext Framework * with the JUnit Jupiter extension model in JUnit 5. */ +@NonNullApi package org.springframework.test.context.junit.jupiter; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/context/junit/jupiter/web/package-info.java b/spring-test/src/main/java/org/springframework/test/context/junit/jupiter/web/package-info.java index d82b9ceba8b..38f765a30da 100644 --- a/spring-test/src/main/java/org/springframework/test/context/junit/jupiter/web/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/context/junit/jupiter/web/package-info.java @@ -2,4 +2,7 @@ * Web support for integrating the Spring TestContext Framework * with the JUnit Jupiter extension model in JUnit 5. */ +@NonNullApi package org.springframework.test.context.junit.jupiter.web; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/context/junit4/SpringJUnit4ClassRunner.java b/spring-test/src/main/java/org/springframework/test/context/junit4/SpringJUnit4ClassRunner.java index dc8c9350c5f..6fbb2249095 100644 --- a/spring-test/src/main/java/org/springframework/test/context/junit4/SpringJUnit4ClassRunner.java +++ b/spring-test/src/main/java/org/springframework/test/context/junit4/SpringJUnit4ClassRunner.java @@ -36,6 +36,7 @@ import org.junit.runners.model.FrameworkMethod; import org.junit.runners.model.InitializationError; import org.junit.runners.model.Statement; +import org.springframework.lang.Nullable; import org.springframework.test.annotation.ProfileValueUtils; import org.springframework.test.annotation.TestAnnotationUtils; import org.springframework.test.context.TestContextManager; @@ -343,6 +344,7 @@ public class SpringJUnit4ClassRunner extends BlockJUnit4ClassRunner { *

    Can be overridden by subclasses. * @return the expected exception, or {@code null} if none was specified */ + @Nullable protected Class getExpectedException(FrameworkMethod frameworkMethod) { Test test = frameworkMethod.getAnnotation(Test.class); return (test != null && test.expected() != Test.None.class ? test.expected() : null); diff --git a/spring-test/src/main/java/org/springframework/test/context/junit4/package-info.java b/spring-test/src/main/java/org/springframework/test/context/junit4/package-info.java index 0a93b26848b..5eb3afdf540 100644 --- a/spring-test/src/main/java/org/springframework/test/context/junit4/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/context/junit4/package-info.java @@ -2,4 +2,7 @@ * Support classes for integrating the Spring TestContext Framework * with JUnit 4.12 or higher. */ +@NonNullApi package org.springframework.test.context.junit4; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/context/junit4/rules/package-info.java b/spring-test/src/main/java/org/springframework/test/context/junit4/rules/package-info.java index 16124c162d9..f942e9cdfc8 100644 --- a/spring-test/src/main/java/org/springframework/test/context/junit4/rules/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/context/junit4/rules/package-info.java @@ -1,4 +1,7 @@ /** * Custom JUnit {@code Rules} used in the Spring TestContext Framework. */ +@NonNullApi package org.springframework.test.context.junit4.rules; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/context/junit4/statements/ProfileValueChecker.java b/spring-test/src/main/java/org/springframework/test/context/junit4/statements/ProfileValueChecker.java index 5d53bbff71b..b6651420013 100644 --- a/spring-test/src/main/java/org/springframework/test/context/junit4/statements/ProfileValueChecker.java +++ b/spring-test/src/main/java/org/springframework/test/context/junit4/statements/ProfileValueChecker.java @@ -23,6 +23,7 @@ import org.junit.AssumptionViolatedException; import org.junit.runners.model.Statement; import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.lang.Nullable; import org.springframework.test.annotation.IfProfileValue; import org.springframework.test.annotation.ProfileValueUtils; import org.springframework.util.Assert; @@ -56,7 +57,7 @@ public class ProfileValueChecker extends Statement { * @param testMethod the test method to check; may be {@code null} if * this {@code ProfileValueChecker} is being applied at the class level */ - public ProfileValueChecker(Statement next, Class testClass, Method testMethod) { + public ProfileValueChecker(Statement next, Class testClass, @Nullable Method testMethod) { Assert.notNull(next, "The next statement must not be null"); Assert.notNull(testClass, "The test class must not be null"); this.next = next; diff --git a/spring-test/src/main/java/org/springframework/test/context/junit4/statements/package-info.java b/spring-test/src/main/java/org/springframework/test/context/junit4/statements/package-info.java index 53ce63a089c..38a80d3186c 100644 --- a/spring-test/src/main/java/org/springframework/test/context/junit4/statements/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/context/junit4/statements/package-info.java @@ -1,4 +1,7 @@ /** * Custom JUnit {@code Statements} used in the Spring TestContext Framework. */ +@NonNullApi package org.springframework.test.context.junit4.statements; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/context/package-info.java b/spring-test/src/main/java/org/springframework/test/context/package-info.java index b20273495ca..4b83127f83c 100644 --- a/spring-test/src/main/java/org/springframework/test/context/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/context/package-info.java @@ -11,4 +11,7 @@ * and caching, dependency injection of test fixtures, and transactional test * management with default rollback semantics. */ +@NonNullApi package org.springframework.test.context; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/context/support/AbstractContextLoader.java b/spring-test/src/main/java/org/springframework/test/context/support/AbstractContextLoader.java index 31533a8ec32..10a5501b9f9 100644 --- a/spring-test/src/main/java/org/springframework/test/context/support/AbstractContextLoader.java +++ b/spring-test/src/main/java/org/springframework/test/context/support/AbstractContextLoader.java @@ -32,6 +32,7 @@ import org.springframework.core.GenericTypeResolver; import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.env.PropertySource; import org.springframework.core.io.ClassPathResource; +import org.springframework.lang.Nullable; import org.springframework.test.context.ContextConfigurationAttributes; import org.springframework.test.context.ContextCustomizer; import org.springframework.test.context.ContextLoader; @@ -212,7 +213,7 @@ public abstract class AbstractContextLoader implements SmartContextLoader { * @see #processContextConfiguration(ContextConfigurationAttributes) */ @Override - public final String[] processLocations(Class clazz, String... locations) { + public final String[] processLocations(Class clazz, @Nullable String... locations) { return (ObjectUtils.isEmpty(locations) && isGenerateDefaultLocations()) ? generateDefaultLocations(clazz) : modifyLocations(clazz, locations); } diff --git a/spring-test/src/main/java/org/springframework/test/context/support/AbstractDirtiesContextTestExecutionListener.java b/spring-test/src/main/java/org/springframework/test/context/support/AbstractDirtiesContextTestExecutionListener.java index dbf1fa6f71a..497722123be 100644 --- a/spring-test/src/main/java/org/springframework/test/context/support/AbstractDirtiesContextTestExecutionListener.java +++ b/spring-test/src/main/java/org/springframework/test/context/support/AbstractDirtiesContextTestExecutionListener.java @@ -23,6 +23,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.context.ApplicationContext; import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.lang.Nullable; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.annotation.DirtiesContext.HierarchyMode; @@ -64,7 +65,7 @@ public abstract class AbstractDirtiesContextTestExecutionListener extends Abstra * context is part of a hierarchy; may be {@code null} * @since 3.2.2 */ - protected void dirtyContext(TestContext testContext, HierarchyMode hierarchyMode) { + protected void dirtyContext(TestContext testContext, @Nullable HierarchyMode hierarchyMode) { testContext.markApplicationContextDirty(hierarchyMode); testContext.setAttribute(DependencyInjectionTestExecutionListener.REINJECT_DEPENDENCIES_ATTRIBUTE, Boolean.TRUE); } diff --git a/spring-test/src/main/java/org/springframework/test/context/support/AbstractTestContextBootstrapper.java b/spring-test/src/main/java/org/springframework/test/context/support/AbstractTestContextBootstrapper.java index 376cdaa332c..43c62fe490e 100644 --- a/spring-test/src/main/java/org/springframework/test/context/support/AbstractTestContextBootstrapper.java +++ b/spring-test/src/main/java/org/springframework/test/context/support/AbstractTestContextBootstrapper.java @@ -34,6 +34,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.io.support.SpringFactoriesLoader; +import org.springframework.lang.Nullable; import org.springframework.test.context.BootstrapContext; import org.springframework.test.context.CacheAwareContextLoaderDelegate; import org.springframework.test.context.ContextConfiguration; @@ -350,7 +351,7 @@ public abstract class AbstractTestContextBootstrapper implements TestContextBoot * @see MergedContextConfiguration */ private MergedContextConfiguration buildMergedContextConfiguration(Class testClass, - List configAttributesList, MergedContextConfiguration parentConfig, + List configAttributesList, @Nullable MergedContextConfiguration parentConfig, CacheAwareContextLoaderDelegate cacheAwareContextLoaderDelegate, boolean requireLocationsClassesOrInitializers) { @@ -490,6 +491,7 @@ public abstract class AbstractTestContextBootstrapper implements TestContextBoot * @throws IllegalArgumentException if supplied configuration attributes are * {@code null} or empty */ + @Nullable protected Class resolveExplicitContextLoaderClass( List configAttributesList) { diff --git a/spring-test/src/main/java/org/springframework/test/context/support/TestPropertySourceAttributes.java b/spring-test/src/main/java/org/springframework/test/context/support/TestPropertySourceAttributes.java index e2ed3c2c6c6..aa18ccfaca3 100644 --- a/spring-test/src/main/java/org/springframework/test/context/support/TestPropertySourceAttributes.java +++ b/spring-test/src/main/java/org/springframework/test/context/support/TestPropertySourceAttributes.java @@ -21,6 +21,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.core.style.ToStringCreator; +import org.springframework.lang.Nullable; import org.springframework.test.context.TestPropertySource; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -105,6 +106,7 @@ class TestPropertySourceAttributes { * @see TestPropertySource#locations * @see #setLocations(String[]) */ + @Nullable String[] getLocations() { return locations; } @@ -125,6 +127,7 @@ class TestPropertySourceAttributes { * @return the inlined properties; potentially {@code null} or empty * @see TestPropertySource#properties */ + @Nullable String[] getProperties() { return this.properties; } diff --git a/spring-test/src/main/java/org/springframework/test/context/support/package-info.java b/spring-test/src/main/java/org/springframework/test/context/support/package-info.java index 98630a9beed..769862c129f 100644 --- a/spring-test/src/main/java/org/springframework/test/context/support/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/context/support/package-info.java @@ -1,4 +1,7 @@ /** * Support classes for the Spring TestContext Framework. */ +@NonNullApi package org.springframework.test.context.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/context/testng/AbstractTestNGSpringContextTests.java b/spring-test/src/main/java/org/springframework/test/context/testng/AbstractTestNGSpringContextTests.java index c36c4e4ca9d..01b6bd93d20 100644 --- a/spring-test/src/main/java/org/springframework/test/context/testng/AbstractTestNGSpringContextTests.java +++ b/spring-test/src/main/java/org/springframework/test/context/testng/AbstractTestNGSpringContextTests.java @@ -24,6 +24,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; +import org.springframework.lang.Nullable; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestContext; import org.springframework.test.context.TestContextManager; @@ -239,6 +240,7 @@ public abstract class AbstractTestNGSpringContextTests implements IHookable, App return testResultException; } + @Nullable private RuntimeException throwAsUncheckedException(Throwable t) { throwAs(t); diff --git a/spring-test/src/main/java/org/springframework/test/context/testng/package-info.java b/spring-test/src/main/java/org/springframework/test/context/testng/package-info.java index aef08243a59..92208b9e20e 100644 --- a/spring-test/src/main/java/org/springframework/test/context/testng/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/context/testng/package-info.java @@ -2,4 +2,7 @@ * Support classes for ApplicationContext-based and transactional * tests run with TestNG and the Spring TestContext Framework. */ +@NonNullApi package org.springframework.test.context.testng; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/context/transaction/TestContextTransactionUtils.java b/spring-test/src/main/java/org/springframework/test/context/transaction/TestContextTransactionUtils.java index b17278e5a0a..0a62330774f 100644 --- a/spring-test/src/main/java/org/springframework/test/context/transaction/TestContextTransactionUtils.java +++ b/spring-test/src/main/java/org/springframework/test/context/transaction/TestContextTransactionUtils.java @@ -17,6 +17,7 @@ package org.springframework.test.context.transaction; import java.util.Map; + import javax.sql.DataSource; import org.apache.commons.logging.Log; @@ -26,6 +27,7 @@ import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.ListableBeanFactory; +import org.springframework.lang.Nullable; import org.springframework.test.context.TestContext; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.TransactionManagementConfigurer; @@ -86,7 +88,8 @@ public abstract class TestContextTransactionUtils { * @throws BeansException if an error occurs while retrieving an explicitly * named {@code DataSource} */ - public static DataSource retrieveDataSource(TestContext testContext, String name) { + @Nullable + public static DataSource retrieveDataSource(TestContext testContext, @Nullable String name) { Assert.notNull(testContext, "TestContext must not be null"); BeanFactory bf = testContext.getApplicationContext().getAutowireCapableBeanFactory(); @@ -158,7 +161,8 @@ public abstract class TestContextTransactionUtils { * @throws IllegalStateException if more than one TransactionManagementConfigurer * exists in the ApplicationContext */ - public static PlatformTransactionManager retrieveTransactionManager(TestContext testContext, String name) { + @Nullable + public static PlatformTransactionManager retrieveTransactionManager(TestContext testContext, @Nullable String name) { Assert.notNull(testContext, "TestContext must not be null"); BeanFactory bf = testContext.getApplicationContext().getAutowireCapableBeanFactory(); diff --git a/spring-test/src/main/java/org/springframework/test/context/transaction/package-info.java b/spring-test/src/main/java/org/springframework/test/context/transaction/package-info.java index e7ddcdfb270..0828438a381 100644 --- a/spring-test/src/main/java/org/springframework/test/context/transaction/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/context/transaction/package-info.java @@ -1,4 +1,7 @@ /** * Transactional support classes for the Spring TestContext Framework. */ +@NonNullApi package org.springframework.test.context.transaction; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/context/util/package-info.java b/spring-test/src/main/java/org/springframework/test/context/util/package-info.java index 494787df0e0..15b97c3d383 100644 --- a/spring-test/src/main/java/org/springframework/test/context/util/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/context/util/package-info.java @@ -1,4 +1,7 @@ /** * Common utilities used within the Spring TestContext Framework. */ +@NonNullApi package org.springframework.test.context.util; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/context/web/WebMergedContextConfiguration.java b/spring-test/src/main/java/org/springframework/test/context/web/WebMergedContextConfiguration.java index 9ed91713c32..a91de167790 100644 --- a/spring-test/src/main/java/org/springframework/test/context/web/WebMergedContextConfiguration.java +++ b/spring-test/src/main/java/org/springframework/test/context/web/WebMergedContextConfiguration.java @@ -21,6 +21,7 @@ import java.util.Set; import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.style.ToStringCreator; +import org.springframework.lang.Nullable; import org.springframework.test.context.CacheAwareContextLoaderDelegate; import org.springframework.test.context.ContextCustomizer; import org.springframework.test.context.ContextLoader; @@ -97,11 +98,11 @@ public class WebMergedContextConfiguration extends MergedContextConfiguration { * @param parent the parent configuration or {@code null} if there is no parent * @since 4.1 */ - public WebMergedContextConfiguration(Class testClass, String[] locations, Class[] classes, - Set>> contextInitializerClasses, - String[] activeProfiles, String[] propertySourceLocations, String[] propertySourceProperties, + public WebMergedContextConfiguration(Class testClass, @Nullable String[] locations, @Nullable Class[] classes, + @Nullable Set>> contextInitializerClasses, + @Nullable String[] activeProfiles, @Nullable String[] propertySourceLocations, @Nullable String[] propertySourceProperties, String resourceBasePath, ContextLoader contextLoader, - CacheAwareContextLoaderDelegate cacheAwareContextLoaderDelegate, MergedContextConfiguration parent) { + CacheAwareContextLoaderDelegate cacheAwareContextLoaderDelegate, @Nullable MergedContextConfiguration parent) { this(testClass, locations, classes, contextInitializerClasses, activeProfiles, propertySourceLocations, propertySourceProperties, null, resourceBasePath, contextLoader, cacheAwareContextLoaderDelegate, parent); @@ -133,11 +134,11 @@ public class WebMergedContextConfiguration extends MergedContextConfiguration { * @param parent the parent configuration or {@code null} if there is no parent * @since 4.3 */ - public WebMergedContextConfiguration(Class testClass, String[] locations, Class[] classes, - Set>> contextInitializerClasses, - String[] activeProfiles, String[] propertySourceLocations, String[] propertySourceProperties, - Set contextCustomizers, String resourceBasePath, ContextLoader contextLoader, - CacheAwareContextLoaderDelegate cacheAwareContextLoaderDelegate, MergedContextConfiguration parent) { + public WebMergedContextConfiguration(Class testClass, @Nullable String[] locations, @Nullable Class[] classes, + @Nullable Set>> contextInitializerClasses, + @Nullable String[] activeProfiles, @Nullable String[] propertySourceLocations, @Nullable String[] propertySourceProperties, + @Nullable Set contextCustomizers, String resourceBasePath, ContextLoader contextLoader, + CacheAwareContextLoaderDelegate cacheAwareContextLoaderDelegate, @Nullable MergedContextConfiguration parent) { super(testClass, locations, classes, contextInitializerClasses, activeProfiles, propertySourceLocations, propertySourceProperties, contextCustomizers, contextLoader, cacheAwareContextLoaderDelegate, parent); diff --git a/spring-test/src/main/java/org/springframework/test/context/web/package-info.java b/spring-test/src/main/java/org/springframework/test/context/web/package-info.java index d3dc1c12b5a..b45e51670ec 100644 --- a/spring-test/src/main/java/org/springframework/test/context/web/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/context/web/package-info.java @@ -1,4 +1,7 @@ /** * Web support classes for the Spring TestContext Framework. */ +@NonNullApi package org.springframework.test.context.web; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/context/web/socket/package-info.java b/spring-test/src/main/java/org/springframework/test/context/web/socket/package-info.java index 7b97278f92d..ca6a5942b2c 100644 --- a/spring-test/src/main/java/org/springframework/test/context/web/socket/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/context/web/socket/package-info.java @@ -1,4 +1,7 @@ /** * WebSocket support classes for the Spring TestContext Framework. */ +@NonNullApi package org.springframework.test.context.web.socket; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/jdbc/package-info.java b/spring-test/src/main/java/org/springframework/test/jdbc/package-info.java index cfa40b7ed82..d35317061f1 100644 --- a/spring-test/src/main/java/org/springframework/test/jdbc/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/jdbc/package-info.java @@ -1,4 +1,7 @@ /** * Support classes for tests based on JDBC. */ +@NonNullApi package org.springframework.test.jdbc; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/util/MetaAnnotationUtils.java b/spring-test/src/main/java/org/springframework/test/util/MetaAnnotationUtils.java index 99dd5125d4f..b0f0f033685 100644 --- a/spring-test/src/main/java/org/springframework/test/util/MetaAnnotationUtils.java +++ b/spring-test/src/main/java/org/springframework/test/util/MetaAnnotationUtils.java @@ -24,6 +24,7 @@ import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.style.ToStringCreator; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -80,6 +81,7 @@ public abstract class MetaAnnotationUtils { * @see AnnotationUtils#findAnnotationDeclaringClass(Class, Class) * @see #findAnnotationDescriptorForTypes(Class, Class...) */ + @Nullable public static AnnotationDescriptor findAnnotationDescriptor( Class clazz, Class annotationType) { @@ -96,6 +98,7 @@ public abstract class MetaAnnotationUtils { * @return the corresponding annotation descriptor if the annotation was found; * otherwise {@code null} */ + @Nullable private static AnnotationDescriptor findAnnotationDescriptor( Class clazz, Set visited, Class annotationType) { @@ -165,6 +168,7 @@ public abstract class MetaAnnotationUtils { * @see #findAnnotationDescriptor(Class, Class) */ @SuppressWarnings("unchecked") + @Nullable public static UntypedAnnotationDescriptor findAnnotationDescriptorForTypes( Class clazz, Class... annotationTypes) { @@ -182,6 +186,7 @@ public abstract class MetaAnnotationUtils { * was found; otherwise {@code null} */ @SuppressWarnings("unchecked") + @Nullable private static UntypedAnnotationDescriptor findAnnotationDescriptorForTypes(Class clazz, Set visited, Class... annotationTypes) { diff --git a/spring-test/src/main/java/org/springframework/test/util/ReflectionTestUtils.java b/spring-test/src/main/java/org/springframework/test/util/ReflectionTestUtils.java index 4f508511f51..49864f84129 100644 --- a/spring-test/src/main/java/org/springframework/test/util/ReflectionTestUtils.java +++ b/spring-test/src/main/java/org/springframework/test/util/ReflectionTestUtils.java @@ -22,6 +22,7 @@ import java.lang.reflect.Method; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.MethodInvoker; import org.springframework.util.ObjectUtils; @@ -96,7 +97,7 @@ public class ReflectionTestUtils { * @param type the type of the field to set; may be {@code null} if * {@code name} is specified */ - public static void setField(Object targetObject, String name, Object value, Class type) { + public static void setField(Object targetObject, @Nullable String name, Object value, Class type) { setField(targetObject, null, name, value, type); } @@ -130,7 +131,7 @@ public class ReflectionTestUtils { * {@code name} is specified * @since 4.2 */ - public static void setField(Class targetClass, String name, Object value, Class type) { + public static void setField(Class targetClass, @Nullable String name, Object value, @Nullable Class type) { setField(null, targetClass, name, value, type); } @@ -160,7 +161,7 @@ public class ReflectionTestUtils { * @see ReflectionUtils#setField(Field, Object, Object) * @see AopTestUtils#getUltimateTargetObject(Object) */ - public static void setField(Object targetObject, Class targetClass, String name, Object value, Class type) { + public static void setField(@Nullable Object targetObject, @Nullable Class targetClass, @Nullable String name, Object value, @Nullable Class type) { Assert.isTrue(targetObject != null || targetClass != null, "Either targetObject or targetClass for the field must be specified"); @@ -241,7 +242,7 @@ public class ReflectionTestUtils { * @see ReflectionUtils#getField(Field, Object) * @see AopTestUtils#getUltimateTargetObject(Object) */ - public static Object getField(Object targetObject, Class targetClass, String name) { + public static Object getField(@Nullable Object targetObject, @Nullable Class targetClass, String name) { Assert.isTrue(targetObject != null || targetClass != null, "Either targetObject or targetClass for the field must be specified"); @@ -402,7 +403,8 @@ public class ReflectionTestUtils { * @see ReflectionUtils#handleReflectionException(Exception) */ @SuppressWarnings("unchecked") - public static T invokeMethod(Object target, String name, Object... args) { + @Nullable + public static T invokeMethod(Object target, String name, @Nullable Object... args) { Assert.notNull(target, "Target object must not be null"); Assert.hasText(name, "Method name must not be empty"); diff --git a/spring-test/src/main/java/org/springframework/test/util/XpathExpectationsHelper.java b/spring-test/src/main/java/org/springframework/test/util/XpathExpectationsHelper.java index 524590fac48..89f6c2bf3e7 100644 --- a/spring-test/src/main/java/org/springframework/test/util/XpathExpectationsHelper.java +++ b/spring-test/src/main/java/org/springframework/test/util/XpathExpectationsHelper.java @@ -19,6 +19,7 @@ package org.springframework.test.util; import java.io.ByteArrayInputStream; import java.util.Collections; import java.util.Map; + import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -34,6 +35,7 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.util.xml.SimpleNamespaceContext; @@ -64,7 +66,7 @@ public class XpathExpectationsHelper { * formatting specifiers defined in {@link String#format(String, Object...)} * @throws XPathExpressionException */ - public XpathExpectationsHelper(String expression, Map namespaces, Object... args) + public XpathExpectationsHelper(String expression, @Nullable Map namespaces, Object... args) throws XPathExpressionException { this.expression = String.format(expression, args); diff --git a/spring-test/src/main/java/org/springframework/test/util/package-info.java b/spring-test/src/main/java/org/springframework/test/util/package-info.java index 24a5e21ac20..4794d8b0a67 100644 --- a/spring-test/src/main/java/org/springframework/test/util/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/util/package-info.java @@ -1,4 +1,7 @@ /** * General utility classes for use in unit and integration tests. */ +@NonNullApi package org.springframework.test.util; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/web/client/AbstractRequestExpectationManager.java b/spring-test/src/main/java/org/springframework/test/web/client/AbstractRequestExpectationManager.java index 7b20fdcd3fc..d9390b3a7c1 100644 --- a/spring-test/src/main/java/org/springframework/test/web/client/AbstractRequestExpectationManager.java +++ b/spring-test/src/main/java/org/springframework/test/web/client/AbstractRequestExpectationManager.java @@ -27,6 +27,7 @@ import java.util.Set; import org.springframework.http.HttpMethod; import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpResponse; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -172,6 +173,7 @@ public abstract class AbstractRequestExpectationManager implements RequestExpect } } + @Nullable public RequestExpectation findExpectation(ClientHttpRequest request) throws IOException { for (RequestExpectation expectation : getExpectations()) { try { diff --git a/spring-test/src/main/java/org/springframework/test/web/client/match/XpathRequestMatchers.java b/spring-test/src/main/java/org/springframework/test/web/client/match/XpathRequestMatchers.java index 49255719de8..e407ffe79b7 100644 --- a/spring-test/src/main/java/org/springframework/test/web/client/match/XpathRequestMatchers.java +++ b/spring-test/src/main/java/org/springframework/test/web/client/match/XpathRequestMatchers.java @@ -18,12 +18,14 @@ package org.springframework.test.web.client.match; import java.io.IOException; import java.util.Map; + import javax.xml.xpath.XPathExpressionException; import org.hamcrest.Matcher; import org.w3c.dom.Node; import org.springframework.http.client.ClientHttpRequest; +import org.springframework.lang.Nullable; import org.springframework.mock.http.client.MockClientHttpRequest; import org.springframework.test.util.XpathExpectationsHelper; import org.springframework.test.web.client.RequestMatcher; @@ -53,7 +55,7 @@ public class XpathRequestMatchers { * formatting specifiers defined in {@link String#format(String, Object...)} * @throws XPathExpressionException */ - protected XpathRequestMatchers(String expression, Map namespaces, Object ... args) + protected XpathRequestMatchers(String expression, @Nullable Map namespaces, Object ... args) throws XPathExpressionException { this.xpathHelper = new XpathExpectationsHelper(expression, namespaces, args); diff --git a/spring-test/src/main/java/org/springframework/test/web/client/match/package-info.java b/spring-test/src/main/java/org/springframework/test/web/client/match/package-info.java index a538c9e0094..c76ae812073 100644 --- a/spring-test/src/main/java/org/springframework/test/web/client/match/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/web/client/match/package-info.java @@ -4,4 +4,7 @@ * {@link org.springframework.test.web.client.match.MockRestRequestMatchers} * to gain access to instances of those implementations. */ +@NonNullApi package org.springframework.test.web.client.match; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/web/client/package-info.java b/spring-test/src/main/java/org/springframework/test/web/client/package-info.java index a0177901846..615f706a8a0 100644 --- a/spring-test/src/main/java/org/springframework/test/web/client/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/web/client/package-info.java @@ -2,4 +2,7 @@ * Contains client-side REST testing support. * @see org.springframework.test.web.client.MockRestServiceServer */ +@NonNullApi package org.springframework.test.web.client; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/web/client/response/MockRestResponseCreators.java b/spring-test/src/main/java/org/springframework/test/web/client/response/MockRestResponseCreators.java index 0ff14df9a16..ac80a4f9149 100644 --- a/spring-test/src/main/java/org/springframework/test/web/client/response/MockRestResponseCreators.java +++ b/spring-test/src/main/java/org/springframework/test/web/client/response/MockRestResponseCreators.java @@ -20,6 +20,7 @@ import java.net.URI; import org.springframework.core.io.Resource; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; import org.springframework.test.web.client.ResponseCreator; /** @@ -45,7 +46,7 @@ public abstract class MockRestResponseCreators { * @param body the response body, a "UTF-8" string * @param mediaType the type of the content, may be {@code null} */ - public static DefaultResponseCreator withSuccess(String body, MediaType mediaType) { + public static DefaultResponseCreator withSuccess(String body, @Nullable MediaType mediaType) { return new DefaultResponseCreator(HttpStatus.OK).body(body).contentType(mediaType); } @@ -54,7 +55,7 @@ public abstract class MockRestResponseCreators { * @param body the response body * @param contentType the type of the content, may be {@code null} */ - public static DefaultResponseCreator withSuccess(byte[] body, MediaType contentType) { + public static DefaultResponseCreator withSuccess(byte[] body, @Nullable MediaType contentType) { return new DefaultResponseCreator(HttpStatus.OK).body(body).contentType(contentType); } @@ -63,7 +64,7 @@ public abstract class MockRestResponseCreators { * @param body the response body * @param contentType the type of the content, may be {@code null} */ - public static DefaultResponseCreator withSuccess(Resource body, MediaType contentType) { + public static DefaultResponseCreator withSuccess(Resource body, @Nullable MediaType contentType) { return new DefaultResponseCreator(HttpStatus.OK).body(body).contentType(contentType); } diff --git a/spring-test/src/main/java/org/springframework/test/web/client/response/package-info.java b/spring-test/src/main/java/org/springframework/test/web/client/response/package-info.java index bc6306c570a..4efaa2c5c0f 100644 --- a/spring-test/src/main/java/org/springframework/test/web/client/response/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/web/client/response/package-info.java @@ -4,4 +4,7 @@ * {@link org.springframework.test.web.client.response.MockRestResponseCreators} * to gain access to instances of those implementations. */ +@NonNullApi package org.springframework.test.web.client.response; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java index b7c23f6d1dd..2b2fbb4eca8 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java @@ -39,6 +39,7 @@ import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.client.reactive.ClientHttpConnector; import org.springframework.http.client.reactive.ClientHttpRequest; +import org.springframework.lang.Nullable; import org.springframework.test.util.JsonExpectationsHelper; import org.springframework.util.Assert; import org.springframework.util.MimeType; @@ -501,6 +502,7 @@ class DefaultWebTestClient implements WebTestClient { return new JsonPathAssertions(this, getBodyAsString(), expression, args); } + @Nullable private String getBodyAsString() { if (this.isEmpty) { return null; diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/package-info.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/package-info.java index 90489f3f00d..47a3a4b6ad7 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/package-info.java @@ -2,4 +2,7 @@ * Support for testing Spring WebFlux server endpoints via * {@link org.springframework.test.web.reactive.server.WebTestClient}. */ +@NonNullApi package org.springframework.test.web.reactive.server; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/MvcResult.java b/spring-test/src/main/java/org/springframework/test/web/servlet/MvcResult.java index a0676a238e8..24f08203854 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/MvcResult.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/MvcResult.java @@ -16,6 +16,7 @@ package org.springframework.test.web.servlet; +import org.springframework.lang.Nullable; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.web.servlet.FlashMap; @@ -47,18 +48,21 @@ public interface MvcResult { * Return the executed handler. * @return the handler, possibly {@code null} if none were executed */ + @Nullable Object getHandler(); /** * Return interceptors around the handler. * @return interceptors, or {@code null} if none were selected */ + @Nullable HandlerInterceptor[] getInterceptors(); /** * Return the {@code ModelAndView} prepared by the handler. * @return a {@code ModelAndView}, or {@code null} */ + @Nullable ModelAndView getModelAndView(); /** @@ -66,6 +70,7 @@ public interface MvcResult { * through a {@link HandlerExceptionResolver}. * @return an exception, possibly {@code null} */ + @Nullable Exception getResolvedException(); /** diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilder.java b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilder.java index ba9d6764a40..5f145570e79 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilder.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/HtmlUnitRequestBuilder.java @@ -42,6 +42,7 @@ import com.gargoylesoftware.htmlunit.util.NameValuePair; import org.springframework.beans.Mergeable; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpSession; import org.springframework.test.web.servlet.RequestBuilder; @@ -206,7 +207,7 @@ final class HtmlUnitRequestBuilder implements RequestBuilder, Mergeable { * @throws IllegalArgumentException if the contextPath is not a valid * {@link HttpServletRequest#getContextPath()} */ - public void setContextPath(String contextPath) { + public void setContextPath(@Nullable String contextPath) { MockMvcWebConnection.validateContextPath(contextPath); this.contextPath = contextPath; } diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnection.java b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnection.java index 6ae42fb18e5..657f1546d51 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnection.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnection.java @@ -29,6 +29,7 @@ import com.gargoylesoftware.htmlunit.WebResponse; import com.gargoylesoftware.htmlunit.util.Cookie; import org.apache.http.impl.cookie.BasicClientCookie; +import org.springframework.lang.Nullable; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockHttpSession; import org.springframework.test.web.servlet.MockMvc; @@ -90,7 +91,7 @@ public final class MockMvcWebConnection implements WebConnection { * @param webClient the {@link WebClient} to use. never {@code null} * @param contextPath the contextPath to use */ - public MockMvcWebConnection(MockMvc mockMvc, WebClient webClient, String contextPath) { + public MockMvcWebConnection(MockMvc mockMvc, WebClient webClient, @Nullable String contextPath) { Assert.notNull(mockMvc, "MockMvc must not be null"); Assert.notNull(webClient, "WebClient must not be null"); validateContextPath(contextPath); @@ -108,7 +109,7 @@ public final class MockMvcWebConnection implements WebConnection { * a "/" character and not end with a "/" character. * @param contextPath the path to validate */ - static void validateContextPath(String contextPath) { + static void validateContextPath(@Nullable String contextPath) { if (contextPath == null || "".equals(contextPath)) { return; } diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnectionBuilderSupport.java b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnectionBuilderSupport.java index 3edf482474d..cb259369a6e 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnectionBuilderSupport.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/htmlunit/MockMvcWebConnectionBuilderSupport.java @@ -22,6 +22,7 @@ import java.util.List; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.WebConnection; +import org.springframework.lang.Nullable; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.htmlunit.DelegatingWebConnection.DelegateWebConnection; import org.springframework.test.web.servlet.setup.MockMvcBuilders; @@ -92,7 +93,7 @@ public abstract class MockMvcWebConnectionBuilderSupport namespaces, Object ... args) + protected XpathResultMatchers(String expression, @Nullable Map namespaces, Object ... args) throws XPathExpressionException { this.xpathHelper = new XpathExpectationsHelper(expression, namespaces, args); diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/result/package-info.java b/spring-test/src/main/java/org/springframework/test/web/servlet/result/package-info.java index 8ee752a27bf..26cf583b0c1 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/result/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/result/package-info.java @@ -4,4 +4,7 @@ * and {@link org.springframework.test.web.servlet.result.MockMvcResultHandlers} * to access instances of those implementations. */ +@NonNullApi package org.springframework.test.web.servlet.result; + +import org.springframework.lang.NonNullApi; diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/setup/package-info.java b/spring-test/src/main/java/org/springframework/test/web/servlet/setup/package-info.java index 3244c26dcfa..562c7e7f6fb 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/setup/package-info.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/setup/package-info.java @@ -3,4 +3,7 @@ * Use {@link org.springframework.test.web.servlet.setup.MockMvcBuilders} * to access to instances of those implementations. */ +@NonNullApi package org.springframework.test.web.servlet.setup; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/dao/annotation/package-info.java b/spring-tx/src/main/java/org/springframework/dao/annotation/package-info.java index 962db3dddf1..85b1ce0cdad 100644 --- a/spring-tx/src/main/java/org/springframework/dao/annotation/package-info.java +++ b/spring-tx/src/main/java/org/springframework/dao/annotation/package-info.java @@ -2,4 +2,7 @@ * Annotation support for DAOs. Contains a bean post-processor for translating * persistence exceptions based on a repository stereotype annotation. */ +@NonNullApi package org.springframework.dao.annotation; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/dao/package-info.java b/spring-tx/src/main/java/org/springframework/dao/package-info.java index 4e9a18651ed..68478e7d8bb 100644 --- a/spring-tx/src/main/java/org/springframework/dao/package-info.java +++ b/spring-tx/src/main/java/org/springframework/dao/package-info.java @@ -13,4 +13,7 @@ * Expert One-On-One J2EE Design and Development * by Rod Johnson (Wrox, 2002). */ +@NonNullApi package org.springframework.dao; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/dao/support/DataAccessUtils.java b/spring-tx/src/main/java/org/springframework/dao/support/DataAccessUtils.java index 4d68bd507b3..eb255339b8d 100644 --- a/spring-tx/src/main/java/org/springframework/dao/support/DataAccessUtils.java +++ b/spring-tx/src/main/java/org/springframework/dao/support/DataAccessUtils.java @@ -22,6 +22,7 @@ import org.springframework.dao.DataAccessException; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.dao.IncorrectResultSizeDataAccessException; import org.springframework.dao.TypeMismatchDataAccessException; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.NumberUtils; @@ -44,6 +45,7 @@ public abstract class DataAccessUtils { * @throws IncorrectResultSizeDataAccessException if more than one * element has been found in the given Collection */ + @Nullable public static T singleResult(Collection results) throws IncorrectResultSizeDataAccessException { int size = (results != null ? results.size() : 0); if (size == 0) { @@ -65,7 +67,7 @@ public abstract class DataAccessUtils { * @throws EmptyResultDataAccessException if no element at all * has been found in the given Collection */ - public static T requiredSingleResult(Collection results) throws IncorrectResultSizeDataAccessException { + public static T requiredSingleResult(@Nullable Collection results) throws IncorrectResultSizeDataAccessException { int size = (results != null ? results.size() : 0); if (size == 0) { throw new EmptyResultDataAccessException(1); @@ -86,7 +88,8 @@ public abstract class DataAccessUtils { * result object has been found in the given Collection * @see org.springframework.util.CollectionUtils#hasUniqueObject */ - public static T uniqueResult(Collection results) throws IncorrectResultSizeDataAccessException { + @Nullable + public static T uniqueResult(@Nullable Collection results) throws IncorrectResultSizeDataAccessException { int size = (results != null ? results.size() : 0); if (size == 0) { return null; @@ -108,7 +111,7 @@ public abstract class DataAccessUtils { * has been found in the given Collection * @see org.springframework.util.CollectionUtils#hasUniqueObject */ - public static T requiredUniqueResult(Collection results) throws IncorrectResultSizeDataAccessException { + public static T requiredUniqueResult(@Nullable Collection results) throws IncorrectResultSizeDataAccessException { int size = (results != null ? results.size() : 0); if (size == 0) { throw new EmptyResultDataAccessException(1); @@ -134,7 +137,7 @@ public abstract class DataAccessUtils { * not match the specified required type */ @SuppressWarnings("unchecked") - public static T objectResult(Collection results, Class requiredType) + public static T objectResult(@Nullable Collection results, Class requiredType) throws IncorrectResultSizeDataAccessException, TypeMismatchDataAccessException { Object result = requiredUniqueResult(results); @@ -172,7 +175,7 @@ public abstract class DataAccessUtils { * @throws TypeMismatchDataAccessException if the unique object * in the collection is not convertible to an int */ - public static int intResult(Collection results) + public static int intResult(@Nullable Collection results) throws IncorrectResultSizeDataAccessException, TypeMismatchDataAccessException { return objectResult(results, Number.class).intValue(); @@ -191,7 +194,7 @@ public abstract class DataAccessUtils { * @throws TypeMismatchDataAccessException if the unique object * in the collection is not convertible to a long */ - public static long longResult(Collection results) + public static long longResult(@Nullable Collection results) throws IncorrectResultSizeDataAccessException, TypeMismatchDataAccessException { return objectResult(results, Number.class).longValue(); diff --git a/spring-tx/src/main/java/org/springframework/dao/support/PersistenceExceptionTranslator.java b/spring-tx/src/main/java/org/springframework/dao/support/PersistenceExceptionTranslator.java index e8351de2303..3985818961c 100644 --- a/spring-tx/src/main/java/org/springframework/dao/support/PersistenceExceptionTranslator.java +++ b/spring-tx/src/main/java/org/springframework/dao/support/PersistenceExceptionTranslator.java @@ -17,6 +17,7 @@ package org.springframework.dao.support; import org.springframework.dao.DataAccessException; +import org.springframework.lang.Nullable; /** * Interface implemented by Spring integrations with data access technologies @@ -51,6 +52,7 @@ public interface PersistenceExceptionTranslator { * @see org.springframework.dao.DataIntegrityViolationException * @see org.springframework.jdbc.support.SQLExceptionTranslator */ + @Nullable DataAccessException translateExceptionIfPossible(RuntimeException ex); } diff --git a/spring-tx/src/main/java/org/springframework/dao/support/package-info.java b/spring-tx/src/main/java/org/springframework/dao/support/package-info.java index fee1509b043..25f757ab878 100644 --- a/spring-tx/src/main/java/org/springframework/dao/support/package-info.java +++ b/spring-tx/src/main/java/org/springframework/dao/support/package-info.java @@ -2,4 +2,7 @@ * Support classes for DAO implementations, * providing miscellaneous utility methods. */ +@NonNullApi package org.springframework.dao.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/jca/cci/connection/ConnectionFactoryUtils.java b/spring-tx/src/main/java/org/springframework/jca/cci/connection/ConnectionFactoryUtils.java index 482a8dc0c92..0e0b0479b26 100644 --- a/spring-tx/src/main/java/org/springframework/jca/cci/connection/ConnectionFactoryUtils.java +++ b/spring-tx/src/main/java/org/springframework/jca/cci/connection/ConnectionFactoryUtils.java @@ -25,6 +25,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.jca.cci.CannotGetCciConnectionException; +import org.springframework.lang.Nullable; import org.springframework.transaction.support.ResourceHolderSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.Assert; @@ -87,7 +88,7 @@ public abstract class ConnectionFactoryUtils { * if the attempt to get a Connection failed * @see #releaseConnection */ - public static Connection getConnection(ConnectionFactory cf, ConnectionSpec spec) + public static Connection getConnection(ConnectionFactory cf, @Nullable ConnectionSpec spec) throws CannotGetCciConnectionException { try { if (spec != null) { @@ -145,7 +146,7 @@ public abstract class ConnectionFactoryUtils { * (may be {@code null}) * @return whether the Connection is transactional */ - public static boolean isConnectionTransactional(Connection con, ConnectionFactory cf) { + public static boolean isConnectionTransactional(Connection con, @Nullable ConnectionFactory cf) { if (cf == null) { return false; } @@ -162,7 +163,7 @@ public abstract class ConnectionFactoryUtils { * (can be {@code null}) * @see #getConnection */ - public static void releaseConnection(Connection con, ConnectionFactory cf) { + public static void releaseConnection(Connection con, @Nullable ConnectionFactory cf) { try { doReleaseConnection(con, cf); } @@ -186,7 +187,7 @@ public abstract class ConnectionFactoryUtils { * @throws ResourceException if thrown by JCA CCI methods * @see #doGetConnection */ - public static void doReleaseConnection(Connection con, ConnectionFactory cf) throws ResourceException { + public static void doReleaseConnection(Connection con, @Nullable ConnectionFactory cf) throws ResourceException { if (con == null || isConnectionTransactional(con, cf)) { return; } diff --git a/spring-tx/src/main/java/org/springframework/jca/cci/connection/package-info.java b/spring-tx/src/main/java/org/springframework/jca/cci/connection/package-info.java index d53934c18b3..6e101b417b0 100644 --- a/spring-tx/src/main/java/org/springframework/jca/cci/connection/package-info.java +++ b/spring-tx/src/main/java/org/springframework/jca/cci/connection/package-info.java @@ -3,4 +3,7 @@ * a PlatformTransactionManager for local CCI transactions, * and various simple ConnectionFactory proxies/adapters. */ +@NonNullApi package org.springframework.jca.cci.connection; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/jca/cci/core/CciOperations.java b/spring-tx/src/main/java/org/springframework/jca/cci/core/CciOperations.java index 5982c036d1b..e06186c3e52 100644 --- a/spring-tx/src/main/java/org/springframework/jca/cci/core/CciOperations.java +++ b/spring-tx/src/main/java/org/springframework/jca/cci/core/CciOperations.java @@ -20,6 +20,7 @@ import javax.resource.cci.InteractionSpec; import javax.resource.cci.Record; import org.springframework.dao.DataAccessException; +import org.springframework.lang.Nullable; /** * Interface that specifies a basic set of CCI operations on an EIS. @@ -47,6 +48,7 @@ public interface CciOperations { * @return the result object returned by the action, if any * @throws DataAccessException if there is any problem */ + @Nullable T execute(ConnectionCallback action) throws DataAccessException; /** @@ -62,6 +64,7 @@ public interface CciOperations { * @return the result object returned by the action, if any * @throws DataAccessException if there is any problem */ + @Nullable T execute(InteractionCallback action) throws DataAccessException; /** diff --git a/spring-tx/src/main/java/org/springframework/jca/cci/core/CciTemplate.java b/spring-tx/src/main/java/org/springframework/jca/cci/core/CciTemplate.java index 4bd46036ca6..5480a95cb18 100644 --- a/spring-tx/src/main/java/org/springframework/jca/cci/core/CciTemplate.java +++ b/spring-tx/src/main/java/org/springframework/jca/cci/core/CciTemplate.java @@ -17,6 +17,7 @@ package org.springframework.jca.cci.core; import java.sql.SQLException; + import javax.resource.NotSupportedException; import javax.resource.ResourceException; import javax.resource.cci.Connection; @@ -41,6 +42,7 @@ import org.springframework.jca.cci.InvalidResultSetAccessException; import org.springframework.jca.cci.RecordTypeNotSupportedException; import org.springframework.jca.cci.connection.ConnectionFactoryUtils; import org.springframework.jca.cci.connection.NotSupportedRecordFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -103,7 +105,7 @@ public class CciTemplate implements CciOperations { * @param connectionSpec the CCI ConnectionSpec to obtain Connections for * (may be {@code null}) */ - public CciTemplate(ConnectionFactory connectionFactory, ConnectionSpec connectionSpec) { + public CciTemplate(ConnectionFactory connectionFactory, @Nullable ConnectionSpec connectionSpec) { setConnectionFactory(connectionFactory); setConnectionSpec(connectionSpec); afterPropertiesSet(); @@ -135,6 +137,7 @@ public class CciTemplate implements CciOperations { /** * Return the CCI ConnectionSpec used by this template, if any. */ + @Nullable public ConnectionSpec getConnectionSpec() { return this.connectionSpec; } @@ -158,6 +161,7 @@ public class CciTemplate implements CciOperations { /** * Return a RecordCreator that should be used for creating default output Records. */ + @Nullable public RecordCreator getOutputRecordCreator() { return this.outputRecordCreator; } @@ -267,7 +271,7 @@ public class CciTemplate implements CciOperations { * @throws DataAccessException if there is any problem */ protected T doExecute( - final InteractionSpec spec, final Record inputRecord, final Record outputRecord, + final InteractionSpec spec, final Record inputRecord, @Nullable final Record outputRecord, final RecordExtractor outputExtractor) throws DataAccessException { return execute(new InteractionCallback() { diff --git a/spring-tx/src/main/java/org/springframework/jca/cci/core/ConnectionCallback.java b/spring-tx/src/main/java/org/springframework/jca/cci/core/ConnectionCallback.java index 3729b682e1a..ba7f90c07df 100644 --- a/spring-tx/src/main/java/org/springframework/jca/cci/core/ConnectionCallback.java +++ b/spring-tx/src/main/java/org/springframework/jca/cci/core/ConnectionCallback.java @@ -17,11 +17,13 @@ package org.springframework.jca.cci.core; import java.sql.SQLException; + import javax.resource.ResourceException; import javax.resource.cci.Connection; import javax.resource.cci.ConnectionFactory; import org.springframework.dao.DataAccessException; +import org.springframework.lang.Nullable; /** * Generic callback interface for code that operates on a CCI Connection. @@ -70,6 +72,7 @@ public interface ConnectionCallback { * @see javax.resource.cci.ConnectionFactory#getMetaData() * @see CciTemplate#execute(javax.resource.cci.InteractionSpec, RecordCreator, RecordExtractor) */ + @Nullable T doInConnection(Connection connection, ConnectionFactory connectionFactory) throws ResourceException, SQLException, DataAccessException; diff --git a/spring-tx/src/main/java/org/springframework/jca/cci/core/InteractionCallback.java b/spring-tx/src/main/java/org/springframework/jca/cci/core/InteractionCallback.java index d480ca71152..2d404ca6a9b 100644 --- a/spring-tx/src/main/java/org/springframework/jca/cci/core/InteractionCallback.java +++ b/spring-tx/src/main/java/org/springframework/jca/cci/core/InteractionCallback.java @@ -17,11 +17,13 @@ package org.springframework.jca.cci.core; import java.sql.SQLException; + import javax.resource.ResourceException; import javax.resource.cci.ConnectionFactory; import javax.resource.cci.Interaction; import org.springframework.dao.DataAccessException; +import org.springframework.lang.Nullable; /** * Generic callback interface for code that operates on a CCI Interaction. @@ -71,6 +73,7 @@ public interface InteractionCallback { * @see javax.resource.cci.ConnectionFactory#getMetaData() * @see CciTemplate#execute(javax.resource.cci.InteractionSpec, RecordCreator, RecordExtractor) */ + @Nullable T doInInteraction(Interaction interaction, ConnectionFactory connectionFactory) throws ResourceException, SQLException, DataAccessException; diff --git a/spring-tx/src/main/java/org/springframework/jca/cci/core/RecordExtractor.java b/spring-tx/src/main/java/org/springframework/jca/cci/core/RecordExtractor.java index 058689707db..f5714fa63ee 100644 --- a/spring-tx/src/main/java/org/springframework/jca/cci/core/RecordExtractor.java +++ b/spring-tx/src/main/java/org/springframework/jca/cci/core/RecordExtractor.java @@ -17,10 +17,12 @@ package org.springframework.jca.cci.core; import java.sql.SQLException; + import javax.resource.ResourceException; import javax.resource.cci.Record; import org.springframework.dao.DataAccessException; +import org.springframework.lang.Nullable; /** * Callback interface for extracting a result object from a CCI Record instance. @@ -58,6 +60,7 @@ public interface RecordExtractor { * @throws DataAccessException in case of custom exceptions * @see javax.resource.cci.ResultSet */ + @Nullable T extractData(Record record) throws ResourceException, SQLException, DataAccessException; } diff --git a/spring-tx/src/main/java/org/springframework/jca/cci/core/package-info.java b/spring-tx/src/main/java/org/springframework/jca/cci/core/package-info.java index 2355d8e16b8..df593e88c52 100644 --- a/spring-tx/src/main/java/org/springframework/jca/cci/core/package-info.java +++ b/spring-tx/src/main/java/org/springframework/jca/cci/core/package-info.java @@ -2,4 +2,7 @@ * Provides the core JCA CCI support, based on CciTemplate * and its associated callback interfaces. */ +@NonNullApi package org.springframework.jca.cci.core; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/jca/cci/core/support/package-info.java b/spring-tx/src/main/java/org/springframework/jca/cci/core/support/package-info.java index c32695212f9..46d9e5f6e45 100644 --- a/spring-tx/src/main/java/org/springframework/jca/cci/core/support/package-info.java +++ b/spring-tx/src/main/java/org/springframework/jca/cci/core/support/package-info.java @@ -2,4 +2,7 @@ * Classes supporting the {@code org.springframework.jca.cci.core} package. * Contains a DAO base class for CciTemplate usage. */ +@NonNullApi package org.springframework.jca.cci.core.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/jca/cci/object/package-info.java b/spring-tx/src/main/java/org/springframework/jca/cci/object/package-info.java index caace5c3c5a..9369900c21a 100644 --- a/spring-tx/src/main/java/org/springframework/jca/cci/object/package-info.java +++ b/spring-tx/src/main/java/org/springframework/jca/cci/object/package-info.java @@ -5,4 +5,7 @@ * Exceptions thrown are as in the {@code org.springframework.dao} package, * meaning that code using this package does not need to worry about error handling. */ +@NonNullApi package org.springframework.jca.cci.object; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/jca/cci/package-info.java b/spring-tx/src/main/java/org/springframework/jca/cci/package-info.java index a47904f2356..7c1fd13c791 100644 --- a/spring-tx/src/main/java/org/springframework/jca/cci/package-info.java +++ b/spring-tx/src/main/java/org/springframework/jca/cci/package-info.java @@ -4,4 +4,7 @@ * to the {@code org.springframework.jdbc} package, providing the same * levels of data access abstraction. */ +@NonNullApi package org.springframework.jca.cci; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/jca/context/SpringContextResourceAdapter.java b/spring-tx/src/main/java/org/springframework/jca/context/SpringContextResourceAdapter.java index 04b6e3ac029..0c0dcf1e5cc 100644 --- a/spring-tx/src/main/java/org/springframework/jca/context/SpringContextResourceAdapter.java +++ b/spring-tx/src/main/java/org/springframework/jca/context/SpringContextResourceAdapter.java @@ -33,6 +33,7 @@ import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.StandardEnvironment; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -230,6 +231,7 @@ public class SpringContextResourceAdapter implements ResourceAdapter { * This implementation always returns {@code null}. */ @Override + @Nullable public XAResource[] getXAResources(ActivationSpec[] activationSpecs) throws ResourceException { return null; } diff --git a/spring-tx/src/main/java/org/springframework/jca/context/package-info.java b/spring-tx/src/main/java/org/springframework/jca/context/package-info.java index c3b2f62e56d..bb4dc6fdfd3 100644 --- a/spring-tx/src/main/java/org/springframework/jca/context/package-info.java +++ b/spring-tx/src/main/java/org/springframework/jca/context/package-info.java @@ -2,4 +2,7 @@ * Integration package that allows for deploying a Spring application context * as a JCA 1.7 compliant RAR file. */ +@NonNullApi package org.springframework.jca.context; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/jca/endpoint/AbstractMessageEndpointFactory.java b/spring-tx/src/main/java/org/springframework/jca/endpoint/AbstractMessageEndpointFactory.java index 5f7883e0aad..893e2d8c5cd 100644 --- a/spring-tx/src/main/java/org/springframework/jca/endpoint/AbstractMessageEndpointFactory.java +++ b/spring-tx/src/main/java/org/springframework/jca/endpoint/AbstractMessageEndpointFactory.java @@ -30,6 +30,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.BeanNameAware; +import org.springframework.lang.Nullable; import org.springframework.transaction.jta.SimpleTransactionFactory; import org.springframework.transaction.jta.TransactionFactory; @@ -135,6 +136,7 @@ public abstract class AbstractMessageEndpointFactory implements MessageEndpointF * @see #setBeanName */ @Override + @Nullable public String getActivationName() { return this.beanName; } @@ -144,6 +146,7 @@ public abstract class AbstractMessageEndpointFactory implements MessageEndpointF * returning {@code} null in order to indicate a synthetic endpoint type. */ @Override + @Nullable public Class getEndpointClass() { return null; } diff --git a/spring-tx/src/main/java/org/springframework/jca/endpoint/package-info.java b/spring-tx/src/main/java/org/springframework/jca/endpoint/package-info.java index 5a1a7cde69b..fe6beaa826c 100644 --- a/spring-tx/src/main/java/org/springframework/jca/endpoint/package-info.java +++ b/spring-tx/src/main/java/org/springframework/jca/endpoint/package-info.java @@ -1,4 +1,7 @@ /** * This package provides a facility for generic JCA message endpoint management. */ +@NonNullApi package org.springframework.jca.endpoint; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/jca/support/SimpleBootstrapContext.java b/spring-tx/src/main/java/org/springframework/jca/support/SimpleBootstrapContext.java index 3cca326ea33..1ecfd9be869 100644 --- a/spring-tx/src/main/java/org/springframework/jca/support/SimpleBootstrapContext.java +++ b/spring-tx/src/main/java/org/springframework/jca/support/SimpleBootstrapContext.java @@ -17,6 +17,7 @@ package org.springframework.jca.support; import java.util.Timer; + import javax.resource.spi.BootstrapContext; import javax.resource.spi.UnavailableException; import javax.resource.spi.XATerminator; @@ -24,6 +25,8 @@ import javax.resource.spi.work.WorkContext; import javax.resource.spi.work.WorkManager; import javax.transaction.TransactionSynchronizationRegistry; +import org.springframework.lang.Nullable; + /** * Simple implementation of the JCA 1.7 {@link javax.resource.spi.BootstrapContext} * interface, used for bootstrapping a JCA ResourceAdapter in a local environment. @@ -50,7 +53,7 @@ public class SimpleBootstrapContext implements BootstrapContext { * with no XATerminator available. * @param workManager the JCA WorkManager to use (may be {@code null}) */ - public SimpleBootstrapContext(WorkManager workManager) { + public SimpleBootstrapContext(@Nullable WorkManager workManager) { this.workManager = workManager; } @@ -59,7 +62,7 @@ public class SimpleBootstrapContext implements BootstrapContext { * @param workManager the JCA WorkManager to use (may be {@code null}) * @param xaTerminator the JCA XATerminator to use (may be {@code null}) */ - public SimpleBootstrapContext(WorkManager workManager, XATerminator xaTerminator) { + public SimpleBootstrapContext(@Nullable WorkManager workManager, @Nullable XATerminator xaTerminator) { this.workManager = workManager; this.xaTerminator = xaTerminator; } @@ -73,8 +76,8 @@ public class SimpleBootstrapContext implements BootstrapContext { * to use (may be {@code null}) * @since 5.0 */ - public SimpleBootstrapContext(WorkManager workManager, XATerminator xaTerminator, - TransactionSynchronizationRegistry transactionSynchronizationRegistry) { + public SimpleBootstrapContext(@Nullable WorkManager workManager, @Nullable XATerminator xaTerminator, + @Nullable TransactionSynchronizationRegistry transactionSynchronizationRegistry) { this.workManager = workManager; this.xaTerminator = xaTerminator; diff --git a/spring-tx/src/main/java/org/springframework/jca/support/package-info.java b/spring-tx/src/main/java/org/springframework/jca/support/package-info.java index 133f84dacbc..9abe8fb34a9 100644 --- a/spring-tx/src/main/java/org/springframework/jca/support/package-info.java +++ b/spring-tx/src/main/java/org/springframework/jca/support/package-info.java @@ -2,4 +2,7 @@ * Provides generic support classes for JCA usage within Spring, * mainly for local setup of a JCA ResourceAdapter and/or ConnectionFactory. */ +@NonNullApi package org.springframework.jca.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/jca/work/WorkManagerTaskExecutor.java b/spring-tx/src/main/java/org/springframework/jca/work/WorkManagerTaskExecutor.java index 6f9aaa5bc57..5aafc72b542 100644 --- a/spring-tx/src/main/java/org/springframework/jca/work/WorkManagerTaskExecutor.java +++ b/spring-tx/src/main/java/org/springframework/jca/work/WorkManagerTaskExecutor.java @@ -35,6 +35,7 @@ import org.springframework.core.task.TaskRejectedException; import org.springframework.core.task.TaskTimeoutException; import org.springframework.jca.context.BootstrapContextAware; import org.springframework.jndi.JndiLocatorSupport; +import org.springframework.lang.Nullable; import org.springframework.scheduling.SchedulingException; import org.springframework.scheduling.SchedulingTaskExecutor; import org.springframework.util.Assert; @@ -157,7 +158,7 @@ public class WorkManagerTaskExecutor extends JndiLocatorSupport *

    This shared WorkListener instance will be passed on to the * WorkManager by all {@link #execute} calls on this TaskExecutor. */ - public void setWorkListener(WorkListener workListener) { + public void setWorkListener(@Nullable WorkListener workListener) { this.workListener = workListener; } diff --git a/spring-tx/src/main/java/org/springframework/jca/work/package-info.java b/spring-tx/src/main/java/org/springframework/jca/work/package-info.java index ef83b0e3bab..4a0eb0ca87b 100644 --- a/spring-tx/src/main/java/org/springframework/jca/work/package-info.java +++ b/spring-tx/src/main/java/org/springframework/jca/work/package-info.java @@ -2,4 +2,7 @@ * Convenience classes for scheduling based on the JCA WorkManager facility, * as supported within ResourceAdapters. */ +@NonNullApi package org.springframework.jca.work; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/transaction/PlatformTransactionManager.java b/spring-tx/src/main/java/org/springframework/transaction/PlatformTransactionManager.java index 2c2030f6bc9..ad5512c3bf1 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/PlatformTransactionManager.java +++ b/spring-tx/src/main/java/org/springframework/transaction/PlatformTransactionManager.java @@ -16,6 +16,8 @@ package org.springframework.transaction; +import org.springframework.lang.Nullable; + /** * This is the central interface in Spring's transaction infrastructure. * Applications can use this directly, but it is not primarily meant as API: @@ -66,7 +68,7 @@ public interface PlatformTransactionManager { * @see TransactionDefinition#getTimeout * @see TransactionDefinition#isReadOnly */ - TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; + TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException; /** * Commit the given transaction, with regard to its status. If the transaction diff --git a/spring-tx/src/main/java/org/springframework/transaction/TransactionDefinition.java b/spring-tx/src/main/java/org/springframework/transaction/TransactionDefinition.java index a45c096e1ba..84d75f3498c 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/TransactionDefinition.java +++ b/spring-tx/src/main/java/org/springframework/transaction/TransactionDefinition.java @@ -18,6 +18,8 @@ package org.springframework.transaction; import java.sql.Connection; +import org.springframework.lang.Nullable; + /** * Interface that defines Spring-compliant transaction properties. * Based on the propagation behavior definitions analogous to EJB CMT attributes. @@ -253,6 +255,7 @@ public interface TransactionDefinition { * @see org.springframework.transaction.interceptor.TransactionAspectSupport * @see org.springframework.transaction.support.TransactionSynchronizationManager#getCurrentTransactionName() */ + @Nullable String getName(); } diff --git a/spring-tx/src/main/java/org/springframework/transaction/TransactionSystemException.java b/spring-tx/src/main/java/org/springframework/transaction/TransactionSystemException.java index 2af9b448ce8..24c12488762 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/TransactionSystemException.java +++ b/spring-tx/src/main/java/org/springframework/transaction/TransactionSystemException.java @@ -16,6 +16,7 @@ package org.springframework.transaction; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -69,6 +70,7 @@ public class TransactionSystemException extends TransactionException { * if any. * @return the application exception, or {@code null} if none set */ + @Nullable public final Throwable getApplicationException() { return this.applicationException; } @@ -78,6 +80,7 @@ public class TransactionSystemException extends TransactionException { * i.e. the application exception, if any, or the TransactionSystemException's own cause. * @return the original exception, or {@code null} if there was none */ + @Nullable public Throwable getOriginalException() { return (this.applicationException != null ? this.applicationException : getCause()); } diff --git a/spring-tx/src/main/java/org/springframework/transaction/annotation/AnnotationTransactionAttributeSource.java b/spring-tx/src/main/java/org/springframework/transaction/annotation/AnnotationTransactionAttributeSource.java index 08722d5b4ba..53c23a14a4b 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/annotation/AnnotationTransactionAttributeSource.java +++ b/spring-tx/src/main/java/org/springframework/transaction/annotation/AnnotationTransactionAttributeSource.java @@ -23,6 +23,7 @@ import java.util.Collections; import java.util.LinkedHashSet; import java.util.Set; +import org.springframework.lang.Nullable; import org.springframework.transaction.interceptor.AbstractFallbackTransactionAttributeSource; import org.springframework.transaction.interceptor.TransactionAttribute; import org.springframework.util.Assert; @@ -149,6 +150,7 @@ public class AnnotationTransactionAttributeSource extends AbstractFallbackTransa * @return TransactionAttribute the configured transaction attribute, * or {@code null} if none was found */ + @Nullable protected TransactionAttribute determineTransactionAttribute(AnnotatedElement ae) { for (TransactionAnnotationParser annotationParser : this.annotationParsers) { TransactionAttribute attr = annotationParser.parseTransactionAnnotation(ae); diff --git a/spring-tx/src/main/java/org/springframework/transaction/annotation/TransactionAnnotationParser.java b/spring-tx/src/main/java/org/springframework/transaction/annotation/TransactionAnnotationParser.java index 558b464028e..c47c86ba8d3 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/annotation/TransactionAnnotationParser.java +++ b/spring-tx/src/main/java/org/springframework/transaction/annotation/TransactionAnnotationParser.java @@ -18,6 +18,7 @@ package org.springframework.transaction.annotation; import java.lang.reflect.AnnotatedElement; +import org.springframework.lang.Nullable; import org.springframework.transaction.interceptor.TransactionAttribute; /** @@ -47,6 +48,7 @@ public interface TransactionAnnotationParser { * or {@code null} if none was found * @see AnnotationTransactionAttributeSource#determineTransactionAttribute */ + @Nullable TransactionAttribute parseTransactionAnnotation(AnnotatedElement ae); } diff --git a/spring-tx/src/main/java/org/springframework/transaction/annotation/package-info.java b/spring-tx/src/main/java/org/springframework/transaction/annotation/package-info.java index 152819a3b8c..77626fb012b 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/annotation/package-info.java +++ b/spring-tx/src/main/java/org/springframework/transaction/annotation/package-info.java @@ -3,4 +3,7 @@ * Hooked into Spring's transaction interception infrastructure * via a special TransactionAttributeSource implementation. */ +@NonNullApi package org.springframework.transaction.annotation; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/transaction/config/package-info.java b/spring-tx/src/main/java/org/springframework/transaction/config/package-info.java index 32af9ae1ce5..4b3b82bdf5b 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/config/package-info.java +++ b/spring-tx/src/main/java/org/springframework/transaction/config/package-info.java @@ -2,4 +2,7 @@ * Support package for declarative transaction configuration, * with XML schema being the primary configuration format. */ +@NonNullApi package org.springframework.transaction.config; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/transaction/event/package-info.java b/spring-tx/src/main/java/org/springframework/transaction/event/package-info.java index 037c8e03245..a5fcfd7131b 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/event/package-info.java +++ b/spring-tx/src/main/java/org/springframework/transaction/event/package-info.java @@ -1,4 +1,7 @@ /** * Spring's support for listening to transaction events. */ +@NonNullApi package org.springframework.transaction.event; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/transaction/interceptor/AbstractFallbackTransactionAttributeSource.java b/spring-tx/src/main/java/org/springframework/transaction/interceptor/AbstractFallbackTransactionAttributeSource.java index b1c310f1c63..aad08eecc36 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/interceptor/AbstractFallbackTransactionAttributeSource.java +++ b/spring-tx/src/main/java/org/springframework/transaction/interceptor/AbstractFallbackTransactionAttributeSource.java @@ -26,6 +26,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.core.BridgeMethodResolver; import org.springframework.core.MethodClassKey; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -81,7 +82,7 @@ public abstract class AbstractFallbackTransactionAttributeSource implements Tran * is not transactional */ @Override - public TransactionAttribute getTransactionAttribute(Method method, Class targetClass) { + public TransactionAttribute getTransactionAttribute(Method method, @Nullable Class targetClass) { if (method.getDeclaringClass() == Object.class) { return null; } @@ -128,7 +129,7 @@ public abstract class AbstractFallbackTransactionAttributeSource implements Tran * @param targetClass the target class (may be {@code null}) * @return the cache key (never {@code null}) */ - protected Object getCacheKey(Method method, Class targetClass) { + protected Object getCacheKey(Method method, @Nullable Class targetClass) { return new MethodClassKey(method, targetClass); } @@ -139,6 +140,7 @@ public abstract class AbstractFallbackTransactionAttributeSource implements Tran * @since 4.1.8 * @see #getTransactionAttribute */ + @Nullable protected TransactionAttribute computeTransactionAttribute(Method method, Class targetClass) { // Don't allow no-public methods as required. if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) { @@ -189,6 +191,7 @@ public abstract class AbstractFallbackTransactionAttributeSource implements Tran * @return all transaction attribute associated with this method * (or {@code null} if none) */ + @Nullable protected abstract TransactionAttribute findTransactionAttribute(Method method); /** @@ -198,6 +201,7 @@ public abstract class AbstractFallbackTransactionAttributeSource implements Tran * @return all transaction attribute associated with this class * (or {@code null} if none) */ + @Nullable protected abstract TransactionAttribute findTransactionAttribute(Class clazz); diff --git a/spring-tx/src/main/java/org/springframework/transaction/interceptor/DefaultTransactionAttribute.java b/spring-tx/src/main/java/org/springframework/transaction/interceptor/DefaultTransactionAttribute.java index fc45334c035..753f6b25df2 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/interceptor/DefaultTransactionAttribute.java +++ b/spring-tx/src/main/java/org/springframework/transaction/interceptor/DefaultTransactionAttribute.java @@ -16,6 +16,7 @@ package org.springframework.transaction.interceptor; +import org.springframework.lang.Nullable; import org.springframework.transaction.support.DefaultTransactionDefinition; /** @@ -106,6 +107,7 @@ public class DefaultTransactionAttribute extends DefaultTransactionDefinition im * or {@code null} if none. * @since 4.3.4 */ + @Nullable public String getDescriptor() { return this.descriptor; } diff --git a/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java b/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java index 035cfaab80d..3180254eaa5 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java +++ b/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java @@ -28,6 +28,7 @@ import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.BeanFactoryAnnotationUtils; import org.springframework.core.NamedThreadLocal; +import org.springframework.lang.Nullable; import org.springframework.transaction.NoTransactionException; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionStatus; @@ -105,6 +106,7 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init * @see org.springframework.transaction.support.TransactionSynchronizationManager#isSynchronizationActive() * @see org.springframework.transaction.support.TransactionSynchronizationManager#isActualTransactionActive() */ + @Nullable protected static TransactionInfo currentTransactionInfo() throws NoTransactionException { return transactionInfoHolder.get(); } @@ -167,6 +169,7 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init /** * Return the default transaction manager, or {@code null} if unknown. */ + @Nullable public PlatformTransactionManager getTransactionManager() { return this.transactionManager; } @@ -264,6 +267,7 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init * @return the return value of the method, if any * @throws Throwable propagated from the target invocation */ + @Nullable protected Object invokeWithinTransaction(Method method, Class targetClass, final InvocationCallback invocation) throws Throwable { @@ -411,6 +415,7 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init * @return a String representation identifying this method * @see org.springframework.util.ClassUtils#getQualifiedMethodName */ + @Nullable protected String methodIdentification(Method method, Class targetClass) { return null; } @@ -429,7 +434,7 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init */ @SuppressWarnings("serial") protected TransactionInfo createTransactionIfNecessary( - PlatformTransactionManager tm, TransactionAttribute txAttr, final String joinpointIdentification) { + PlatformTransactionManager tm, @Nullable TransactionAttribute txAttr, final String joinpointIdentification) { // If no name specified, apply method identification as transaction name. if (txAttr != null && txAttr.getName() == null) { @@ -465,7 +470,7 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init * @return the prepared TransactionInfo object */ protected TransactionInfo prepareTransactionInfo(PlatformTransactionManager tm, - TransactionAttribute txAttr, String joinpointIdentification, TransactionStatus status) { + @Nullable TransactionAttribute txAttr, String joinpointIdentification, TransactionStatus status) { TransactionInfo txInfo = new TransactionInfo(tm, txAttr, joinpointIdentification); if (txAttr != null) { @@ -563,7 +568,7 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init *

    Call this in all cases: exception or normal return! * @param txInfo information about the current transaction (may be {@code null}) */ - protected void cleanupTransactionInfo(TransactionInfo txInfo) { + protected void cleanupTransactionInfo(@Nullable TransactionInfo txInfo) { if (txInfo != null) { txInfo.restoreThreadLocalStatus(); } diff --git a/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAttributeSource.java b/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAttributeSource.java index a6a9250fce4..6d0c3dee004 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAttributeSource.java +++ b/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAttributeSource.java @@ -18,6 +18,8 @@ package org.springframework.transaction.interceptor; import java.lang.reflect.Method; +import org.springframework.lang.Nullable; + /** * Strategy interface used by {@link TransactionInterceptor} for metadata retrieval. * @@ -41,6 +43,7 @@ public interface TransactionAttributeSource { * @return TransactionAttribute the matching transaction attribute, * or {@code null} if none found */ - TransactionAttribute getTransactionAttribute(Method method, Class targetClass); + @Nullable + TransactionAttribute getTransactionAttribute(Method method, @Nullable Class targetClass); } diff --git a/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAttributeSourcePointcut.java b/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAttributeSourcePointcut.java index fa6d9e1ac64..d82040f20c5 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAttributeSourcePointcut.java +++ b/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAttributeSourcePointcut.java @@ -20,6 +20,7 @@ import java.io.Serializable; import java.lang.reflect.Method; import org.springframework.aop.support.StaticMethodMatcherPointcut; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -68,6 +69,7 @@ abstract class TransactionAttributeSourcePointcut extends StaticMethodMatcherPoi * Obtain the underlying TransactionAttributeSource (may be {@code null}). * To be implemented by subclasses. */ + @Nullable protected abstract TransactionAttributeSource getTransactionAttributeSource(); } diff --git a/spring-tx/src/main/java/org/springframework/transaction/interceptor/package-info.java b/spring-tx/src/main/java/org/springframework/transaction/interceptor/package-info.java index a34f97db978..70cf07abf9e 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/interceptor/package-info.java +++ b/spring-tx/src/main/java/org/springframework/transaction/interceptor/package-info.java @@ -11,4 +11,7 @@ * This allows declarative transaction management in any environment, * even without JTA if an application uses only a single database. */ +@NonNullApi package org.springframework.transaction.interceptor; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/transaction/jta/JtaTransactionManager.java b/spring-tx/src/main/java/org/springframework/transaction/jta/JtaTransactionManager.java index 4d46ebbca0c..4be8ba19c3f 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/jta/JtaTransactionManager.java +++ b/spring-tx/src/main/java/org/springframework/transaction/jta/JtaTransactionManager.java @@ -21,6 +21,7 @@ import java.io.ObjectInputStream; import java.io.Serializable; import java.util.List; import java.util.Properties; + import javax.naming.NamingException; import javax.transaction.HeuristicMixedException; import javax.transaction.HeuristicRollbackException; @@ -36,6 +37,7 @@ import javax.transaction.UserTransaction; import org.springframework.beans.factory.InitializingBean; import org.springframework.jndi.JndiTemplate; +import org.springframework.lang.Nullable; import org.springframework.transaction.CannotCreateTransactionException; import org.springframework.transaction.HeuristicCompletionException; import org.springframework.transaction.IllegalTransactionStateException; @@ -331,6 +333,7 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager /** * Return the JTA TransactionManager that this transaction manager uses, if any. */ + @Nullable public TransactionManager getTransactionManager() { return this.transactionManager; } @@ -383,6 +386,7 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager /** * Return the JTA 1.1 TransactionSynchronizationRegistry that this transaction manager uses, if any. */ + @Nullable public TransactionSynchronizationRegistry getTransactionSynchronizationRegistry() { return this.transactionSynchronizationRegistry; } @@ -632,6 +636,7 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager * @see #setUserTransaction * @see #setUserTransactionName */ + @Nullable protected UserTransaction retrieveUserTransaction() throws TransactionSystemException { return null; } @@ -645,6 +650,7 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager * @see #setTransactionManager * @see #setTransactionManagerName */ + @Nullable protected TransactionManager retrieveTransactionManager() throws TransactionSystemException { return null; } @@ -657,6 +663,7 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager * or {@code null} if none found * @throws TransactionSystemException in case of errors */ + @Nullable protected TransactionSynchronizationRegistry retrieveTransactionSynchronizationRegistry() throws TransactionSystemException { return null; } @@ -667,6 +674,7 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager * @return the JTA UserTransaction reference, or {@code null} if not found * @see #DEFAULT_USER_TRANSACTION_NAME */ + @Nullable protected UserTransaction findUserTransaction() { String jndiName = DEFAULT_USER_TRANSACTION_NAME; try { @@ -693,6 +701,7 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager * @return the JTA TransactionManager reference, or {@code null} if not found * @see #FALLBACK_TRANSACTION_MANAGER_NAMES */ + @Nullable protected TransactionManager findTransactionManager(UserTransaction ut) { if (ut instanceof TransactionManager) { if (logger.isDebugEnabled()) { @@ -732,6 +741,7 @@ public class JtaTransactionManager extends AbstractPlatformTransactionManager * or {@code null} if none found * @throws TransactionSystemException in case of errors */ + @Nullable protected TransactionSynchronizationRegistry findTransactionSynchronizationRegistry(UserTransaction ut, TransactionManager tm) throws TransactionSystemException { diff --git a/spring-tx/src/main/java/org/springframework/transaction/jta/TransactionFactory.java b/spring-tx/src/main/java/org/springframework/transaction/jta/TransactionFactory.java index aac7f91e5e3..d2b14df0971 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/jta/TransactionFactory.java +++ b/spring-tx/src/main/java/org/springframework/transaction/jta/TransactionFactory.java @@ -20,6 +20,8 @@ import javax.transaction.NotSupportedException; import javax.transaction.SystemException; import javax.transaction.Transaction; +import org.springframework.lang.Nullable; + /** * Strategy interface for creating JTA {@link javax.transaction.Transaction} * objects based on specified transactional characteristics. @@ -47,7 +49,7 @@ public interface TransactionFactory { * @throws SystemException if the transaction manager failed to create the * transaction */ - Transaction createTransaction(String name, int timeout) throws NotSupportedException, SystemException; + Transaction createTransaction(@Nullable String name, int timeout) throws NotSupportedException, SystemException; /** * Determine whether the underlying transaction manager supports XA transactions diff --git a/spring-tx/src/main/java/org/springframework/transaction/jta/package-info.java b/spring-tx/src/main/java/org/springframework/transaction/jta/package-info.java index 10a38004990..457655376ff 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/jta/package-info.java +++ b/spring-tx/src/main/java/org/springframework/transaction/jta/package-info.java @@ -1,4 +1,7 @@ /** * Transaction SPI implementation for JTA. */ +@NonNullApi package org.springframework.transaction.jta; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/transaction/package-info.java b/spring-tx/src/main/java/org/springframework/transaction/package-info.java index d28c7a7e5d5..c8303416d44 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/package-info.java +++ b/spring-tx/src/main/java/org/springframework/transaction/package-info.java @@ -3,4 +3,7 @@ * independent of any specific transaction management system. * Contains transaction manager, definition, and status interfaces. */ +@NonNullApi package org.springframework.transaction; + +import org.springframework.lang.NonNullApi; diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/AbstractPlatformTransactionManager.java b/spring-tx/src/main/java/org/springframework/transaction/support/AbstractPlatformTransactionManager.java index ce23664ba17..8448fb64917 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/AbstractPlatformTransactionManager.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/AbstractPlatformTransactionManager.java @@ -25,6 +25,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.core.Constants; +import org.springframework.lang.Nullable; import org.springframework.transaction.IllegalTransactionStateException; import org.springframework.transaction.InvalidTimeoutException; import org.springframework.transaction.NestedTransactionNotSupportedException; @@ -562,7 +563,8 @@ public abstract class AbstractPlatformTransactionManager implements PlatformTran * @see #doSuspend * @see #resume */ - protected final SuspendedResourcesHolder suspend(Object transaction) throws TransactionException { + @Nullable + protected final SuspendedResourcesHolder suspend(@Nullable Object transaction) throws TransactionException { if (TransactionSynchronizationManager.isSynchronizationActive()) { List suspendedSynchronizations = doSuspendSynchronization(); try { @@ -608,7 +610,7 @@ public abstract class AbstractPlatformTransactionManager implements PlatformTran * @see #doResume * @see #suspend */ - protected final void resume(Object transaction, SuspendedResourcesHolder resourcesHolder) + protected final void resume(Object transaction, @Nullable SuspendedResourcesHolder resourcesHolder) throws TransactionException { if (resourcesHolder != null) { diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/AbstractTransactionStatus.java b/spring-tx/src/main/java/org/springframework/transaction/support/AbstractTransactionStatus.java index 1cfcda34cda..7c15a7e0db1 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/AbstractTransactionStatus.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/AbstractTransactionStatus.java @@ -16,6 +16,7 @@ package org.springframework.transaction.support; +import org.springframework.lang.Nullable; import org.springframework.transaction.NestedTransactionNotSupportedException; import org.springframework.transaction.SavepointManager; import org.springframework.transaction.TransactionException; @@ -126,6 +127,7 @@ public abstract class AbstractTransactionStatus implements TransactionStatus { /** * Get the savepoint for this transaction, if any. */ + @Nullable protected Object getSavepoint() { return this.savepoint; } diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/CallbackPreferringPlatformTransactionManager.java b/spring-tx/src/main/java/org/springframework/transaction/support/CallbackPreferringPlatformTransactionManager.java index 6a1f9decf02..c6503577bef 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/CallbackPreferringPlatformTransactionManager.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/CallbackPreferringPlatformTransactionManager.java @@ -16,6 +16,7 @@ package org.springframework.transaction.support; +import org.springframework.lang.Nullable; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionException; @@ -53,6 +54,7 @@ public interface CallbackPreferringPlatformTransactionManager extends PlatformTr * @throws TransactionException in case of initialization, rollback, or system errors * @throws RuntimeException if thrown by the TransactionCallback */ + @Nullable T execute(TransactionDefinition definition, TransactionCallback callback) throws TransactionException; diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/DefaultTransactionStatus.java b/spring-tx/src/main/java/org/springframework/transaction/support/DefaultTransactionStatus.java index 22f6f46acc1..ab0bd64eb19 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/DefaultTransactionStatus.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/DefaultTransactionStatus.java @@ -16,6 +16,7 @@ package org.springframework.transaction.support; +import org.springframework.lang.Nullable; import org.springframework.transaction.NestedTransactionNotSupportedException; import org.springframework.transaction.SavepointManager; @@ -78,7 +79,7 @@ public class DefaultTransactionStatus extends AbstractTransactionStatus { */ public DefaultTransactionStatus( Object transaction, boolean newTransaction, boolean newSynchronization, - boolean readOnly, boolean debug, Object suspendedResources) { + boolean readOnly, boolean debug, @Nullable Object suspendedResources) { this.transaction = transaction; this.newTransaction = newTransaction; @@ -136,6 +137,7 @@ public class DefaultTransactionStatus extends AbstractTransactionStatus { * Return the holder for resources that have been suspended for this transaction, * if any. */ + @Nullable public Object getSuspendedResources() { return this.suspendedResources; } diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionCallback.java b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionCallback.java index 8e298d00811..6e3ac2d64b3 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionCallback.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionCallback.java @@ -16,6 +16,7 @@ package org.springframework.transaction.support; +import org.springframework.lang.Nullable; import org.springframework.transaction.TransactionStatus; /** @@ -50,6 +51,7 @@ public interface TransactionCallback { * @see TransactionTemplate#execute * @see CallbackPreferringPlatformTransactionManager#execute */ + @Nullable T doInTransaction(TransactionStatus status); } diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionOperations.java b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionOperations.java index bc1ffbc820d..51e62169f47 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionOperations.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionOperations.java @@ -16,6 +16,7 @@ package org.springframework.transaction.support; +import org.springframework.lang.Nullable; import org.springframework.transaction.TransactionException; /** @@ -40,6 +41,7 @@ public interface TransactionOperations { * @throws TransactionException in case of initialization, rollback, or system errors * @throws RuntimeException if thrown by the TransactionCallback */ + @Nullable T execute(TransactionCallback action) throws TransactionException; } diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionSynchronizationManager.java b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionSynchronizationManager.java index e3885bd6ecc..db948e05c4f 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionSynchronizationManager.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionSynchronizationManager.java @@ -29,6 +29,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.core.NamedThreadLocal; import org.springframework.core.annotation.AnnotationAwareOrderComparator; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -133,6 +134,7 @@ public abstract class TransactionSynchronizationManager { * resource object), or {@code null} if none * @see ResourceTransactionManager#getResourceFactory() */ + @Nullable public static Object getResource(Object key) { Object actualKey = TransactionSynchronizationUtils.unwrapResourceIfNecessary(key); Object value = doGetResource(actualKey); @@ -146,6 +148,7 @@ public abstract class TransactionSynchronizationManager { /** * Actually check the value of the resource that is bound for the given key. */ + @Nullable private static Object doGetResource(Object actualKey) { Map map = resources.get(); if (map == null) { @@ -217,6 +220,7 @@ public abstract class TransactionSynchronizationManager { * @param key the key to unbind (usually the resource factory) * @return the previously bound value, or {@code null} if none bound */ + @Nullable public static Object unbindResourceIfPossible(Object key) { Object actualKey = TransactionSynchronizationUtils.unwrapResourceIfNecessary(key); return doUnbindResource(actualKey); @@ -225,6 +229,7 @@ public abstract class TransactionSynchronizationManager { /** * Actually remove the value of the resource that is bound for the given key. */ + @Nullable private static Object doUnbindResource(Object actualKey) { Map map = resources.get(); if (map == null) { @@ -343,7 +348,7 @@ public abstract class TransactionSynchronizationManager { * @param name the name of the transaction, or {@code null} to reset it * @see org.springframework.transaction.TransactionDefinition#getName() */ - public static void setCurrentTransactionName(String name) { + public static void setCurrentTransactionName(@Nullable String name) { currentTransactionName.set(name); } @@ -353,6 +358,7 @@ public abstract class TransactionSynchronizationManager { * for example to optimize fetch strategies for specific named transactions. * @see org.springframework.transaction.TransactionDefinition#getName() */ + @Nullable public static String getCurrentTransactionName() { return currentTransactionName.get(); } @@ -400,7 +406,7 @@ public abstract class TransactionSynchronizationManager { * @see org.springframework.transaction.TransactionDefinition#ISOLATION_SERIALIZABLE * @see org.springframework.transaction.TransactionDefinition#getIsolationLevel() */ - public static void setCurrentTransactionIsolationLevel(Integer isolationLevel) { + public static void setCurrentTransactionIsolationLevel(@Nullable Integer isolationLevel) { currentTransactionIsolationLevel.set(isolationLevel); } @@ -421,6 +427,7 @@ public abstract class TransactionSynchronizationManager { * @see org.springframework.transaction.TransactionDefinition#ISOLATION_SERIALIZABLE * @see org.springframework.transaction.TransactionDefinition#getIsolationLevel() */ + @Nullable public static Integer getCurrentTransactionIsolationLevel() { return currentTransactionIsolationLevel.get(); } diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/package-info.java b/spring-tx/src/main/java/org/springframework/transaction/support/package-info.java index a7d4b63107f..7a6d172a4f2 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/package-info.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/package-info.java @@ -3,4 +3,7 @@ * Provides an abstract base class for transaction manager implementations, * and a template plus callback for transaction demarcation. */ +@NonNullApi package org.springframework.transaction.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/http/CacheControl.java b/spring-web/src/main/java/org/springframework/http/CacheControl.java index c99333445f3..2e8ce692f80 100644 --- a/spring-web/src/main/java/org/springframework/http/CacheControl.java +++ b/spring-web/src/main/java/org/springframework/http/CacheControl.java @@ -18,6 +18,7 @@ package org.springframework.http; import java.util.concurrent.TimeUnit; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -246,6 +247,7 @@ public class CacheControl { * Return the "Cache-Control" header value. * @return {@code null} if no directive was added, or the header value otherwise */ + @Nullable public String getHeaderValue() { StringBuilder ccValue = new StringBuilder(); if (this.maxAge != -1) { diff --git a/spring-web/src/main/java/org/springframework/http/ContentDisposition.java b/spring-web/src/main/java/org/springframework/http/ContentDisposition.java index a2dd5baece3..163d258dc8a 100644 --- a/spring-web/src/main/java/org/springframework/http/ContentDisposition.java +++ b/spring-web/src/main/java/org/springframework/http/ContentDisposition.java @@ -20,6 +20,7 @@ import java.io.ByteArrayOutputStream; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -61,6 +62,7 @@ public class ContentDisposition { * Return the disposition type, like for example {@literal inline}, {@literal attachment}, * {@literal form-data}, or {@code null} if not defined. */ + @Nullable public String getType() { return this.type; } @@ -68,6 +70,7 @@ public class ContentDisposition { /** * Return the value of the {@literal name} parameter, or {@code null} if not defined. */ + @Nullable public String getName() { return this.name; } @@ -76,6 +79,7 @@ public class ContentDisposition { * Return the value of the {@literal filename} parameter (or the value of the * {@literal filename*} one decoded as defined in the RFC 5987), or {@code null} if not defined. */ + @Nullable public String getFilename() { return this.filename; } @@ -83,6 +87,7 @@ public class ContentDisposition { /** * Return the charset defined in {@literal filename*} parameter, or {@code null} if not defined. */ + @Nullable public Charset getCharset() { return this.charset; } @@ -90,6 +95,7 @@ public class ContentDisposition { /** * Return the value of the {@literal size} parameter, or {@code null} if not defined. */ + @Nullable public Long getSize() { return this.size; } diff --git a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java index c3ce739265a..a8833f354f0 100644 --- a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java +++ b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java @@ -41,6 +41,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.LinkedCaseInsensitiveMap; import org.springframework.util.MultiValueMap; @@ -740,7 +741,7 @@ public class HttpHeaders implements MultiValueMap, Serializable * @see #setContentDisposition(ContentDisposition) * @see #getContentDisposition() */ - public void setContentDispositionFormData(String name, String filename) { + public void setContentDispositionFormData(String name, @Nullable String filename) { setContentDispositionFormData(name, filename, null); } @@ -756,7 +757,7 @@ public class HttpHeaders implements MultiValueMap, Serializable * @see #getContentDisposition() * @see RFC 7230 Section 3.2.4 */ - public void setContentDispositionFormData(String name, String filename, Charset charset) { + public void setContentDispositionFormData(String name, @Nullable String filename, @Nullable Charset charset) { Assert.notNull(name, "'name' must not be null"); ContentDisposition disposition = ContentDisposition.builder("form-data") .name(name).filename(filename, charset).build(); @@ -811,6 +812,7 @@ public class HttpHeaders implements MultiValueMap, Serializable * to get multiple content languages.

    * @since 5.0 */ + @Nullable public Locale getContentLanguage() { return getValuesAsList(CONTENT_LANGUAGE) .stream() @@ -852,6 +854,7 @@ public class HttpHeaders implements MultiValueMap, Serializable * by the {@code Content-Type} header. *

    Returns {@code null} when the content-type is unknown. */ + @Nullable public MediaType getContentType() { String value = getFirst(CONTENT_TYPE); return (StringUtils.hasLength(value) ? MediaType.parseMediaType(value) : null); @@ -936,6 +939,7 @@ public class HttpHeaders implements MultiValueMap, Serializable * {@linkplain InetSocketAddress#getPort() port} will be {@code 0}. * @since 5.0 */ + @Nullable public InetSocketAddress getHost() { String value = getFirst(HOST); if (value == null) { @@ -1076,6 +1080,7 @@ public class HttpHeaders implements MultiValueMap, Serializable * as specified by the {@code Location} header. *

    Returns {@code null} when the location is unknown. */ + @Nullable public URI getLocation() { String value = getFirst(LOCATION); return (value != null ? URI.create(value) : null); diff --git a/spring-web/src/main/java/org/springframework/http/HttpMethod.java b/spring-web/src/main/java/org/springframework/http/HttpMethod.java index 3a21183632d..62d7ffe36ad 100644 --- a/spring-web/src/main/java/org/springframework/http/HttpMethod.java +++ b/spring-web/src/main/java/org/springframework/http/HttpMethod.java @@ -19,6 +19,8 @@ package org.springframework.http; import java.util.HashMap; import java.util.Map; +import org.springframework.lang.Nullable; + /** * Java 5 enumeration of HTTP request methods. Intended for use * with {@link org.springframework.http.client.ClientHttpRequest} @@ -48,6 +50,7 @@ public enum HttpMethod { * @return the corresponding {@code HttpMethod}, or {@code null} if not found * @since 4.2.4 */ + @Nullable public static HttpMethod resolve(String method) { return (method != null ? mappings.get(method) : null); } diff --git a/spring-web/src/main/java/org/springframework/http/HttpRequest.java b/spring-web/src/main/java/org/springframework/http/HttpRequest.java index ad5bc9b7332..627982c4ed9 100644 --- a/spring-web/src/main/java/org/springframework/http/HttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/HttpRequest.java @@ -18,6 +18,8 @@ package org.springframework.http; import java.net.URI; +import org.springframework.lang.Nullable; + /** * Represents an HTTP request message, consisting of * {@linkplain #getMethod() method} and {@linkplain #getURI() uri}. @@ -32,6 +34,7 @@ public interface HttpRequest extends HttpMessage { * @return the HTTP method as an HttpMethod enum value, or {@code null} * if not resolvable (e.g. in case of a non-standard HTTP method) */ + @Nullable default HttpMethod getMethod() { return HttpMethod.resolve(getMethodValue()); } diff --git a/spring-web/src/main/java/org/springframework/http/MediaType.java b/spring-web/src/main/java/org/springframework/http/MediaType.java index 821e84bb228..a5564d5128d 100644 --- a/spring-web/src/main/java/org/springframework/http/MediaType.java +++ b/spring-web/src/main/java/org/springframework/http/MediaType.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.InvalidMimeTypeException; @@ -380,7 +381,7 @@ public class MediaType extends MimeType implements Serializable { * @param parameters the parameters, may be {@code null} * @throws IllegalArgumentException if any of the parameters contain illegal characters */ - public MediaType(MediaType other, Map parameters) { + public MediaType(MediaType other, @Nullable Map parameters) { super(other.getType(), other.getSubtype(), parameters); } @@ -391,7 +392,7 @@ public class MediaType extends MimeType implements Serializable { * @param parameters the parameters, may be {@code null} * @throws IllegalArgumentException if any of the parameters contain illegal characters */ - public MediaType(String type, String subtype, Map parameters) { + public MediaType(String type, String subtype, @Nullable Map parameters) { super(type, subtype, parameters); } diff --git a/spring-web/src/main/java/org/springframework/http/MediaTypeFactory.java b/spring-web/src/main/java/org/springframework/http/MediaTypeFactory.java index b5ecdd59f76..8cfb899a417 100644 --- a/spring-web/src/main/java/org/springframework/http/MediaTypeFactory.java +++ b/spring-web/src/main/java/org/springframework/http/MediaTypeFactory.java @@ -27,6 +27,7 @@ import java.util.Locale; import java.util.Optional; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; @@ -97,7 +98,7 @@ public class MediaTypeFactory { * @param resource the resource to introspect * @return the corresponding media type, or {@code null} if none found */ - public static Optional getMediaType(Resource resource) { + public static Optional getMediaType(@Nullable Resource resource) { return Optional.ofNullable(resource) .map(Resource::getFilename) .flatMap(MediaTypeFactory::getMediaType); @@ -108,7 +109,7 @@ public class MediaTypeFactory { * @param filename the file name plus extension * @return the corresponding media type, or {@code null} if none found */ - public static Optional getMediaType(String filename) { + public static Optional getMediaType(@Nullable String filename) { return getMediaTypes(filename).stream().findFirst(); } @@ -117,7 +118,7 @@ public class MediaTypeFactory { * @param filename the file name plus extension * @return the corresponding media types, or an empty list if none found */ - public static List getMediaTypes(String filename) { + public static List getMediaTypes(@Nullable String filename) { return Optional.ofNullable(StringUtils.getFilenameExtension(filename)) .map(s -> s.toLowerCase(Locale.ENGLISH)) .map(fileExtensionToMediaTypes::get) diff --git a/spring-web/src/main/java/org/springframework/http/RequestEntity.java b/spring-web/src/main/java/org/springframework/http/RequestEntity.java index cf7a0b95b56..09b5b795ddc 100644 --- a/spring-web/src/main/java/org/springframework/http/RequestEntity.java +++ b/spring-web/src/main/java/org/springframework/http/RequestEntity.java @@ -21,6 +21,7 @@ import java.net.URI; import java.nio.charset.Charset; import java.util.Arrays; +import org.springframework.lang.Nullable; import org.springframework.util.MultiValueMap; import org.springframework.util.ObjectUtils; @@ -159,6 +160,7 @@ public class RequestEntity extends HttpEntity { * @return the request's body type, or {@code null} if not known * @since 4.3 */ + @Nullable public Type getType() { if (this.type == null) { T body = getBody(); diff --git a/spring-web/src/main/java/org/springframework/http/ResponseCookie.java b/spring-web/src/main/java/org/springframework/http/ResponseCookie.java index 1a8f37798c7..46c62c16c5c 100644 --- a/spring-web/src/main/java/org/springframework/http/ResponseCookie.java +++ b/spring-web/src/main/java/org/springframework/http/ResponseCookie.java @@ -18,6 +18,7 @@ package org.springframework.http; import java.time.Duration; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -73,6 +74,7 @@ public final class ResponseCookie extends HttpCookie { /** * Return the cookie "Domain" attribute, or {@code null} if not set. */ + @Nullable public String getDomain() { return this.domain; } @@ -80,6 +82,7 @@ public final class ResponseCookie extends HttpCookie { /** * Return the cookie "Path" attribute, or {@code null} if not set. */ + @Nullable public String getPath() { return this.path; } diff --git a/spring-web/src/main/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.java b/spring-web/src/main/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.java index fdfd45163fd..9aed5b5051e 100644 --- a/spring-web/src/main/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.java +++ b/spring-web/src/main/java/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.java @@ -38,6 +38,7 @@ import org.apache.http.protocol.HttpContext; import org.springframework.beans.factory.DisposableBean; import org.springframework.http.HttpMethod; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -204,6 +205,7 @@ public class HttpComponentsClientHttpRequestFactory implements ClientHttpRequest * @since 4.2 * @see #mergeRequestConfig(RequestConfig) */ + @Nullable protected RequestConfig createRequestConfig(Object client) { if (client instanceof Configurable) { RequestConfig clientRequestConfig = ((Configurable) client).getConfig(); @@ -220,7 +222,8 @@ public class HttpComponentsClientHttpRequestFactory implements ClientHttpRequest * (may be {@code null} if the given client config is {@code null}) * @since 4.2 */ - protected RequestConfig mergeRequestConfig(RequestConfig clientConfig) { + @Nullable + protected RequestConfig mergeRequestConfig(@Nullable RequestConfig clientConfig) { if (this.requestConfig == null) { // nothing to merge return clientConfig; } @@ -286,6 +289,7 @@ public class HttpComponentsClientHttpRequestFactory implements ClientHttpRequest * @param uri the URI * @return the http context */ + @Nullable protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) { return null; } diff --git a/spring-web/src/main/java/org/springframework/http/client/InterceptingClientHttpRequestFactory.java b/spring-web/src/main/java/org/springframework/http/client/InterceptingClientHttpRequestFactory.java index e23190c8b8e..65857009616 100644 --- a/spring-web/src/main/java/org/springframework/http/client/InterceptingClientHttpRequestFactory.java +++ b/spring-web/src/main/java/org/springframework/http/client/InterceptingClientHttpRequestFactory.java @@ -21,6 +21,7 @@ import java.util.Collections; import java.util.List; import org.springframework.http.HttpMethod; +import org.springframework.lang.Nullable; /** * {@link ClientHttpRequestFactory} wrapper with support for {@link ClientHttpRequestInterceptor}s. @@ -41,7 +42,7 @@ public class InterceptingClientHttpRequestFactory extends AbstractClientHttpRequ * @param interceptors the interceptors that are to be applied (can be {@code null}) */ public InterceptingClientHttpRequestFactory(ClientHttpRequestFactory requestFactory, - List interceptors) { + @Nullable List interceptors) { super(requestFactory); this.interceptors = (interceptors != null ? interceptors : Collections.emptyList()); diff --git a/spring-web/src/main/java/org/springframework/http/client/SimpleClientHttpRequestFactory.java b/spring-web/src/main/java/org/springframework/http/client/SimpleClientHttpRequestFactory.java index 17bcd6c1d41..ab821d58f90 100644 --- a/spring-web/src/main/java/org/springframework/http/client/SimpleClientHttpRequestFactory.java +++ b/spring-web/src/main/java/org/springframework/http/client/SimpleClientHttpRequestFactory.java @@ -25,6 +25,7 @@ import java.net.URLConnection; import org.springframework.core.task.AsyncListenableTaskExecutor; import org.springframework.http.HttpMethod; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -180,7 +181,7 @@ public class SimpleClientHttpRequestFactory implements ClientHttpRequestFactory, * @return the opened connection * @throws IOException in case of I/O errors */ - protected HttpURLConnection openConnection(URL url, Proxy proxy) throws IOException { + protected HttpURLConnection openConnection(URL url, @Nullable Proxy proxy) throws IOException { URLConnection urlConnection = (proxy != null ? url.openConnection(proxy) : url.openConnection()); if (!HttpURLConnection.class.isInstance(urlConnection)) { throw new IllegalStateException("HttpURLConnection required for [" + url + "] but got: " + urlConnection); diff --git a/spring-web/src/main/java/org/springframework/http/client/package-info.java b/spring-web/src/main/java/org/springframework/http/client/package-info.java index c0e1c676ec0..ce85f7f341c 100644 --- a/spring-web/src/main/java/org/springframework/http/client/package-info.java +++ b/spring-web/src/main/java/org/springframework/http/client/package-info.java @@ -3,4 +3,7 @@ * contains the {@code ClientHttpRequest} and {@code ClientHttpResponse}, * as well as a basic implementation of these interfaces. */ +@NonNullApi package org.springframework.http.client; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/http/client/reactive/AbstractClientHttpRequest.java b/spring-web/src/main/java/org/springframework/http/client/reactive/AbstractClientHttpRequest.java index 88d480c6b0f..d2ab80aec73 100644 --- a/spring-web/src/main/java/org/springframework/http/client/reactive/AbstractClientHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/client/reactive/AbstractClientHttpRequest.java @@ -27,6 +27,7 @@ import reactor.core.publisher.Mono; import org.springframework.http.HttpCookie; import org.springframework.http.HttpHeaders; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.LinkedMultiValueMap; @@ -111,7 +112,7 @@ public abstract class AbstractClientHttpRequest implements ClientHttpRequest { * @param writeAction the action to write the request body (may be {@code null}) * @return a completion publisher */ - protected Mono doCommit(Supplier> writeAction) { + protected Mono doCommit(@Nullable Supplier> writeAction) { if (!this.state.compareAndSet(State.NEW, State.COMMITTING)) { return Mono.empty(); } diff --git a/spring-web/src/main/java/org/springframework/http/client/reactive/package-info.java b/spring-web/src/main/java/org/springframework/http/client/reactive/package-info.java index 79d1989b507..57af2c3ceec 100644 --- a/spring-web/src/main/java/org/springframework/http/client/reactive/package-info.java +++ b/spring-web/src/main/java/org/springframework/http/client/reactive/package-info.java @@ -4,4 +4,7 @@ * {@link org.springframework.http.client.reactive.ClientHttpResponse} as well as a * {@link org.springframework.http.client.reactive.ClientHttpConnector}. */ +@NonNullApi package org.springframework.http.client.reactive; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/http/client/support/package-info.java b/spring-web/src/main/java/org/springframework/http/client/support/package-info.java index 97f55aa1c21..eb74fbcb036 100644 --- a/spring-web/src/main/java/org/springframework/http/client/support/package-info.java +++ b/spring-web/src/main/java/org/springframework/http/client/support/package-info.java @@ -2,4 +2,7 @@ * This package provides generic HTTP support classes, * to be used by higher-level classes like RestTemplate. */ +@NonNullApi package org.springframework.http.client.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/http/codec/HttpMessageReader.java b/spring-web/src/main/java/org/springframework/http/codec/HttpMessageReader.java index c087de0bf00..f44b960974e 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/HttpMessageReader.java +++ b/spring-web/src/main/java/org/springframework/http/codec/HttpMessageReader.java @@ -28,6 +28,7 @@ import org.springframework.http.MediaType; import org.springframework.http.ReactiveHttpInputMessage; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.lang.Nullable; /** * Strategy for reading from a {@link ReactiveHttpInputMessage} and decoding @@ -53,7 +54,7 @@ public interface HttpMessageReader { * @param mediaType the media type for the read, possibly {@code null} * @return {@code true} if readable, {@code false} otherwise */ - boolean canRead(ResolvableType elementType, MediaType mediaType); + boolean canRead(ResolvableType elementType, @Nullable MediaType mediaType); /** * Read from the input message and encode to a stream of objects. diff --git a/spring-web/src/main/java/org/springframework/http/codec/HttpMessageWriter.java b/spring-web/src/main/java/org/springframework/http/codec/HttpMessageWriter.java index 1a04e91136d..86bfb307242 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/HttpMessageWriter.java +++ b/spring-web/src/main/java/org/springframework/http/codec/HttpMessageWriter.java @@ -28,6 +28,7 @@ import org.springframework.http.MediaType; import org.springframework.http.ReactiveHttpOutputMessage; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.lang.Nullable; /** * Strategy for encoding a stream of objects of type {@code } and writing @@ -67,7 +68,7 @@ public interface HttpMessageWriter { * @return indicates completion or error */ Mono write(Publisher inputStream, ResolvableType elementType, - MediaType mediaType, ReactiveHttpOutputMessage message, Map hints); + @Nullable MediaType mediaType, ReactiveHttpOutputMessage message, Map hints); /** * Server-side only alternative to @@ -85,7 +86,7 @@ public interface HttpMessageWriter { * @return a {@link Mono} that indicates completion of writing or error */ default Mono write(Publisher inputStream, ResolvableType actualType, - ResolvableType elementType, MediaType mediaType, ServerHttpRequest request, + ResolvableType elementType, @Nullable MediaType mediaType, ServerHttpRequest request, ServerHttpResponse response, Map hints) { return write(inputStream, elementType, mediaType, response, hints); diff --git a/spring-web/src/main/java/org/springframework/http/codec/ServerSentEvent.java b/spring-web/src/main/java/org/springframework/http/codec/ServerSentEvent.java index da9f4a1738d..ade2a405757 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/ServerSentEvent.java +++ b/spring-web/src/main/java/org/springframework/http/codec/ServerSentEvent.java @@ -19,6 +19,7 @@ package org.springframework.http.codec; import java.time.Duration; import org.springframework.http.codec.json.Jackson2JsonEncoder; +import org.springframework.lang.Nullable; /** * Representation for a Server-Sent Event for use with Spring's reactive Web support. @@ -58,6 +59,7 @@ public class ServerSentEvent { /** * Return the {@code id} field of this event, if available. */ + @Nullable public String id() { return this.id; } @@ -65,6 +67,7 @@ public class ServerSentEvent { /** * Return the {@code event} field of this event, if available. */ + @Nullable public String event() { return this.event; } @@ -72,6 +75,7 @@ public class ServerSentEvent { /** * Return the {@code data} field of this event, if available. */ + @Nullable public T data() { return this.data; } @@ -79,6 +83,7 @@ public class ServerSentEvent { /** * Return the {@code retry} field of this event, if available. */ + @Nullable public Duration retry() { return this.retry; } @@ -86,6 +91,7 @@ public class ServerSentEvent { /** * Return the comment of this event, if available. */ + @Nullable public String comment() { return this.comment; } diff --git a/spring-web/src/main/java/org/springframework/http/codec/ServerSentEventHttpMessageWriter.java b/spring-web/src/main/java/org/springframework/http/codec/ServerSentEventHttpMessageWriter.java index a6859ccc98f..c0631d6e460 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/ServerSentEventHttpMessageWriter.java +++ b/spring-web/src/main/java/org/springframework/http/codec/ServerSentEventHttpMessageWriter.java @@ -35,6 +35,7 @@ import org.springframework.http.MediaType; import org.springframework.http.ReactiveHttpOutputMessage; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.lang.Nullable; /** * {@code HttpMessageWriter} for {@code "text/event-stream"} responses. @@ -74,6 +75,7 @@ public class ServerSentEventHttpMessageWriter implements HttpMessageWriter getEncoder() { return this.encoder; } diff --git a/spring-web/src/main/java/org/springframework/http/codec/json/package-info.java b/spring-web/src/main/java/org/springframework/http/codec/json/package-info.java index 2336313778a..5039cba4062 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/json/package-info.java +++ b/spring-web/src/main/java/org/springframework/http/codec/json/package-info.java @@ -1,4 +1,7 @@ /** * JSON encoder and decoder support. */ +@NonNullApi package org.springframework.http.codec.json; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/http/codec/multipart/package-info.java b/spring-web/src/main/java/org/springframework/http/codec/multipart/package-info.java new file mode 100644 index 00000000000..c84c6711225 --- /dev/null +++ b/spring-web/src/main/java/org/springframework/http/codec/multipart/package-info.java @@ -0,0 +1,7 @@ +/** + * Multipart support. + */ +@NonNullApi +package org.springframework.http.codec.multipart; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/http/codec/package-info.java b/spring-web/src/main/java/org/springframework/http/codec/package-info.java index 9670bcb49b0..c52dbb555b3 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/package-info.java +++ b/spring-web/src/main/java/org/springframework/http/codec/package-info.java @@ -7,4 +7,7 @@ * {@link org.springframework.http.codec.HttpMessageWriter} for reading and * writing the body of HTTP requests and responses. */ +@NonNullApi package org.springframework.http.codec; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/http/codec/xml/package-info.java b/spring-web/src/main/java/org/springframework/http/codec/xml/package-info.java index affc0179404..28ac6bcd314 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/xml/package-info.java +++ b/spring-web/src/main/java/org/springframework/http/codec/xml/package-info.java @@ -1,4 +1,7 @@ /** * XML encoder and decoder support. */ +@NonNullApi package org.springframework.http.codec.xml; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/http/converter/AbstractGenericHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/AbstractGenericHttpMessageConverter.java index a15d0468d8b..0fa8a443866 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/AbstractGenericHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/AbstractGenericHttpMessageConverter.java @@ -24,6 +24,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; import org.springframework.http.StreamingHttpOutputMessage; +import org.springframework.lang.Nullable; /** * Abstract base class for most {@link GenericHttpMessageConverter} implementations. @@ -123,7 +124,7 @@ public abstract class AbstractGenericHttpMessageConverter extends AbstractHtt * @throws IOException in case of I/O errors * @throws HttpMessageNotWritableException in case of conversion errors */ - protected abstract void writeInternal(T t, Type type, HttpOutputMessage outputMessage) + protected abstract void writeInternal(T t, @Nullable Type type, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException; } diff --git a/spring-web/src/main/java/org/springframework/http/converter/AbstractHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/AbstractHttpMessageConverter.java index 1457cfea329..942365d462b 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/AbstractHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/AbstractHttpMessageConverter.java @@ -32,6 +32,7 @@ import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; import org.springframework.http.StreamingHttpOutputMessage; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -117,6 +118,7 @@ public abstract class AbstractHttpMessageConverter implements HttpMessageConv * Return the default character set, if any. * @since 4.3 */ + @Nullable public Charset getDefaultCharset() { return this.defaultCharset; } @@ -141,7 +143,7 @@ public abstract class AbstractHttpMessageConverter implements HttpMessageConv * @return {@code true} if the supported media types include the media type, * or if the media type is {@code null} */ - protected boolean canRead(MediaType mediaType) { + protected boolean canRead(@Nullable MediaType mediaType) { if (mediaType == null) { return true; } @@ -172,7 +174,7 @@ public abstract class AbstractHttpMessageConverter implements HttpMessageConv * @return {@code true} if the supported media types are compatible with the media type, * or if the media type is {@code null} */ - protected boolean canWrite(MediaType mediaType) { + protected boolean canWrite(@Nullable MediaType mediaType) { if (mediaType == null || MediaType.ALL.equals(mediaType)) { return true; } @@ -273,6 +275,7 @@ public abstract class AbstractHttpMessageConverter implements HttpMessageConv * @param t the type to return the content type for * @return the content type, or {@code null} if not known */ + @Nullable protected MediaType getDefaultContentType(T t) throws IOException { List mediaTypes = getSupportedMediaTypes(); return (!mediaTypes.isEmpty() ? mediaTypes.get(0) : null); @@ -285,7 +288,8 @@ public abstract class AbstractHttpMessageConverter implements HttpMessageConv * @param t the type to return the content length for * @return the content length, or {@code null} if not known */ - protected Long getContentLength(T t, MediaType contentType) throws IOException { + @Nullable + protected Long getContentLength(T t, @Nullable MediaType contentType) throws IOException { return null; } diff --git a/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java index c2463d5a7ca..bba3aac8a1e 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java @@ -29,6 +29,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; + import javax.mail.internet.MimeUtility; import org.springframework.core.io.Resource; @@ -38,6 +39,7 @@ import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; import org.springframework.http.StreamingHttpOutputMessage; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MimeTypeUtils; @@ -431,6 +433,7 @@ public class FormHttpMessageConverter implements HttpMessageConverter extends HttpMessageConverter * Typically the value of a {@code Content-Type} header. * @return {@code true} if readable; {@code false} otherwise */ - boolean canRead(Type type, Class contextClass, MediaType mediaType); + boolean canRead(Type type, @Nullable Class contextClass, @Nullable MediaType mediaType); /** * Read an object of the given type form the given input message, and returns it. @@ -62,7 +63,7 @@ public interface GenericHttpMessageConverter extends HttpMessageConverter * @throws IOException in case of I/O errors * @throws HttpMessageNotReadableException in case of conversion errors */ - T read(Type type, Class contextClass, HttpInputMessage inputMessage) + T read(Type type, @Nullable Class contextClass, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException; /** @@ -78,7 +79,7 @@ public interface GenericHttpMessageConverter extends HttpMessageConverter * @return {@code true} if writable; {@code false} otherwise * @since 4.2 */ - boolean canWrite(Type type, Class clazz, MediaType mediaType); + boolean canWrite(@Nullable Type type, Class clazz, @Nullable MediaType mediaType); /** * Write an given object to the given output message. @@ -98,7 +99,7 @@ public interface GenericHttpMessageConverter extends HttpMessageConverter * @throws HttpMessageNotWritableException in case of conversion errors * @since 4.2 */ - void write(T t, Type type, MediaType contentType, HttpOutputMessage outputMessage) + void write(T t, @Nullable Type type, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException; } diff --git a/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConversionException.java b/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConversionException.java index b9fc38ff6c3..0ce42ee9381 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConversionException.java +++ b/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConversionException.java @@ -17,6 +17,7 @@ package org.springframework.http.converter; import org.springframework.core.NestedRuntimeException; +import org.springframework.lang.Nullable; /** * Thrown by {@link HttpMessageConverter} implementations when a conversion attempt fails. @@ -41,7 +42,7 @@ public class HttpMessageConversionException extends NestedRuntimeException { * @param msg the detail message * @param cause the root cause (if any) */ - public HttpMessageConversionException(String msg, Throwable cause) { + public HttpMessageConversionException(String msg, @Nullable Throwable cause) { super(msg, cause); } diff --git a/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverter.java index 7cb9c6c61c0..bfdd8741ff4 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/HttpMessageConverter.java @@ -22,6 +22,7 @@ import java.util.List; import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; /** * Strategy interface that specifies a converter that can convert from and to HTTP requests and responses. @@ -39,7 +40,7 @@ public interface HttpMessageConverter { * typically the value of a {@code Content-Type} header. * @return {@code true} if readable; {@code false} otherwise */ - boolean canRead(Class clazz, MediaType mediaType); + boolean canRead(Class clazz, @Nullable MediaType mediaType); /** * Indicates whether the given class can be written by this converter. @@ -48,7 +49,7 @@ public interface HttpMessageConverter { * typically the value of an {@code Accept} header. * @return {@code true} if writable; {@code false} otherwise */ - boolean canWrite(Class clazz, MediaType mediaType); + boolean canWrite(Class clazz, @Nullable MediaType mediaType); /** * Return the list of {@link MediaType} objects supported by this converter. @@ -80,7 +81,7 @@ public interface HttpMessageConverter { * @throws IOException in case of I/O errors * @throws HttpMessageNotWritableException in case of conversion errors */ - void write(T t, MediaType contentType, HttpOutputMessage outputMessage) + void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException; } diff --git a/spring-web/src/main/java/org/springframework/http/converter/HttpMessageNotReadableException.java b/spring-web/src/main/java/org/springframework/http/converter/HttpMessageNotReadableException.java index 8d35ac90c3d..0d3575d273e 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/HttpMessageNotReadableException.java +++ b/spring-web/src/main/java/org/springframework/http/converter/HttpMessageNotReadableException.java @@ -16,6 +16,8 @@ package org.springframework.http.converter; +import org.springframework.lang.Nullable; + /** * Thrown by {@link HttpMessageConverter} implementations when the * {@link HttpMessageConverter#read} method fails. @@ -39,7 +41,7 @@ public class HttpMessageNotReadableException extends HttpMessageConversionExcept * @param msg the detail message * @param cause the root cause (if any) */ - public HttpMessageNotReadableException(String msg, Throwable cause) { + public HttpMessageNotReadableException(String msg, @Nullable Throwable cause) { super(msg, cause); } diff --git a/spring-web/src/main/java/org/springframework/http/converter/HttpMessageNotWritableException.java b/spring-web/src/main/java/org/springframework/http/converter/HttpMessageNotWritableException.java index 5eb5fa71178..beab170fe8b 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/HttpMessageNotWritableException.java +++ b/spring-web/src/main/java/org/springframework/http/converter/HttpMessageNotWritableException.java @@ -16,6 +16,8 @@ package org.springframework.http.converter; +import org.springframework.lang.Nullable; + /** * Thrown by {@link HttpMessageConverter} implementations when the * {@link HttpMessageConverter#write} method fails. @@ -39,7 +41,7 @@ public class HttpMessageNotWritableException extends HttpMessageConversionExcept * @param msg the detail message * @param cause the root cause (if any) */ - public HttpMessageNotWritableException(String msg, Throwable cause) { + public HttpMessageNotWritableException(String msg, @Nullable Throwable cause) { super(msg, cause); } diff --git a/spring-web/src/main/java/org/springframework/http/converter/cbor/package-info.java b/spring-web/src/main/java/org/springframework/http/converter/cbor/package-info.java index 993f0e5f4d1..62a839ae883 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/cbor/package-info.java +++ b/spring-web/src/main/java/org/springframework/http/converter/cbor/package-info.java @@ -1,4 +1,7 @@ /** * Provides an HttpMessageConverter for the CBOR data format. */ +@NonNullApi package org.springframework.http.converter.cbor; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/http/converter/feed/package-info.java b/spring-web/src/main/java/org/springframework/http/converter/feed/package-info.java index 440db3d3778..3c4843aa187 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/feed/package-info.java +++ b/spring-web/src/main/java/org/springframework/http/converter/feed/package-info.java @@ -2,4 +2,7 @@ * Provides HttpMessageConverter implementations for handling Atom and RSS feeds. * Based on the ROME tools project. */ +@NonNullApi package org.springframework.http.converter.feed; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJackson2HttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJackson2HttpMessageConverter.java index d731af7f5e5..82ee132804f 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJackson2HttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJackson2HttpMessageConverter.java @@ -47,6 +47,7 @@ import org.springframework.http.converter.HttpMessageConversionException; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.TypeUtils; @@ -315,7 +316,7 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener * in which the target type appears in a method signature (can be {@code null}) * @return the Jackson JavaType */ - protected JavaType getJavaType(Type type, Class contextClass) { + protected JavaType getJavaType(Type type, @Nullable Class contextClass) { TypeFactory typeFactory = this.objectMapper.getTypeFactory(); return typeFactory.constructType(GenericTypeResolver.resolveType(type, contextClass)); } diff --git a/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJsonHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJsonHttpMessageConverter.java index 4e5a7a4ce2d..3684406b402 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJsonHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJsonHttpMessageConverter.java @@ -33,6 +33,7 @@ import org.springframework.http.MediaType; import org.springframework.http.converter.AbstractGenericHttpMessageConverter; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; +import org.springframework.lang.Nullable; /** * Common base class for plain JSON converters, e.g. Gson and JSON-B. @@ -142,7 +143,7 @@ public abstract class AbstractJsonHttpMessageConverter extends AbstractGenericHt * @param writer the {@code} Writer to use * @throws Exception in case of write failures */ - protected abstract void writeInternal(Object o, Type type, Writer writer) throws Exception; + protected abstract void writeInternal(Object o, @Nullable Type type, Writer writer) throws Exception; private static Reader getReader(HttpInputMessage inputMessage) throws IOException { diff --git a/spring-web/src/main/java/org/springframework/http/converter/json/package-info.java b/spring-web/src/main/java/org/springframework/http/converter/json/package-info.java index 886aa944083..c786dae179d 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/json/package-info.java +++ b/spring-web/src/main/java/org/springframework/http/converter/json/package-info.java @@ -1,4 +1,7 @@ /** * Provides HttpMessageConverter implementations for handling JSON. */ +@NonNullApi package org.springframework.http.converter.json; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/http/converter/package-info.java b/spring-web/src/main/java/org/springframework/http/converter/package-info.java index 0719dd82d3b..e225736697f 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/package-info.java +++ b/spring-web/src/main/java/org/springframework/http/converter/package-info.java @@ -1,4 +1,7 @@ /** * Provides an HttpMessageConverter abstraction to convert between Java objects and HTTP input/output messages. */ +@NonNullApi package org.springframework.http.converter; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/http/converter/protobuf/package-info.java b/spring-web/src/main/java/org/springframework/http/converter/protobuf/package-info.java index 3c73a272c5b..863c73c5ae9 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/protobuf/package-info.java +++ b/spring-web/src/main/java/org/springframework/http/converter/protobuf/package-info.java @@ -2,4 +2,7 @@ * Provides an HttpMessageConverter implementation for handling * Google Protocol Buffers. */ +@NonNullApi package org.springframework.http.converter.protobuf; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/http/converter/smile/package-info.java b/spring-web/src/main/java/org/springframework/http/converter/smile/package-info.java index a8e7e121069..1728559634d 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/smile/package-info.java +++ b/spring-web/src/main/java/org/springframework/http/converter/smile/package-info.java @@ -1,4 +1,7 @@ /** * Provides an HttpMessageConverter for the Smile data format ("binary JSON"). */ +@NonNullApi package org.springframework.http.converter.smile; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/http/converter/support/package-info.java b/spring-web/src/main/java/org/springframework/http/converter/support/package-info.java index eaaf8204b4e..33f91a24cf6 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/support/package-info.java +++ b/spring-web/src/main/java/org/springframework/http/converter/support/package-info.java @@ -1,4 +1,7 @@ /** * Provides a comprehensive HttpMessageConverter variant for form handling. */ +@NonNullApi package org.springframework.http.converter.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/http/converter/xml/package-info.java b/spring-web/src/main/java/org/springframework/http/converter/xml/package-info.java index a889b35119a..f3a33401d1d 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/xml/package-info.java +++ b/spring-web/src/main/java/org/springframework/http/converter/xml/package-info.java @@ -1,4 +1,7 @@ /** * Provides HttpMessageConverter implementations for handling XML. */ +@NonNullApi package org.springframework.http.converter.xml; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/http/package-info.java b/spring-web/src/main/java/org/springframework/http/package-info.java index 0f7cce528b0..04fddd7d6e7 100644 --- a/spring-web/src/main/java/org/springframework/http/package-info.java +++ b/spring-web/src/main/java/org/springframework/http/package-info.java @@ -2,4 +2,7 @@ * Contains a basic abstraction over client/server-side HTTP. This package contains * the {@code HttpInputMessage} and {@code HttpOutputMessage} interfaces. */ +@NonNullApi package org.springframework.http; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/http/server/package-info.java b/spring-web/src/main/java/org/springframework/http/server/package-info.java index d08f8626a66..76ef93911b4 100644 --- a/spring-web/src/main/java/org/springframework/http/server/package-info.java +++ b/spring-web/src/main/java/org/springframework/http/server/package-info.java @@ -3,4 +3,7 @@ * contains the {@code ServerHttpRequest} and {@code ServerHttpResponse}, * as well as a Servlet-based implementation of these interfaces. */ +@NonNullApi package org.springframework.http.server; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerReadPublisher.java b/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerReadPublisher.java index d048891ae83..6df66b12f07 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerReadPublisher.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerReadPublisher.java @@ -27,6 +27,7 @@ import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; import reactor.core.publisher.Operators; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -108,6 +109,7 @@ public abstract class AbstractListenerReadPublisher implements Publisher { * Reads a data from the input, if possible. * @return the data that was read; or {@code null} */ + @Nullable protected abstract T read() throws IOException; diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpResponse.java b/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpResponse.java index 42c4a50a0af..68d9cdcefd6 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpResponse.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpResponse.java @@ -34,6 +34,7 @@ import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseCookie; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.LinkedMultiValueMap; @@ -186,7 +187,7 @@ public abstract class AbstractServerHttpResponse implements ServerHttpResponse { * @param writeAction the action to write the response body (may be {@code null}) * @return a completion publisher */ - protected Mono doCommit(Supplier> writeAction) { + protected Mono doCommit(@Nullable Supplier> writeAction) { if (!this.state.compareAndSet(State.NEW, State.COMMITTING)) { if (logger.isDebugEnabled()) { logger.debug("Skipping doCommit (response already committed)."); diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/ServerHttpRequest.java b/spring-web/src/main/java/org/springframework/http/server/reactive/ServerHttpRequest.java index dac0090f5e6..14d08e498a3 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/ServerHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/ServerHttpRequest.java @@ -22,6 +22,7 @@ import org.springframework.http.HttpCookie; import org.springframework.http.HttpMethod; import org.springframework.http.HttpRequest; import org.springframework.http.ReactiveHttpInputMessage; +import org.springframework.lang.Nullable; import org.springframework.util.MultiValueMap; /** @@ -57,6 +58,7 @@ public interface ServerHttpRequest extends HttpRequest, ReactiveHttpInputMessage /** * Return the remote address where this request is connected to, if available. */ + @Nullable InetSocketAddress getRemoteAddress(); diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/ServerHttpResponse.java b/spring-web/src/main/java/org/springframework/http/server/reactive/ServerHttpResponse.java index e2b0b7a5dc7..ce6534a4737 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/ServerHttpResponse.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/ServerHttpResponse.java @@ -21,6 +21,7 @@ import java.util.function.Function; import org.springframework.http.HttpStatus; import org.springframework.http.ReactiveHttpOutputMessage; import org.springframework.http.ResponseCookie; +import org.springframework.lang.Nullable; import org.springframework.util.MultiValueMap; /** @@ -43,6 +44,7 @@ public interface ServerHttpResponse extends ReactiveHttpOutputMessage { /** * Return the HTTP status code or {@code null} if not set. */ + @Nullable HttpStatus getStatusCode(); /** diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletHttpHandlerAdapter.java b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletHttpHandlerAdapter.java index bded291e9fc..e984d5f24b0 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletHttpHandlerAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletHttpHandlerAdapter.java @@ -36,6 +36,7 @@ import org.reactivestreams.Subscription; import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.core.io.buffer.DefaultDataBufferFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -133,6 +134,7 @@ public class ServletHttpHandlerAdapter implements Servlet { } @Override + @Nullable public ServletConfig getServletConfig() { return null; } diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java index 08c51b62a6b..072c0edd383 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java @@ -40,6 +40,7 @@ import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.http.HttpCookie; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.LinkedCaseInsensitiveMap; import org.springframework.util.LinkedMultiValueMap; @@ -189,6 +190,7 @@ public class ServletServerHttpRequest extends AbstractServerHttpRequest { * Read from the request body InputStream and return a DataBuffer. * Invoked only when {@link ServletInputStream#isReady()} returns "true". */ + @Nullable protected DataBuffer readFromInputStream() throws IOException { int read = this.request.getInputStream().read(this.buffer); if (logger.isTraceEnabled()) { diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/package-info.java b/spring-web/src/main/java/org/springframework/http/server/reactive/package-info.java index 4c49c9e301e..dcc0eb8f2d8 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/package-info.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/package-info.java @@ -7,4 +7,7 @@ *

    Also provides implementations adapting to different runtimes * including Servlet 3.1 containers, Netty + Reactor IO, and Undertow. */ +@NonNullApi package org.springframework.http.server.reactive; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/remoting/caucho/package-info.java b/spring-web/src/main/java/org/springframework/remoting/caucho/package-info.java index e630835f262..bdb8b0e9d02 100644 --- a/spring-web/src/main/java/org/springframework/remoting/caucho/package-info.java +++ b/spring-web/src/main/java/org/springframework/remoting/caucho/package-info.java @@ -7,4 +7,7 @@ * For information on Hessian, see the * Hessian website */ +@NonNullApi package org.springframework.remoting.caucho; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/remoting/httpinvoker/AbstractHttpInvokerRequestExecutor.java b/spring-web/src/main/java/org/springframework/remoting/httpinvoker/AbstractHttpInvokerRequestExecutor.java index 2b976d32ec4..8945db8b933 100644 --- a/spring-web/src/main/java/org/springframework/remoting/httpinvoker/AbstractHttpInvokerRequestExecutor.java +++ b/spring-web/src/main/java/org/springframework/remoting/httpinvoker/AbstractHttpInvokerRequestExecutor.java @@ -28,6 +28,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.lang.Nullable; import org.springframework.remoting.rmi.CodebaseAwareObjectInputStream; import org.springframework.remoting.support.RemoteInvocation; import org.springframework.remoting.support.RemoteInvocationResult; @@ -267,7 +268,7 @@ public abstract class AbstractHttpInvokerRequestExecutor implements HttpInvokerR * @throws IOException if creation of the ObjectInputStream failed * @see org.springframework.remoting.rmi.CodebaseAwareObjectInputStream */ - protected ObjectInputStream createObjectInputStream(InputStream is, String codebaseUrl) throws IOException { + protected ObjectInputStream createObjectInputStream(InputStream is, @Nullable String codebaseUrl) throws IOException { return new CodebaseAwareObjectInputStream(is, getBeanClassLoader(), codebaseUrl); } diff --git a/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpComponentsHttpInvokerRequestExecutor.java b/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpComponentsHttpInvokerRequestExecutor.java index 8ac5cf92282..53608ecf843 100644 --- a/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpComponentsHttpInvokerRequestExecutor.java +++ b/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpComponentsHttpInvokerRequestExecutor.java @@ -41,6 +41,7 @@ import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.springframework.context.i18n.LocaleContext; import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.lang.Nullable; import org.springframework.remoting.support.RemoteInvocationResult; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -238,6 +239,7 @@ public class HttpComponentsHttpInvokerRequestExecutor extends AbstractHttpInvoke * target service * @return the RequestConfig to use */ + @Nullable protected RequestConfig createRequestConfig(HttpInvokerClientConfiguration config) { HttpClient client = getHttpClient(); if (client instanceof Configurable) { diff --git a/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpInvokerClientConfiguration.java b/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpInvokerClientConfiguration.java index 7e894a53e44..8ea6addc4eb 100644 --- a/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpInvokerClientConfiguration.java +++ b/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpInvokerClientConfiguration.java @@ -16,6 +16,8 @@ package org.springframework.remoting.httpinvoker; +import org.springframework.lang.Nullable; + /** * Configuration interface for executing HTTP invoker requests. * @@ -37,6 +39,7 @@ public interface HttpInvokerClientConfiguration { * @return the codebase URL, or {@code null} if none * @see java.rmi.server.RMIClassLoader */ + @Nullable String getCodebaseUrl(); } diff --git a/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpInvokerClientInterceptor.java b/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpInvokerClientInterceptor.java index c6703e9d7f6..3ff5a0f4423 100644 --- a/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpInvokerClientInterceptor.java +++ b/spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpInvokerClientInterceptor.java @@ -24,6 +24,7 @@ import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.springframework.aop.support.AopUtils; +import org.springframework.lang.Nullable; import org.springframework.remoting.RemoteAccessException; import org.springframework.remoting.RemoteConnectFailureException; import org.springframework.remoting.RemoteInvocationFailureException; @@ -209,6 +210,7 @@ public class HttpInvokerClientInterceptor extends RemoteInvocationBasedAccessor * @return the RemoteAccessException to throw, or {@code null} to have the * original exception propagated to the caller */ + @Nullable protected RemoteAccessException convertHttpInvokerAccessException(Throwable ex) { if (ex instanceof ConnectException) { return new RemoteConnectFailureException( diff --git a/spring-web/src/main/java/org/springframework/remoting/httpinvoker/package-info.java b/spring-web/src/main/java/org/springframework/remoting/httpinvoker/package-info.java index c145ec24557..1409b7b0499 100644 --- a/spring-web/src/main/java/org/springframework/remoting/httpinvoker/package-info.java +++ b/spring-web/src/main/java/org/springframework/remoting/httpinvoker/package-info.java @@ -8,4 +8,7 @@ * being tied to Java. Nevertheless, it is as easy to set up as Hessian, * which is its main advantage compared to RMI. */ +@NonNullApi package org.springframework.remoting.httpinvoker; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/remoting/jaxws/JaxWsPortClientInterceptor.java b/spring-web/src/main/java/org/springframework/remoting/jaxws/JaxWsPortClientInterceptor.java index a1d6d32e42b..edebde32794 100644 --- a/spring-web/src/main/java/org/springframework/remoting/jaxws/JaxWsPortClientInterceptor.java +++ b/spring-web/src/main/java/org/springframework/remoting/jaxws/JaxWsPortClientInterceptor.java @@ -37,6 +37,7 @@ import org.aopalliance.intercept.MethodInvocation; import org.springframework.aop.support.AopUtils; import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.beans.factory.InitializingBean; +import org.springframework.lang.Nullable; import org.springframework.remoting.RemoteAccessException; import org.springframework.remoting.RemoteConnectFailureException; import org.springframework.remoting.RemoteLookupFailureException; @@ -112,6 +113,7 @@ public class JaxWsPortClientInterceptor extends LocalJaxWsServiceFactory /** * Return a reference to an existing JAX-WS Service instance, if any. */ + @Nullable public Service getJaxWsService() { return this.jaxWsService; } @@ -491,6 +493,7 @@ public class JaxWsPortClientInterceptor extends LocalJaxWsServiceFactory * @see #getPortStub() * @see #doInvoke(org.aopalliance.intercept.MethodInvocation, Object) */ + @Nullable protected Object doInvoke(MethodInvocation invocation) throws Throwable { try { return doInvoke(invocation, getPortStub()); @@ -516,6 +519,7 @@ public class JaxWsPortClientInterceptor extends LocalJaxWsServiceFactory * @throws Throwable in case of invocation failure * @see #getPortStub() */ + @Nullable protected Object doInvoke(MethodInvocation invocation, Object portStub) throws Throwable { Method method = invocation.getMethod(); try { diff --git a/spring-web/src/main/java/org/springframework/remoting/jaxws/package-info.java b/spring-web/src/main/java/org/springframework/remoting/jaxws/package-info.java index ba98b1aa39d..e8f54f88102 100644 --- a/spring-web/src/main/java/org/springframework/remoting/jaxws/package-info.java +++ b/spring-web/src/main/java/org/springframework/remoting/jaxws/package-info.java @@ -3,4 +3,7 @@ * as included in Java 6 and Java EE 5. This package provides proxy * factories for accessing JAX-WS services and ports. */ +@NonNullApi package org.springframework.remoting.jaxws; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/HttpRequestMethodNotSupportedException.java b/spring-web/src/main/java/org/springframework/web/HttpRequestMethodNotSupportedException.java index bc13568dc71..c4fe79a7986 100644 --- a/spring-web/src/main/java/org/springframework/web/HttpRequestMethodNotSupportedException.java +++ b/spring-web/src/main/java/org/springframework/web/HttpRequestMethodNotSupportedException.java @@ -21,9 +21,11 @@ import java.util.EnumSet; import java.util.LinkedList; import java.util.List; import java.util.Set; + import javax.servlet.ServletException; import org.springframework.http.HttpMethod; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -63,7 +65,7 @@ public class HttpRequestMethodNotSupportedException extends ServletException { * @param method the unsupported HTTP request method * @param supportedMethods the actually supported HTTP methods (may be {@code null}) */ - public HttpRequestMethodNotSupportedException(String method, Collection supportedMethods) { + public HttpRequestMethodNotSupportedException(String method, @Nullable Collection supportedMethods) { this(method, StringUtils.toStringArray(supportedMethods)); } @@ -72,7 +74,7 @@ public class HttpRequestMethodNotSupportedException extends ServletException { * @param method the unsupported HTTP request method * @param supportedMethods the actually supported HTTP methods (may be {@code null}) */ - public HttpRequestMethodNotSupportedException(String method, String[] supportedMethods) { + public HttpRequestMethodNotSupportedException(String method, @Nullable String[] supportedMethods) { this(method, supportedMethods, "Request method '" + method + "' not supported"); } @@ -99,6 +101,7 @@ public class HttpRequestMethodNotSupportedException extends ServletException { /** * Return the actually supported HTTP methods, or {@code null} if not known. */ + @Nullable public String[] getSupportedMethods() { return this.supportedMethods; } @@ -108,6 +111,7 @@ public class HttpRequestMethodNotSupportedException extends ServletException { * or {@code null} if not known. * @since 3.2 */ + @Nullable public Set getSupportedHttpMethods() { if (this.supportedMethods == null) { return null; diff --git a/spring-web/src/main/java/org/springframework/web/HttpSessionRequiredException.java b/spring-web/src/main/java/org/springframework/web/HttpSessionRequiredException.java index d17f8d39f91..7b5f1d3bf0b 100644 --- a/spring-web/src/main/java/org/springframework/web/HttpSessionRequiredException.java +++ b/spring-web/src/main/java/org/springframework/web/HttpSessionRequiredException.java @@ -18,6 +18,8 @@ package org.springframework.web; import javax.servlet.ServletException; +import org.springframework.lang.Nullable; + /** * Exception thrown when an HTTP request handler requires a pre-existing session. * @@ -54,6 +56,7 @@ public class HttpSessionRequiredException extends ServletException { * Return the name of the expected session attribute, if any. * @since 4.3 */ + @Nullable public String getExpectedAttribute() { return this.expectedAttribute; } diff --git a/spring-web/src/main/java/org/springframework/web/accept/AbstractMappingContentNegotiationStrategy.java b/spring-web/src/main/java/org/springframework/web/accept/AbstractMappingContentNegotiationStrategy.java index ee83d31f77f..4ee7cf6f803 100644 --- a/spring-web/src/main/java/org/springframework/web/accept/AbstractMappingContentNegotiationStrategy.java +++ b/spring-web/src/main/java/org/springframework/web/accept/AbstractMappingContentNegotiationStrategy.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Map; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; import org.springframework.web.HttpMediaTypeNotAcceptableException; import org.springframework.web.context.request.NativeWebRequest; @@ -89,6 +90,7 @@ public abstract class AbstractMappingContentNegotiationStrategy extends MappingM * Extract a key from the request to use to look up media types. * @return the lookup key or {@code null}. */ + @Nullable protected abstract String getMediaTypeKey(NativeWebRequest request); /** @@ -104,6 +106,7 @@ public abstract class AbstractMappingContentNegotiationStrategy extends MappingM * determine the media type(s). If a MediaType is returned from * this method it will be added to the cache in the base class. */ + @Nullable protected MediaType handleNoMatch(NativeWebRequest request, String key) throws HttpMediaTypeNotAcceptableException { diff --git a/spring-web/src/main/java/org/springframework/web/accept/ContentNegotiationManager.java b/spring-web/src/main/java/org/springframework/web/accept/ContentNegotiationManager.java index 04184f5bb57..92621006955 100644 --- a/spring-web/src/main/java/org/springframework/web/accept/ContentNegotiationManager.java +++ b/spring-web/src/main/java/org/springframework/web/accept/ContentNegotiationManager.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Set; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.HttpMediaTypeNotAcceptableException; import org.springframework.web.context.request.NativeWebRequest; @@ -99,6 +100,7 @@ public class ContentNegotiationManager implements ContentNegotiationStrategy, Me * @since 4.3 */ @SuppressWarnings("unchecked") + @Nullable public T getStrategy(Class strategyType) { for (ContentNegotiationStrategy strategy : getStrategies()) { if (strategyType.isInstance(strategy)) { diff --git a/spring-web/src/main/java/org/springframework/web/accept/MappingMediaTypeFileExtensionResolver.java b/spring-web/src/main/java/org/springframework/web/accept/MappingMediaTypeFileExtensionResolver.java index 4d9d84117a2..31dd0072dfd 100644 --- a/spring-web/src/main/java/org/springframework/web/accept/MappingMediaTypeFileExtensionResolver.java +++ b/spring-web/src/main/java/org/springframework/web/accept/MappingMediaTypeFileExtensionResolver.java @@ -27,6 +27,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @@ -102,6 +103,7 @@ public class MappingMediaTypeFileExtensionResolver implements MediaTypeFileExten * Use this method for a reverse lookup from extension to MediaType. * @return a MediaType for the key, or {@code null} if none found */ + @Nullable protected MediaType lookupMediaType(String extension) { return this.mediaTypes.get(extension.toLowerCase(Locale.ENGLISH)); } diff --git a/spring-web/src/main/java/org/springframework/web/accept/PathExtensionContentNegotiationStrategy.java b/spring-web/src/main/java/org/springframework/web/accept/PathExtensionContentNegotiationStrategy.java index 8e0a1b7ecb4..e09332f9b10 100644 --- a/spring-web/src/main/java/org/springframework/web/accept/PathExtensionContentNegotiationStrategy.java +++ b/spring-web/src/main/java/org/springframework/web/accept/PathExtensionContentNegotiationStrategy.java @@ -19,6 +19,7 @@ package org.springframework.web.accept; import java.util.Locale; import java.util.Map; import java.util.Optional; + import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; @@ -27,6 +28,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.core.io.Resource; import org.springframework.http.MediaType; import org.springframework.http.MediaTypeFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; import org.springframework.web.HttpMediaTypeNotAcceptableException; @@ -146,6 +148,7 @@ public class PathExtensionContentNegotiationStrategy extends AbstractMappingCont * @return the MediaType for the extension, or {@code null} if none found * @since 4.3 */ + @Nullable public MediaType getMediaTypeForResource(Resource resource) { Assert.notNull(resource, "Resource must not be null"); MediaType mediaType = null; diff --git a/spring-web/src/main/java/org/springframework/web/accept/ServletPathExtensionContentNegotiationStrategy.java b/spring-web/src/main/java/org/springframework/web/accept/ServletPathExtensionContentNegotiationStrategy.java index 86a212e50ad..1fa2d28ba37 100644 --- a/spring-web/src/main/java/org/springframework/web/accept/ServletPathExtensionContentNegotiationStrategy.java +++ b/spring-web/src/main/java/org/springframework/web/accept/ServletPathExtensionContentNegotiationStrategy.java @@ -17,6 +17,7 @@ package org.springframework.web.accept; import java.util.Map; + import javax.servlet.ServletContext; import org.springframework.core.io.Resource; diff --git a/spring-web/src/main/java/org/springframework/web/accept/package-info.java b/spring-web/src/main/java/org/springframework/web/accept/package-info.java index d3c5ba3e16f..111a11ed3e3 100644 --- a/spring-web/src/main/java/org/springframework/web/accept/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/accept/package-info.java @@ -12,4 +12,7 @@ *

    {@link org.springframework.web.accept.ContentNegotiationManager} is used to delegate to one * ore more of the above strategies in a specific order. */ +@NonNullApi package org.springframework.web.accept; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/bind/ServletRequestDataBinder.java b/spring-web/src/main/java/org/springframework/web/bind/ServletRequestDataBinder.java index ad651bbe280..77be69a3046 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/ServletRequestDataBinder.java +++ b/spring-web/src/main/java/org/springframework/web/bind/ServletRequestDataBinder.java @@ -19,6 +19,7 @@ package org.springframework.web.bind; import javax.servlet.ServletRequest; import org.springframework.beans.MutablePropertyValues; +import org.springframework.lang.Nullable; import org.springframework.validation.BindException; import org.springframework.web.multipart.MultipartRequest; import org.springframework.web.util.WebUtils; @@ -64,7 +65,7 @@ public class ServletRequestDataBinder extends WebDataBinder { * if the binder is just used to convert a plain parameter value) * @see #DEFAULT_OBJECT_NAME */ - public ServletRequestDataBinder(Object target) { + public ServletRequestDataBinder(@Nullable Object target) { super(target); } @@ -74,7 +75,7 @@ public class ServletRequestDataBinder extends WebDataBinder { * if the binder is just used to convert a plain parameter value) * @param objectName the name of the target object */ - public ServletRequestDataBinder(Object target, String objectName) { + public ServletRequestDataBinder(@Nullable Object target, String objectName) { super(target, objectName); } diff --git a/spring-web/src/main/java/org/springframework/web/bind/ServletRequestUtils.java b/spring-web/src/main/java/org/springframework/web/bind/ServletRequestUtils.java index 0745e9494f9..8c247d6faa2 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/ServletRequestUtils.java +++ b/spring-web/src/main/java/org/springframework/web/bind/ServletRequestUtils.java @@ -18,6 +18,8 @@ package org.springframework.web.bind; import javax.servlet.ServletRequest; +import org.springframework.lang.Nullable; + /** * Parameter extraction methods, for an approach distinct from data binding, * in which parameters of specific types are required. @@ -53,6 +55,7 @@ public abstract class ServletRequestUtils { * @throws ServletRequestBindingException a subclass of ServletException, * so it doesn't need to be caught */ + @Nullable public static Integer getIntParameter(ServletRequest request, String name) throws ServletRequestBindingException { @@ -131,6 +134,7 @@ public abstract class ServletRequestUtils { * @throws ServletRequestBindingException a subclass of ServletException, * so it doesn't need to be caught */ + @Nullable public static Long getLongParameter(ServletRequest request, String name) throws ServletRequestBindingException { @@ -209,6 +213,7 @@ public abstract class ServletRequestUtils { * @throws ServletRequestBindingException a subclass of ServletException, * so it doesn't need to be caught */ + @Nullable public static Float getFloatParameter(ServletRequest request, String name) throws ServletRequestBindingException { @@ -287,6 +292,7 @@ public abstract class ServletRequestUtils { * @throws ServletRequestBindingException a subclass of ServletException, * so it doesn't need to be caught */ + @Nullable public static Double getDoubleParameter(ServletRequest request, String name) throws ServletRequestBindingException { @@ -367,6 +373,7 @@ public abstract class ServletRequestUtils { * @throws ServletRequestBindingException a subclass of ServletException, * so it doesn't need to be caught */ + @Nullable public static Boolean getBooleanParameter(ServletRequest request, String name) throws ServletRequestBindingException { @@ -454,6 +461,7 @@ public abstract class ServletRequestUtils { * @throws ServletRequestBindingException a subclass of ServletException, * so it doesn't need to be caught */ + @Nullable public static String getStringParameter(ServletRequest request, String name) throws ServletRequestBindingException { diff --git a/spring-web/src/main/java/org/springframework/web/bind/WebDataBinder.java b/spring-web/src/main/java/org/springframework/web/bind/WebDataBinder.java index 48756e854ad..1ad598224f3 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/WebDataBinder.java +++ b/spring-web/src/main/java/org/springframework/web/bind/WebDataBinder.java @@ -24,6 +24,7 @@ import java.util.Map; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.PropertyValue; import org.springframework.core.CollectionFactory; +import org.springframework.lang.Nullable; import org.springframework.validation.DataBinder; import org.springframework.web.multipart.MultipartFile; @@ -87,7 +88,7 @@ public class WebDataBinder extends DataBinder { * if the binder is just used to convert a plain parameter value) * @see #DEFAULT_OBJECT_NAME */ - public WebDataBinder(Object target) { + public WebDataBinder(@Nullable Object target) { super(target); } @@ -97,7 +98,7 @@ public class WebDataBinder extends DataBinder { * if the binder is just used to convert a plain parameter value) * @param objectName the name of the target object */ - public WebDataBinder(Object target, String objectName) { + public WebDataBinder(@Nullable Object target, String objectName) { super(target, objectName); } @@ -258,7 +259,8 @@ public class WebDataBinder extends DataBinder { * @param fieldType the type of the field * @return the empty value (for most fields: null) */ - protected Object getEmptyValue(String field, Class fieldType) { + @Nullable + protected Object getEmptyValue(String field, @Nullable Class fieldType) { if (fieldType != null) { try { if (boolean.class == fieldType || Boolean.class == fieldType) { diff --git a/spring-web/src/main/java/org/springframework/web/bind/annotation/package-info.java b/spring-web/src/main/java/org/springframework/web/bind/annotation/package-info.java index a11e561eddc..73ccba5ce4a 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/annotation/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/bind/annotation/package-info.java @@ -2,4 +2,7 @@ * Annotations for binding requests to controllers and handler methods * as well as for binding request parameters to method arguments. */ +@NonNullApi package org.springframework.web.bind.annotation; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/bind/package-info.java b/spring-web/src/main/java/org/springframework/web/bind/package-info.java index fca046be7c0..c0b9c54c812 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/bind/package-info.java @@ -1,4 +1,7 @@ /** * Provides web-specific data binding functionality. */ +@NonNullApi package org.springframework.web.bind; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/bind/support/ConfigurableWebBindingInitializer.java b/spring-web/src/main/java/org/springframework/web/bind/support/ConfigurableWebBindingInitializer.java index acb3a459814..57819083849 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/support/ConfigurableWebBindingInitializer.java +++ b/spring-web/src/main/java/org/springframework/web/bind/support/ConfigurableWebBindingInitializer.java @@ -18,6 +18,7 @@ package org.springframework.web.bind.support; import org.springframework.beans.PropertyEditorRegistrar; import org.springframework.core.convert.ConversionService; +import org.springframework.lang.Nullable; import org.springframework.validation.BindingErrorProcessor; import org.springframework.validation.MessageCodesResolver; import org.springframework.validation.Validator; @@ -107,6 +108,7 @@ public class ConfigurableWebBindingInitializer implements WebBindingInitializer /** * Return the strategy to use for resolving errors into message codes. */ + @Nullable public final MessageCodesResolver getMessageCodesResolver() { return this.messageCodesResolver; } @@ -125,6 +127,7 @@ public class ConfigurableWebBindingInitializer implements WebBindingInitializer /** * Return the strategy to use for processing binding errors. */ + @Nullable public final BindingErrorProcessor getBindingErrorProcessor() { return this.bindingErrorProcessor; } @@ -139,6 +142,7 @@ public class ConfigurableWebBindingInitializer implements WebBindingInitializer /** * Return the Validator to apply after each binding step, if any. */ + @Nullable public final Validator getValidator() { return this.validator; } @@ -154,6 +158,7 @@ public class ConfigurableWebBindingInitializer implements WebBindingInitializer /** * Return the ConversionService which will apply to every DataBinder. */ + @Nullable public final ConversionService getConversionService() { return this.conversionService; } @@ -175,6 +180,7 @@ public class ConfigurableWebBindingInitializer implements WebBindingInitializer /** * Return the PropertyEditorRegistrars to be applied to every DataBinder. */ + @Nullable public final PropertyEditorRegistrar[] getPropertyEditorRegistrars() { return this.propertyEditorRegistrars; } diff --git a/spring-web/src/main/java/org/springframework/web/bind/support/DefaultDataBinderFactory.java b/spring-web/src/main/java/org/springframework/web/bind/support/DefaultDataBinderFactory.java index 53e5a0abd0c..df98d87019d 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/support/DefaultDataBinderFactory.java +++ b/spring-web/src/main/java/org/springframework/web/bind/support/DefaultDataBinderFactory.java @@ -16,6 +16,7 @@ package org.springframework.web.bind.support; +import org.springframework.lang.Nullable; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.context.request.NativeWebRequest; @@ -36,7 +37,7 @@ public class DefaultDataBinderFactory implements WebDataBinderFactory { * @param initializer for global data binder initialization * (or {@code null} if none) */ - public DefaultDataBinderFactory(WebBindingInitializer initializer) { + public DefaultDataBinderFactory(@Nullable WebBindingInitializer initializer) { this.initializer = initializer; } @@ -67,7 +68,7 @@ public class DefaultDataBinderFactory implements WebDataBinderFactory { * @param webRequest the current request * @throws Exception in case of invalid state or arguments */ - protected WebDataBinder createBinderInstance(Object target, String objectName, + protected WebDataBinder createBinderInstance(@Nullable Object target, String objectName, NativeWebRequest webRequest) throws Exception { return new WebRequestDataBinder(target, objectName); diff --git a/spring-web/src/main/java/org/springframework/web/bind/support/SessionAttributeStore.java b/spring-web/src/main/java/org/springframework/web/bind/support/SessionAttributeStore.java index 47a9b103c73..7f0b2b6b13e 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/support/SessionAttributeStore.java +++ b/spring-web/src/main/java/org/springframework/web/bind/support/SessionAttributeStore.java @@ -16,6 +16,7 @@ package org.springframework.web.bind.support; +import org.springframework.lang.Nullable; import org.springframework.web.context.request.WebRequest; /** @@ -46,6 +47,7 @@ public interface SessionAttributeStore { * @param attributeName the name of the attribute * @return the current attribute value, or {@code null} if none */ + @Nullable Object retrieveAttribute(WebRequest request, String attributeName); /** diff --git a/spring-web/src/main/java/org/springframework/web/bind/support/WebDataBinderFactory.java b/spring-web/src/main/java/org/springframework/web/bind/support/WebDataBinderFactory.java index e37776a3c87..1e2d3693000 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/support/WebDataBinderFactory.java +++ b/spring-web/src/main/java/org/springframework/web/bind/support/WebDataBinderFactory.java @@ -16,6 +16,7 @@ package org.springframework.web.bind.support; +import org.springframework.lang.Nullable; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.context.request.NativeWebRequest; @@ -35,6 +36,6 @@ public interface WebDataBinderFactory { * @return the created {@link WebDataBinder} instance, never null * @throws Exception raised if the creation and initialization of the data binder fails */ - WebDataBinder createBinder(NativeWebRequest webRequest, Object target, String objectName) throws Exception; + WebDataBinder createBinder(NativeWebRequest webRequest, @Nullable Object target, String objectName) throws Exception; } diff --git a/spring-web/src/main/java/org/springframework/web/bind/support/WebExchangeDataBinder.java b/spring-web/src/main/java/org/springframework/web/bind/support/WebExchangeDataBinder.java index d3ccb616895..7ff87b54f7a 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/support/WebExchangeDataBinder.java +++ b/spring-web/src/main/java/org/springframework/web/bind/support/WebExchangeDataBinder.java @@ -26,6 +26,7 @@ import reactor.core.publisher.Mono; import org.springframework.beans.MutablePropertyValues; import org.springframework.http.codec.multipart.FormFieldPart; import org.springframework.http.codec.multipart.Part; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.WebDataBinder; @@ -47,7 +48,7 @@ public class WebExchangeDataBinder extends WebDataBinder { * binder is just used to convert a plain parameter value) * @see #DEFAULT_OBJECT_NAME */ - public WebExchangeDataBinder(Object target) { + public WebExchangeDataBinder(@Nullable Object target) { super(target); } @@ -57,7 +58,7 @@ public class WebExchangeDataBinder extends WebDataBinder { * binder is just used to convert a plain parameter value) * @param objectName the name of the target object */ - public WebExchangeDataBinder(Object target, String objectName) { + public WebExchangeDataBinder(@Nullable Object target, String objectName) { super(target, objectName); } diff --git a/spring-web/src/main/java/org/springframework/web/bind/support/WebRequestDataBinder.java b/spring-web/src/main/java/org/springframework/web/bind/support/WebRequestDataBinder.java index 7841d5b951b..05886258f8c 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/support/WebRequestDataBinder.java +++ b/spring-web/src/main/java/org/springframework/web/bind/support/WebRequestDataBinder.java @@ -18,10 +18,12 @@ package org.springframework.web.bind.support; import java.util.List; import java.util.Map; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.Part; import org.springframework.beans.MutablePropertyValues; +import org.springframework.lang.Nullable; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; @@ -75,7 +77,7 @@ public class WebRequestDataBinder extends WebDataBinder { * if the binder is just used to convert a plain parameter value) * @see #DEFAULT_OBJECT_NAME */ - public WebRequestDataBinder(Object target) { + public WebRequestDataBinder(@Nullable Object target) { super(target); } @@ -85,7 +87,7 @@ public class WebRequestDataBinder extends WebDataBinder { * if the binder is just used to convert a plain parameter value) * @param objectName the name of the target object */ - public WebRequestDataBinder(Object target, String objectName) { + public WebRequestDataBinder(@Nullable Object target, String objectName) { super(target, objectName); } diff --git a/spring-web/src/main/java/org/springframework/web/bind/support/package-info.java b/spring-web/src/main/java/org/springframework/web/bind/support/package-info.java index 49a9e2a939f..2731b4f6386 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/support/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/bind/support/package-info.java @@ -1,4 +1,7 @@ /** * Support classes for web data binding. */ +@NonNullApi package org.springframework.web.bind.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/client/AsyncRestOperations.java b/spring-web/src/main/java/org/springframework/web/client/AsyncRestOperations.java index a4f77d671f7..2dda684317e 100644 --- a/spring-web/src/main/java/org/springframework/web/client/AsyncRestOperations.java +++ b/spring-web/src/main/java/org/springframework/web/client/AsyncRestOperations.java @@ -26,6 +26,7 @@ import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; +import org.springframework.lang.Nullable; import org.springframework.util.concurrent.ListenableFuture; /** @@ -128,7 +129,7 @@ public interface AsyncRestOperations { * @return the value for the {@code Location} header wrapped in a {@link Future} * @see org.springframework.http.HttpEntity */ - ListenableFuture postForLocation(String url, HttpEntity request, Object... uriVariables) + ListenableFuture postForLocation(String url, @Nullable HttpEntity request, Object... uriVariables) throws RestClientException; /** @@ -142,7 +143,7 @@ public interface AsyncRestOperations { * @return the value for the {@code Location} header wrapped in a {@link Future} * @see org.springframework.http.HttpEntity */ - ListenableFuture postForLocation(String url, HttpEntity request, Map uriVariables) + ListenableFuture postForLocation(String url, @Nullable HttpEntity request, Map uriVariables) throws RestClientException; /** @@ -154,7 +155,7 @@ public interface AsyncRestOperations { * @return the value for the {@code Location} header wrapped in a {@link Future} * @see org.springframework.http.HttpEntity */ - ListenableFuture postForLocation(URI url, HttpEntity request) throws RestClientException; + ListenableFuture postForLocation(URI url, @Nullable HttpEntity request) throws RestClientException; /** * Create a new resource by POSTing the given object to the URI template, @@ -166,7 +167,7 @@ public interface AsyncRestOperations { * @return the entity wrapped in a {@link Future} * @see org.springframework.http.HttpEntity */ - ListenableFuture> postForEntity(String url, HttpEntity request, + ListenableFuture> postForEntity(String url, @Nullable HttpEntity request, Class responseType, Object... uriVariables) throws RestClientException; /** @@ -179,7 +180,7 @@ public interface AsyncRestOperations { * @return the entity wrapped in a {@link Future} * @see org.springframework.http.HttpEntity */ - ListenableFuture> postForEntity(String url, HttpEntity request, + ListenableFuture> postForEntity(String url, @Nullable HttpEntity request, Class responseType, Map uriVariables) throws RestClientException; /** @@ -190,7 +191,7 @@ public interface AsyncRestOperations { * @return the entity wrapped in a {@link Future} * @see org.springframework.http.HttpEntity */ - ListenableFuture> postForEntity(URI url, HttpEntity request, + ListenableFuture> postForEntity(URI url, @Nullable HttpEntity request, Class responseType) throws RestClientException; @@ -205,7 +206,7 @@ public interface AsyncRestOperations { * @param uriVariables the variables to expand the template * @see HttpEntity */ - ListenableFuture put(String url, HttpEntity request, Object... uriVariables) + ListenableFuture put(String url, @Nullable HttpEntity request, Object... uriVariables) throws RestClientException; /** @@ -217,7 +218,7 @@ public interface AsyncRestOperations { * @param uriVariables the variables to expand the template * @see HttpEntity */ - ListenableFuture put(String url, HttpEntity request, Map uriVariables) + ListenableFuture put(String url, @Nullable HttpEntity request, Map uriVariables) throws RestClientException; /** @@ -227,7 +228,7 @@ public interface AsyncRestOperations { * @param request the Object to be PUT (may be {@code null}) * @see HttpEntity */ - ListenableFuture put(URI url, HttpEntity request) throws RestClientException; + ListenableFuture put(URI url, @Nullable HttpEntity request) throws RestClientException; // DELETE @@ -305,7 +306,7 @@ public interface AsyncRestOperations { * @return the response as entity wrapped in a {@link Future} */ ListenableFuture> exchange(String url, HttpMethod method, - HttpEntity requestEntity, Class responseType, Object... uriVariables) + @Nullable HttpEntity requestEntity, Class responseType, Object... uriVariables) throws RestClientException; /** @@ -322,7 +323,7 @@ public interface AsyncRestOperations { * @return the response as entity wrapped in a {@link Future} */ ListenableFuture> exchange(String url, HttpMethod method, - HttpEntity requestEntity, Class responseType, + @Nullable HttpEntity requestEntity, Class responseType, Map uriVariables) throws RestClientException; /** @@ -337,7 +338,7 @@ public interface AsyncRestOperations { * @return the response as entity wrapped in a {@link Future} */ ListenableFuture> exchange(URI url, HttpMethod method, - HttpEntity requestEntity, Class responseType) + @Nullable HttpEntity requestEntity, Class responseType) throws RestClientException; /** @@ -358,7 +359,7 @@ public interface AsyncRestOperations { * @return the response as entity wrapped in a {@link Future} */ ListenableFuture> exchange(String url, HttpMethod method, - HttpEntity requestEntity, ParameterizedTypeReference responseType, + @Nullable HttpEntity requestEntity, ParameterizedTypeReference responseType, Object... uriVariables) throws RestClientException; /** @@ -379,7 +380,7 @@ public interface AsyncRestOperations { * @return the response as entity wrapped in a {@link Future} */ ListenableFuture> exchange(String url, HttpMethod method, - HttpEntity requestEntity, ParameterizedTypeReference responseType, + @Nullable HttpEntity requestEntity, ParameterizedTypeReference responseType, Map uriVariables) throws RestClientException; /** @@ -399,7 +400,7 @@ public interface AsyncRestOperations { * @return the response as entity wrapped in a {@link Future} */ ListenableFuture> exchange(URI url, HttpMethod method, - HttpEntity requestEntity, ParameterizedTypeReference responseType) + @Nullable HttpEntity requestEntity, ParameterizedTypeReference responseType) throws RestClientException; diff --git a/spring-web/src/main/java/org/springframework/web/client/AsyncRestTemplate.java b/spring-web/src/main/java/org/springframework/web/client/AsyncRestTemplate.java index 7f034ca07cc..b48cff0f2c0 100644 --- a/spring-web/src/main/java/org/springframework/web/client/AsyncRestTemplate.java +++ b/spring-web/src/main/java/org/springframework/web/client/AsyncRestTemplate.java @@ -38,6 +38,7 @@ import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.concurrent.ListenableFuture; import org.springframework.util.concurrent.ListenableFutureAdapter; @@ -498,8 +499,8 @@ public class AsyncRestTemplate extends org.springframework.http.client.support.I * be {@code null}) * @return an arbitrary object, as returned by the {@link ResponseExtractor} */ - protected ListenableFuture doExecute(URI url, HttpMethod method, AsyncRequestCallback requestCallback, - ResponseExtractor responseExtractor) throws RestClientException { + protected ListenableFuture doExecute(URI url, HttpMethod method, @Nullable AsyncRequestCallback requestCallback, + @Nullable ResponseExtractor responseExtractor) throws RestClientException { Assert.notNull(url, "'url' must not be null"); Assert.notNull(method, "'method' must not be null"); diff --git a/spring-web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java b/spring-web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java index 399187b46e8..b5dfec7dcb3 100644 --- a/spring-web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java +++ b/spring-web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java @@ -23,6 +23,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpResponse; +import org.springframework.lang.Nullable; import org.springframework.util.FileCopyUtils; /** @@ -110,6 +111,7 @@ public class DefaultResponseErrorHandler implements ResponseErrorHandler { * @return the associated charset, or {@code null} if none * @since 4.3.8 */ + @Nullable protected Charset getCharset(ClientHttpResponse response) { HttpHeaders headers = response.getHeaders(); MediaType contentType = headers.getContentType(); diff --git a/spring-web/src/main/java/org/springframework/web/client/HttpClientErrorException.java b/spring-web/src/main/java/org/springframework/web/client/HttpClientErrorException.java index 14883542a9e..8e7814d21df 100644 --- a/spring-web/src/main/java/org/springframework/web/client/HttpClientErrorException.java +++ b/spring-web/src/main/java/org/springframework/web/client/HttpClientErrorException.java @@ -20,6 +20,7 @@ import java.nio.charset.Charset; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; /** * Exception thrown when an HTTP 4xx is received. @@ -61,7 +62,7 @@ public class HttpClientErrorException extends HttpStatusCodeException { * @param responseCharset the response body charset (may be {@code null}) */ public HttpClientErrorException(HttpStatus statusCode, String statusText, - byte[] responseBody, Charset responseCharset) { + @Nullable byte[] responseBody, @Nullable Charset responseCharset) { super(statusCode, statusText, responseBody, responseCharset); } @@ -77,7 +78,7 @@ public class HttpClientErrorException extends HttpStatusCodeException { * @since 3.1.2 */ public HttpClientErrorException(HttpStatus statusCode, String statusText, - HttpHeaders responseHeaders, byte[] responseBody, Charset responseCharset) { + @Nullable HttpHeaders responseHeaders, @Nullable byte[] responseBody, @Nullable Charset responseCharset) { super(statusCode, statusText, responseHeaders, responseBody, responseCharset); } diff --git a/spring-web/src/main/java/org/springframework/web/client/HttpServerErrorException.java b/spring-web/src/main/java/org/springframework/web/client/HttpServerErrorException.java index f4e494d9315..128b3716218 100644 --- a/spring-web/src/main/java/org/springframework/web/client/HttpServerErrorException.java +++ b/spring-web/src/main/java/org/springframework/web/client/HttpServerErrorException.java @@ -20,6 +20,7 @@ import java.nio.charset.Charset; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; /** * Exception thrown when an HTTP 5xx is received. @@ -62,7 +63,7 @@ public class HttpServerErrorException extends HttpStatusCodeException { * @since 3.0.5 */ public HttpServerErrorException(HttpStatus statusCode, String statusText, - byte[] responseBody, Charset responseCharset) { + @Nullable byte[] responseBody, @Nullable Charset responseCharset) { super(statusCode, statusText, responseBody, responseCharset); } @@ -78,7 +79,7 @@ public class HttpServerErrorException extends HttpStatusCodeException { * @since 3.1.2 */ public HttpServerErrorException(HttpStatus statusCode, String statusText, - HttpHeaders responseHeaders, byte[] responseBody, Charset responseCharset) { + @Nullable HttpHeaders responseHeaders, @Nullable byte[] responseBody, @Nullable Charset responseCharset) { super(statusCode, statusText, responseHeaders, responseBody, responseCharset); } diff --git a/spring-web/src/main/java/org/springframework/web/client/HttpStatusCodeException.java b/spring-web/src/main/java/org/springframework/web/client/HttpStatusCodeException.java index 0d5c2fbc195..a4f22478edb 100644 --- a/spring-web/src/main/java/org/springframework/web/client/HttpStatusCodeException.java +++ b/spring-web/src/main/java/org/springframework/web/client/HttpStatusCodeException.java @@ -20,6 +20,7 @@ import java.nio.charset.Charset; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; /** * Abstract base class for exceptions based on an {@link HttpStatus}. @@ -63,7 +64,7 @@ public abstract class HttpStatusCodeException extends RestClientResponseExceptio * @since 3.0.5 */ protected HttpStatusCodeException(HttpStatus statusCode, String statusText, - byte[] responseBody, Charset responseCharset) { + @Nullable byte[] responseBody, @Nullable Charset responseCharset) { this(statusCode, statusText, null, responseBody, responseCharset); } @@ -79,7 +80,7 @@ public abstract class HttpStatusCodeException extends RestClientResponseExceptio * @since 3.1.2 */ protected HttpStatusCodeException(HttpStatus statusCode, String statusText, - HttpHeaders responseHeaders, byte[] responseBody, Charset responseCharset) { + @Nullable HttpHeaders responseHeaders, @Nullable byte[] responseBody, @Nullable Charset responseCharset) { super(statusCode.value() + " " + statusText, statusCode.value(), statusText, responseHeaders, responseBody, responseCharset); diff --git a/spring-web/src/main/java/org/springframework/web/client/ResponseExtractor.java b/spring-web/src/main/java/org/springframework/web/client/ResponseExtractor.java index 143fb6925f2..e77e6c91b1c 100644 --- a/spring-web/src/main/java/org/springframework/web/client/ResponseExtractor.java +++ b/spring-web/src/main/java/org/springframework/web/client/ResponseExtractor.java @@ -19,6 +19,7 @@ package org.springframework.web.client; import java.io.IOException; import org.springframework.http.client.ClientHttpResponse; +import org.springframework.lang.Nullable; /** * Generic callback interface used by {@link RestTemplate}'s retrieval methods @@ -41,6 +42,7 @@ public interface ResponseExtractor { * @return the extracted data * @throws IOException in case of I/O errors */ + @Nullable T extractData(ClientHttpResponse response) throws IOException; } diff --git a/spring-web/src/main/java/org/springframework/web/client/RestClientResponseException.java b/spring-web/src/main/java/org/springframework/web/client/RestClientResponseException.java index d9c1e6a0f1d..3779143280b 100644 --- a/spring-web/src/main/java/org/springframework/web/client/RestClientResponseException.java +++ b/spring-web/src/main/java/org/springframework/web/client/RestClientResponseException.java @@ -20,6 +20,7 @@ import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import org.springframework.http.HttpHeaders; +import org.springframework.lang.Nullable; /** * Common base class for exceptions that contain actual HTTP response data. @@ -54,7 +55,7 @@ public class RestClientResponseException extends RestClientException { * @param responseCharset the response body charset (may be {@code null}) */ public RestClientResponseException(String message, int statusCode, String statusText, - HttpHeaders responseHeaders, byte[] responseBody, Charset responseCharset) { + @Nullable HttpHeaders responseHeaders, @Nullable byte[] responseBody, @Nullable Charset responseCharset) { super(message); this.rawStatusCode = statusCode; diff --git a/spring-web/src/main/java/org/springframework/web/client/RestOperations.java b/spring-web/src/main/java/org/springframework/web/client/RestOperations.java index aed0a89d10a..4d93d9e6599 100644 --- a/spring-web/src/main/java/org/springframework/web/client/RestOperations.java +++ b/spring-web/src/main/java/org/springframework/web/client/RestOperations.java @@ -26,6 +26,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; +import org.springframework.lang.Nullable; /** * Interface specifying a basic set of RESTful operations. @@ -51,6 +52,7 @@ public interface RestOperations { * @param uriVariables the variables to expand the template * @return the converted object */ + @Nullable T getForObject(String url, Class responseType, Object... uriVariables) throws RestClientException; /** @@ -62,6 +64,7 @@ public interface RestOperations { * @param uriVariables the map containing variables for the URI template * @return the converted object */ + @Nullable T getForObject(String url, Class responseType, Map uriVariables) throws RestClientException; /** @@ -71,6 +74,7 @@ public interface RestOperations { * @param responseType the type of the return value * @return the converted object */ + @Nullable T getForObject(URI url, Class responseType) throws RestClientException; /** @@ -150,7 +154,7 @@ public interface RestOperations { * @return the value for the {@code Location} header * @see HttpEntity */ - URI postForLocation(String url, Object request, Object... uriVariables) throws RestClientException; + URI postForLocation(String url, @Nullable Object request, Object... uriVariables) throws RestClientException; /** * Create a new resource by POSTing the given object to the URI template, and returns the value of @@ -164,7 +168,7 @@ public interface RestOperations { * @return the value for the {@code Location} header * @see HttpEntity */ - URI postForLocation(String url, Object request, Map uriVariables) throws RestClientException; + URI postForLocation(String url, @Nullable Object request, Map uriVariables) throws RestClientException; /** * Create a new resource by POSTing the given object to the URL, and returns the value of the @@ -176,7 +180,7 @@ public interface RestOperations { * @return the value for the {@code Location} header * @see HttpEntity */ - URI postForLocation(URI url, Object request) throws RestClientException; + URI postForLocation(URI url, @Nullable Object request) throws RestClientException; /** * Create a new resource by POSTing the given object to the URI template, @@ -191,7 +195,8 @@ public interface RestOperations { * @return the converted object * @see HttpEntity */ - T postForObject(String url, Object request, Class responseType, Object... uriVariables) + @Nullable + T postForObject(String url, @Nullable Object request, Class responseType, Object... uriVariables) throws RestClientException; /** @@ -207,7 +212,8 @@ public interface RestOperations { * @return the converted object * @see HttpEntity */ - T postForObject(String url, Object request, Class responseType, Map uriVariables) + @Nullable + T postForObject(String url, @Nullable Object request, Class responseType, Map uriVariables) throws RestClientException; /** @@ -221,7 +227,8 @@ public interface RestOperations { * @return the converted object * @see HttpEntity */ - T postForObject(URI url, Object request, Class responseType) throws RestClientException; + @Nullable + T postForObject(URI url, @Nullable Object request, Class responseType) throws RestClientException; /** * Create a new resource by POSTing the given object to the URI template, @@ -236,7 +243,7 @@ public interface RestOperations { * @since 3.0.2 * @see HttpEntity */ - ResponseEntity postForEntity(String url, Object request, Class responseType, Object... uriVariables) + ResponseEntity postForEntity(String url, @Nullable Object request, Class responseType, Object... uriVariables) throws RestClientException; /** @@ -252,7 +259,7 @@ public interface RestOperations { * @since 3.0.2 * @see HttpEntity */ - ResponseEntity postForEntity(String url, Object request, Class responseType, Map uriVariables) + ResponseEntity postForEntity(String url, @Nullable Object request, Class responseType, Map uriVariables) throws RestClientException; /** @@ -266,7 +273,7 @@ public interface RestOperations { * @since 3.0.2 * @see HttpEntity */ - ResponseEntity postForEntity(URI url, Object request, Class responseType) throws RestClientException; + ResponseEntity postForEntity(URI url, @Nullable Object request, Class responseType) throws RestClientException; // PUT @@ -281,7 +288,7 @@ public interface RestOperations { * @param uriVariables the variables to expand the template * @see HttpEntity */ - void put(String url, Object request, Object... uriVariables) throws RestClientException; + void put(String url, @Nullable Object request, Object... uriVariables) throws RestClientException; /** * Creates a new resource by PUTting the given object to URI template. @@ -293,7 +300,7 @@ public interface RestOperations { * @param uriVariables the variables to expand the template * @see HttpEntity */ - void put(String url, Object request, Map uriVariables) throws RestClientException; + void put(String url, @Nullable Object request, Map uriVariables) throws RestClientException; /** * Creates a new resource by PUTting the given object to URL. @@ -303,7 +310,7 @@ public interface RestOperations { * @param request the Object to be PUT (may be {@code null}) * @see HttpEntity */ - void put(URI url, Object request) throws RestClientException; + void put(URI url, @Nullable Object request) throws RestClientException; // PATCH @@ -327,7 +334,8 @@ public interface RestOperations { * @see org.springframework.http.client.HttpComponentsAsyncClientHttpRequestFactory * @see org.springframework.http.client.OkHttp3ClientHttpRequestFactory */ - T patchForObject(String url, Object request, Class responseType, Object... uriVariables) + @Nullable + T patchForObject(String url, @Nullable Object request, Class responseType, Object... uriVariables) throws RestClientException; /** @@ -349,7 +357,8 @@ public interface RestOperations { * @see org.springframework.http.client.HttpComponentsAsyncClientHttpRequestFactory * @see org.springframework.http.client.OkHttp3ClientHttpRequestFactory */ - T patchForObject(String url, Object request, Class responseType, Map uriVariables) + @Nullable + T patchForObject(String url, @Nullable Object request, Class responseType, Map uriVariables) throws RestClientException; /** @@ -369,7 +378,8 @@ public interface RestOperations { * @see org.springframework.http.client.HttpComponentsAsyncClientHttpRequestFactory * @see org.springframework.http.client.OkHttp3ClientHttpRequestFactory */ - T patchForObject(URI url, Object request, Class responseType) throws RestClientException; + @Nullable + T patchForObject(URI url, @Nullable Object request, Class responseType) throws RestClientException; @@ -442,7 +452,7 @@ public interface RestOperations { * @return the response as entity * @since 3.0.2 */ - ResponseEntity exchange(String url, HttpMethod method, HttpEntity requestEntity, + ResponseEntity exchange(String url, HttpMethod method, @Nullable HttpEntity requestEntity, Class responseType, Object... uriVariables) throws RestClientException; /** @@ -458,7 +468,7 @@ public interface RestOperations { * @return the response as entity * @since 3.0.2 */ - ResponseEntity exchange(String url, HttpMethod method, HttpEntity requestEntity, + ResponseEntity exchange(String url, HttpMethod method, @Nullable HttpEntity requestEntity, Class responseType, Map uriVariables) throws RestClientException; /** @@ -472,7 +482,7 @@ public interface RestOperations { * @return the response as entity * @since 3.0.2 */ - ResponseEntity exchange(URI url, HttpMethod method, HttpEntity requestEntity, + ResponseEntity exchange(URI url, HttpMethod method, @Nullable HttpEntity requestEntity, Class responseType) throws RestClientException; /** @@ -492,7 +502,7 @@ public interface RestOperations { * @return the response as entity * @since 3.2 */ - ResponseEntity exchange(String url,HttpMethod method, HttpEntity requestEntity, + ResponseEntity exchange(String url,HttpMethod method, @Nullable HttpEntity requestEntity, ParameterizedTypeReference responseType, Object... uriVariables) throws RestClientException; /** @@ -512,7 +522,7 @@ public interface RestOperations { * @return the response as entity * @since 3.2 */ - ResponseEntity exchange(String url, HttpMethod method, HttpEntity requestEntity, + ResponseEntity exchange(String url, HttpMethod method, @Nullable HttpEntity requestEntity, ParameterizedTypeReference responseType, Map uriVariables) throws RestClientException; /** @@ -531,7 +541,7 @@ public interface RestOperations { * @return the response as entity * @since 3.2 */ - ResponseEntity exchange(URI url, HttpMethod method, HttpEntity requestEntity, + ResponseEntity exchange(URI url, HttpMethod method, @Nullable HttpEntity requestEntity, ParameterizedTypeReference responseType) throws RestClientException; /** @@ -582,6 +592,7 @@ public interface RestOperations { * @param uriVariables the variables to expand in the template * @return an arbitrary object, as returned by the {@link ResponseExtractor} */ + @Nullable T execute(String url, HttpMethod method, RequestCallback requestCallback, ResponseExtractor responseExtractor, Object... uriVariables) throws RestClientException; @@ -596,6 +607,7 @@ public interface RestOperations { * @param uriVariables the variables to expand in the template * @return an arbitrary object, as returned by the {@link ResponseExtractor} */ + @Nullable T execute(String url, HttpMethod method, RequestCallback requestCallback, ResponseExtractor responseExtractor, Map uriVariables) throws RestClientException; @@ -608,6 +620,7 @@ public interface RestOperations { * @param responseExtractor object that extracts the return value from the response * @return an arbitrary object, as returned by the {@link ResponseExtractor} */ + @Nullable T execute(URI url, HttpMethod method, RequestCallback requestCallback, ResponseExtractor responseExtractor) throws RestClientException; diff --git a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java index dfe291f2416..eac4ddfb053 100644 --- a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java +++ b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java @@ -51,6 +51,7 @@ import org.springframework.http.converter.support.AllEncompassingFormHttpMessage import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter; import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter; import org.springframework.http.converter.xml.SourceHttpMessageConverter; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.web.util.DefaultUriBuilderFactory; @@ -667,8 +668,9 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat * @param responseExtractor object that extracts the return value from the response (can be {@code null}) * @return an arbitrary object, as returned by the {@link ResponseExtractor} */ - protected T doExecute(URI url, HttpMethod method, RequestCallback requestCallback, - ResponseExtractor responseExtractor) throws RestClientException { + @Nullable + protected T doExecute(URI url, HttpMethod method, @Nullable RequestCallback requestCallback, + @Nullable ResponseExtractor responseExtractor) throws RestClientException { Assert.notNull(url, "'url' must not be null"); Assert.notNull(method, "'method' must not be null"); diff --git a/spring-web/src/main/java/org/springframework/web/client/UnknownHttpStatusCodeException.java b/spring-web/src/main/java/org/springframework/web/client/UnknownHttpStatusCodeException.java index b8e894b9254..9b019770523 100644 --- a/spring-web/src/main/java/org/springframework/web/client/UnknownHttpStatusCodeException.java +++ b/spring-web/src/main/java/org/springframework/web/client/UnknownHttpStatusCodeException.java @@ -20,6 +20,7 @@ import java.nio.charset.Charset; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; /** * Exception thrown when an unknown (or custom) HTTP status code is received. @@ -42,7 +43,7 @@ public class UnknownHttpStatusCodeException extends RestClientResponseException * @param responseCharset the response body charset, may be {@code null} */ public UnknownHttpStatusCodeException(int rawStatusCode, String statusText, - HttpHeaders responseHeaders, byte[] responseBody, Charset responseCharset) { + @Nullable HttpHeaders responseHeaders, @Nullable byte[] responseBody,@Nullable Charset responseCharset) { super("Unknown status code [" + String.valueOf(rawStatusCode) + "]" + " " + statusText, rawStatusCode, statusText, responseHeaders, responseBody, responseCharset); diff --git a/spring-web/src/main/java/org/springframework/web/client/package-info.java b/spring-web/src/main/java/org/springframework/web/client/package-info.java index c4de044765a..56cccb4c7e6 100644 --- a/spring-web/src/main/java/org/springframework/web/client/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/client/package-info.java @@ -2,4 +2,7 @@ * Core package of the client-side web support. * Provides a RestTemplate class and various callback interfaces. */ +@NonNullApi package org.springframework.web.client; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/client/support/package-info.java b/spring-web/src/main/java/org/springframework/web/client/support/package-info.java index d7fd057b314..b617229b2d0 100644 --- a/spring-web/src/main/java/org/springframework/web/client/support/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/client/support/package-info.java @@ -2,4 +2,7 @@ * Classes supporting the {@code org.springframework.web.client} package. * Contains a base class for RestTemplate usage. */ +@NonNullApi package org.springframework.web.client.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/context/AbstractContextLoaderInitializer.java b/spring-web/src/main/java/org/springframework/web/context/AbstractContextLoaderInitializer.java index 49622568bd9..7e56d42879c 100644 --- a/spring-web/src/main/java/org/springframework/web/context/AbstractContextLoaderInitializer.java +++ b/spring-web/src/main/java/org/springframework/web/context/AbstractContextLoaderInitializer.java @@ -23,6 +23,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.context.ApplicationContextInitializer; +import org.springframework.lang.Nullable; import org.springframework.web.WebApplicationInitializer; /** @@ -79,6 +80,7 @@ public abstract class AbstractContextLoaderInitializer implements WebApplication * desired * @see org.springframework.web.servlet.support.AbstractDispatcherServletInitializer */ + @Nullable protected abstract WebApplicationContext createRootApplicationContext(); /** @@ -88,6 +90,7 @@ public abstract class AbstractContextLoaderInitializer implements WebApplication * @see #createRootApplicationContext() * @see ContextLoaderListener#setContextInitializers */ + @Nullable protected ApplicationContextInitializer[] getRootApplicationContextInitializers() { return null; } diff --git a/spring-web/src/main/java/org/springframework/web/context/ConfigurableWebApplicationContext.java b/spring-web/src/main/java/org/springframework/web/context/ConfigurableWebApplicationContext.java index a48338358ba..9d101a54725 100644 --- a/spring-web/src/main/java/org/springframework/web/context/ConfigurableWebApplicationContext.java +++ b/spring-web/src/main/java/org/springframework/web/context/ConfigurableWebApplicationContext.java @@ -20,6 +20,7 @@ import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.lang.Nullable; /** * Interface to be implemented by configurable web application contexts. @@ -69,6 +70,7 @@ public interface ConfigurableWebApplicationContext extends WebApplicationContext /** * Return the ServletConfig for this web application context, if any. */ + @Nullable ServletConfig getServletConfig(); /** @@ -81,6 +83,7 @@ public interface ConfigurableWebApplicationContext extends WebApplicationContext /** * Return the namespace for this web application context, if any. */ + @Nullable String getNamespace(); /** @@ -102,6 +105,7 @@ public interface ConfigurableWebApplicationContext extends WebApplicationContext * Return the config locations for this web application context, * or {@code null} if none specified. */ + @Nullable String[] getConfigLocations(); } diff --git a/spring-web/src/main/java/org/springframework/web/context/ConfigurableWebEnvironment.java b/spring-web/src/main/java/org/springframework/web/context/ConfigurableWebEnvironment.java index 241f1023194..f2a67884056 100644 --- a/spring-web/src/main/java/org/springframework/web/context/ConfigurableWebEnvironment.java +++ b/spring-web/src/main/java/org/springframework/web/context/ConfigurableWebEnvironment.java @@ -20,6 +20,7 @@ import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.lang.Nullable; /** * Specialization of {@link ConfigurableEnvironment} allowing initialization of @@ -43,6 +44,6 @@ public interface ConfigurableWebEnvironment extends ConfigurableEnvironment { * @see org.springframework.web.context.support.WebApplicationContextUtils#initServletPropertySources( * org.springframework.core.env.MutablePropertySources, ServletContext, ServletConfig) */ - void initPropertySources(ServletContext servletContext, ServletConfig servletConfig); + void initPropertySources(@Nullable ServletContext servletContext, @Nullable ServletConfig servletConfig); } diff --git a/spring-web/src/main/java/org/springframework/web/context/ContextLoader.java b/spring-web/src/main/java/org/springframework/web/context/ContextLoader.java index 85204e96b42..b8edf4b0918 100644 --- a/spring-web/src/main/java/org/springframework/web/context/ContextLoader.java +++ b/spring-web/src/main/java/org/springframework/web/context/ContextLoader.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; + import javax.servlet.ServletContext; import org.apache.commons.logging.Log; @@ -37,6 +38,7 @@ import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.support.PropertiesLoaderUtils; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -504,6 +506,7 @@ public class ContextLoader { * @param servletContext current servlet context * @return the parent application context, or {@code null} if none */ + @Nullable protected ApplicationContext loadParentContext(ServletContext servletContext) { return null; } @@ -542,6 +545,7 @@ public class ContextLoader { * if none found * @see org.springframework.web.context.support.SpringBeanAutowiringSupport */ + @Nullable public static WebApplicationContext getCurrentWebApplicationContext() { ClassLoader ccl = Thread.currentThread().getContextClassLoader(); if (ccl != null) { diff --git a/spring-web/src/main/java/org/springframework/web/context/annotation/package-info.java b/spring-web/src/main/java/org/springframework/web/context/annotation/package-info.java index fffce1b0586..b56cc70a480 100644 --- a/spring-web/src/main/java/org/springframework/web/context/annotation/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/context/annotation/package-info.java @@ -1,4 +1,7 @@ /** * Provides convenience annotations for web scopes. */ +@NonNullApi package org.springframework.web.context.annotation; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/context/package-info.java b/spring-web/src/main/java/org/springframework/web/context/package-info.java index 2cc6192a802..b00b31383a7 100644 --- a/spring-web/src/main/java/org/springframework/web/context/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/context/package-info.java @@ -2,4 +2,7 @@ * Contains a variant of the application context interface for web applications, * and the ContextLoaderListener that bootstraps a root web application context. */ +@NonNullApi package org.springframework.web.context; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/context/request/NativeWebRequest.java b/spring-web/src/main/java/org/springframework/web/context/request/NativeWebRequest.java index edf161e1278..79b6f9b4c2c 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/NativeWebRequest.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/NativeWebRequest.java @@ -16,6 +16,8 @@ package org.springframework.web.context.request; +import org.springframework.lang.Nullable; + /** * Extension of the {@link WebRequest} interface, exposing the * native request and response objects in a generic fashion. @@ -47,6 +49,7 @@ public interface NativeWebRequest extends WebRequest { * of that type is available * @see javax.servlet.http.HttpServletRequest */ + @Nullable T getNativeRequest(Class requiredType); /** @@ -56,6 +59,7 @@ public interface NativeWebRequest extends WebRequest { * of that type is available * @see javax.servlet.http.HttpServletResponse */ + @Nullable T getNativeResponse(Class requiredType); } diff --git a/spring-web/src/main/java/org/springframework/web/context/request/RequestAttributes.java b/spring-web/src/main/java/org/springframework/web/context/request/RequestAttributes.java index 6fba81f3c25..fd92841199e 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/RequestAttributes.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/RequestAttributes.java @@ -16,6 +16,8 @@ package org.springframework.web.context.request; +import org.springframework.lang.Nullable; + /** * Abstraction for accessing attribute objects associated with a request. * Supports access to request-scoped attributes as well as to session-scoped @@ -63,6 +65,7 @@ public interface RequestAttributes { * @param scope the scope identifier * @return the current attribute value, or {@code null} if not found */ + @Nullable Object getAttribute(String name, int scope); /** @@ -122,12 +125,14 @@ public interface RequestAttributes { * @param key the contextual key * @return the corresponding object, or {@code null} if none found */ + @Nullable Object resolveReference(String key); /** * Return an id for the current underlying session. * @return the session id as String (never {@code null}) */ + @Nullable String getSessionId(); /** @@ -135,6 +140,7 @@ public interface RequestAttributes { * that is, an object to synchronize on for the underlying session. * @return the session mutex to use (never {@code null}) */ + @Nullable Object getSessionMutex(); } diff --git a/spring-web/src/main/java/org/springframework/web/context/request/RequestContextHolder.java b/spring-web/src/main/java/org/springframework/web/context/request/RequestContextHolder.java index 365f66f6c4f..6a7a1e4fdd2 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/RequestContextHolder.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/RequestContextHolder.java @@ -20,6 +20,7 @@ import javax.faces.context.FacesContext; import org.springframework.core.NamedInheritableThreadLocal; import org.springframework.core.NamedThreadLocal; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; /** @@ -78,7 +79,7 @@ public abstract class RequestContextHolder { * @param inheritable whether to expose the RequestAttributes as inheritable * for child threads (using an {@link InheritableThreadLocal}) */ - public static void setRequestAttributes(RequestAttributes attributes, boolean inheritable) { + public static void setRequestAttributes(@Nullable RequestAttributes attributes, boolean inheritable) { if (attributes == null) { resetRequestAttributes(); } @@ -99,6 +100,7 @@ public abstract class RequestContextHolder { * @return the RequestAttributes currently bound to the thread, * or {@code null} if none bound */ + @Nullable public static RequestAttributes getRequestAttributes() { RequestAttributes attributes = requestAttributesHolder.get(); if (attributes == null) { diff --git a/spring-web/src/main/java/org/springframework/web/context/request/ServletRequestAttributes.java b/spring-web/src/main/java/org/springframework/web/context/request/ServletRequestAttributes.java index 970c77b7551..b57eff81e67 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/ServletRequestAttributes.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/ServletRequestAttributes.java @@ -24,6 +24,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.NumberUtils; import org.springframework.util.StringUtils; @@ -98,6 +99,7 @@ public class ServletRequestAttributes extends AbstractRequestAttributes { /** * Exposes the native {@link HttpServletResponse} that we're wrapping (if any). */ + @Nullable public final HttpServletResponse getResponse() { return this.response; } diff --git a/spring-web/src/main/java/org/springframework/web/context/request/WebRequest.java b/spring-web/src/main/java/org/springframework/web/context/request/WebRequest.java index c4c11eb4871..1db8b9735ba 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/WebRequest.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/WebRequest.java @@ -21,6 +21,8 @@ import java.util.Iterator; import java.util.Locale; import java.util.Map; +import org.springframework.lang.Nullable; + /** * Generic interface for a web request. Mainly intended for generic web * request interceptors, giving them access to general request metadata, @@ -39,6 +41,7 @@ public interface WebRequest extends RequestAttributes { * @since 3.0 * @see javax.servlet.http.HttpServletRequest#getHeader(String) */ + @Nullable String getHeader(String headerName); /** @@ -48,6 +51,7 @@ public interface WebRequest extends RequestAttributes { * @since 3.0 * @see javax.servlet.http.HttpServletRequest#getHeaders(String) */ + @Nullable String[] getHeaderValues(String headerName); /** @@ -62,6 +66,7 @@ public interface WebRequest extends RequestAttributes { *

    Retrieves the first parameter value in case of a multi-value parameter. * @see javax.servlet.http.HttpServletRequest#getParameter(String) */ + @Nullable String getParameter(String paramName); /** @@ -70,6 +75,7 @@ public interface WebRequest extends RequestAttributes { *

    A single-value parameter will be exposed as an array with a single element. * @see javax.servlet.http.HttpServletRequest#getParameterValues(String) */ + @Nullable String[] getParameterValues(String paramName); /** @@ -104,12 +110,14 @@ public interface WebRequest extends RequestAttributes { * Return the remote user for this request, if any. * @see javax.servlet.http.HttpServletRequest#getRemoteUser() */ + @Nullable String getRemoteUser(); /** * Return the user principal for this request, if any. * @see javax.servlet.http.HttpServletRequest#getUserPrincipal() */ + @Nullable Principal getUserPrincipal(); /** diff --git a/spring-web/src/main/java/org/springframework/web/context/request/WebRequestInterceptor.java b/spring-web/src/main/java/org/springframework/web/context/request/WebRequestInterceptor.java index 4b16c98334f..aee6209a4e9 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/WebRequestInterceptor.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/WebRequestInterceptor.java @@ -16,6 +16,7 @@ package org.springframework.web.context.request; +import org.springframework.lang.Nullable; import org.springframework.ui.ModelMap; /** @@ -75,7 +76,7 @@ public interface WebRequestInterceptor { * and/or to add further model attributes, if desired. * @throws Exception in case of errors */ - void postHandle(WebRequest request, ModelMap model) throws Exception; + void postHandle(WebRequest request, @Nullable ModelMap model) throws Exception; /** * Callback after completion of request processing, that is, after rendering @@ -87,6 +88,6 @@ public interface WebRequestInterceptor { * @param ex exception thrown on handler execution, if any * @throws Exception in case of errors */ - void afterCompletion(WebRequest request, Exception ex) throws Exception; + void afterCompletion(WebRequest request, @Nullable Exception ex) throws Exception; } diff --git a/spring-web/src/main/java/org/springframework/web/context/request/async/AsyncWebRequest.java b/spring-web/src/main/java/org/springframework/web/context/request/async/AsyncWebRequest.java index 529e6644221..64c8072ccce 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/async/AsyncWebRequest.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/async/AsyncWebRequest.java @@ -16,6 +16,7 @@ package org.springframework.web.context.request.async; +import org.springframework.lang.Nullable; import org.springframework.web.context.request.NativeWebRequest; /** @@ -33,7 +34,7 @@ public interface AsyncWebRequest extends NativeWebRequest { * @param timeout amount of time in milliseconds; {@code null} means no * timeout, i.e. rely on the default timeout of the container. */ - void setTimeout(Long timeout); + void setTimeout(@Nullable Long timeout); /** * Add a handler to invoke when concurrent handling has timed out. diff --git a/spring-web/src/main/java/org/springframework/web/context/request/async/DeferredResult.java b/spring-web/src/main/java/org/springframework/web/context/request/async/DeferredResult.java index e2ad4be263c..5d65839b351 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/async/DeferredResult.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/async/DeferredResult.java @@ -22,6 +22,7 @@ import java.util.concurrent.Callable; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.context.request.NativeWebRequest; @@ -93,7 +94,7 @@ public class DeferredResult { * @param timeout timeout value in milliseconds (ignored if {@code null}) * @param timeoutResult the result to use */ - public DeferredResult(Long timeout, Object timeoutResult) { + public DeferredResult(@Nullable Long timeout, Object timeoutResult) { this.timeoutResult = timeoutResult; this.timeout = timeout; } @@ -125,6 +126,7 @@ public class DeferredResult { * to check if there is a result prior to calling this method. * @since 4.0 */ + @Nullable public Object getResult() { Object resultToCheck = this.result; return (resultToCheck != RESULT_NONE ? resultToCheck : null); diff --git a/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java b/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java index 5054041431a..aaf53a27a7f 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.RejectedExecutionException; + import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; @@ -29,6 +30,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.core.task.SimpleAsyncTaskExecutor; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.async.DeferredResult.DeferredResultHandler; @@ -166,6 +168,7 @@ public final class WebAsyncManager { * @param key the key * @return the interceptor registered under that key or {@code null} */ + @Nullable public CallableProcessingInterceptor getCallableInterceptor(Object key) { return this.callableInterceptors.get(key); } @@ -175,6 +178,7 @@ public final class WebAsyncManager { * @param key the key * @return the interceptor registered under that key or {@code null} */ + @Nullable public DeferredResultProcessingInterceptor getDeferredResultInterceptor(Object key) { return this.deferredResultInterceptors.get(key); } diff --git a/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncTask.java b/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncTask.java index 21a4ede67fd..002c1d602df 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncTask.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncTask.java @@ -21,6 +21,7 @@ import java.util.concurrent.Callable; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.context.request.NativeWebRequest; @@ -73,7 +74,7 @@ public class WebAsyncTask implements BeanFactoryAware { * @param executorName the name of an executor bean to use * @param callable the callable for concurrent handling */ - public WebAsyncTask(Long timeout, String executorName, Callable callable) { + public WebAsyncTask(@Nullable Long timeout, String executorName, Callable callable) { this(callable); Assert.notNull(executorName, "Executor name must not be null"); this.executorName = executorName; @@ -86,7 +87,7 @@ public class WebAsyncTask implements BeanFactoryAware { * @param executor the executor to use * @param callable the callable for concurrent handling */ - public WebAsyncTask(Long timeout, AsyncTaskExecutor executor, Callable callable) { + public WebAsyncTask(@Nullable Long timeout, AsyncTaskExecutor executor, Callable callable) { this(callable); Assert.notNull(executor, "Executor must not be null"); this.executor = executor; @@ -104,6 +105,7 @@ public class WebAsyncTask implements BeanFactoryAware { /** * Return the timeout value in milliseconds, or {@code null} if no timeout is set. */ + @Nullable public Long getTimeout() { return this.timeout; } @@ -121,6 +123,7 @@ public class WebAsyncTask implements BeanFactoryAware { * Return the AsyncTaskExecutor to use for concurrent handling, * or {@code null} if none specified. */ + @Nullable public AsyncTaskExecutor getExecutor() { if (this.executor != null) { return this.executor; diff --git a/spring-web/src/main/java/org/springframework/web/context/request/package-info.java b/spring-web/src/main/java/org/springframework/web/context/request/package-info.java index 30f66417cd1..26066438086 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/package-info.java @@ -2,4 +2,7 @@ * Support for generic request context holding, in particular for * scoping of application objects per HTTP request or HTTP session. */ +@NonNullApi package org.springframework.web.context.request; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/context/support/AnnotationConfigWebApplicationContext.java b/spring-web/src/main/java/org/springframework/web/context/support/AnnotationConfigWebApplicationContext.java index ceb2c2ede62..a64dd3f1cf1 100644 --- a/spring-web/src/main/java/org/springframework/web/context/support/AnnotationConfigWebApplicationContext.java +++ b/spring-web/src/main/java/org/springframework/web/context/support/AnnotationConfigWebApplicationContext.java @@ -27,6 +27,7 @@ import org.springframework.context.annotation.AnnotationConfigRegistry; import org.springframework.context.annotation.AnnotationConfigUtils; import org.springframework.context.annotation.ClassPathBeanDefinitionScanner; import org.springframework.context.annotation.ScopeMetadataResolver; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; import org.springframework.web.context.ContextLoader; @@ -106,6 +107,7 @@ public class AnnotationConfigWebApplicationContext extends AbstractRefreshableWe * Return the custom {@link BeanNameGenerator} for use with {@link AnnotatedBeanDefinitionReader} * and/or {@link ClassPathBeanDefinitionScanner}, if any. */ + @Nullable protected BeanNameGenerator getBeanNameGenerator() { return this.beanNameGenerator; } @@ -125,6 +127,7 @@ public class AnnotationConfigWebApplicationContext extends AbstractRefreshableWe * Return the custom {@link ScopeMetadataResolver} for use with {@link AnnotatedBeanDefinitionReader} * and/or {@link ClassPathBeanDefinitionScanner}, if any. */ + @Nullable protected ScopeMetadataResolver getScopeMetadataResolver() { return this.scopeMetadataResolver; } diff --git a/spring-web/src/main/java/org/springframework/web/context/support/RequestHandledEvent.java b/spring-web/src/main/java/org/springframework/web/context/support/RequestHandledEvent.java index 343aad71c5d..bbb3ce7ff36 100644 --- a/spring-web/src/main/java/org/springframework/web/context/support/RequestHandledEvent.java +++ b/spring-web/src/main/java/org/springframework/web/context/support/RequestHandledEvent.java @@ -17,6 +17,7 @@ package org.springframework.web.context.support; import org.springframework.context.ApplicationEvent; +import org.springframework.lang.Nullable; /** * Event raised when a request is handled within an ApplicationContext. @@ -57,7 +58,7 @@ public class RequestHandledEvent extends ApplicationEvent { * request, if any (usually the UserPrincipal) * @param processingTimeMillis the processing time of the request in milliseconds */ - public RequestHandledEvent(Object source, String sessionId, String userName, long processingTimeMillis) { + public RequestHandledEvent(Object source, @Nullable String sessionId, @Nullable String userName, long processingTimeMillis) { super(source); this.sessionId = sessionId; this.userName = userName; @@ -74,7 +75,7 @@ public class RequestHandledEvent extends ApplicationEvent { * @param failureCause the cause of failure, if any */ public RequestHandledEvent( - Object source, String sessionId, String userName, long processingTimeMillis, Throwable failureCause) { + Object source, @Nullable String sessionId, @Nullable String userName, long processingTimeMillis, @Nullable Throwable failureCause) { this(source, sessionId, userName, processingTimeMillis); this.failureCause = failureCause; @@ -91,6 +92,7 @@ public class RequestHandledEvent extends ApplicationEvent { /** * Return the id of the HTTP session, if any. */ + @Nullable public String getSessionId() { return this.sessionId; } @@ -100,6 +102,7 @@ public class RequestHandledEvent extends ApplicationEvent { * (usually the UserPrincipal). * @see javax.servlet.http.HttpServletRequest#getUserPrincipal() */ + @Nullable public String getUserName() { return this.userName; } @@ -114,6 +117,7 @@ public class RequestHandledEvent extends ApplicationEvent { /** * Return the cause of failure, if any. */ + @Nullable public Throwable getFailureCause() { return this.failureCause; } diff --git a/spring-web/src/main/java/org/springframework/web/context/support/ServletContextAwareProcessor.java b/spring-web/src/main/java/org/springframework/web/context/support/ServletContextAwareProcessor.java index b20a79fe73f..5ad591a216e 100644 --- a/spring-web/src/main/java/org/springframework/web/context/support/ServletContextAwareProcessor.java +++ b/spring-web/src/main/java/org/springframework/web/context/support/ServletContextAwareProcessor.java @@ -21,6 +21,7 @@ import javax.servlet.ServletContext; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.lang.Nullable; import org.springframework.web.context.ServletConfigAware; import org.springframework.web.context.ServletContextAware; @@ -81,6 +82,7 @@ public class ServletContextAwareProcessor implements BeanPostProcessor { * can be overridden by subclasses when a context is obtained after the post-processor * has been registered. */ + @Nullable protected ServletContext getServletContext() { if (this.servletContext == null && getServletConfig() != null) { return getServletConfig().getServletContext(); @@ -89,10 +91,11 @@ public class ServletContextAwareProcessor implements BeanPostProcessor { } /** - * Returns the {@link ServletContext} to be injected or {@code null}. This method + * Returns the {@link ServletConfig} to be injected or {@code null}. This method * can be overridden by subclasses when a context is obtained after the post-processor * has been registered. */ + @Nullable protected ServletConfig getServletConfig() { return this.servletConfig; } diff --git a/spring-web/src/main/java/org/springframework/web/context/support/ServletContextResource.java b/spring-web/src/main/java/org/springframework/web/context/support/ServletContextResource.java index 916a4c11949..758c2755f50 100644 --- a/spring-web/src/main/java/org/springframework/web/context/support/ServletContextResource.java +++ b/spring-web/src/main/java/org/springframework/web/context/support/ServletContextResource.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; + import javax.servlet.ServletContext; import org.springframework.core.io.AbstractFileResolvingResource; diff --git a/spring-web/src/main/java/org/springframework/web/context/support/ServletRequestHandledEvent.java b/spring-web/src/main/java/org/springframework/web/context/support/ServletRequestHandledEvent.java index c08405a7cc4..d6c36f0170a 100644 --- a/spring-web/src/main/java/org/springframework/web/context/support/ServletRequestHandledEvent.java +++ b/spring-web/src/main/java/org/springframework/web/context/support/ServletRequestHandledEvent.java @@ -16,6 +16,8 @@ package org.springframework.web.context.support; +import org.springframework.lang.Nullable; + /** * Servlet-specific subclass of RequestHandledEvent, * adding servlet-specific context information. @@ -58,7 +60,7 @@ public class ServletRequestHandledEvent extends RequestHandledEvent { */ public ServletRequestHandledEvent(Object source, String requestUrl, String clientAddress, String method, String servletName, - String sessionId, String userName, long processingTimeMillis) { + @Nullable String sessionId, @Nullable String userName, long processingTimeMillis) { super(source, sessionId, userName, processingTimeMillis); this.requestUrl = requestUrl; @@ -82,8 +84,8 @@ public class ServletRequestHandledEvent extends RequestHandledEvent { * @param failureCause the cause of failure, if any */ public ServletRequestHandledEvent(Object source, String requestUrl, - String clientAddress, String method, String servletName, String sessionId, - String userName, long processingTimeMillis, Throwable failureCause) { + String clientAddress, String method, String servletName, @Nullable String sessionId, + @Nullable String userName, long processingTimeMillis, @Nullable Throwable failureCause) { super(source, sessionId, userName, processingTimeMillis, failureCause); this.requestUrl = requestUrl; @@ -108,8 +110,8 @@ public class ServletRequestHandledEvent extends RequestHandledEvent { * @param statusCode the HTTP status code of the response */ public ServletRequestHandledEvent(Object source, String requestUrl, - String clientAddress, String method, String servletName, String sessionId, - String userName, long processingTimeMillis, Throwable failureCause, int statusCode) { + String clientAddress, String method, String servletName, @Nullable String sessionId, + @Nullable String userName, long processingTimeMillis, @Nullable Throwable failureCause, int statusCode) { super(source, sessionId, userName, processingTimeMillis, failureCause); this.requestUrl = requestUrl; diff --git a/spring-web/src/main/java/org/springframework/web/context/support/WebApplicationContextUtils.java b/spring-web/src/main/java/org/springframework/web/context/support/WebApplicationContextUtils.java index cd34437310f..8531a4bd0dd 100644 --- a/spring-web/src/main/java/org/springframework/web/context/support/WebApplicationContextUtils.java +++ b/spring-web/src/main/java/org/springframework/web/context/support/WebApplicationContextUtils.java @@ -21,6 +21,7 @@ import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; + import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.servlet.ServletConfig; @@ -33,6 +34,7 @@ import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.core.env.MutablePropertySources; import org.springframework.core.env.PropertySource.StubPropertySource; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.web.context.ConfigurableWebApplicationContext; @@ -94,6 +96,7 @@ public abstract class WebApplicationContextUtils { * @return the root WebApplicationContext for this web app, or {@code null} if none * @see org.springframework.web.context.WebApplicationContext#ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE */ + @Nullable public static WebApplicationContext getWebApplicationContext(ServletContext sc) { return getWebApplicationContext(sc, WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); } @@ -104,6 +107,7 @@ public abstract class WebApplicationContextUtils { * @param attrName the name of the ServletContext attribute to look for * @return the desired WebApplicationContext for this web app, or {@code null} if none */ + @Nullable public static WebApplicationContext getWebApplicationContext(ServletContext sc, String attrName) { Assert.notNull(sc, "ServletContext must not be null"); Object attr = sc.getAttribute(attrName); @@ -140,6 +144,7 @@ public abstract class WebApplicationContextUtils { * @see #getWebApplicationContext(ServletContext) * @see ServletContext#getAttributeNames() */ + @Nullable public static WebApplicationContext findWebApplicationContext(ServletContext sc) { WebApplicationContext wac = getWebApplicationContext(sc); if (wac == null) { @@ -285,7 +290,7 @@ public abstract class WebApplicationContextUtils { * @see org.springframework.core.env.ConfigurableEnvironment#getPropertySources() */ public static void initServletPropertySources( - MutablePropertySources propertySources, ServletContext servletContext, ServletConfig servletConfig) { + MutablePropertySources propertySources, @Nullable ServletContext servletContext, @Nullable ServletConfig servletConfig) { Assert.notNull(propertySources, "'propertySources' must not be null"); if (servletContext != null && propertySources.contains(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME) && diff --git a/spring-web/src/main/java/org/springframework/web/context/support/WebApplicationObjectSupport.java b/spring-web/src/main/java/org/springframework/web/context/support/WebApplicationObjectSupport.java index 209a87ddf0f..c9efc3e5eda 100644 --- a/spring-web/src/main/java/org/springframework/web/context/support/WebApplicationObjectSupport.java +++ b/spring-web/src/main/java/org/springframework/web/context/support/WebApplicationObjectSupport.java @@ -21,6 +21,7 @@ import javax.servlet.ServletContext; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ApplicationObjectSupport; +import org.springframework.lang.Nullable; import org.springframework.web.context.ServletContextAware; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.util.WebUtils; @@ -103,6 +104,7 @@ public abstract class WebApplicationObjectSupport extends ApplicationObjectSuppo * @throws IllegalStateException if not running in a WebApplicationContext * @see #getApplicationContext() */ + @Nullable protected final WebApplicationContext getWebApplicationContext() throws IllegalStateException { ApplicationContext ctx = getApplicationContext(); if (ctx instanceof WebApplicationContext) { @@ -121,6 +123,7 @@ public abstract class WebApplicationObjectSupport extends ApplicationObjectSuppo * Return the current ServletContext. * @throws IllegalStateException if not running within a ServletContext */ + @Nullable protected final ServletContext getServletContext() throws IllegalStateException { if (this.servletContext != null) { return this.servletContext; diff --git a/spring-web/src/main/java/org/springframework/web/context/support/package-info.java b/spring-web/src/main/java/org/springframework/web/context/support/package-info.java index 6185f654c16..7090f654295 100644 --- a/spring-web/src/main/java/org/springframework/web/context/support/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/context/support/package-info.java @@ -2,4 +2,7 @@ * Classes supporting the {@code org.springframework.web.context} package, * such as WebApplicationContext implementations and various utility classes. */ +@NonNullApi package org.springframework.web.context.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/cors/CorsConfiguration.java b/spring-web/src/main/java/org/springframework/web/cors/CorsConfiguration.java index 1a7a368da91..27a281e033c 100644 --- a/spring-web/src/main/java/org/springframework/web/cors/CorsConfiguration.java +++ b/spring-web/src/main/java/org/springframework/web/cors/CorsConfiguration.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Set; import org.springframework.http.HttpMethod; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -116,6 +117,7 @@ public class CorsConfiguration { * @see #addAllowedOrigin(String) * @see #setAllowedOrigins(List) */ + @Nullable public List getAllowedOrigins() { return this.allowedOrigins; } @@ -161,6 +163,7 @@ public class CorsConfiguration { * @see #addAllowedMethod(String) * @see #setAllowedMethods(List) */ + @Nullable public List getAllowedMethods() { return this.allowedMethods; } @@ -212,6 +215,7 @@ public class CorsConfiguration { * @see #addAllowedHeader(String) * @see #setAllowedHeaders(List) */ + @Nullable public List getAllowedHeaders() { return this.allowedHeaders; } @@ -246,6 +250,7 @@ public class CorsConfiguration { * @see #addExposedHeader(String) * @see #setExposedHeaders(List) */ + @Nullable public List getExposedHeaders() { return this.exposedHeaders; } @@ -276,6 +281,7 @@ public class CorsConfiguration { * Return the configured {@code allowCredentials} flag, or {@code null} if none. * @see #setAllowCredentials(Boolean) */ + @Nullable public Boolean getAllowCredentials() { return this.allowCredentials; } @@ -293,6 +299,7 @@ public class CorsConfiguration { * Return the configured {@code maxAge} value, or {@code null} if none. * @see #setMaxAge(Long) */ + @Nullable public Long getMaxAge() { return this.maxAge; } @@ -343,6 +350,7 @@ public class CorsConfiguration { * @return the combined {@code CorsConfiguration} or {@code this} * configuration if the supplied configuration is {@code null} */ + @Nullable public CorsConfiguration combine(CorsConfiguration other) { if (other == null) { return this; @@ -381,6 +389,7 @@ public class CorsConfiguration { * @return the origin to use for the response, or {@code null} which * means the request origin is not allowed */ + @Nullable public String checkOrigin(String requestOrigin) { if (!StringUtils.hasText(requestOrigin)) { return null; @@ -414,6 +423,7 @@ public class CorsConfiguration { * @return the list of HTTP methods to list in the response of a pre-flight * request, or {@code null} if the supplied {@code requestMethod} is not allowed */ + @Nullable public List checkHttpMethod(HttpMethod requestMethod) { if (requestMethod == null) { return null; @@ -432,6 +442,7 @@ public class CorsConfiguration { * @return the list of allowed headers to list in the response of a pre-flight * request, or {@code null} if none of the supplied request headers is allowed */ + @Nullable public List checkHeaders(List requestHeaders) { if (requestHeaders == null) { return null; diff --git a/spring-web/src/main/java/org/springframework/web/cors/CorsConfigurationSource.java b/spring-web/src/main/java/org/springframework/web/cors/CorsConfigurationSource.java index 48166caa198..fae4b31863a 100644 --- a/spring-web/src/main/java/org/springframework/web/cors/CorsConfigurationSource.java +++ b/spring-web/src/main/java/org/springframework/web/cors/CorsConfigurationSource.java @@ -18,6 +18,8 @@ package org.springframework.web.cors; import javax.servlet.http.HttpServletRequest; +import org.springframework.lang.Nullable; + /** * Interface to be implemented by classes (usually HTTP request handlers) that * provides a {@link CorsConfiguration} instance based on the provided request. @@ -31,6 +33,7 @@ public interface CorsConfigurationSource { * Return a {@link CorsConfiguration} based on the incoming request. * @return the associated {@link CorsConfiguration}, or {@code null} if none */ + @Nullable CorsConfiguration getCorsConfiguration(HttpServletRequest request); } diff --git a/spring-web/src/main/java/org/springframework/web/cors/CorsProcessor.java b/spring-web/src/main/java/org/springframework/web/cors/CorsProcessor.java index 2794cb4c4df..302e6657ef7 100644 --- a/spring-web/src/main/java/org/springframework/web/cors/CorsProcessor.java +++ b/spring-web/src/main/java/org/springframework/web/cors/CorsProcessor.java @@ -17,9 +17,12 @@ package org.springframework.web.cors; import java.io.IOException; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.lang.Nullable; + /** * A strategy that takes a request and a {@link CorsConfiguration} and updates * the response. @@ -44,7 +47,7 @@ public interface CorsProcessor { * @param response the current response * @return {@code false} if the request is rejected, {@code true} otherwise */ - boolean processRequest(CorsConfiguration configuration, HttpServletRequest request, + boolean processRequest(@Nullable CorsConfiguration configuration, HttpServletRequest request, HttpServletResponse response) throws IOException; } diff --git a/spring-web/src/main/java/org/springframework/web/cors/package-info.java b/spring-web/src/main/java/org/springframework/web/cors/package-info.java index 8331aec38ec..0fb2394c1d7 100644 --- a/spring-web/src/main/java/org/springframework/web/cors/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/cors/package-info.java @@ -2,4 +2,7 @@ * Support for CORS (Cross-Origin Resource Sharing), * based on a common {@code CorsProcessor} strategy. */ +@NonNullApi package org.springframework.web.cors; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/cors/reactive/CorsConfigurationSource.java b/spring-web/src/main/java/org/springframework/web/cors/reactive/CorsConfigurationSource.java index c0fc6e8f92f..9ff7a23bbd6 100644 --- a/spring-web/src/main/java/org/springframework/web/cors/reactive/CorsConfigurationSource.java +++ b/spring-web/src/main/java/org/springframework/web/cors/reactive/CorsConfigurationSource.java @@ -16,6 +16,7 @@ package org.springframework.web.cors.reactive; +import org.springframework.lang.Nullable; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.server.ServerWebExchange; @@ -32,6 +33,7 @@ public interface CorsConfigurationSource { * Return a {@link CorsConfiguration} based on the incoming request. * @return the associated {@link CorsConfiguration}, or {@code null} if none */ + @Nullable CorsConfiguration getCorsConfiguration(ServerWebExchange exchange); } diff --git a/spring-web/src/main/java/org/springframework/web/cors/reactive/CorsProcessor.java b/spring-web/src/main/java/org/springframework/web/cors/reactive/CorsProcessor.java index b516b77893e..91c845970fa 100644 --- a/spring-web/src/main/java/org/springframework/web/cors/reactive/CorsProcessor.java +++ b/spring-web/src/main/java/org/springframework/web/cors/reactive/CorsProcessor.java @@ -18,6 +18,7 @@ package org.springframework.web.cors.reactive; import reactor.core.publisher.Mono; +import org.springframework.lang.Nullable; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.server.ServerWebExchange; @@ -43,6 +44,6 @@ public interface CorsProcessor { * @param exchange the current HTTP request / response * @return a {@link Mono} emitting {@code false} if the request is rejected, {@code true} otherwise */ - boolean processRequest(CorsConfiguration configuration, ServerWebExchange exchange); + boolean processRequest(@Nullable CorsConfiguration configuration, ServerWebExchange exchange); } diff --git a/spring-web/src/main/java/org/springframework/web/cors/reactive/UrlBasedCorsConfigurationSource.java b/spring-web/src/main/java/org/springframework/web/cors/reactive/UrlBasedCorsConfigurationSource.java index 9fb2c74d547..f1eaa47e25a 100644 --- a/spring-web/src/main/java/org/springframework/web/cors/reactive/UrlBasedCorsConfigurationSource.java +++ b/spring-web/src/main/java/org/springframework/web/cors/reactive/UrlBasedCorsConfigurationSource.java @@ -100,7 +100,6 @@ public class UrlBasedCorsConfigurationSource implements CorsConfigurationSource this.corsConfigurations.put(path, config); } - @Override public CorsConfiguration getCorsConfiguration(ServerWebExchange exchange) { String lookupPath = this.pathHelper.getLookupPathForRequest(exchange); diff --git a/spring-web/src/main/java/org/springframework/web/cors/reactive/package-info.java b/spring-web/src/main/java/org/springframework/web/cors/reactive/package-info.java new file mode 100644 index 00000000000..4f9bbeacf29 --- /dev/null +++ b/spring-web/src/main/java/org/springframework/web/cors/reactive/package-info.java @@ -0,0 +1,8 @@ +/** + * Reactive support for CORS (Cross-Origin Resource Sharing), + * based on a common {@code CorsProcessor} strategy. + */ +@NonNullApi +package org.springframework.web.cors.reactive; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/filter/DelegatingFilterProxy.java b/spring-web/src/main/java/org/springframework/web/filter/DelegatingFilterProxy.java index ba5bb5813b4..6a665855a0c 100644 --- a/spring-web/src/main/java/org/springframework/web/filter/DelegatingFilterProxy.java +++ b/spring-web/src/main/java/org/springframework/web/filter/DelegatingFilterProxy.java @@ -17,6 +17,7 @@ package org.springframework.web.filter; import java.io.IOException; + import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.ServletException; @@ -24,6 +25,7 @@ import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; @@ -156,7 +158,7 @@ public class DelegatingFilterProxy extends GenericFilterBean { * @see #findWebApplicationContext() * @see #setEnvironment(org.springframework.core.env.Environment) */ - public DelegatingFilterProxy(String targetBeanName, WebApplicationContext wac) { + public DelegatingFilterProxy(String targetBeanName, @Nullable WebApplicationContext wac) { Assert.hasText(targetBeanName, "target Filter bean name must not be null or empty"); this.setTargetBeanName(targetBeanName); this.webApplicationContext = wac; @@ -287,6 +289,7 @@ public class DelegatingFilterProxy extends GenericFilterBean { * @see WebApplicationContextUtils#getWebApplicationContext(javax.servlet.ServletContext) * @see WebApplicationContext#ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE */ + @Nullable protected WebApplicationContext findWebApplicationContext() { if (this.webApplicationContext != null) { // The user has injected a context at construction time -> use it... diff --git a/spring-web/src/main/java/org/springframework/web/filter/GenericFilterBean.java b/spring-web/src/main/java/org/springframework/web/filter/GenericFilterBean.java index e79408ae57f..5a0b54cc8c0 100644 --- a/spring-web/src/main/java/org/springframework/web/filter/GenericFilterBean.java +++ b/spring-web/src/main/java/org/springframework/web/filter/GenericFilterBean.java @@ -19,6 +19,7 @@ package org.springframework.web.filter; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; + import javax.servlet.Filter; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; @@ -42,6 +43,7 @@ import org.springframework.core.env.EnvironmentCapable; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceEditor; import org.springframework.core.io.ResourceLoader; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -274,6 +276,7 @@ public abstract class GenericFilterBean implements Filter, BeanNameAware, Enviro * @return the FilterConfig instance, or {@code null} if none available * @see javax.servlet.GenericServlet#getServletConfig() */ + @Nullable public final FilterConfig getFilterConfig() { return this.filterConfig; } @@ -289,6 +292,7 @@ public abstract class GenericFilterBean implements Filter, BeanNameAware, Enviro * @see javax.servlet.FilterConfig#getFilterName() * @see #setBeanName */ + @Nullable protected final String getFilterName() { return (this.filterConfig != null ? this.filterConfig.getFilterName() : this.beanName); } @@ -304,6 +308,7 @@ public abstract class GenericFilterBean implements Filter, BeanNameAware, Enviro * @see javax.servlet.FilterConfig#getServletContext() * @see #setServletContext */ + @Nullable protected final ServletContext getServletContext() { return (this.filterConfig != null ? this.filterConfig.getServletContext() : this.servletContext); } diff --git a/spring-web/src/main/java/org/springframework/web/filter/package-info.java b/spring-web/src/main/java/org/springframework/web/filter/package-info.java index 1cfca2cc1ef..e48b8b4445e 100644 --- a/spring-web/src/main/java/org/springframework/web/filter/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/filter/package-info.java @@ -1,4 +1,7 @@ /** * Provides generic filter base classes allowing for bean-style configuration. */ +@NonNullApi package org.springframework.web.filter; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/filter/reactive/package-info.java b/spring-web/src/main/java/org/springframework/web/filter/reactive/package-info.java index 07a3b12da77..5dfc7049b6d 100644 --- a/spring-web/src/main/java/org/springframework/web/filter/reactive/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/filter/reactive/package-info.java @@ -2,4 +2,7 @@ * {@link org.springframework.web.server.WebFilter} implementations for use in * reactive web applications. */ +@NonNullApi package org.springframework.web.filter.reactive; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/jsf/DecoratingNavigationHandler.java b/spring-web/src/main/java/org/springframework/web/jsf/DecoratingNavigationHandler.java index 3726b0962ea..e420cdd1721 100644 --- a/spring-web/src/main/java/org/springframework/web/jsf/DecoratingNavigationHandler.java +++ b/spring-web/src/main/java/org/springframework/web/jsf/DecoratingNavigationHandler.java @@ -19,6 +19,8 @@ package org.springframework.web.jsf; import javax.faces.application.NavigationHandler; import javax.faces.context.FacesContext; +import org.springframework.lang.Nullable; + /** * Base class for JSF NavigationHandler implementations that want * to be capable of decorating an original NavigationHandler. @@ -58,6 +60,7 @@ public abstract class DecoratingNavigationHandler extends NavigationHandler { * Return the fixed original NavigationHandler decorated by this handler, if any * (that is, if passed in through the constructor). */ + @Nullable public final NavigationHandler getDecoratedNavigationHandler() { return this.decoratedNavigationHandler; } @@ -95,7 +98,7 @@ public abstract class DecoratingNavigationHandler extends NavigationHandler { * @see #callNextHandlerInChain */ public abstract void handleNavigation( - FacesContext facesContext, String fromAction, String outcome, NavigationHandler originalNavigationHandler); + FacesContext facesContext, @Nullable String fromAction, @Nullable String outcome, @Nullable NavigationHandler originalNavigationHandler); /** @@ -127,7 +130,7 @@ public abstract class DecoratingNavigationHandler extends NavigationHandler { * or {@code null} if none */ protected final void callNextHandlerInChain( - FacesContext facesContext, String fromAction, String outcome, NavigationHandler originalNavigationHandler) { + FacesContext facesContext, @Nullable String fromAction, @Nullable String outcome, @Nullable NavigationHandler originalNavigationHandler) { NavigationHandler decoratedNavigationHandler = getDecoratedNavigationHandler(); diff --git a/spring-web/src/main/java/org/springframework/web/jsf/FacesContextUtils.java b/spring-web/src/main/java/org/springframework/web/jsf/FacesContextUtils.java index cbf07194dfc..e7deb525ca7 100644 --- a/spring-web/src/main/java/org/springframework/web/jsf/FacesContextUtils.java +++ b/spring-web/src/main/java/org/springframework/web/jsf/FacesContextUtils.java @@ -19,6 +19,7 @@ package org.springframework.web.jsf; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.util.WebUtils; @@ -46,6 +47,7 @@ public abstract class FacesContextUtils { * @return the root WebApplicationContext for this web app, or {@code null} if none * @see org.springframework.web.context.WebApplicationContext#ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE */ + @Nullable public static WebApplicationContext getWebApplicationContext(FacesContext fc) { Assert.notNull(fc, "FacesContext must not be null"); Object attr = fc.getExternalContext().getApplicationMap().get( @@ -103,6 +105,7 @@ public abstract class FacesContextUtils { * @see org.springframework.web.util.WebUtils#SESSION_MUTEX_ATTRIBUTE * @see org.springframework.web.util.HttpSessionMutexListener */ + @Nullable public static Object getSessionMutex(FacesContext fc) { Assert.notNull(fc, "FacesContext must not be null"); ExternalContext ec = fc.getExternalContext(); diff --git a/spring-web/src/main/java/org/springframework/web/jsf/el/WebApplicationContextFacesELResolver.java b/spring-web/src/main/java/org/springframework/web/jsf/el/WebApplicationContextFacesELResolver.java index faab2f4216d..b653b25b869 100644 --- a/spring-web/src/main/java/org/springframework/web/jsf/el/WebApplicationContextFacesELResolver.java +++ b/spring-web/src/main/java/org/springframework/web/jsf/el/WebApplicationContextFacesELResolver.java @@ -18,6 +18,7 @@ package org.springframework.web.jsf.el; import java.beans.FeatureDescriptor; import java.util.Iterator; + import javax.el.ELContext; import javax.el.ELException; import javax.el.ELResolver; @@ -27,6 +28,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeansException; +import org.springframework.lang.Nullable; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.jsf.FacesContextUtils; @@ -66,6 +68,7 @@ public class WebApplicationContextFacesELResolver extends ELResolver { @Override + @Nullable public Object getValue(ELContext elContext, Object base, Object property) throws ELException { if (base != null) { if (base instanceof WebApplicationContext) { @@ -103,6 +106,7 @@ public class WebApplicationContextFacesELResolver extends ELResolver { } @Override + @Nullable public Class getType(ELContext elContext, Object base, Object property) throws ELException { if (base != null) { if (base instanceof WebApplicationContext) { @@ -153,6 +157,7 @@ public class WebApplicationContextFacesELResolver extends ELResolver { } @Override + @Nullable public Iterator getFeatureDescriptors(ELContext elContext, Object base) { return null; } @@ -171,6 +176,7 @@ public class WebApplicationContextFacesELResolver extends ELResolver { * @return the Spring web application context * @see org.springframework.web.jsf.FacesContextUtils#getWebApplicationContext */ + @Nullable protected WebApplicationContext getWebApplicationContext(ELContext elContext) { FacesContext facesContext = FacesContext.getCurrentInstance(); return FacesContextUtils.getRequiredWebApplicationContext(facesContext); diff --git a/spring-web/src/main/java/org/springframework/web/jsf/el/package-info.java b/spring-web/src/main/java/org/springframework/web/jsf/el/package-info.java index 955b183993e..82afe98ca20 100644 --- a/spring-web/src/main/java/org/springframework/web/jsf/el/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/jsf/el/package-info.java @@ -2,4 +2,7 @@ * ELResolvers for integrating a JSF web layer with a Spring service layer * which is hosted in a Spring root WebApplicationContext. */ +@NonNullApi package org.springframework.web.jsf.el; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/jsf/package-info.java b/spring-web/src/main/java/org/springframework/web/jsf/package-info.java index 6ed9b5f2126..5063eaef05e 100644 --- a/spring-web/src/main/java/org/springframework/web/jsf/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/jsf/package-info.java @@ -5,4 +5,7 @@ *

    Supports easy access to beans in the Spring root WebApplicationContext * from JSF EL expressions, for example in property values of JSF-managed beans. */ +@NonNullApi package org.springframework.web.jsf; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java b/spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java index d1541b5d8f4..3297408cffc 100644 --- a/spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java +++ b/spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java @@ -29,6 +29,7 @@ import org.springframework.core.MethodParameter; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.SynthesizingMethodParameter; import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.web.bind.annotation.ResponseStatus; @@ -223,6 +224,7 @@ public class HandlerMethod { * @since 4.3.8 * @see ResponseStatus#code() */ + @Nullable protected HttpStatus getResponseStatus() { return this.responseStatus; } @@ -232,6 +234,7 @@ public class HandlerMethod { * @since 4.3.8 * @see ResponseStatus#reason() */ + @Nullable protected String getResponseStatusReason() { return this.responseStatusReason; } @@ -266,6 +269,7 @@ public class HandlerMethod { * @return the annotation, or {@code null} if none found * @see AnnotatedElementUtils#findMergedAnnotation */ + @Nullable public A getMethodAnnotation(Class annotationType) { return AnnotatedElementUtils.findMergedAnnotation(this.method, annotationType); } diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractCookieValueMethodArgumentResolver.java b/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractCookieValueMethodArgumentResolver.java index 9d9383679d5..b5949a72241 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractCookieValueMethodArgumentResolver.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractCookieValueMethodArgumentResolver.java @@ -18,6 +18,7 @@ package org.springframework.web.method.annotation; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.web.bind.ServletRequestBindingException; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.CookieValue; @@ -44,7 +45,7 @@ public abstract class AbstractCookieValueMethodArgumentResolver extends Abstract * placeholder and #{...} SpEL expressions in default values; * or {@code null} if default values are not expected to contain expressions */ - public AbstractCookieValueMethodArgumentResolver(ConfigurableBeanFactory beanFactory) { + public AbstractCookieValueMethodArgumentResolver(@Nullable ConfigurableBeanFactory beanFactory) { super(beanFactory); } diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractNamedValueMethodArgumentResolver.java b/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractNamedValueMethodArgumentResolver.java index ba6b3c17032..363e9b2fd37 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractNamedValueMethodArgumentResolver.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractNamedValueMethodArgumentResolver.java @@ -18,6 +18,7 @@ package org.springframework.web.method.annotation; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; + import javax.servlet.ServletException; import org.springframework.beans.ConversionNotSupportedException; @@ -26,6 +27,7 @@ import org.springframework.beans.factory.config.BeanExpressionContext; import org.springframework.beans.factory.config.BeanExpressionResolver; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.web.bind.ServletRequestBindingException; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.ValueConstants; @@ -79,7 +81,7 @@ public abstract class AbstractNamedValueMethodArgumentResolver implements Handle * and #{...} SpEL expressions in default values, or {@code null} if default * values are not expected to contain expressions */ - public AbstractNamedValueMethodArgumentResolver(ConfigurableBeanFactory beanFactory) { + public AbstractNamedValueMethodArgumentResolver(@Nullable ConfigurableBeanFactory beanFactory) { this.configurableBeanFactory = beanFactory; this.expressionContext = (beanFactory != null ? new BeanExpressionContext(beanFactory, new RequestScope()) : null); @@ -197,6 +199,7 @@ public abstract class AbstractNamedValueMethodArgumentResolver implements Handle * @return the resolved argument (may be {@code null}) * @throws Exception in case of errors */ + @Nullable protected abstract Object resolveName(String name, MethodParameter parameter, NativeWebRequest request) throws Exception; @@ -228,7 +231,7 @@ public abstract class AbstractNamedValueMethodArgumentResolver implements Handle /** * A {@code null} results in a {@code false} value for {@code boolean}s or an exception for other primitives. */ - private Object handleNullValue(String name, Object value, Class paramType) { + private Object handleNullValue(String name, @Nullable Object value, Class paramType) { if (value == null) { if (Boolean.TYPE.equals(paramType)) { return Boolean.FALSE; @@ -251,7 +254,7 @@ public abstract class AbstractNamedValueMethodArgumentResolver implements Handle * @param webRequest the current request */ protected void handleResolvedValue(Object arg, String name, MethodParameter parameter, - ModelAndViewContainer mavContainer, NativeWebRequest webRequest) { + @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest) { } diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractWebArgumentResolverAdapter.java b/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractWebArgumentResolverAdapter.java index 78a3b50806f..566642cde80 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractWebArgumentResolverAdapter.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractWebArgumentResolverAdapter.java @@ -20,6 +20,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.web.bind.support.WebArgumentResolver; @@ -109,6 +110,7 @@ public abstract class AbstractWebArgumentResolverAdapter implements HandlerMetho /** * Required for access to NativeWebRequest in {@link #supportsParameter}. */ + @Nullable protected abstract NativeWebRequest getWebRequest(); } diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/ExceptionHandlerMethodResolver.java b/spring-web/src/main/java/org/springframework/web/method/annotation/ExceptionHandlerMethodResolver.java index eac5de70908..c9116e179cd 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/ExceptionHandlerMethodResolver.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/ExceptionHandlerMethodResolver.java @@ -27,6 +27,7 @@ import java.util.concurrent.ConcurrentHashMap; import org.springframework.core.ExceptionDepthComparator; import org.springframework.core.MethodIntrospector; import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils.MethodFilter; @@ -124,6 +125,7 @@ public class ExceptionHandlerMethodResolver { * @param exception the exception * @return a Method to handle the exception, or {@code null} if none found */ + @Nullable public Method resolveMethod(Exception exception) { return resolveMethodByThrowable(exception); } @@ -135,6 +137,7 @@ public class ExceptionHandlerMethodResolver { * @return a Method to handle the exception, or {@code null} if none found * @since 5.0 */ + @Nullable public Method resolveMethodByThrowable(Throwable exception) { Method method = resolveMethodByExceptionType(exception.getClass()); if (method == null) { @@ -152,6 +155,7 @@ public class ExceptionHandlerMethodResolver { * @param exceptionType the exception type * @return a Method to handle the exception, or {@code null} if none found */ + @Nullable public Method resolveMethodByExceptionType(Class exceptionType) { Method method = this.exceptionLookupCache.get(exceptionType); if (method == null) { @@ -164,6 +168,7 @@ public class ExceptionHandlerMethodResolver { /** * Return the {@link Method} mapped to the given exception type, or {@code null} if none. */ + @Nullable private Method getMappedMethod(Class exceptionType) { List> matches = new ArrayList<>(); for (Class mappedException : this.mappedMethods.keySet()) { diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/ExpressionValueMethodArgumentResolver.java b/spring-web/src/main/java/org/springframework/web/method/annotation/ExpressionValueMethodArgumentResolver.java index 73393f720a5..cc0e0248b01 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/ExpressionValueMethodArgumentResolver.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/ExpressionValueMethodArgumentResolver.java @@ -21,6 +21,7 @@ import javax.servlet.ServletException; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.context.request.NativeWebRequest; @@ -44,7 +45,7 @@ public class ExpressionValueMethodArgumentResolver extends AbstractNamedValueMet * placeholder and #{...} SpEL expressions in default values; * or {@code null} if default values are not expected to contain expressions */ - public ExpressionValueMethodArgumentResolver(ConfigurableBeanFactory beanFactory) { + public ExpressionValueMethodArgumentResolver(@Nullable ConfigurableBeanFactory beanFactory) { super(beanFactory); } diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/InitBinderDataBinderFactory.java b/spring-web/src/main/java/org/springframework/web/method/annotation/InitBinderDataBinderFactory.java index 6223005d1bb..b0147597664 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/InitBinderDataBinderFactory.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/InitBinderDataBinderFactory.java @@ -21,6 +21,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; +import org.springframework.lang.Nullable; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.support.DefaultDataBinderFactory; @@ -45,7 +46,7 @@ public class InitBinderDataBinderFactory extends DefaultDataBinderFactory { * @param binderMethods {@code @InitBinder} methods, or {@code null} * @param initializer for global data binder intialization */ - public InitBinderDataBinderFactory(List binderMethods, + public InitBinderDataBinderFactory(@Nullable List binderMethods, WebBindingInitializer initializer) { super(initializer); diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/RequestHeaderMethodArgumentResolver.java b/spring-web/src/main/java/org/springframework/web/method/annotation/RequestHeaderMethodArgumentResolver.java index c8575251cea..24d72e25aa2 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/RequestHeaderMethodArgumentResolver.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/RequestHeaderMethodArgumentResolver.java @@ -20,6 +20,7 @@ import java.util.Map; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.web.bind.ServletRequestBindingException; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.RequestHeader; @@ -48,7 +49,7 @@ public class RequestHeaderMethodArgumentResolver extends AbstractNamedValueMetho * placeholder and #{...} SpEL expressions in default values; * or {@code null} if default values are not expected to have expressions */ - public RequestHeaderMethodArgumentResolver(ConfigurableBeanFactory beanFactory) { + public RequestHeaderMethodArgumentResolver(@Nullable ConfigurableBeanFactory beanFactory) { super(beanFactory); } diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/RequestParamMethodArgumentResolver.java b/spring-web/src/main/java/org/springframework/web/method/annotation/RequestParamMethodArgumentResolver.java index e7463e05e9e..a2c6e414668 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/RequestParamMethodArgumentResolver.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/RequestParamMethodArgumentResolver.java @@ -20,6 +20,7 @@ import java.beans.PropertyEditor; import java.util.Collection; import java.util.List; import java.util.Map; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.Part; @@ -29,6 +30,7 @@ import org.springframework.core.MethodParameter; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.converter.Converter; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.WebDataBinder; @@ -99,7 +101,7 @@ public class RequestParamMethodArgumentResolver extends AbstractNamedValueMethod * is treated as a request parameter even if it isn't annotated, the * request parameter name is derived from the method parameter name. */ - public RequestParamMethodArgumentResolver(ConfigurableBeanFactory beanFactory, boolean useDefaultResolution) { + public RequestParamMethodArgumentResolver(@Nullable ConfigurableBeanFactory beanFactory, boolean useDefaultResolution) { super(beanFactory); this.useDefaultResolution = useDefaultResolution; } diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/SessionAttributesHandler.java b/spring-web/src/main/java/org/springframework/web/method/annotation/SessionAttributesHandler.java index d5a5607c9e1..51e9ba793c9 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/SessionAttributesHandler.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/SessionAttributesHandler.java @@ -25,6 +25,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.bind.annotation.SessionAttributes; import org.springframework.web.bind.support.SessionAttributeStore; @@ -98,7 +99,7 @@ public class SessionAttributesHandler { * @param attributeName the attribute name to check, never {@code null} * @param attributeType the type for the attribute, possibly {@code null} */ - public boolean isHandlerSessionAttribute(String attributeName, Class attributeType) { + public boolean isHandlerSessionAttribute(String attributeName, @Nullable Class attributeType) { Assert.notNull(attributeName, "Attribute name must not be null"); if (this.attributeNames.contains(attributeName) || this.attributeTypes.contains(attributeType)) { this.knownAttributeNames.add(attributeName); @@ -162,6 +163,7 @@ public class SessionAttributesHandler { * @param attributeName the name of the attribute of interest * @return the attribute value or {@code null} */ + @Nullable Object retrieveAttribute(WebRequest request, String attributeName) { return this.sessionAttributeStore.retrieveAttribute(request, attributeName); } diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/package-info.java b/spring-web/src/main/java/org/springframework/web/method/annotation/package-info.java index dd12277b7bd..46582f23487 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/package-info.java @@ -1,4 +1,7 @@ /** * Support classes for annotation-based handler method processing. */ +@NonNullApi package org.springframework.web.method.annotation; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/method/package-info.java b/spring-web/src/main/java/org/springframework/web/method/package-info.java index 5d7b2a78c11..6e13a6e5e66 100644 --- a/spring-web/src/main/java/org/springframework/web/method/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/method/package-info.java @@ -2,4 +2,7 @@ * Common infrastructure for handler method processing, as used by * Spring MVC's {@code org.springframework.web.servlet.mvc.method} package. */ +@NonNullApi package org.springframework.web.method; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/method/support/CompositeUriComponentsContributor.java b/spring-web/src/main/java/org/springframework/web/method/support/CompositeUriComponentsContributor.java index 01f028b0aba..42dfc307e73 100644 --- a/spring-web/src/main/java/org/springframework/web/method/support/CompositeUriComponentsContributor.java +++ b/spring-web/src/main/java/org/springframework/web/method/support/CompositeUriComponentsContributor.java @@ -25,6 +25,7 @@ import java.util.Map; import org.springframework.core.MethodParameter; import org.springframework.core.convert.ConversionService; import org.springframework.format.support.DefaultFormattingConversionService; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.util.UriComponentsBuilder; @@ -84,7 +85,7 @@ public class CompositeUriComponentsContributor implements UriComponentsContribut * @param cs a ConversionService to use when method argument values * need to be formatted as Strings before being added to the URI */ - public CompositeUriComponentsContributor(Collection contributors, ConversionService cs) { + public CompositeUriComponentsContributor(Collection contributors, @Nullable ConversionService cs) { Assert.notNull(contributors, "'uriComponentsContributors' must not be null"); this.contributors.addAll(contributors); this.conversionService = (cs != null ? cs : new DefaultFormattingConversionService()); diff --git a/spring-web/src/main/java/org/springframework/web/method/support/HandlerMethodArgumentResolver.java b/spring-web/src/main/java/org/springframework/web/method/support/HandlerMethodArgumentResolver.java index c5cd168156e..3789c08a0f0 100644 --- a/spring-web/src/main/java/org/springframework/web/method/support/HandlerMethodArgumentResolver.java +++ b/spring-web/src/main/java/org/springframework/web/method/support/HandlerMethodArgumentResolver.java @@ -17,6 +17,7 @@ package org.springframework.web.method.support; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; @@ -55,6 +56,7 @@ public interface HandlerMethodArgumentResolver { * @return the resolved argument value, or {@code null} * @throws Exception in case of errors with the preparation of argument values */ + @Nullable Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception; diff --git a/spring-web/src/main/java/org/springframework/web/method/support/HandlerMethodReturnValueHandlerComposite.java b/spring-web/src/main/java/org/springframework/web/method/support/HandlerMethodReturnValueHandlerComposite.java index 7917e28cd7d..ba880e32b5b 100644 --- a/spring-web/src/main/java/org/springframework/web/method/support/HandlerMethodReturnValueHandlerComposite.java +++ b/spring-web/src/main/java/org/springframework/web/method/support/HandlerMethodReturnValueHandlerComposite.java @@ -24,6 +24,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.web.context.request.NativeWebRequest; /** @@ -57,6 +58,7 @@ public class HandlerMethodReturnValueHandlerComposite implements HandlerMethodRe return getReturnValueHandler(returnType) != null; } + @Nullable private HandlerMethodReturnValueHandler getReturnValueHandler(MethodParameter returnType) { for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) { if (handler.supportsReturnType(returnType)) { @@ -81,6 +83,7 @@ public class HandlerMethodReturnValueHandlerComposite implements HandlerMethodRe handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest); } + @Nullable private HandlerMethodReturnValueHandler selectHandler(Object value, MethodParameter returnType) { boolean isAsyncValue = isAsyncReturnValue(value, returnType); for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) { diff --git a/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java b/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java index 8f6965d7ffa..18f2b229e6b 100644 --- a/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java +++ b/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java @@ -23,6 +23,7 @@ import java.util.Arrays; import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.MethodParameter; import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; import org.springframework.web.bind.WebDataBinder; @@ -183,6 +184,7 @@ public class InvocableHandlerMethod extends HandlerMethod { /** * Attempt to resolve a method parameter from the list of provided argument values. */ + @Nullable private Object resolveProvidedArgument(MethodParameter parameter, Object... providedArgs) { if (providedArgs == null) { return null; diff --git a/spring-web/src/main/java/org/springframework/web/method/support/ModelAndViewContainer.java b/spring-web/src/main/java/org/springframework/web/method/support/ModelAndViewContainer.java index 08af03d8310..1d67969c905 100644 --- a/spring-web/src/main/java/org/springframework/web/method/support/ModelAndViewContainer.java +++ b/spring-web/src/main/java/org/springframework/web/method/support/ModelAndViewContainer.java @@ -21,6 +21,7 @@ import java.util.Map; import java.util.Set; import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.validation.support.BindingAwareModelMap; @@ -95,6 +96,7 @@ public class ModelAndViewContainer { * Return the view name to be resolved by the DispatcherServlet via a * ViewResolver, or {@code null} if a View object is set. */ + @Nullable public String getViewName() { return (this.view instanceof String ? (String) this.view : null); } @@ -111,6 +113,7 @@ public class ModelAndViewContainer { * Return the View object, or {@code null} if we using a view name * to be resolved by the DispatcherServlet via a ViewResolver. */ + @Nullable public Object getView() { return this.view; } @@ -219,6 +222,7 @@ public class ModelAndViewContainer { * Return the configured HTTP status, if any. * @since 4.3 */ + @Nullable public HttpStatus getStatus() { return this.status; } diff --git a/spring-web/src/main/java/org/springframework/web/method/support/package-info.java b/spring-web/src/main/java/org/springframework/web/method/support/package-info.java index 3fe229ede38..379e75e0530 100644 --- a/spring-web/src/main/java/org/springframework/web/method/support/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/method/support/package-info.java @@ -1,4 +1,7 @@ /** * Generic support classes for handler method processing. */ +@NonNullApi package org.springframework.web.method.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/multipart/MultipartFile.java b/spring-web/src/main/java/org/springframework/web/multipart/MultipartFile.java index 5d27f350f94..7c642d591b0 100644 --- a/spring-web/src/main/java/org/springframework/web/multipart/MultipartFile.java +++ b/spring-web/src/main/java/org/springframework/web/multipart/MultipartFile.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.io.InputStream; import org.springframework.core.io.InputStreamSource; +import org.springframework.lang.Nullable; /** * A representation of an uploaded file received in a multipart request. @@ -53,6 +54,7 @@ public interface MultipartFile extends InputStreamSource { * @see org.apache.commons.fileupload.FileItem#getName() * @see org.springframework.web.multipart.commons.CommonsMultipartFile#setPreserveFilename */ + @Nullable String getOriginalFilename(); /** @@ -60,6 +62,7 @@ public interface MultipartFile extends InputStreamSource { * @return the content type, or {@code null} if not defined * (or no file has been chosen in the multipart form) */ + @Nullable String getContentType(); /** diff --git a/spring-web/src/main/java/org/springframework/web/multipart/MultipartHttpServletRequest.java b/spring-web/src/main/java/org/springframework/web/multipart/MultipartHttpServletRequest.java index c5428f08d4b..f96305919bd 100644 --- a/spring-web/src/main/java/org/springframework/web/multipart/MultipartHttpServletRequest.java +++ b/spring-web/src/main/java/org/springframework/web/multipart/MultipartHttpServletRequest.java @@ -20,6 +20,7 @@ import javax.servlet.http.HttpServletRequest; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; +import org.springframework.lang.Nullable; /** * Provides additional methods for dealing with multipart content within a @@ -62,6 +63,7 @@ public interface MultipartHttpServletRequest extends HttpServletRequest, Multipa *

    If the underlying implementation supports access to headers, then all headers are returned. * Otherwise, the returned headers will include a 'Content-Type' header at the very least. */ + @Nullable HttpHeaders getMultipartHeaders(String paramOrFileName); } diff --git a/spring-web/src/main/java/org/springframework/web/multipart/MultipartRequest.java b/spring-web/src/main/java/org/springframework/web/multipart/MultipartRequest.java index 4dc2cb25d7c..ec55d02f4b2 100644 --- a/spring-web/src/main/java/org/springframework/web/multipart/MultipartRequest.java +++ b/spring-web/src/main/java/org/springframework/web/multipart/MultipartRequest.java @@ -20,6 +20,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.util.MultiValueMap; /** @@ -47,6 +48,7 @@ public interface MultipartRequest { * @param name a String specifying the parameter name of the multipart file * @return the uploaded content in the form of a {@link MultipartFile} object */ + @Nullable MultipartFile getFile(String name); /** @@ -79,6 +81,7 @@ public interface MultipartRequest { * @return the associated content type, or {@code null} if not defined * @since 3.1 */ + @Nullable String getMultipartContentType(String paramOrFileName); } diff --git a/spring-web/src/main/java/org/springframework/web/multipart/commons/package-info.java b/spring-web/src/main/java/org/springframework/web/multipart/commons/package-info.java index 001283a1fe9..3021c8c629b 100644 --- a/spring-web/src/main/java/org/springframework/web/multipart/commons/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/multipart/commons/package-info.java @@ -2,4 +2,7 @@ * MultipartResolver implementation for * Apache Commons FileUpload. */ +@NonNullApi package org.springframework.web.multipart.commons; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/multipart/package-info.java b/spring-web/src/main/java/org/springframework/web/multipart/package-info.java index 0733fd94366..906d5c8585c 100644 --- a/spring-web/src/main/java/org/springframework/web/multipart/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/multipart/package-info.java @@ -4,4 +4,7 @@ * and a generic extension of the HttpServletRequest interface * for accessing multipart files in web application code. */ +@NonNullApi package org.springframework.web.multipart; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/multipart/support/MultipartFilter.java b/spring-web/src/main/java/org/springframework/web/multipart/support/MultipartFilter.java index 577b4e3b858..c6d2ccebb7a 100644 --- a/spring-web/src/main/java/org/springframework/web/multipart/support/MultipartFilter.java +++ b/spring-web/src/main/java/org/springframework/web/multipart/support/MultipartFilter.java @@ -17,11 +17,13 @@ package org.springframework.web.multipart.support; import java.io.IOException; + import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.lang.Nullable; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import org.springframework.web.filter.OncePerRequestFilter; @@ -148,6 +150,7 @@ public class MultipartFilter extends OncePerRequestFilter { * for example if not using a Spring web application context. * @return the MultipartResolver instance, or {@code null} if none found */ + @Nullable protected MultipartResolver lookupMultipartResolver() { WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(getServletContext()); String beanName = getMultipartResolverBeanName(); diff --git a/spring-web/src/main/java/org/springframework/web/multipart/support/MultipartResolutionDelegate.java b/spring-web/src/main/java/org/springframework/web/multipart/support/MultipartResolutionDelegate.java index d409496bd7a..30cdecad09c 100644 --- a/spring-web/src/main/java/org/springframework/web/multipart/support/MultipartResolutionDelegate.java +++ b/spring-web/src/main/java/org/springframework/web/multipart/support/MultipartResolutionDelegate.java @@ -24,6 +24,7 @@ import javax.servlet.http.Part; import org.springframework.core.MethodParameter; import org.springframework.core.ResolvableType; +import org.springframework.lang.Nullable; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.util.WebUtils; @@ -66,6 +67,7 @@ public abstract class MultipartResolutionDelegate { (Part.class == paramType || isPartCollection(parameter) || isPartArray(parameter))); } + @Nullable public static Object resolveMultipartArgument(String name, MethodParameter parameter, HttpServletRequest request) throws Exception { @@ -127,6 +129,7 @@ public abstract class MultipartResolutionDelegate { return (Part.class == methodParam.getNestedParameterType().getComponentType()); } + @Nullable private static Class getCollectionParameterType(MethodParameter methodParam) { Class paramType = methodParam.getNestedParameterType(); if (Collection.class == paramType || List.class.isAssignableFrom(paramType)){ diff --git a/spring-web/src/main/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequest.java b/spring-web/src/main/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequest.java index c631932cbce..c84ac006794 100644 --- a/spring-web/src/main/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequest.java +++ b/spring-web/src/main/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequest.java @@ -35,6 +35,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.Part; import org.springframework.http.HttpHeaders; +import org.springframework.lang.Nullable; import org.springframework.util.FileCopyUtils; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @@ -121,6 +122,7 @@ public class StandardMultipartHttpServletRequest extends AbstractMultipartHttpSe throw new MultipartException("Failed to parse multipart servlet request", ex); } + @Nullable private String extractFilename(String contentDisposition, String key) { if (contentDisposition == null) { return null; @@ -149,6 +151,7 @@ public class StandardMultipartHttpServletRequest extends AbstractMultipartHttpSe return extractFilename(contentDisposition, FILENAME_KEY); } + @Nullable private String extractFilenameWithCharset(String contentDisposition) { String filename = extractFilename(contentDisposition, FILENAME_WITH_CHARSET_KEY); if (filename == null) { diff --git a/spring-web/src/main/java/org/springframework/web/multipart/support/package-info.java b/spring-web/src/main/java/org/springframework/web/multipart/support/package-info.java index 351cb24816c..234f6b44535 100644 --- a/spring-web/src/main/java/org/springframework/web/multipart/support/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/multipart/support/package-info.java @@ -3,4 +3,7 @@ * Contains property editors for multipart files, and a Servlet filter * for multipart handling without Spring's Web MVC. */ +@NonNullApi package org.springframework.web.multipart.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/package-info.java b/spring-web/src/main/java/org/springframework/web/package-info.java index 142f096ec74..4780c3f8896 100644 --- a/spring-web/src/main/java/org/springframework/web/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/package-info.java @@ -2,4 +2,7 @@ * Common, generic interfaces that define minimal boundary points * between Spring's web infrastructure and other framework modules. */ +@NonNullApi package org.springframework.web; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/server/ResponseStatusException.java b/spring-web/src/main/java/org/springframework/web/server/ResponseStatusException.java index 198b5a05ff4..0bbc5d0e0b7 100644 --- a/spring-web/src/main/java/org/springframework/web/server/ResponseStatusException.java +++ b/spring-web/src/main/java/org/springframework/web/server/ResponseStatusException.java @@ -19,6 +19,7 @@ package org.springframework.web.server; import org.springframework.core.NestedExceptionUtils; import org.springframework.core.NestedRuntimeException; import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -50,7 +51,7 @@ public class ResponseStatusException extends NestedRuntimeException { * @param status the HTTP status (required) * @param reason the associated reason (optional) */ - public ResponseStatusException(HttpStatus status, String reason) { + public ResponseStatusException(HttpStatus status, @Nullable String reason) { this(status, reason, null); } @@ -61,7 +62,7 @@ public class ResponseStatusException extends NestedRuntimeException { * @param reason the associated reason (optional) * @param cause a nested exception (optional) */ - public ResponseStatusException(HttpStatus status, String reason, Throwable cause) { + public ResponseStatusException(HttpStatus status, @Nullable String reason, @Nullable Throwable cause) { super(null, cause); Assert.notNull(status, "HttpStatus is required"); this.status = status; @@ -79,6 +80,7 @@ public class ResponseStatusException extends NestedRuntimeException { /** * The reason explaining the exception (potentially {@code null} or empty). */ + @Nullable public String getReason() { return this.reason; } diff --git a/spring-web/src/main/java/org/springframework/web/server/ServerErrorException.java b/spring-web/src/main/java/org/springframework/web/server/ServerErrorException.java index 513a67fbbfa..e914ad629bb 100644 --- a/spring-web/src/main/java/org/springframework/web/server/ServerErrorException.java +++ b/spring-web/src/main/java/org/springframework/web/server/ServerErrorException.java @@ -18,6 +18,7 @@ package org.springframework.web.server; import org.springframework.core.MethodParameter; import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; /** * Exception for errors that fit response status 500 (bad request) for use in @@ -59,6 +60,7 @@ public class ServerErrorException extends ResponseStatusException { /** * Return the {@code MethodParameter} associated with this error, if any. */ + @Nullable public MethodParameter getMethodParameter() { return this.parameter; } diff --git a/spring-web/src/main/java/org/springframework/web/server/ServerWebInputException.java b/spring-web/src/main/java/org/springframework/web/server/ServerWebInputException.java index 91f60f43049..3c94c409f11 100644 --- a/spring-web/src/main/java/org/springframework/web/server/ServerWebInputException.java +++ b/spring-web/src/main/java/org/springframework/web/server/ServerWebInputException.java @@ -18,6 +18,7 @@ package org.springframework.web.server; import org.springframework.core.MethodParameter; import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; /** * Exception for errors that fit response status 400 (bad request) for use in @@ -59,6 +60,7 @@ public class ServerWebInputException extends ResponseStatusException { /** * Return the {@code MethodParameter} associated with this error, if any. */ + @Nullable public MethodParameter getMethodParameter() { return this.parameter; } diff --git a/spring-web/src/main/java/org/springframework/web/server/UnsupportedMediaTypeStatusException.java b/spring-web/src/main/java/org/springframework/web/server/UnsupportedMediaTypeStatusException.java index 308951a2977..84f354efc2a 100644 --- a/spring-web/src/main/java/org/springframework/web/server/UnsupportedMediaTypeStatusException.java +++ b/spring-web/src/main/java/org/springframework/web/server/UnsupportedMediaTypeStatusException.java @@ -21,6 +21,7 @@ import java.util.List; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; /** * Exception for errors that fit response status 416 (unsupported media type). @@ -59,6 +60,7 @@ public class UnsupportedMediaTypeStatusException extends ResponseStatusException * Return the request Content-Type header if it was parsed successfully, * or {@code null} otherwise. */ + @Nullable public MediaType getContentType() { return this.contentType; } diff --git a/spring-web/src/main/java/org/springframework/web/server/adapter/package-info.java b/spring-web/src/main/java/org/springframework/web/server/adapter/package-info.java index 8f20e00d331..51c295df38e 100644 --- a/spring-web/src/main/java/org/springframework/web/server/adapter/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/server/adapter/package-info.java @@ -3,4 +3,7 @@ * {@code org.springframework.http.client.reactive} reactive HTTP adapter * and {@link org.springframework.http.server.reactive.HttpHandler}. */ +@NonNullApi package org.springframework.web.server.adapter; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/server/handler/package-info.java b/spring-web/src/main/java/org/springframework/web/server/handler/package-info.java index 77da5259e88..091e1784db2 100644 --- a/spring-web/src/main/java/org/springframework/web/server/handler/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/server/handler/package-info.java @@ -2,4 +2,7 @@ * Provides common WebHandler implementations and a * {@link org.springframework.web.server.handler.WebHandlerDecorator}. */ +@NonNullApi package org.springframework.web.server.handler; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/server/package-info.java b/spring-web/src/main/java/org/springframework/web/server/package-info.java index dda2f5dbeff..fbe43f7b522 100644 --- a/spring-web/src/main/java/org/springframework/web/server/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/server/package-info.java @@ -4,4 +4,7 @@ * reactive HTTP adapter layer, providing additional constructs such as * WebHandler, WebFilter, WebSession among others. */ +@NonNullApi package org.springframework.web.server; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/server/session/package-info.java b/spring-web/src/main/java/org/springframework/web/server/session/package-info.java index e0a1afc065a..46fdc33681b 100644 --- a/spring-web/src/main/java/org/springframework/web/server/session/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/server/session/package-info.java @@ -2,4 +2,7 @@ * Auxiliary interfaces and implementation classes for * {@link org.springframework.web.server.WebSession} support. */ +@NonNullApi package org.springframework.web.server.session; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/server/support/package-info.java b/spring-web/src/main/java/org/springframework/web/server/support/package-info.java index 0220d7faa44..93a8f728717 100644 --- a/spring-web/src/main/java/org/springframework/web/server/support/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/server/support/package-info.java @@ -2,4 +2,7 @@ * Helper classes on top of {@code org.springframework.web.server}, * as a convenience for working with {@code ServerWebExchange}. */ +@NonNullApi package org.springframework.web.server.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/util/CookieGenerator.java b/spring-web/src/main/java/org/springframework/web/util/CookieGenerator.java index 59f5b226802..475b84c641f 100644 --- a/spring-web/src/main/java/org/springframework/web/util/CookieGenerator.java +++ b/spring-web/src/main/java/org/springframework/web/util/CookieGenerator.java @@ -22,6 +22,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -89,6 +90,7 @@ public class CookieGenerator { /** * Return the domain for cookies created by this generator, if any. */ + @Nullable public String getCookieDomain() { return this.cookieDomain; } diff --git a/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java b/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java index 86bd732c409..a8c02ba9967 100644 --- a/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java +++ b/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java @@ -28,6 +28,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.LinkedMultiValueMap; @@ -78,9 +79,9 @@ final class HierarchicalUriComponents extends UriComponents { * @param encoded whether the components are already encoded * @param verify whether the components need to be checked for illegal characters */ - HierarchicalUriComponents(String scheme, String userInfo, String host, String port, - PathComponent path, MultiValueMap queryParams, - String fragment, boolean encoded, boolean verify) { + HierarchicalUriComponents(@Nullable String scheme, @Nullable String userInfo, @Nullable String host, @Nullable String port, + @Nullable PathComponent path, @Nullable MultiValueMap queryParams, + @Nullable String fragment, @Nullable boolean encoded, @Nullable boolean verify) { super(scheme, fragment); this.userInfo = userInfo; diff --git a/spring-web/src/main/java/org/springframework/web/util/HtmlCharacterEntityReferences.java b/spring-web/src/main/java/org/springframework/web/util/HtmlCharacterEntityReferences.java index 2757be91728..1e00db13f58 100644 --- a/spring-web/src/main/java/org/springframework/web/util/HtmlCharacterEntityReferences.java +++ b/spring-web/src/main/java/org/springframework/web/util/HtmlCharacterEntityReferences.java @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Properties; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -121,6 +122,7 @@ class HtmlCharacterEntityReferences { /** * Return the reference mapped to the given character or {@code null}. */ + @Nullable public String convertToReference(char character) { return convertToReference(character, WebUtils.DEFAULT_CHARACTER_ENCODING); } @@ -129,6 +131,7 @@ class HtmlCharacterEntityReferences { * Return the reference mapped to the given character or {@code null}. * @since 4.1.2 */ + @Nullable public String convertToReference(char character, String encoding) { if (encoding.startsWith("UTF-")){ switch (character){ diff --git a/spring-web/src/main/java/org/springframework/web/util/UriBuilder.java b/spring-web/src/main/java/org/springframework/web/util/UriBuilder.java index 2388d325812..1ffe3005023 100644 --- a/spring-web/src/main/java/org/springframework/web/util/UriBuilder.java +++ b/spring-web/src/main/java/org/springframework/web/util/UriBuilder.java @@ -18,6 +18,7 @@ package org.springframework.web.util; import java.net.URI; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.util.MultiValueMap; /** @@ -43,21 +44,21 @@ public interface UriBuilder { * and may also be {@code null} to clear the scheme of this builder. * @param scheme the URI scheme */ - UriBuilder scheme(String scheme); + UriBuilder scheme(@Nullable String scheme); /** * Set the URI user info which may contain URI template variables, and * may also be {@code null} to clear the user info of this builder. * @param userInfo the URI user info */ - UriBuilder userInfo(String userInfo); + UriBuilder userInfo(@Nullable String userInfo); /** * Set the URI host which may contain URI template variables, and may also * be {@code null} to clear the host of this builder. * @param host the URI host */ - UriBuilder host(String host); + UriBuilder host(@Nullable String host); /** * Set the URI port. Passing {@code -1} will clear the port of this builder. @@ -71,7 +72,7 @@ public interface UriBuilder { * Passing {@code null} will clear the port of this builder. * @param port the URI port */ - UriBuilder port(String port); + UriBuilder port(@Nullable String port); /** * Append the given path to the existing path of this builder. @@ -84,7 +85,7 @@ public interface UriBuilder { * Set the path of this builder overriding the existing path values. * @param path the URI path or {@code null} for an empty path. */ - UriBuilder replacePath(String path); + UriBuilder replacePath(@Nullable String path); /** * Append path segments to the existing path. Each path segment may contain @@ -113,7 +114,7 @@ public interface UriBuilder { * Set the query of this builder overriding all existing query parameters. * @param query the query string or {@code null} to remove all query params */ - UriBuilder replaceQuery(String query); + UriBuilder replaceQuery(@Nullable String query); /** * Append the given query parameter to the existing query parameters. The @@ -150,7 +151,7 @@ public interface UriBuilder { * and may also be {@code null} to clear the fragment of this builder. * @param fragment the URI fragment */ - UriBuilder fragment(String fragment); + UriBuilder fragment(@Nullable String fragment); /** * Build a {@link URI} instance and replaces URI template variables diff --git a/spring-web/src/main/java/org/springframework/web/util/UriComponents.java b/spring-web/src/main/java/org/springframework/web/util/UriComponents.java index 9ada40127a8..1415ac87144 100644 --- a/spring-web/src/main/java/org/springframework/web/util/UriComponents.java +++ b/spring-web/src/main/java/org/springframework/web/util/UriComponents.java @@ -27,6 +27,7 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.MultiValueMap; @@ -65,6 +66,7 @@ public abstract class UriComponents implements Serializable { /** * Return the scheme. Can be {@code null}. */ + @Nullable public final String getScheme() { return this.scheme; } @@ -72,16 +74,19 @@ public abstract class UriComponents implements Serializable { /** * Return the scheme specific part. Can be {@code null}. */ + @Nullable public abstract String getSchemeSpecificPart(); /** * Return the user info. Can be {@code null}. */ + @Nullable public abstract String getUserInfo(); /** * Return the host. Can be {@code null}. */ + @Nullable public abstract String getHost(); /** @@ -92,6 +97,7 @@ public abstract class UriComponents implements Serializable { /** * Return the path. Can be {@code null}. */ + @Nullable public abstract String getPath(); /** @@ -102,6 +108,7 @@ public abstract class UriComponents implements Serializable { /** * Return the query. Can be {@code null}. */ + @Nullable public abstract String getQuery(); /** @@ -112,6 +119,7 @@ public abstract class UriComponents implements Serializable { /** * Return the fragment. Can be {@code null}. */ + @Nullable public final String getFragment() { return this.fragment; } @@ -279,7 +287,8 @@ public abstract class UriComponents implements Serializable { * @param name the variable name * @return the variable value, possibly {@code null} or {@link #SKIP_VALUE} */ - Object getValue(String name); + @Nullable + Object getValue(@Nullable String name); } diff --git a/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java b/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java index 255e0b30f8c..c21c668e74e 100644 --- a/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java +++ b/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java @@ -26,6 +26,7 @@ import java.util.regex.Pattern; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpRequest; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @@ -454,7 +455,7 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable { * @return this UriComponentsBuilder */ @Override - public UriComponentsBuilder scheme(String scheme) { + public UriComponentsBuilder scheme(@Nullable String scheme) { this.scheme = scheme; return this; } @@ -480,7 +481,7 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable { * @return this UriComponentsBuilder */ @Override - public UriComponentsBuilder userInfo(String userInfo) { + public UriComponentsBuilder userInfo(@Nullable String userInfo) { this.userInfo = userInfo; resetSchemeSpecificPart(); return this; @@ -493,7 +494,7 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable { * @return this UriComponentsBuilder */ @Override - public UriComponentsBuilder host(String host) { + public UriComponentsBuilder host(@Nullable String host) { this.host = host; resetSchemeSpecificPart(); return this; @@ -520,7 +521,7 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable { * @return this UriComponentsBuilder */ @Override - public UriComponentsBuilder port(String port) { + public UriComponentsBuilder port(@Nullable String port) { this.port = port; resetSchemeSpecificPart(); return this; @@ -545,7 +546,7 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable { * @return this UriComponentsBuilder */ @Override - public UriComponentsBuilder replacePath(String path) { + public UriComponentsBuilder replacePath(@Nullable String path) { this.pathBuilder = new CompositePathComponentBuilder(path); resetSchemeSpecificPart(); return this; @@ -605,7 +606,7 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable { * @return this UriComponentsBuilder */ @Override - public UriComponentsBuilder replaceQuery(String query) { + public UriComponentsBuilder replaceQuery(@Nullable String query) { this.queryParams.clear(); query(query); resetSchemeSpecificPart(); @@ -691,7 +692,7 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable { * @return this UriComponentsBuilder */ @Override - public UriComponentsBuilder fragment(String fragment) { + public UriComponentsBuilder fragment(@Nullable String fragment) { if (fragment != null) { Assert.hasLength(fragment, "Fragment must not be empty"); this.fragment = fragment; @@ -795,6 +796,7 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable { private interface PathComponentBuilder { + @Nullable PathComponent build(); PathComponentBuilder cloneBuilder(); @@ -843,6 +845,7 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable { } @SuppressWarnings("unchecked") + @Nullable private T getLastBuilder(Class builderClass) { if (!this.builders.isEmpty()) { PathComponentBuilder last = this.builders.getLast(); diff --git a/spring-web/src/main/java/org/springframework/web/util/UriUtils.java b/spring-web/src/main/java/org/springframework/web/util/UriUtils.java index 7fd64dc2547..2144b74c709 100644 --- a/spring-web/src/main/java/org/springframework/web/util/UriUtils.java +++ b/spring-web/src/main/java/org/springframework/web/util/UriUtils.java @@ -24,6 +24,7 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.stream.Collectors; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -237,6 +238,7 @@ public abstract class UriUtils { * @return the extracted file extension (e.g. "html") * @since 4.3.2 */ + @Nullable public static String extractFileExtension(String path) { int end = path.indexOf('?'); if (end == -1) { diff --git a/spring-web/src/main/java/org/springframework/web/util/UrlPathHelper.java b/spring-web/src/main/java/org/springframework/web/util/UrlPathHelper.java index 42d3662d57a..afc8038b3ce 100644 --- a/spring-web/src/main/java/org/springframework/web/util/UrlPathHelper.java +++ b/spring-web/src/main/java/org/springframework/web/util/UrlPathHelper.java @@ -27,6 +27,7 @@ import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; @@ -238,6 +239,7 @@ public class UrlPathHelper { * context path and the servlet path returned by the HttpServletRequest are * stripped of semicolon content unlike the requesUri. */ + @Nullable private String getRemainingPath(String requestUri, String mapping, boolean ignoreCase) { int index1 = 0; int index2 = 0; diff --git a/spring-web/src/main/java/org/springframework/web/util/WebUtils.java b/spring-web/src/main/java/org/springframework/web/util/WebUtils.java index 28b79893477..29064ee33eb 100644 --- a/spring-web/src/main/java/org/springframework/web/util/WebUtils.java +++ b/spring-web/src/main/java/org/springframework/web/util/WebUtils.java @@ -23,6 +23,7 @@ import java.util.Enumeration; import java.util.Map; import java.util.StringTokenizer; import java.util.TreeMap; + import javax.servlet.ServletContext; import javax.servlet.ServletRequest; import javax.servlet.ServletRequestWrapper; @@ -35,6 +36,7 @@ import javax.servlet.http.HttpSession; import org.springframework.http.HttpRequest; import org.springframework.http.server.ServletServerHttpRequest; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.LinkedMultiValueMap; @@ -191,6 +193,7 @@ public abstract class WebUtils { * @return whether default HTML escaping is enabled for the given application * ({@code null} = no explicit default) */ + @Nullable public static Boolean getDefaultHtmlEscape(ServletContext servletContext) { if (servletContext == null) { return null; @@ -213,6 +216,7 @@ public abstract class WebUtils { * ({@code null} = no explicit default) * @since 4.1.2 */ + @Nullable public static Boolean getResponseEncodedHtmlEscape(ServletContext servletContext) { if (servletContext == null) { return null; @@ -265,6 +269,7 @@ public abstract class WebUtils { * @param request current HTTP request * @return the session id, or {@code null} if none */ + @Nullable public static String getSessionId(HttpServletRequest request) { Assert.notNull(request, "Request must not be null"); HttpSession session = request.getSession(false); @@ -279,6 +284,7 @@ public abstract class WebUtils { * @param name the name of the session attribute * @return the value of the session attribute, or {@code null} if not found */ + @Nullable public static Object getSessionAttribute(HttpServletRequest request, String name) { Assert.notNull(request, "Request must not be null"); HttpSession session = request.getSession(false); @@ -294,6 +300,7 @@ public abstract class WebUtils { * @return the value of the session attribute, or {@code null} if not found * @throws IllegalStateException if the session attribute could not be found */ + @Nullable public static Object getRequiredSessionAttribute(HttpServletRequest request, String name) throws IllegalStateException { @@ -364,6 +371,7 @@ public abstract class WebUtils { * of that type is available */ @SuppressWarnings("unchecked") + @Nullable public static T getNativeRequest(ServletRequest request, Class requiredType) { if (requiredType != null) { if (requiredType.isInstance(request)) { @@ -385,6 +393,7 @@ public abstract class WebUtils { * of that type is available */ @SuppressWarnings("unchecked") + @Nullable public static T getNativeResponse(ServletResponse response, Class requiredType) { if (requiredType != null) { if (requiredType.isInstance(response)) { @@ -476,6 +485,7 @@ public abstract class WebUtils { * @param name cookie name * @return the first cookie with the given name, or {@code null} if none is found */ + @Nullable public static Cookie getCookie(HttpServletRequest request, String name) { Assert.notNull(request, "Request must not be null"); Cookie cookies[] = request.getCookies(); @@ -520,6 +530,7 @@ public abstract class WebUtils { * @return the value of the parameter, or {@code null} * if the parameter does not exist in given request */ + @Nullable public static String findParameterValue(ServletRequest request, String name) { return findParameterValue(request.getParameterMap(), name); } @@ -547,6 +558,7 @@ public abstract class WebUtils { * @return the value of the parameter, or {@code null} * if the parameter does not exist in given request */ + @Nullable public static String findParameterValue(Map parameters, String name) { // First try to get it as a normal name=value parameter Object value = parameters.get(name); diff --git a/spring-web/src/main/java/org/springframework/web/util/package-info.java b/spring-web/src/main/java/org/springframework/web/util/package-info.java index 42edc4aebfe..58b92951631 100644 --- a/spring-web/src/main/java/org/springframework/web/util/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/util/package-info.java @@ -2,4 +2,7 @@ * Miscellaneous web utility classes, such as HTML escaping, * Log4j initialization, and cookie handling. */ +@NonNullApi package org.springframework.web.util; + +import org.springframework.lang.NonNullApi; diff --git a/spring-web/src/main/java/org/springframework/web/util/pattern/PathPattern.java b/spring-web/src/main/java/org/springframework/web/util/pattern/PathPattern.java index 9c17ce67966..919782b8eca 100644 --- a/spring-web/src/main/java/org/springframework/web/util/pattern/PathPattern.java +++ b/spring-web/src/main/java/org/springframework/web/util/pattern/PathPattern.java @@ -20,6 +20,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.util.PathMatcher; import static org.springframework.util.StringUtils.*; @@ -173,6 +174,7 @@ public class PathPattern implements Comparable { * @return a {@link PathRemainingMatchInfo} describing the match result or null if * the path does not match this pattern */ + @Nullable public PathRemainingMatchInfo getPathRemaining(String path) { if (this.head == null) { if (path == null) { diff --git a/spring-web/src/main/java/org/springframework/web/util/pattern/package-info.java b/spring-web/src/main/java/org/springframework/web/util/pattern/package-info.java index ad083bec054..29e42f9425a 100644 --- a/spring-web/src/main/java/org/springframework/web/util/pattern/package-info.java +++ b/spring-web/src/main/java/org/springframework/web/util/pattern/package-info.java @@ -1,4 +1,7 @@ /** * Spring's path pattern parser/matcher. */ +@NonNullApi package org.springframework.web.util.pattern; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/BindingContext.java b/spring-webflux/src/main/java/org/springframework/web/reactive/BindingContext.java index d6e1f986fcd..d3f950b311b 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/BindingContext.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/BindingContext.java @@ -16,6 +16,7 @@ package org.springframework.web.reactive; +import org.springframework.lang.Nullable; import org.springframework.ui.Model; import org.springframework.validation.support.BindingAwareConcurrentModel; import org.springframework.web.bind.support.WebBindingInitializer; @@ -52,7 +53,7 @@ public class BindingContext { * Create a new {@code BindingContext} with the given initializer. * @param initializer the binding initializer to apply (may be {@code null}) */ - public BindingContext(WebBindingInitializer initializer) { + public BindingContext(@Nullable WebBindingInitializer initializer) { this.initializer = initializer; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/HandlerResult.java b/spring-webflux/src/main/java/org/springframework/web/reactive/HandlerResult.java index 6e661b9be7d..90d0576ff1a 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/HandlerResult.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/HandlerResult.java @@ -22,6 +22,7 @@ import reactor.core.publisher.Mono; import org.springframework.core.MethodParameter; import org.springframework.core.ResolvableType; +import org.springframework.lang.Nullable; import org.springframework.ui.Model; import org.springframework.util.Assert; @@ -50,7 +51,7 @@ public class HandlerResult { * @param returnValue the return value from the handler possibly {@code null} * @param returnType the return value type */ - public HandlerResult(Object handler, Object returnValue, MethodParameter returnType) { + public HandlerResult(Object handler, @Nullable Object returnValue, MethodParameter returnType) { this(handler, returnValue, returnType, null); } @@ -61,7 +62,7 @@ public class HandlerResult { * @param returnType the return value type * @param context the binding context used for request handling */ - public HandlerResult(Object handler, Object returnValue, MethodParameter returnType, + public HandlerResult(Object handler, @Nullable Object returnValue, MethodParameter returnType, BindingContext context) { Assert.notNull(handler, "'handler' is required"); @@ -83,6 +84,7 @@ public class HandlerResult { /** * Return the value returned from the handler, if any. */ + @Nullable public Object getReturnValue() { return this.returnValue; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/accept/AbstractMappingContentTypeResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/accept/AbstractMappingContentTypeResolver.java index bd38fac63f1..2dc0a9229f4 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/accept/AbstractMappingContentTypeResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/accept/AbstractMappingContentTypeResolver.java @@ -25,6 +25,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; @@ -73,6 +74,7 @@ public abstract class AbstractMappingContentTypeResolver implements MappingConte * @param key the key converted to lower case * @return a MediaType or {@code null} */ + @Nullable protected MediaType getMediaType(String key) { return this.mediaTypeLookup.get(key.toLowerCase(Locale.ENGLISH)); } @@ -125,6 +127,7 @@ public abstract class AbstractMappingContentTypeResolver implements MappingConte * e.g. file extension, query parameter, etc. * @return the key or {@code null} */ + @Nullable protected abstract String extractKey(ServerWebExchange exchange); /** @@ -141,6 +144,7 @@ public abstract class AbstractMappingContentTypeResolver implements MappingConte * this method it will be added to the mappings. */ @SuppressWarnings("UnusedParameters") + @Nullable protected MediaType handleNoMatch(String key) throws NotAcceptableStatusException { return null; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/accept/CompositeContentTypeResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/accept/CompositeContentTypeResolver.java index 745ed19174d..423653438d2 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/accept/CompositeContentTypeResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/accept/CompositeContentTypeResolver.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Set; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.server.NotAcceptableStatusException; import org.springframework.web.server.ServerWebExchange; @@ -61,6 +62,7 @@ public class CompositeContentTypeResolver implements MappingContentTypeResolver * @return the first matching resolver or {@code null}. */ @SuppressWarnings("unchecked") + @Nullable public T findResolver(Class resolverType) { for (RequestedContentTypeResolver resolver : this.resolvers) { if (resolverType.isInstance(resolver)) { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/accept/PathExtensionContentTypeResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/accept/PathExtensionContentTypeResolver.java index 7ad79e03834..b7c1b7e49eb 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/accept/PathExtensionContentTypeResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/accept/PathExtensionContentTypeResolver.java @@ -23,6 +23,7 @@ import java.util.Optional; import org.springframework.core.io.Resource; import org.springframework.http.MediaType; import org.springframework.http.MediaTypeFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; import org.springframework.web.server.NotAcceptableStatusException; @@ -110,6 +111,7 @@ public class PathExtensionContentTypeResolver extends AbstractMappingContentType * @param resource the resource * @return the MediaType for the extension, or {@code null} if none determined */ + @Nullable public MediaType resolveMediaTypeForResource(Resource resource) { Assert.notNull(resource, "Resource must not be null"); MediaType mediaType = null; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/accept/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/accept/package-info.java index 0f06c119a05..498eca8b8cc 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/accept/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/accept/package-info.java @@ -3,4 +3,7 @@ * strategy and implementations to resolve the requested content type for a * given request. */ +@NonNullApi package org.springframework.web.reactive.accept; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/config/ResourceHandlerRegistry.java b/spring-webflux/src/main/java/org/springframework/web/reactive/config/ResourceHandlerRegistry.java index 640dd1152a3..d9b927c125e 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/config/ResourceHandlerRegistry.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/config/ResourceHandlerRegistry.java @@ -24,6 +24,7 @@ import java.util.Map; import org.springframework.beans.factory.BeanInitializationException; import org.springframework.context.ApplicationContext; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.reactive.accept.CompositeContentTypeResolver; import org.springframework.web.reactive.handler.AbstractHandlerMapping; @@ -127,6 +128,7 @@ public class ResourceHandlerRegistry { * Return a handler mapping with the mapped resource handlers; or {@code null} in case * of no registrations. */ + @Nullable protected AbstractHandlerMapping getHandlerMapping() { if (this.registrations.isEmpty()) { return null; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurationSupport.java b/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurationSupport.java index e1eb5d1e262..f0ebd8669f0 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurationSupport.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurationSupport.java @@ -36,6 +36,7 @@ import org.springframework.format.support.DefaultFormattingConversionService; import org.springframework.format.support.FormattingConversionService; import org.springframework.http.MediaType; import org.springframework.http.codec.ServerCodecConfigurer; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.validation.Errors; import org.springframework.validation.MessageCodesResolver; @@ -373,6 +374,7 @@ public class WebFluxConfigurationSupport implements ApplicationContextAware { /** * Override this method to provide a custom {@link Validator}. */ + @Nullable protected Validator getValidator() { return null; } @@ -380,6 +382,7 @@ public class WebFluxConfigurationSupport implements ApplicationContextAware { /** * Override this method to provide a custom {@link MessageCodesResolver}. */ + @Nullable protected MessageCodesResolver getMessageCodesResolver() { return null; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurer.java b/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurer.java index 71bd17bea2f..43519bdc69f 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurer.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurer.java @@ -20,6 +20,7 @@ import org.springframework.core.convert.converter.Converter; import org.springframework.format.Formatter; import org.springframework.format.FormatterRegistry; import org.springframework.http.codec.ServerCodecConfigurer; +import org.springframework.lang.Nullable; import org.springframework.validation.MessageCodesResolver; import org.springframework.validation.Validator; import org.springframework.web.reactive.accept.CompositeContentTypeResolver; @@ -102,6 +103,7 @@ public interface WebFluxConfigurer { *

    By default a validator for standard bean validation is created if * bean validation api is present on the classpath. */ + @Nullable default Validator getValidator() { return null; } @@ -110,6 +112,7 @@ public interface WebFluxConfigurer { * Provide a custom {@link MessageCodesResolver} to use for data binding instead * of the one created by default in {@link org.springframework.validation.DataBinder}. */ + @Nullable default MessageCodesResolver getMessageCodesResolver() { return null; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurerComposite.java b/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurerComposite.java index 67bab03662d..18e125894d6 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurerComposite.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurerComposite.java @@ -23,6 +23,7 @@ import java.util.stream.Collectors; import org.springframework.format.FormatterRegistry; import org.springframework.http.codec.ServerCodecConfigurer; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; import org.springframework.validation.MessageCodesResolver; import org.springframework.validation.Validator; @@ -98,6 +99,7 @@ public class WebFluxConfigurerComposite implements WebFluxConfigurer { this.delegates.forEach(delegate -> delegate.configureViewResolvers(registry)); } + @Nullable private T createSingleBean(Function factory, Class beanType) { List result = this.delegates.stream().map(factory).filter(t -> t != null).collect(Collectors.toList()); if (result.isEmpty()) { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/config/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/config/package-info.java index 0f0516b227a..03cf147d9c6 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/config/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/config/package-info.java @@ -1,4 +1,7 @@ /** * Spring WebFlux configuration infrastructure. */ +@NonNullApi package org.springframework.web.reactive.config; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/UnsupportedMediaTypeException.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/UnsupportedMediaTypeException.java index 5cc0a5cc770..d28e9f28ddd 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/UnsupportedMediaTypeException.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/UnsupportedMediaTypeException.java @@ -18,10 +18,10 @@ package org.springframework.web.reactive.function; import java.util.Collections; import java.util.List; -import java.util.Optional; import org.springframework.core.NestedRuntimeException; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; /** * Exception thrown to indicate that a {@code Content-Type} is not supported. @@ -60,6 +60,7 @@ public class UnsupportedMediaTypeException extends NestedRuntimeException { * Return the request Content-Type header if it was parsed successfully, * or {@code null} otherwise. */ + @Nullable public MediaType getContentType() { return this.contentType; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java index 3ffd01a33b9..91f3707c2d4 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java @@ -37,6 +37,7 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.http.client.reactive.ClientHttpRequest; import org.springframework.http.client.reactive.ClientHttpResponse; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.LinkedMultiValueMap; @@ -297,6 +298,7 @@ class DefaultWebClient implements WebClient { return ClientRequest.method(this.httpMethod, this.uri).headers(initHeaders()).cookies(initCookies()); } + @Nullable private HttpHeaders initHeaders() { if (CollectionUtils.isEmpty(defaultHeaders) && CollectionUtils.isEmpty(this.headers)) { return null; @@ -319,6 +321,7 @@ class DefaultWebClient implements WebClient { } } + @Nullable private MultiValueMap initCookies() { if (CollectionUtils.isEmpty(defaultCookies) && CollectionUtils.isEmpty(this.cookies)) { return null; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/package-info.java index 57e61fc9ce8..807c9ef4535 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/package-info.java @@ -3,4 +3,7 @@ * that builds on top of the * {@code org.springframework.http.client.reactive} reactive HTTP adapter layer. */ +@NonNullApi package org.springframework.web.reactive.function.client; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/package-info.java index b145d8dea20..7a6dd1f8e12 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/package-info.java @@ -1,4 +1,7 @@ /** * Provides a foundation for both the reactive client and server subpackages. */ -package org.springframework.web.reactive.function; \ No newline at end of file +@NonNullApi +package org.springframework.web.reactive.function; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/RenderingResponse.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/RenderingResponse.java index b6127f31f0b..56773870e8b 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/RenderingResponse.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/RenderingResponse.java @@ -23,6 +23,7 @@ import reactor.core.publisher.Mono; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -92,7 +93,7 @@ public interface RenderingResponse extends ServerResponse { * @param name the name of the model attribute (never {@code null}) * @param value the model attribute value (can be {@code null}) */ - Builder modelAttribute(String name, Object value); + Builder modelAttribute(String name, @Nullable Object value); /** * Copy all attributes in the supplied array into the model, diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/package-info.java index d6343b3faee..fefa0034780 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/package-info.java @@ -1,4 +1,7 @@ /** * Provides the types that make up Spring's functional web framework. */ -package org.springframework.web.reactive.function.server; \ No newline at end of file +@NonNullApi +package org.springframework.web.reactive.function.server; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/support/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/support/package-info.java index a9507adcb35..fa7cd76c922 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/support/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/support/package-info.java @@ -4,4 +4,7 @@ * a {@code HandlerResultHandler} that supports {@code ServerResponse}s, and * a {@code ServerRequest} wrapper to adapt a request. */ -package org.springframework.web.reactive.function.server.support; \ No newline at end of file +@NonNullApi +package org.springframework.web.reactive.function.server.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractHandlerMapping.java b/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractHandlerMapping.java index a1fcb235241..d2a20b0befa 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractHandlerMapping.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractHandlerMapping.java @@ -22,6 +22,7 @@ import reactor.core.publisher.Mono; import org.springframework.context.support.ApplicationObjectSupport; import org.springframework.core.Ordered; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.PathMatcher; import org.springframework.web.cors.CorsConfiguration; @@ -189,6 +190,7 @@ public abstract class AbstractHandlerMapping extends ApplicationObjectSupport im * @param exchange the current exchange * @return the CORS configuration for the handler, or {@code null} if none */ + @Nullable protected CorsConfiguration getCorsConfiguration(Object handler, ServerWebExchange exchange) { if (handler instanceof CorsConfigurationSource) { return ((CorsConfigurationSource) handler).getCorsConfiguration(exchange); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java b/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java index 7c5bbd5baa2..4458bb34c63 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/handler/AbstractUrlHandlerMapping.java @@ -26,6 +26,7 @@ import java.util.Map; import reactor.core.publisher.Mono; import org.springframework.beans.BeansException; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.server.ServerWebExchange; @@ -129,6 +130,7 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { * @return the associated handler instance, or {@code null} if not found * @see org.springframework.web.util.pattern.ParsingPathMatcher */ + @Nullable protected Object lookupHandler(String urlPath, ServerWebExchange exchange) throws Exception { // Direct match? Object handler = this.handlerMap.get(urlPath); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/handler/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/handler/package-info.java index 13c9d9aec71..94524fb6652 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/handler/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/handler/package-info.java @@ -1,4 +1,7 @@ /** * Provides HandlerMapping implementations including abstract base classes. */ +@NonNullApi package org.springframework.web.reactive.handler; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/package-info.java index 51c980da9cd..55bd9d94b99 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/package-info.java @@ -9,4 +9,7 @@ * routing and handling. The module also contains a functional, reactive * {@code WebClient} as well as client and server, reactive WebSocket support. */ +@NonNullApi package org.springframework.web.reactive; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/DefaultResourceResolverChain.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/DefaultResourceResolverChain.java index 6c051a96bdf..0f049dc33c6 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/DefaultResourceResolverChain.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/DefaultResourceResolverChain.java @@ -22,6 +22,7 @@ import java.util.List; import reactor.core.publisher.Mono; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.server.ServerWebExchange; @@ -78,6 +79,7 @@ class DefaultResourceResolverChain implements ResourceResolverChain { } } + @Nullable private ResourceResolver getNext() { Assert.state(this.index <= this.resolvers.size(), "Current index exceeds the number of configured ResourceResolvers"); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/DefaultResourceTransformerChain.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/DefaultResourceTransformerChain.java index f883026deb6..b51cdd80546 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/DefaultResourceTransformerChain.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/DefaultResourceTransformerChain.java @@ -22,6 +22,7 @@ import java.util.List; import reactor.core.publisher.Mono; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.server.ServerWebExchange; @@ -71,6 +72,7 @@ class DefaultResourceTransformerChain implements ResourceTransformerChain { } } + @Nullable private ResourceTransformer getNext() { Assert.state(this.index <= this.transformers.size(), "Current index exceeds the number of configured ResourceTransformer's"); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/PathResourceResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/PathResourceResolver.java index f3d61c7d3c2..8860b53e063 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/PathResourceResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/PathResourceResolver.java @@ -100,7 +100,7 @@ public class PathResourceResolver extends AbstractResourceResolver { * {@code Resource} for the given path relative to the location. * @param resourcePath the path to the resource * @param location the location to check - * @return the resource, or {@code null} if none found + * @return the resource, or empty {@link Mono} if none found */ protected Mono getResource(String resourcePath, Resource location) { try { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceTransformer.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceTransformer.java index ec1130fb937..17a2e7c5ad8 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceTransformer.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceTransformer.java @@ -35,7 +35,7 @@ public interface ResourceTransformer { * @param exchange the current exchange * @param resource the resource to transform * @param transformerChain the chain of remaining transformers to delegate to - * @return the transformed resource (never {@code null}) + * @return the transformed resource (never empty) */ Mono transform(ServerWebExchange exchange, Resource resource, ResourceTransformerChain transformerChain); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceTransformerChain.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceTransformerChain.java index 1d2fd737ccd..184d6107b15 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceTransformerChain.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceTransformerChain.java @@ -41,7 +41,7 @@ public interface ResourceTransformerChain { * Transform the given resource. * @param exchange the current exchange * @param resource the candidate resource to transform - * @return the transformed or the same resource, never {@code null} + * @return the transformed or the same resource, never empty */ Mono transform(ServerWebExchange exchange, Resource resource); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceTransformerSupport.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceTransformerSupport.java index 287896f42df..fbeb9bcc9a5 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceTransformerSupport.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceTransformerSupport.java @@ -66,7 +66,7 @@ public abstract class ResourceTransformerSupport implements ResourceTransformer * @param exchange the current exchange * @param resource the resource being transformed * @param transformerChain the transformer chain - * @return the resolved URL or null + * @return the resolved URL or an empty {@link Mono} */ protected Mono resolveUrlPath(String resourcePath, ServerWebExchange exchange, Resource resource, ResourceTransformerChain transformerChain) { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceUrlProvider.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceUrlProvider.java index 26cf7f6aaec..b3ef7234bd5 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceUrlProvider.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceUrlProvider.java @@ -167,7 +167,7 @@ public class ResourceUrlProvider implements ApplicationListener getForRequestUrl(ServerWebExchange exchange, String requestUrl) { if (logger.isTraceEnabled()) { @@ -211,7 +211,7 @@ public class ResourceUrlProvider implements ApplicationListenerIf several handler mappings match, the handler used will be the one * configured with the most specific pattern. * @param lookupPath the lookup path to check - * @return the resolved public URL path, or {@code null} if unresolved + * @return the resolved public URL path, or empty if unresolved */ public final Mono getForLookupPath(String lookupPath) { if (logger.isTraceEnabled()) { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java index db42c513e8b..a874998a567 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java @@ -44,6 +44,7 @@ import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.codec.ResourceHttpMessageWriter; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; @@ -473,6 +474,7 @@ public class ResourceWebHandler * @param resource the resource to check * @return the corresponding media type, or {@code null} if none found */ + @Nullable protected MediaType getMediaType(ServerWebExchange exchange, Resource resource) { return this.pathExtensionResolver.resolveMediaTypeForResource(resource); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/VersionPathStrategy.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/VersionPathStrategy.java index c522c6901e6..28d245b45c9 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/VersionPathStrategy.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/VersionPathStrategy.java @@ -16,6 +16,8 @@ package org.springframework.web.reactive.resource; +import org.springframework.lang.Nullable; + /** * A strategy for extracting and embedding a resource version in its URL path. * @@ -30,6 +32,7 @@ public interface VersionPathStrategy { * @param requestPath the request path to check * @return the version string or {@code null} if none was found */ + @Nullable String extractVersion(String requestPath); /** diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/VersionResourceResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/VersionResourceResolver.java index a4c26343026..148963662f5 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/VersionResourceResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/VersionResourceResolver.java @@ -34,6 +34,7 @@ import reactor.core.publisher.Mono; import org.springframework.core.io.AbstractResource; import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; +import org.springframework.lang.Nullable; import org.springframework.util.AntPathMatcher; import org.springframework.util.StringUtils; import org.springframework.web.server.ServerWebExchange; @@ -235,6 +236,7 @@ public class VersionResourceResolver extends AbstractResourceResolver { * Find a {@code VersionStrategy} for the request path of the requested resource. * @return an instance of a {@code VersionStrategy} or null if none matches that request path */ + @Nullable protected VersionStrategy getStrategyForPath(String requestPath) { String path = "/".concat(requestPath); List matchingPatterns = new ArrayList<>(); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/VersionStrategy.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/VersionStrategy.java index 51d500702c8..5b328cfa98c 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/VersionStrategy.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/VersionStrategy.java @@ -17,6 +17,7 @@ package org.springframework.web.reactive.resource; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; /** * An extension of {@link VersionPathStrategy} that adds a method @@ -34,6 +35,7 @@ public interface VersionStrategy extends VersionPathStrategy { * @param resource the resource to check * @return the version (never {@code null}) */ + @Nullable String getResourceVersion(Resource resource); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/WebJarsResourceResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/WebJarsResourceResolver.java index 710ba37ec22..971090ea533 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/WebJarsResourceResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/WebJarsResourceResolver.java @@ -23,6 +23,7 @@ import org.webjars.WebJarAssetLocator; import reactor.core.publisher.Mono; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; import org.springframework.web.server.ServerWebExchange; /** @@ -102,6 +103,7 @@ public class WebJarsResourceResolver extends AbstractResourceResolver { })); } + @Nullable protected String findWebJarResourcePath(String path) { try { int startOffset = (path.startsWith("/") ? 1 : 0); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/package-info.java index a97c4fe9b8b..1b4c914d2c4 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/package-info.java @@ -1,4 +1,7 @@ /** * Support classes for serving static resources. */ +@NonNullApi package org.springframework.web.reactive.resource; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/HandlerResultHandlerSupport.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/HandlerResultHandlerSupport.java index a4652125c34..110957bc2c3 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/HandlerResultHandlerSupport.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/HandlerResultHandlerSupport.java @@ -28,6 +28,7 @@ import org.springframework.core.Ordered; import org.springframework.core.ReactiveAdapter; import org.springframework.core.ReactiveAdapterRegistry; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.reactive.HandlerMapping; import org.springframework.web.reactive.HandlerResult; @@ -98,6 +99,7 @@ public abstract class HandlerResultHandlerSupport implements Ordered { * Get a {@code ReactiveAdapter} for the top-level return value type. * @return the matching adapter or {@code null} */ + @Nullable protected ReactiveAdapter getAdapter(HandlerResult result) { Class returnType = result.getReturnType().getRawClass(); return getAdapterRegistry().getAdapter(returnType, result.getReturnValue()); @@ -110,6 +112,7 @@ public abstract class HandlerResultHandlerSupport implements Ordered { * @param producibleTypesSupplier the media types that can be produced for the current request * @return the selected media type or {@code null} */ + @Nullable protected MediaType selectMediaType(ServerWebExchange exchange, Supplier> producibleTypesSupplier) { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/CompositeRequestCondition.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/CompositeRequestCondition.java index 66b77d264ab..8d0f4df2e46 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/CompositeRequestCondition.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/CompositeRequestCondition.java @@ -21,6 +21,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.web.server.ServerWebExchange; @@ -49,7 +50,7 @@ public class CompositeRequestCondition extends AbstractRequestCondition... requestConditions) { + public CompositeRequestCondition(@Nullable RequestCondition... requestConditions) { this.requestConditions = wrap(requestConditions); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/RequestCondition.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/RequestCondition.java index e90b4b28700..8ddda6b7b89 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/RequestCondition.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/RequestCondition.java @@ -16,6 +16,7 @@ package org.springframework.web.reactive.result.condition; +import org.springframework.lang.Nullable; import org.springframework.web.server.ServerWebExchange; /** @@ -55,6 +56,7 @@ public interface RequestCondition { * empty content thus not causing a failure to match. * @return a condition instance in case of a match or {@code null} otherwise. */ + @Nullable T getMatchingCondition(ServerWebExchange exchange); /** diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/RequestConditionHolder.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/RequestConditionHolder.java index 9f5f4ace90c..9d2e882af90 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/RequestConditionHolder.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/condition/RequestConditionHolder.java @@ -19,6 +19,7 @@ package org.springframework.web.reactive.result.condition; import java.util.Collection; import java.util.Collections; +import org.springframework.lang.Nullable; import org.springframework.web.server.ServerWebExchange; /** @@ -45,7 +46,7 @@ public final class RequestConditionHolder extends AbstractRequestCondition requestCondition) { + public RequestConditionHolder(@Nullable RequestCondition requestCondition) { this.condition = (RequestCondition) requestCondition; } @@ -53,6 +54,7 @@ public final class RequestConditionHolder extends AbstractRequestCondition getCondition() { return this.condition; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/AbstractHandlerMethodMapping.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/AbstractHandlerMethodMapping.java index 2f0f41d89f5..9585e19b188 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/AbstractHandlerMethodMapping.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/AbstractHandlerMethodMapping.java @@ -34,6 +34,7 @@ import reactor.core.publisher.Mono; import org.springframework.aop.support.AopUtils; import org.springframework.beans.factory.InitializingBean; import org.springframework.core.MethodIntrospector; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.LinkedMultiValueMap; @@ -233,6 +234,7 @@ public abstract class AbstractHandlerMethodMapping extends AbstractHandlerMap /** * Extract and return the CORS configuration for the mapping. */ + @Nullable protected CorsConfiguration initCorsConfiguration(Object handler, Method method, T mapping) { return null; } @@ -293,6 +295,7 @@ public abstract class AbstractHandlerMethodMapping extends AbstractHandlerMap * @see #handleMatch(Object, String, ServerWebExchange) * @see #handleNoMatch(Set, String, ServerWebExchange) */ + @Nullable protected HandlerMethod lookupHandlerMethod(String lookupPath, ServerWebExchange exchange) throws Exception { @@ -360,6 +363,7 @@ public abstract class AbstractHandlerMethodMapping extends AbstractHandlerMap * @return an alternative HandlerMethod or {@code null} * @throws Exception provides details that can be translated into an error status code */ + @Nullable protected HandlerMethod handleNoMatch(Set mappings, String lookupPath, ServerWebExchange exchange) throws Exception { @@ -398,6 +402,7 @@ public abstract class AbstractHandlerMethodMapping extends AbstractHandlerMap * declaring class * @return the mapping, or {@code null} if the method is not mapped */ + @Nullable protected abstract T getMappingForMethod(Method method, Class handlerType); /** @@ -412,6 +417,7 @@ public abstract class AbstractHandlerMethodMapping extends AbstractHandlerMap * @param exchange the current exchange * @return the match, or {@code null} if the mapping doesn't match */ + @Nullable protected abstract T getMatchingMapping(T mapping, ServerWebExchange exchange); /** @@ -420,6 +426,7 @@ public abstract class AbstractHandlerMethodMapping extends AbstractHandlerMap * @param exchange the current exchange * @return the comparator (never {@code null}) */ + @Nullable protected abstract Comparator getMappingComparator(ServerWebExchange exchange); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfo.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfo.java index 6dfe57170aa..3741b94a455 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfo.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfo.java @@ -18,6 +18,7 @@ package org.springframework.web.reactive.result.method; import java.util.Set; +import org.springframework.lang.Nullable; import org.springframework.util.PathMatcher; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMethod; @@ -104,6 +105,7 @@ public final class RequestMappingInfo implements RequestCondition getCustomCondition() { return this.customConditionHolder.getCondition(); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageReaderArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageReaderArgumentResolver.java index e93d9f6d0c3..03a84688bdb 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageReaderArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageReaderArgumentResolver.java @@ -36,6 +36,7 @@ import org.springframework.http.MediaType; import org.springframework.http.codec.HttpMessageReader; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.validation.Validator; import org.springframework.validation.annotation.Validated; @@ -168,6 +169,7 @@ public abstract class AbstractMessageReaderArgumentResolver extends HandlerMetho * a (possibly empty) Object[] with validation hints. A return value of * {@code null} indicates that validation is not required. */ + @Nullable private Object[] extractValidationHints(MethodParameter parameter) { Annotation[] annotations = parameter.getParameterAnnotations(); for (Annotation ann : annotations) { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractNamedValueArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractNamedValueArgumentResolver.java index 28eb13e067f..0fee5288175 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractNamedValueArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractNamedValueArgumentResolver.java @@ -28,6 +28,7 @@ import org.springframework.beans.factory.config.BeanExpressionResolver; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.core.MethodParameter; import org.springframework.core.ReactiveAdapterRegistry; +import org.springframework.lang.Nullable; import org.springframework.ui.Model; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.ValueConstants; @@ -72,7 +73,7 @@ public abstract class AbstractNamedValueArgumentResolver extends HandlerMethodAr * values are not expected to contain expressions * @param registry for checking reactive type wrappers */ - public AbstractNamedValueArgumentResolver(ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { + public AbstractNamedValueArgumentResolver(@Nullable ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { super(registry); this.configurableBeanFactory = factory; this.expressionContext = (factory != null ? new BeanExpressionContext(factory, null) : null); @@ -169,7 +170,7 @@ public abstract class AbstractNamedValueArgumentResolver extends HandlerMethodAr * @param parameter the method parameter to resolve to an argument value * (pre-nested in case of a {@link java.util.Optional} declaration) * @param exchange the current exchange - * @return the resolved argument (may be {@code null}) + * @return the resolved argument (may be empty {@link Mono}) */ protected abstract Mono resolveName(String name, MethodParameter parameter, ServerWebExchange exchange); @@ -248,7 +249,7 @@ public abstract class AbstractNamedValueArgumentResolver extends HandlerMethodAr * A {@code null} results in a {@code false} value for {@code boolean}s or * an exception for other primitives. */ - private Object handleNullValue(String name, Object value, Class paramType) { + private Object handleNullValue(String name, @Nullable Object value, Class paramType) { if (value == null) { if (Boolean.TYPE.equals(paramType)) { return Boolean.FALSE; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractNamedValueSyncArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractNamedValueSyncArgumentResolver.java index f0a5e8989ec..0fa95b184b1 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractNamedValueSyncArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractNamedValueSyncArgumentResolver.java @@ -23,6 +23,7 @@ import reactor.core.publisher.Mono; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.core.MethodParameter; import org.springframework.core.ReactiveAdapterRegistry; +import org.springframework.lang.Nullable; import org.springframework.web.reactive.BindingContext; import org.springframework.web.reactive.result.method.SyncHandlerMethodArgumentResolver; import org.springframework.web.server.ServerWebExchange; @@ -45,7 +46,7 @@ public abstract class AbstractNamedValueSyncArgumentResolver extends AbstractNam * or {@code null} if default values are not expected to have expressions * @param registry for checking reactive type wrappers */ - protected AbstractNamedValueSyncArgumentResolver(ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { + protected AbstractNamedValueSyncArgumentResolver(@Nullable ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { super(factory, registry); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/CookieValueMethodArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/CookieValueMethodArgumentResolver.java index b5b2d550e0f..26f48e16e8d 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/CookieValueMethodArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/CookieValueMethodArgumentResolver.java @@ -22,6 +22,7 @@ import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.core.MethodParameter; import org.springframework.core.ReactiveAdapterRegistry; import org.springframework.http.HttpCookie; +import org.springframework.lang.Nullable; import org.springframework.web.bind.annotation.CookieValue; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.ServerWebInputException; @@ -44,7 +45,7 @@ public class CookieValueMethodArgumentResolver extends AbstractNamedValueSyncArg * or {@code null} if default values are not expected to contain expressions * @param registry for checking reactive type wrappers */ - public CookieValueMethodArgumentResolver(ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { + public CookieValueMethodArgumentResolver(@Nullable ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { super(factory, registry); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ExpressionValueMethodArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ExpressionValueMethodArgumentResolver.java index 542b49f9649..be602b61206 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ExpressionValueMethodArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ExpressionValueMethodArgumentResolver.java @@ -22,6 +22,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.core.MethodParameter; import org.springframework.core.ReactiveAdapterRegistry; +import org.springframework.lang.Nullable; import org.springframework.web.server.ServerWebExchange; /** @@ -42,7 +43,7 @@ public class ExpressionValueMethodArgumentResolver extends AbstractNamedValueSyn * or {@code null} if default values are not expected to contain expressions * @param registry for checking reactive type wrappers */ - public ExpressionValueMethodArgumentResolver(ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { + public ExpressionValueMethodArgumentResolver(@Nullable ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { super(factory, registry); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/PathVariableMethodArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/PathVariableMethodArgumentResolver.java index 7f749efe5cc..8550f00e5c7 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/PathVariableMethodArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/PathVariableMethodArgumentResolver.java @@ -23,6 +23,7 @@ import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.core.MethodParameter; import org.springframework.core.ReactiveAdapterRegistry; import org.springframework.core.convert.converter.Converter; +import org.springframework.lang.Nullable; import org.springframework.ui.Model; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.PathVariable; @@ -58,7 +59,7 @@ public class PathVariableMethodArgumentResolver extends AbstractNamedValueSyncAr * or {@code null} if default values are not expected to contain expressions * @param registry for checking reactive type wrappers */ - public PathVariableMethodArgumentResolver(ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { + public PathVariableMethodArgumentResolver(@Nullable ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { super(factory, registry); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestAttributeMethodArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestAttributeMethodArgumentResolver.java index 72c3f8a73d6..87f95f0c5e4 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestAttributeMethodArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestAttributeMethodArgumentResolver.java @@ -20,6 +20,7 @@ import java.util.Optional; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.core.MethodParameter; import org.springframework.core.ReactiveAdapterRegistry; +import org.springframework.lang.Nullable; import org.springframework.web.bind.annotation.RequestAttribute; import org.springframework.web.bind.annotation.ValueConstants; import org.springframework.web.server.ServerWebExchange; @@ -41,7 +42,7 @@ public class RequestAttributeMethodArgumentResolver extends AbstractNamedValueSy * or {@code null} if default values are not expected to have expressions * @param registry for checking reactive type wrappers */ - public RequestAttributeMethodArgumentResolver(ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { + public RequestAttributeMethodArgumentResolver(@Nullable ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { super(factory, registry); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestHeaderMethodArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestHeaderMethodArgumentResolver.java index 754de6268c5..225c6de9427 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestHeaderMethodArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestHeaderMethodArgumentResolver.java @@ -24,6 +24,7 @@ import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.core.MethodParameter; import org.springframework.core.ReactiveAdapterRegistry; import org.springframework.core.convert.ConversionService; +import org.springframework.lang.Nullable; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.ServerWebInputException; @@ -52,7 +53,7 @@ public class RequestHeaderMethodArgumentResolver extends AbstractNamedValueSyncA * or {@code null} if default values are not expected to have expressions * @param registry for checking reactive type wrappers */ - public RequestHeaderMethodArgumentResolver(ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { + public RequestHeaderMethodArgumentResolver(@Nullable ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry) { super(factory, registry); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerAdapter.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerAdapter.java index a68cd9775af..41037f25bb5 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerAdapter.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerAdapter.java @@ -29,6 +29,7 @@ import org.springframework.context.ApplicationContextAware; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.ReactiveAdapterRegistry; import org.springframework.http.codec.ServerCodecConfigurer; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.bind.support.WebBindingInitializer; import org.springframework.web.method.HandlerMethod; @@ -90,6 +91,7 @@ public class RequestMappingHandlerAdapter implements HandlerAdapter, Application /** * Return the configured WebBindingInitializer, or {@code null} if none. */ + @Nullable public WebBindingInitializer getWebBindingInitializer() { return this.webBindingInitializer; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMapping.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMapping.java index 539d54fe754..b3485ec8691 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMapping.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerMapping.java @@ -22,6 +22,7 @@ import java.util.Set; import org.springframework.context.EmbeddedValueResolverAware; import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.lang.Nullable; import org.springframework.stereotype.Controller; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -217,6 +218,7 @@ public class RequestMappingHandlerMapping extends RequestMappingInfoHandlerMappi * @return the condition, or {@code null} */ @SuppressWarnings("UnusedParameters") + @Nullable protected RequestCondition getCustomTypeCondition(Class handlerType) { return null; } @@ -235,6 +237,7 @@ public class RequestMappingHandlerMapping extends RequestMappingInfoHandlerMappi * @return the condition, or {@code null} */ @SuppressWarnings("UnusedParameters") + @Nullable protected RequestCondition getCustomMethodCondition(Method method) { return null; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestParamMethodArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestParamMethodArgumentResolver.java index 41fbba180b0..b0f9f6d89b1 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestParamMethodArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestParamMethodArgumentResolver.java @@ -25,6 +25,7 @@ import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.core.MethodParameter; import org.springframework.core.ReactiveAdapterRegistry; import org.springframework.core.convert.converter.Converter; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ValueConstants; @@ -68,7 +69,7 @@ public class RequestParamMethodArgumentResolver extends AbstractNamedValueSyncAr * request parameter name is derived from the method parameter name. */ public RequestParamMethodArgumentResolver( - ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry, boolean useDefaultResolution) { + @Nullable ConfigurableBeanFactory factory, ReactiveAdapterRegistry registry, boolean useDefaultResolution) { super(factory, registry); this.useDefaultResolution = useDefaultResolution; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/package-info.java index eee90dcffde..658110927d0 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/package-info.java @@ -1,4 +1,7 @@ /** * Infrastructure for annotation-based handler method processing. */ +@NonNullApi package org.springframework.web.reactive.result.method.annotation; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/package-info.java index 9761f929e60..7f281fd83dc 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/package-info.java @@ -1,4 +1,7 @@ /** * Infrastructure for handler method processing. */ +@NonNullApi package org.springframework.web.reactive.result.method; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/package-info.java index 81324dffa0c..ad053e24e19 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/package-info.java @@ -4,4 +4,7 @@ * including the handling of handler result values, e.g. @ResponseBody, view * resolution, and so on. */ +@NonNullApi package org.springframework.web.reactive.result; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/AbstractView.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/AbstractView.java index fe554113350..7514eee9835 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/AbstractView.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/AbstractView.java @@ -30,6 +30,7 @@ import reactor.core.publisher.Mono; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.server.ServerWebExchange; @@ -121,6 +122,7 @@ public abstract class AbstractView implements View, ApplicationContextAware { /** * Return the name of the RequestContext attribute, if any. */ + @Nullable public String getRequestContextAttribute() { return this.requestContextAttribute; } @@ -249,6 +251,7 @@ public abstract class AbstractView implements View, ApplicationContextAware { * the name {@link #REQUEST_DATA_VALUE_PROCESSOR_BEAN_NAME}. * @return the RequestDataValueProcessor, or null if there is none at the application context. */ + @Nullable protected RequestDataValueProcessor getRequestDataValueProcessor() { ApplicationContext context = getApplicationContext(); if (context != null && context.containsBean(REQUEST_DATA_VALUE_PROCESSOR_BEAN_NAME)) { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/BindStatus.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/BindStatus.java index 174fd043570..250d1ec8cad 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/BindStatus.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/BindStatus.java @@ -23,6 +23,7 @@ import java.util.List; import org.springframework.beans.BeanWrapper; import org.springframework.beans.PropertyAccessorFactory; import org.springframework.context.NoSuchMessageException; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; import org.springframework.validation.BindingResult; import org.springframework.validation.Errors; @@ -186,6 +187,7 @@ public class BindStatus { * Note that the complete bind path as required by the bind tag is * "customer.address.street", if bound to a "customer" bean. */ + @Nullable public String getExpression() { return this.expression; } @@ -196,6 +198,7 @@ public class BindStatus { *

    This value will be an HTML-escaped String if the original value * already was a String. */ + @Nullable public Object getValue() { return this.value; } @@ -205,6 +208,7 @@ public class BindStatus { * '{@code getValue().getClass()}' since '{@code getValue()}' may * return '{@code null}'. */ + @Nullable public Class getValueType() { return this.valueType; } @@ -213,6 +217,7 @@ public class BindStatus { * Return the actual value of the field, i.e. the raw property value, * or {@code null} if not available. */ + @Nullable public Object getActualValue() { return this.actualValue; } @@ -246,6 +251,7 @@ public class BindStatus { * Return the error codes for the field or object, if any. * Returns an empty array instead of null if none. */ + @Nullable public String[] getErrorCodes() { return this.errorCodes; } @@ -304,6 +310,7 @@ public class BindStatus { * @return the current Errors instance, or {@code null} if none * @see org.springframework.validation.BindingResult */ + @Nullable public Errors getErrors() { return this.errors; } @@ -313,6 +320,7 @@ public class BindStatus { * is currently bound to. * @return the current PropertyEditor, or {@code null} if none */ + @Nullable public PropertyEditor getEditor() { return this.editor; } @@ -323,6 +331,7 @@ public class BindStatus { * @param valueClass the value class that an editor is needed for * @return the associated PropertyEditor, or {@code null} if none */ + @Nullable public PropertyEditor findEditor(Class valueClass) { return (this.bindingResult != null ? this.bindingResult.findEditor(this.expression, valueClass) : null); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/HttpMessageWriterView.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/HttpMessageWriterView.java index 7d3190735f9..049cbc597e8 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/HttpMessageWriterView.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/HttpMessageWriterView.java @@ -31,6 +31,7 @@ import org.springframework.core.codec.Encoder; import org.springframework.http.MediaType; import org.springframework.http.codec.EncoderHttpMessageWriter; import org.springframework.http.codec.HttpMessageWriter; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.server.ServerWebExchange; @@ -120,6 +121,7 @@ public class HttpMessageWriterView implements View { exchange.getResponse().setComplete(); } + @Nullable private Object getObjectToRender(Map model) { Map result = model.entrySet().stream() diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/Rendering.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/Rendering.java index 590cce525c3..0cbcfb43d73 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/Rendering.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/Rendering.java @@ -21,6 +21,7 @@ import java.util.Map; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; import org.springframework.ui.Model; /** @@ -45,6 +46,7 @@ public interface Rendering { /** * Return the selected {@link String} view name or {@link View} object. */ + @Nullable Object view(); /** @@ -55,6 +57,7 @@ public interface Rendering { /** * Return the HTTP status to set the response to. */ + @Nullable HttpStatus status(); /** diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/RequestContext.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/RequestContext.java index aec51b90222..92acdf3bc05 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/RequestContext.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/RequestContext.java @@ -25,6 +25,7 @@ import org.springframework.context.MessageSource; import org.springframework.context.MessageSourceResolvable; import org.springframework.context.NoSuchMessageException; import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.validation.BindException; import org.springframework.validation.BindingResult; @@ -105,6 +106,7 @@ public class RequestContext { * Return the model Map that this RequestContext encapsulates, if any. * @return the populated model Map, or {@code null} if none available */ + @Nullable public Map getModel() { return this.model; } @@ -169,6 +171,7 @@ public class RequestContext { * Return the {@link RequestDataValueProcessor} instance to apply to in form * tag libraries and to redirect URLs. */ + @Nullable public RequestDataValueProcessor getRequestDataValueProcessor() { return this.dataValueProcessor; } @@ -244,7 +247,7 @@ public class RequestContext { * @param defaultMessage String to return if the lookup fails * @return the message */ - public String getMessage(String code, Object[] args, String defaultMessage) { + public String getMessage(String code, @Nullable Object[] args, String defaultMessage) { return getMessage(code, args, defaultMessage, isDefaultHtmlEscape()); } @@ -255,7 +258,7 @@ public class RequestContext { * @param defaultMessage String to return if the lookup fails * @return the message */ - public String getMessage(String code, List args, String defaultMessage) { + public String getMessage(String code, @Nullable List args, String defaultMessage) { return getMessage(code, (args != null ? args.toArray() : null), defaultMessage, isDefaultHtmlEscape()); } @@ -267,7 +270,7 @@ public class RequestContext { * @param htmlEscape HTML escape the message? * @return the message */ - public String getMessage(String code, Object[] args, String defaultMessage, boolean htmlEscape) { + public String getMessage(String code, @Nullable Object[] args, String defaultMessage, boolean htmlEscape) { String msg = this.messageSource.getMessage(code, args, defaultMessage, this.locale); return (htmlEscape ? HtmlUtils.htmlEscape(msg) : msg); } @@ -289,7 +292,7 @@ public class RequestContext { * @return the message * @throws org.springframework.context.NoSuchMessageException if not found */ - public String getMessage(String code, Object[] args) throws NoSuchMessageException { + public String getMessage(String code, @Nullable Object[] args) throws NoSuchMessageException { return getMessage(code, args, isDefaultHtmlEscape()); } @@ -300,7 +303,7 @@ public class RequestContext { * @return the message * @throws org.springframework.context.NoSuchMessageException if not found */ - public String getMessage(String code, List args) throws NoSuchMessageException { + public String getMessage(String code, @Nullable List args) throws NoSuchMessageException { return getMessage(code, (args != null ? args.toArray() : null), isDefaultHtmlEscape()); } @@ -312,7 +315,7 @@ public class RequestContext { * @return the message * @throws org.springframework.context.NoSuchMessageException if not found */ - public String getMessage(String code, Object[] args, boolean htmlEscape) throws NoSuchMessageException { + public String getMessage(String code, @Nullable Object[] args, boolean htmlEscape) throws NoSuchMessageException { String msg = this.messageSource.getMessage(code, args, this.locale); return (htmlEscape ? HtmlUtils.htmlEscape(msg) : msg); } @@ -345,6 +348,7 @@ public class RequestContext { * @param name name of the bind object * @return the Errors instance, or {@code null} if not found */ + @Nullable public Errors getErrors(String name) { return getErrors(name, isDefaultHtmlEscape()); } @@ -355,6 +359,7 @@ public class RequestContext { * @param htmlEscape create an Errors instance with automatic HTML escaping? * @return the Errors instance, or {@code null} if not found */ + @Nullable public Errors getErrors(String name, boolean htmlEscape) { if (this.errorsMap == null) { this.errorsMap = new HashMap<>(); @@ -386,6 +391,7 @@ public class RequestContext { * @return the model object */ @SuppressWarnings("unchecked") + @Nullable protected T getModelObject(String modelName) { T modelObject = (T) this.model.get(modelName); if (modelObject == null) { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/RequestDataValueProcessor.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/RequestDataValueProcessor.java index 400db5047d7..10aa134088c 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/RequestDataValueProcessor.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/RequestDataValueProcessor.java @@ -17,6 +17,7 @@ package org.springframework.web.reactive.result.view; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.web.server.ServerWebExchange; /** @@ -61,6 +62,7 @@ public interface RequestDataValueProcessor { * @param exchange the current exchange * @return additional hidden form fields to be added, or {@code null} */ + @Nullable Map getExtraHiddenFields(ServerWebExchange exchange); /** diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/UrlBasedViewResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/UrlBasedViewResolver.java index 0dc0236bbe9..630b63ea056 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/UrlBasedViewResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/UrlBasedViewResolver.java @@ -23,6 +23,7 @@ import reactor.core.publisher.Mono; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.InitializingBean; +import org.springframework.lang.Nullable; import org.springframework.util.PatternMatchUtils; /** @@ -176,6 +177,7 @@ public class UrlBasedViewResolver extends ViewResolverSupport implements ViewRes /** * Return the name of the RequestContext attribute for all views, if any. */ + @Nullable protected String getRequestContextAttribute() { return this.requestContextAttribute; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/View.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/View.java index 61089fe7528..268b7dc10b8 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/View.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/View.java @@ -22,6 +22,7 @@ import java.util.Map; import reactor.core.publisher.Mono; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; import org.springframework.web.reactive.HandlerResult; import org.springframework.web.server.ServerWebExchange; @@ -64,6 +65,6 @@ public interface View { * @param exchange the current exchange * @return {@code Mono} to represent when and if rendering succeeds */ - Mono render(Map model, MediaType contentType, ServerWebExchange exchange); + Mono render(@Nullable Map model, MediaType contentType, ServerWebExchange exchange); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/freemarker/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/freemarker/package-info.java index 2514b6b9b89..b932889b6f9 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/freemarker/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/freemarker/package-info.java @@ -4,4 +4,7 @@ * as Spring web view technology. * Contains a View implementation for FreeMarker templates. */ +@NonNullApi package org.springframework.web.reactive.result.view.freemarker; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/package-info.java index c789bb26323..238f9cbbb07 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/package-info.java @@ -1,4 +1,7 @@ /** * Support for result handling through view resolution. */ +@NonNullApi package org.springframework.web.reactive.result.view; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/script/ScriptTemplateView.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/script/ScriptTemplateView.java index 0046be875a6..84da1de16a7 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/script/ScriptTemplateView.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/script/ScriptTemplateView.java @@ -39,6 +39,7 @@ import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.http.MediaType; import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.lang.Nullable; import org.springframework.scripting.support.StandardScriptEvalException; import org.springframework.scripting.support.StandardScriptUtils; import org.springframework.util.Assert; @@ -258,6 +259,7 @@ public class ScriptTemplateView extends AbstractUrlBasedView { } } + @Nullable protected Resource getResource(String location) { for (String path : this.resourceLoaderPaths) { Resource resource = this.resourceLoader.getResource(path + location); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/script/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/script/package-info.java index 5ad2ee25a43..6f155192aea 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/script/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/script/package-info.java @@ -3,4 +3,7 @@ * (as included in Java 6+), e.g. using JavaScript via Nashorn on JDK 8. * Contains a View implementation for scripted templates. */ +@NonNullApi package org.springframework.web.reactive.result.view.script; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/CloseStatus.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/CloseStatus.java index fb9dfd4295e..e39d10fa9a3 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/CloseStatus.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/CloseStatus.java @@ -16,6 +16,7 @@ package org.springframework.web.reactive.socket; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -167,6 +168,7 @@ public final class CloseStatus { /** * Return the reason, or {@code null} if none. */ + @Nullable public String getReason() { return this.reason; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/HandshakeInfo.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/HandshakeInfo.java index 85b06093b88..48bd2a8e5d3 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/HandshakeInfo.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/HandshakeInfo.java @@ -22,6 +22,7 @@ import java.security.Principal; import reactor.core.publisher.Mono; import org.springframework.http.HttpHeaders; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -88,6 +89,7 @@ public class HandshakeInfo { * @see * https://tools.ietf.org/html/rfc6455#section-1.9 */ + @Nullable public String getSubProtocol() { return this.protocol; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/adapter/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/adapter/package-info.java index aa675f1b3bc..47a1bd6aa2f 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/adapter/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/adapter/package-info.java @@ -1,4 +1,7 @@ /** * Classes adapting Spring's Reactive WebSocket API to and from WebSocket runtimes. */ +@NonNullApi package org.springframework.web.reactive.socket.adapter; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/package-info.java index 81087aab33c..4ad4dbea74a 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/package-info.java @@ -1,4 +1,7 @@ /** * Client support for WebSocket interactions. */ +@NonNullApi package org.springframework.web.reactive.socket.client; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/package-info.java index 4d611c0ff91..38e53ece1ee 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/package-info.java @@ -1,4 +1,7 @@ /** * Abstractions and support classes for reactive WebSocket interactions. */ +@NonNullApi package org.springframework.web.reactive.socket; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/RequestUpgradeStrategy.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/RequestUpgradeStrategy.java index 35654ce8061..16f57c3effc 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/RequestUpgradeStrategy.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/RequestUpgradeStrategy.java @@ -20,6 +20,7 @@ import reactor.core.publisher.Mono; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.lang.Nullable; import org.springframework.web.reactive.socket.WebSocketHandler; import org.springframework.web.server.ServerWebExchange; @@ -45,6 +46,6 @@ public interface RequestUpgradeStrategy { * @return completion {@code Mono} to indicate the outcome of the * WebSocket session handling. */ - Mono upgrade(ServerWebExchange exchange, WebSocketHandler webSocketHandler, String subProtocol); + Mono upgrade(ServerWebExchange exchange, WebSocketHandler webSocketHandler, @Nullable String subProtocol); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/package-info.java index 0c0cb9c23c9..7c53cdd73b0 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/package-info.java @@ -1,4 +1,7 @@ /** * Server support for WebSocket interactions. */ +@NonNullApi package org.springframework.web.reactive.socket.server; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/support/HandshakeWebSocketService.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/support/HandshakeWebSocketService.java index a7ab423019a..bf39512f10d 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/support/HandshakeWebSocketService.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/support/HandshakeWebSocketService.java @@ -27,6 +27,7 @@ import org.springframework.context.Lifecycle; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; @@ -208,6 +209,7 @@ public class HandshakeWebSocketService implements WebSocketService, Lifecycle { return Mono.error(new ServerWebInputException(reason)); } + @Nullable private String selectProtocol(HttpHeaders headers, WebSocketHandler handler) { String protocolHeader = headers.getFirst(SEC_WEBSOCKET_PROTOCOL); if (protocolHeader != null) { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/support/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/support/package-info.java index 4f4a56ea33c..17e4ed81f1f 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/support/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/support/package-info.java @@ -1,4 +1,7 @@ /** * Server-side support classes for WebSocket requests. */ +@NonNullApi package org.springframework.web.reactive.socket.server.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/package-info.java index 6fdce1fc11b..0b1cc54e8af 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/package-info.java @@ -2,4 +2,7 @@ * Holds implementations of * {@link org.springframework.web.reactive.socket.server.RequestUpgradeStrategy}. */ +@NonNullApi package org.springframework.web.reactive.socket.server.upgrade; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/support/package-info.java b/spring-webflux/src/main/java/org/springframework/web/reactive/support/package-info.java index 09bf03bcf54..d979bd71a1f 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/support/package-info.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/support/package-info.java @@ -1,4 +1,7 @@ /** * Support classes for Spring WebFlux setup. */ -package org.springframework.web.reactive.support; \ No newline at end of file +@NonNullApi +package org.springframework.web.reactive.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java index a7b7a0ed6b6..e5460a7e777 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java @@ -28,6 +28,7 @@ import java.util.Locale; import java.util.Map; import java.util.Properties; import java.util.Set; + import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -46,6 +47,7 @@ import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.support.PropertiesLoaderUtils; import org.springframework.http.server.ServletServerHttpRequest; +import org.springframework.lang.Nullable; import org.springframework.ui.context.ThemeSource; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; @@ -767,6 +769,7 @@ public class DispatcherServlet extends FrameworkServlet { * @return the ThemeSource, if any * @see #getWebApplicationContext() */ + @Nullable public final ThemeSource getThemeSource() { if (getWebApplicationContext() instanceof ThemeSource) { return (ThemeSource) getWebApplicationContext(); @@ -781,6 +784,7 @@ public class DispatcherServlet extends FrameworkServlet { * @return the MultipartResolver used by this servlet, or {@code null} if none * (indicating that no multipart support is available) */ + @Nullable public final MultipartResolver getMultipartResolver() { return this.multipartResolver; } @@ -1151,6 +1155,7 @@ public class DispatcherServlet extends FrameworkServlet { * @param request current HTTP request * @return the HandlerExecutionChain, or {@code null} if no handler could be found */ + @Nullable protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { for (HandlerMapping hm : this.handlerMappings) { if (logger.isTraceEnabled()) { @@ -1213,8 +1218,9 @@ public class DispatcherServlet extends FrameworkServlet { * @return a corresponding ModelAndView to forward to * @throws Exception if no error ModelAndView found */ + @Nullable protected ModelAndView processHandlerException(HttpServletRequest request, HttpServletResponse response, - Object handler, Exception ex) throws Exception { + @Nullable Object handler, Exception ex) throws Exception { // Check registered HandlerExceptionResolvers... ModelAndView exMv = null; @@ -1300,6 +1306,7 @@ public class DispatcherServlet extends FrameworkServlet { * @return the view name (or {@code null} if no default found) * @throws Exception if view name translation failed */ + @Nullable protected String getDefaultViewName(HttpServletRequest request) throws Exception { return this.viewNameTranslator.getViewName(request); } @@ -1318,6 +1325,7 @@ public class DispatcherServlet extends FrameworkServlet { * (typically in case of problems creating an actual View object) * @see ViewResolver#resolveViewName */ + @Nullable protected View resolveViewName(String viewName, Map model, Locale locale, HttpServletRequest request) throws Exception { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/FlashMap.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/FlashMap.java index df35f702d62..a40fb7cbfe6 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/FlashMap.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/FlashMap.java @@ -18,6 +18,7 @@ package org.springframework.web.servlet; import java.util.HashMap; +import org.springframework.lang.Nullable; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.ObjectUtils; @@ -67,6 +68,7 @@ public final class FlashMap extends HashMap implements Comparabl /** * Return the target URL path (or {@code null} if none specified). */ + @Nullable public String getTargetRequestPath() { return this.targetRequestPath; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/FlashMapManager.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/FlashMapManager.java index 527009e58e2..5b420326999 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/FlashMapManager.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/FlashMapManager.java @@ -19,6 +19,8 @@ package org.springframework.web.servlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.lang.Nullable; + /** * A strategy interface for retrieving and saving FlashMap instances. * See {@link FlashMap} for a general overview of flash attributes. @@ -40,6 +42,7 @@ public interface FlashMapManager { * @param response the current response * @return a FlashMap matching the current request or {@code null} */ + @Nullable FlashMap retrieveAndUpdate(HttpServletRequest request, HttpServletResponse response); /** diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/FrameworkServlet.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/FrameworkServlet.java index 7cb980d4565..14e5393ff10 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/FrameworkServlet.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/FrameworkServlet.java @@ -21,6 +21,7 @@ import java.security.Principal; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; + import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -43,6 +44,7 @@ import org.springframework.core.GenericTypeResolver; import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.http.HttpMethod; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -321,6 +323,7 @@ public abstract class FrameworkServlet extends HttpServletBean implements Applic /** * Return the custom WebApplicationContext id, if any. */ + @Nullable public String getContextId() { return this.contextId; } @@ -353,6 +356,7 @@ public abstract class FrameworkServlet extends HttpServletBean implements Applic /** * Return the explicit context config location, if any. */ + @Nullable public String getContextConfigLocation() { return this.contextConfigLocation; } @@ -578,6 +582,7 @@ public abstract class FrameworkServlet extends HttpServletBean implements Applic * @return the WebApplicationContext for this servlet, or {@code null} if not found * @see #getContextAttribute() */ + @Nullable protected WebApplicationContext findWebApplicationContext() { String attrName = getContextAttribute(); if (attrName == null) { @@ -606,7 +611,7 @@ public abstract class FrameworkServlet extends HttpServletBean implements Applic * @return the WebApplicationContext for this servlet * @see org.springframework.web.context.support.XmlWebApplicationContext */ - protected WebApplicationContext createWebApplicationContext(ApplicationContext parent) { + protected WebApplicationContext createWebApplicationContext(@Nullable ApplicationContext parent) { Class contextClass = getContextClass(); if (this.logger.isDebugEnabled()) { this.logger.debug("Servlet with name '" + getServletName() + @@ -673,7 +678,7 @@ public abstract class FrameworkServlet extends HttpServletBean implements Applic * @see org.springframework.web.context.support.XmlWebApplicationContext * @see #createWebApplicationContext(ApplicationContext) */ - protected WebApplicationContext createWebApplicationContext(WebApplicationContext parent) { + protected WebApplicationContext createWebApplicationContext(@Nullable WebApplicationContext parent) { return createWebApplicationContext((ApplicationContext) parent); } @@ -1007,6 +1012,7 @@ public abstract class FrameworkServlet extends HttpServletBean implements Applic * @return the corresponding LocaleContext, or {@code null} if none to bind * @see LocaleContextHolder#setLocaleContext */ + @Nullable protected LocaleContext buildLocaleContext(HttpServletRequest request) { return new SimpleLocaleContext(request.getLocale()); } @@ -1022,6 +1028,7 @@ public abstract class FrameworkServlet extends HttpServletBean implements Applic * the previously bound instance (or not binding any, if none bound before) * @see RequestContextHolder#setRequestAttributes */ + @Nullable protected ServletRequestAttributes buildRequestAttributes( HttpServletRequest request, HttpServletResponse response, RequestAttributes previousAttributes) { @@ -1080,6 +1087,7 @@ public abstract class FrameworkServlet extends HttpServletBean implements Applic * @return the username, or {@code null} if none found * @see javax.servlet.http.HttpServletRequest#getUserPrincipal() */ + @Nullable protected String getUsernameForRequest(HttpServletRequest request) { Principal userPrincipal = request.getUserPrincipal(); return (userPrincipal != null ? userPrincipal.getName() : null); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerAdapter.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerAdapter.java index f456d25ebb6..0957eca869c 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerAdapter.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerAdapter.java @@ -19,6 +19,8 @@ package org.springframework.web.servlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.lang.Nullable; + /** * MVC framework SPI, allowing parameterization of the core MVC workflow. * @@ -72,6 +74,7 @@ public interface HandlerAdapter { * @return ModelAndView object with the name of the view and the required * model data, or {@code null} if the request has been handled directly */ + @Nullable ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; /** diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerExceptionResolver.java index d7d1b6d9b56..f870fe5a204 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerExceptionResolver.java @@ -19,6 +19,8 @@ package org.springframework.web.servlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.lang.Nullable; + /** * Interface to be implemented by objects that can resolve exceptions thrown during * handler mapping or execution, in the typical case to error views. Implementors are @@ -47,7 +49,8 @@ public interface HandlerExceptionResolver { * @return a corresponding {@code ModelAndView} to forward to, or {@code null} * for default processing */ + @Nullable ModelAndView resolveException( - HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex); + HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerExecutionChain.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerExecutionChain.java index 4b7d82ad6e8..45a6f740a28 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerExecutionChain.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerExecutionChain.java @@ -18,12 +18,14 @@ package org.springframework.web.servlet; import java.util.ArrayList; import java.util.List; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; @@ -81,6 +83,7 @@ public class HandlerExecutionChain { * Return the handler object to execute. * @return the handler object (may be {@code null}) */ + @Nullable public Object getHandler() { return this.handler; } @@ -111,6 +114,7 @@ public class HandlerExecutionChain { * Return the array of interceptors to apply (in the given order). * @return the array of HandlerInterceptors instances (may be {@code null}) */ + @Nullable public HandlerInterceptor[] getInterceptors() { if (this.interceptors == null && this.interceptorList != null) { this.interceptors = this.interceptorList.toArray(new HandlerInterceptor[this.interceptorList.size()]); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerInterceptor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerInterceptor.java index 2fffa1c3ec8..4953f4553c2 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerInterceptor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerInterceptor.java @@ -19,6 +19,7 @@ package org.springframework.web.servlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.lang.Nullable; import org.springframework.web.method.HandlerMethod; /** @@ -120,7 +121,7 @@ public interface HandlerInterceptor { * @throws Exception in case of errors */ default void postHandle( - HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) + HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerMapping.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerMapping.java index 00d26677e99..02ad6e7b749 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerMapping.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/HandlerMapping.java @@ -18,6 +18,8 @@ package org.springframework.web.servlet; import javax.servlet.http.HttpServletRequest; +import org.springframework.lang.Nullable; + /** * Interface to be implemented by objects that define a mapping between * requests and handler objects. @@ -126,6 +128,7 @@ public interface HandlerMapping { * any interceptors, or {@code null} if no mapping found * @throws Exception if there is an internal error */ + @Nullable HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/HttpServletBean.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/HttpServletBean.java index 46e6461c781..d10f4ebb4cf 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/HttpServletBean.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/HttpServletBean.java @@ -19,6 +19,7 @@ package org.springframework.web.servlet; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; + import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; @@ -40,6 +41,7 @@ import org.springframework.core.env.EnvironmentCapable; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceEditor; import org.springframework.core.io.ResourceLoader; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -202,6 +204,7 @@ public abstract class HttpServletBean extends HttpServlet implements Environment * @see #getServletConfig() */ @Override + @Nullable public final String getServletName() { return (getServletConfig() != null ? getServletConfig().getServletName() : null); } @@ -212,6 +215,7 @@ public abstract class HttpServletBean extends HttpServlet implements Environment * @see #getServletConfig() */ @Override + @Nullable public final ServletContext getServletContext() { return (getServletConfig() != null ? getServletConfig().getServletContext() : null); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/LocaleContextResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/LocaleContextResolver.java index ffa7b24f7fc..ed86f27bd3e 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/LocaleContextResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/LocaleContextResolver.java @@ -17,10 +17,12 @@ package org.springframework.web.servlet; import java.util.Locale; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.context.i18n.LocaleContext; +import org.springframework.lang.Nullable; /** * Extension of {@link LocaleResolver}, adding support for a rich locale context @@ -68,6 +70,6 @@ public interface LocaleContextResolver extends LocaleResolver { * @see org.springframework.context.i18n.SimpleLocaleContext * @see org.springframework.context.i18n.SimpleTimeZoneAwareLocaleContext */ - void setLocaleContext(HttpServletRequest request, HttpServletResponse response, LocaleContext localeContext); + void setLocaleContext(HttpServletRequest request, HttpServletResponse response, @Nullable LocaleContext localeContext); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/LocaleResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/LocaleResolver.java index 2d0f9540229..b7710b40f33 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/LocaleResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/LocaleResolver.java @@ -17,9 +17,12 @@ package org.springframework.web.servlet; import java.util.Locale; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.lang.Nullable; + /** * Interface for web-based locale resolution strategies that allows for * both locale resolution via the request and locale modification via @@ -66,6 +69,6 @@ public interface LocaleResolver { * @throws UnsupportedOperationException if the LocaleResolver * implementation does not support dynamic changing of the locale */ - void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale); + void setLocale(HttpServletRequest request, HttpServletResponse response, @Nullable Locale locale); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/ModelAndView.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/ModelAndView.java index 237526d0c43..923a0391e90 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/ModelAndView.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/ModelAndView.java @@ -19,6 +19,7 @@ package org.springframework.web.servlet; import java.util.Map; import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; import org.springframework.ui.ModelMap; import org.springframework.util.CollectionUtils; @@ -96,7 +97,7 @@ public class ModelAndView { * (Objects). Model entries may not be {@code null}, but the * model Map may be {@code null} if there is no model data. */ - public ModelAndView(String viewName, Map model) { + public ModelAndView(String viewName, @Nullable Map model) { this.view = viewName; if (model != null) { getModelMap().addAllAttributes(model); @@ -113,7 +114,7 @@ public class ModelAndView { * (Objects). Model entries may not be {@code null}, but the * model Map may be {@code null} if there is no model data. */ - public ModelAndView(View view, Map model) { + public ModelAndView(View view, @Nullable Map model) { this.view = view; if (model != null) { getModelMap().addAllAttributes(model); @@ -144,7 +145,7 @@ public class ModelAndView { * (to be set just prior to View rendering) * @since 4.3 */ - public ModelAndView(String viewName, Map model, HttpStatus status) { + public ModelAndView(String viewName, @Nullable Map model, HttpStatus status) { this.view = viewName; if (model != null) { getModelMap().addAllAttributes(model); @@ -189,6 +190,7 @@ public class ModelAndView { * Return the view name to be resolved by the DispatcherServlet * via a ViewResolver, or {@code null} if we are using a View object. */ + @Nullable public String getViewName() { return (this.view instanceof String ? (String) this.view : null); } @@ -205,6 +207,7 @@ public class ModelAndView { * Return the View object, or {@code null} if we are using a view name * to be resolved by the DispatcherServlet via a ViewResolver. */ + @Nullable public View getView() { return (this.view instanceof View ? (View) this.view : null); } @@ -230,6 +233,7 @@ public class ModelAndView { * Return the model map. May return {@code null}. * Called by DispatcherServlet for evaluation of the model. */ + @Nullable protected Map getModelInternal() { return this.model; } @@ -265,6 +269,7 @@ public class ModelAndView { * Return the configured HTTP status for the response, if any. * @since 4.3 */ + @Nullable public HttpStatus getStatus() { return this.status; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/RequestToViewNameTranslator.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/RequestToViewNameTranslator.java index 7c47cd3aa89..8eeffd5e47a 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/RequestToViewNameTranslator.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/RequestToViewNameTranslator.java @@ -18,6 +18,8 @@ package org.springframework.web.servlet; import javax.servlet.http.HttpServletRequest; +import org.springframework.lang.Nullable; + /** * Strategy interface for translating an incoming * {@link javax.servlet.http.HttpServletRequest} into a @@ -36,6 +38,7 @@ public interface RequestToViewNameTranslator { * @return the view name (or {@code null} if no default found) * @throws Exception if view name translation fails */ + @Nullable String getViewName(HttpServletRequest request) throws Exception; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/ResourceServlet.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/ResourceServlet.java index e927935005d..2f55dab080f 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/ResourceServlet.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/ResourceServlet.java @@ -23,6 +23,7 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.lang.Nullable; import org.springframework.util.AntPathMatcher; import org.springframework.util.PathMatcher; import org.springframework.util.StringUtils; @@ -235,6 +236,7 @@ public class ResourceServlet extends HttpServletBean { * @return the URL of the target resource, or {@code null} if none found * @see #RESOURCE_PARAM_NAME */ + @Nullable protected String determineResourceUrl(HttpServletRequest request) { return request.getParameter(RESOURCE_PARAM_NAME); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/View.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/View.java index f63658d0bf1..aa452b24b13 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/View.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/View.java @@ -17,10 +17,12 @@ package org.springframework.web.servlet; import java.util.Map; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; /** * MVC View for a web interaction. Implementations are responsible for rendering @@ -73,6 +75,7 @@ public interface View { * @return the content type String (optionally including a character set), * or {@code null} if not predetermined. */ + @Nullable String getContentType(); /** @@ -87,6 +90,6 @@ public interface View { * @param response HTTP response we are building * @throws Exception if rendering failed */ - void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception; + void render(@Nullable Map model, HttpServletRequest request, HttpServletResponse response) throws Exception; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/ViewResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/ViewResolver.java index e6a50cc2dfb..3f0942230a7 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/ViewResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/ViewResolver.java @@ -18,6 +18,8 @@ package org.springframework.web.servlet; import java.util.Locale; +import org.springframework.lang.Nullable; + /** * Interface to be implemented by objects that can resolve views by name. * @@ -50,6 +52,7 @@ public interface ViewResolver { * @throws Exception if the view cannot be resolved * (typically in case of problems creating an actual View object) */ + @Nullable View resolveViewName(String viewName, Locale locale) throws Exception; } 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 410eb31416d..ba21278d3c0 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 @@ -56,6 +56,7 @@ import org.springframework.http.converter.support.AllEncompassingFormHttpMessage import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter; import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter; import org.springframework.http.converter.xml.SourceHttpMessageConverter; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; @@ -355,6 +356,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { return conversionServiceRef; } + @Nullable private RuntimeBeanReference getValidator(Element element, Object source, ParserContext parserContext) { if (element.hasAttribute("validator")) { return new RuntimeBeanReference(element.getAttribute("validator")); @@ -450,6 +452,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { return props; } + @Nullable private RuntimeBeanReference getMessageCodesResolver(Element element) { if (element.hasAttribute("message-codes-resolver")) { return new RuntimeBeanReference(element.getAttribute("message-codes-resolver")); @@ -464,6 +467,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { return (asyncElement != null) ? asyncElement.getAttribute("default-timeout") : null; } + @Nullable private RuntimeBeanReference getAsyncExecutor(Element element) { Element asyncElement = DomUtils.getChildElementByTagName(element, "async-support"); if (asyncElement != null) { @@ -508,6 +512,7 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { return interceptors; } + @Nullable private ManagedList getArgumentResolvers(Element element, ParserContext parserContext) { Element resolversElement = DomUtils.getChildElementByTagName(element, "argument-resolvers"); if (resolversElement != null) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/MvcNamespaceUtils.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/MvcNamespaceUtils.java index fb787d1a0a1..affde15c09b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/MvcNamespaceUtils.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/MvcNamespaceUtils.java @@ -24,6 +24,7 @@ import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.parsing.BeanComponentDefinition; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.lang.Nullable; import org.springframework.util.AntPathMatcher; import org.springframework.util.PathMatcher; import org.springframework.web.cors.CorsConfiguration; @@ -183,6 +184,7 @@ abstract class MvcNamespaceUtils { * with the {@code annotation-driven} element. * @return a bean definition, bean reference, or null. */ + @Nullable public static Object getContentNegotiationManager(ParserContext context) { String name = AnnotationDrivenBeanDefinitionParser.HANDLER_MAPPING_BEAN_NAME; if (context.getRegistry().containsBeanDefinition(name)) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/DefaultServletHandlerConfigurer.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/DefaultServletHandlerConfigurer.java index c1e617836e5..d5b1a9eb65a 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/DefaultServletHandlerConfigurer.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/DefaultServletHandlerConfigurer.java @@ -18,8 +18,10 @@ package org.springframework.web.servlet.config.annotation; import java.util.HashMap; import java.util.Map; + import javax.servlet.ServletContext; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.HttpRequestHandler; import org.springframework.web.servlet.DispatcherServlet; @@ -80,6 +82,7 @@ public class DefaultServletHandlerConfigurer { * {@link DefaultServletHttpRequestHandler} instance mapped to {@code "/**"}; or {@code null} if * default servlet handling was not been enabled. */ + @Nullable protected AbstractHandlerMapping getHandlerMapping() { if (handler == null) { return null; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ResourceHandlerRegistry.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ResourceHandlerRegistry.java index 7cd4e2a32f0..f26aba30182 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ResourceHandlerRegistry.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ResourceHandlerRegistry.java @@ -21,10 +21,12 @@ import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; + import javax.servlet.ServletContext; import org.springframework.beans.factory.BeanInitializationException; import org.springframework.context.ApplicationContext; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.HttpRequestHandler; import org.springframework.web.accept.ContentNegotiationManager; @@ -131,6 +133,7 @@ public class ResourceHandlerRegistry { * Return a handler mapping with the mapped resource handlers; or {@code null} in case * of no registrations. */ + @Nullable protected AbstractHandlerMapping getHandlerMapping() { if (this.registrations.isEmpty()) { return null; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistry.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistry.java index 2756733d4b1..0a28f735056 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistry.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistry.java @@ -23,6 +23,7 @@ import java.util.Map; import org.springframework.context.ApplicationContext; import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; import org.springframework.web.servlet.handler.AbstractHandlerMapping; import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; @@ -105,6 +106,7 @@ public class ViewControllerRegistry { * Return the {@code HandlerMapping} that contains the registered view * controller mappings, or {@code null} for no registrations. */ + @Nullable protected AbstractHandlerMapping getHandlerMapping() { if (this.registrations.isEmpty() && this.redirectRegistrations.isEmpty()) { return null; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java index 73660ce5b87..3ff089689b1 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java @@ -22,6 +22,7 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; + import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; @@ -56,6 +57,7 @@ import org.springframework.http.converter.support.AllEncompassingFormHttpMessage import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter; import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter; import org.springframework.http.converter.xml.SourceHttpMessageConverter; +import org.springframework.lang.Nullable; import org.springframework.util.AntPathMatcher; import org.springframework.util.ClassUtils; import org.springframework.util.PathMatcher; @@ -584,6 +586,7 @@ public class WebMvcConfigurationSupport implements ApplicationContextAware, Serv /** * Override this method to provide a custom {@link MessageCodesResolver}. */ + @Nullable protected MessageCodesResolver getMessageCodesResolver() { return null; } @@ -646,6 +649,7 @@ public class WebMvcConfigurationSupport implements ApplicationContextAware, Serv /** * Override this method to provide a custom {@link Validator}. */ + @Nullable protected Validator getValidator() { return null; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurer.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurer.java index e576c7bb591..750aeff6ff7 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurer.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurer.java @@ -22,6 +22,7 @@ import org.springframework.core.convert.converter.Converter; import org.springframework.format.Formatter; import org.springframework.format.FormatterRegistry; import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.lang.Nullable; import org.springframework.validation.MessageCodesResolver; import org.springframework.validation.Validator; import org.springframework.web.method.support.HandlerMethodArgumentResolver; @@ -214,6 +215,7 @@ public interface WebMvcConfigurer { * {@link org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean}. * Leave the return value as {@code null} to keep the default. */ + @Nullable default Validator getValidator() { return null; } @@ -223,6 +225,7 @@ public interface WebMvcConfigurer { * from data binding and validation error codes. Leave the return value as * {@code null} to keep the default. */ + @Nullable default MessageCodesResolver getMessageCodesResolver() { return null; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/package-info.java index 0ed876c41c8..9c99c473833 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/package-info.java @@ -1,4 +1,7 @@ /** * Annotation-based setup for Spring MVC. */ +@NonNullApi package org.springframework.web.servlet.config.annotation; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/package-info.java index 5fbb39dd063..29c110b010f 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/package-info.java @@ -1,4 +1,7 @@ /** * Defines the XML configuration namespace for Spring MVC. */ +@NonNullApi package org.springframework.web.servlet.config; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractDetectingUrlHandlerMapping.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractDetectingUrlHandlerMapping.java index c06bb4eefff..100f7e114cf 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractDetectingUrlHandlerMapping.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractDetectingUrlHandlerMapping.java @@ -19,6 +19,7 @@ package org.springframework.web.servlet.handler; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.context.ApplicationContextException; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -96,6 +97,7 @@ public abstract class AbstractDetectingUrlHandlerMapping extends AbstractUrlHand * @return the URLs determined for the bean, * or {@code null} or an empty array if none */ + @Nullable protected abstract String[] determineUrlsForHandler(String beanName); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerExceptionResolver.java index 50997f55bd3..3fe557beebc 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerExceptionResolver.java @@ -25,6 +25,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.core.Ordered; +import org.springframework.lang.Nullable; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; @@ -157,7 +158,7 @@ public abstract class AbstractHandlerExceptionResolver implements HandlerExcepti * @see #setMappedHandlers * @see #setMappedHandlerClasses */ - protected boolean shouldApplyTo(HttpServletRequest request, Object handler) { + protected boolean shouldApplyTo(HttpServletRequest request, @Nullable Object handler) { if (handler != null) { if (this.mappedHandlers != null && this.mappedHandlers.contains(handler)) { return true; @@ -239,7 +240,8 @@ public abstract class AbstractHandlerExceptionResolver implements HandlerExcepti * @param ex the exception that got thrown during handler execution * @return a corresponding {@code ModelAndView} to forward to, or {@code null} for default processing */ + @Nullable protected abstract ModelAndView doResolveException(HttpServletRequest request, - HttpServletResponse response, Object handler, Exception ex); + HttpServletResponse response, @Nullable Object handler, Exception ex); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMapping.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMapping.java index ce3051d5c71..0ff7fbcc74a 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMapping.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMapping.java @@ -28,6 +28,7 @@ import javax.servlet.http.HttpServletResponse; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.core.Ordered; +import org.springframework.lang.Nullable; import org.springframework.util.AntPathMatcher; import org.springframework.util.Assert; import org.springframework.util.PathMatcher; @@ -111,6 +112,7 @@ public abstract class AbstractHandlerMapping extends WebApplicationObjectSupport * Return the default handler for this handler mapping, * or {@code null} if none. */ + @Nullable public Object getDefaultHandler() { return this.defaultHandler; } @@ -197,7 +199,7 @@ public abstract class AbstractHandlerMapping extends WebApplicationObjectSupport * @see org.springframework.web.servlet.HandlerInterceptor * @see org.springframework.web.context.request.WebRequestInterceptor */ - public void setInterceptors(Object... interceptors) { + public void setInterceptors(@Nullable Object... interceptors) { this.interceptors.addAll(Arrays.asList(interceptors)); } @@ -320,6 +322,7 @@ public abstract class AbstractHandlerMapping extends WebApplicationObjectSupport * Return the adapted interceptors as {@link HandlerInterceptor} array. * @return the array of {@link HandlerInterceptor}s, or {@code null} if none */ + @Nullable protected final HandlerInterceptor[] getAdaptedInterceptors() { int count = this.adaptedInterceptors.size(); return (count > 0 ? this.adaptedInterceptors.toArray(new HandlerInterceptor[count]) : null); @@ -329,6 +332,7 @@ public abstract class AbstractHandlerMapping extends WebApplicationObjectSupport * Return all configured {@link MappedInterceptor}s as an array. * @return the array of {@link MappedInterceptor}s, or {@code null} if none */ + @Nullable protected final MappedInterceptor[] getMappedInterceptors() { List mappedInterceptors = new ArrayList<>(); for (HandlerInterceptor interceptor : this.adaptedInterceptors) { @@ -389,6 +393,7 @@ public abstract class AbstractHandlerMapping extends WebApplicationObjectSupport * @return the corresponding handler instance, or {@code null} if none found * @throws Exception if there is an internal error */ + @Nullable protected abstract Object getHandlerInternal(HttpServletRequest request) throws Exception; /** @@ -437,6 +442,7 @@ public abstract class AbstractHandlerMapping extends WebApplicationObjectSupport * @return the CORS configuration for the handler or {@code null}. * @since 4.2 */ + @Nullable protected CorsConfiguration getCorsConfiguration(Object handler, HttpServletRequest request) { if (handler instanceof HandlerExecutionChain) { handler = ((HandlerExecutionChain) handler).getHandler(); @@ -460,7 +466,7 @@ public abstract class AbstractHandlerMapping extends WebApplicationObjectSupport * @since 4.2 */ protected HandlerExecutionChain getCorsHandlerExecutionChain(HttpServletRequest request, - HandlerExecutionChain chain, CorsConfiguration config) { + HandlerExecutionChain chain, @Nullable CorsConfiguration config) { if (CorsUtils.isPreFlightRequest(request)) { HandlerInterceptor[] interceptors = chain.getInterceptors(); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodExceptionResolver.java index 7f9bc066651..70bf4962605 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodExceptionResolver.java @@ -19,6 +19,7 @@ package org.springframework.web.servlet.handler; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.lang.Nullable; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.ModelAndView; @@ -73,7 +74,8 @@ public abstract class AbstractHandlerMethodExceptionResolver extends AbstractHan * @param ex the exception that got thrown during handler execution * @return a corresponding ModelAndView to forward to, or {@code null} for default processing */ + @Nullable protected abstract ModelAndView doResolveHandlerMethodException( - HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, Exception ex); + HttpServletRequest request, HttpServletResponse response, @Nullable HandlerMethod handlerMethod, Exception ex); } 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 df5257e1f07..1fa77960a9c 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 @@ -28,6 +28,7 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReentrantReadWriteLock; + import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -35,6 +36,7 @@ import org.springframework.aop.support.AopUtils; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.InitializingBean; import org.springframework.core.MethodIntrospector; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.LinkedMultiValueMap; @@ -118,6 +120,7 @@ public abstract class AbstractHandlerMethodMapping extends AbstractHandlerMap /** * Return the configured naming strategy or {@code null}. */ + @Nullable public HandlerMethodMappingNamingStrategy getNamingStrategy() { return this.namingStrategy; } @@ -142,6 +145,7 @@ public abstract class AbstractHandlerMethodMapping extends AbstractHandlerMap * list will never be modified and is safe to iterate. * @see #setHandlerMethodMappingNamingStrategy */ + @Nullable public List getHandlerMethodsForMappingName(String mappingName) { return this.mappingRegistry.getHandlerMethodsByMappingName(mappingName); } @@ -286,6 +290,7 @@ public abstract class AbstractHandlerMethodMapping extends AbstractHandlerMap /** * Extract and return the CORS configuration for the mapping. */ + @Nullable protected CorsConfiguration initCorsConfiguration(Object handler, Method method, T mapping) { return null; } @@ -336,6 +341,7 @@ public abstract class AbstractHandlerMethodMapping extends AbstractHandlerMap * @see #handleMatch(Object, String, HttpServletRequest) * @see #handleNoMatch(Set, String, HttpServletRequest) */ + @Nullable protected HandlerMethod lookupHandlerMethod(String lookupPath, HttpServletRequest request) throws Exception { List matches = new ArrayList(); List directPathMatches = this.mappingRegistry.getMappingsByUrl(lookupPath); @@ -401,6 +407,7 @@ public abstract class AbstractHandlerMethodMapping extends AbstractHandlerMap * @param request the current request * @throws ServletException in case of errors */ + @Nullable protected HandlerMethod handleNoMatch(Set mappings, String lookupPath, HttpServletRequest request) throws Exception { @@ -441,6 +448,7 @@ public abstract class AbstractHandlerMethodMapping extends AbstractHandlerMap * declaring class * @return the mapping, or {@code null} if the method is not mapped */ + @Nullable protected abstract T getMappingForMethod(Method method, Class handlerType); /** @@ -455,6 +463,7 @@ public abstract class AbstractHandlerMethodMapping extends AbstractHandlerMap * @param request the current HTTP servlet request * @return the match, or {@code null} if the mapping doesn't match */ + @Nullable protected abstract T getMatchingMapping(T mapping, HttpServletRequest request); /** diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java index 2b05738c89d..9982b52341c 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractUrlHandlerMapping.java @@ -22,10 +22,12 @@ import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.BeansException; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.web.servlet.HandlerExecutionChain; @@ -73,6 +75,7 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping i * Return the root handler for this handler mapping (registered for "/"), * or {@code null} if none. */ + @Nullable public Object getRootHandler() { return this.rootHandler; } @@ -113,6 +116,7 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping i * @return the handler instance, or {@code null} if none found */ @Override + @Nullable protected Object getHandlerInternal(HttpServletRequest request) throws Exception { String lookupPath = getUrlPathHelper().getLookupPathForRequest(request); Object handler = lookupHandler(lookupPath, request); @@ -158,6 +162,7 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping i * @see #exposePathWithinMapping * @see org.springframework.util.AntPathMatcher */ + @Nullable protected Object lookupHandler(String urlPath, HttpServletRequest request) throws Exception { // Direct match? Object handler = this.handlerMap.get(urlPath); @@ -255,7 +260,7 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping i * @return the final handler object */ protected Object buildPathExposingHandler(Object rawHandler, String bestMatchingPattern, - String pathWithinMapping, Map uriTemplateVariables) { + String pathWithinMapping, @Nullable Map uriTemplateVariables) { HandlerExecutionChain chain = new HandlerExecutionChain(rawHandler); chain.addInterceptor(new PathExposingHandlerInterceptor(bestMatchingPattern, pathWithinMapping)); 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 21a815ab64e..4b38e361a8d 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 @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Properties; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; @@ -30,6 +31,7 @@ import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PropertiesLoaderUtils; +import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; import org.springframework.web.cors.CorsConfiguration; @@ -125,6 +127,7 @@ public class HandlerMappingIntrospector implements CorsConfigurationSource { * @return the resolved matcher, or {@code null} * @throws Exception if any of the HandlerMapping's raise an exception */ + @Nullable public MatchableHandlerMapping getMatchableHandlerMapping(HttpServletRequest request) throws Exception { HttpServletRequest wrapper = new RequestAttributeChangeIgnoringWrapper(request); for (HandlerMapping handlerMapping : this.handlerMappings) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/MappedInterceptor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/MappedInterceptor.java index a238d537ea7..9022c792426 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/MappedInterceptor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/MappedInterceptor.java @@ -19,6 +19,7 @@ package org.springframework.web.servlet.handler; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.lang.Nullable; import org.springframework.util.PathMatcher; import org.springframework.web.context.request.WebRequestInterceptor; import org.springframework.web.servlet.HandlerInterceptor; @@ -57,7 +58,7 @@ public final class MappedInterceptor implements HandlerInterceptor { * @param includePatterns the path patterns to map with a {@code null} value matching to all paths * @param interceptor the HandlerInterceptor instance to map to the given patterns */ - public MappedInterceptor(String[] includePatterns, HandlerInterceptor interceptor) { + public MappedInterceptor(@Nullable String[] includePatterns, HandlerInterceptor interceptor) { this(includePatterns, null, interceptor); } @@ -67,7 +68,7 @@ public final class MappedInterceptor implements HandlerInterceptor { * @param excludePatterns the path patterns to exclude * @param interceptor the HandlerInterceptor instance to map to the given patterns */ - public MappedInterceptor(String[] includePatterns, String[] excludePatterns, HandlerInterceptor interceptor) { + public MappedInterceptor(@Nullable String[] includePatterns, String[] excludePatterns, HandlerInterceptor interceptor) { this.includePatterns = includePatterns; this.excludePatterns = excludePatterns; this.interceptor = interceptor; @@ -79,7 +80,7 @@ public final class MappedInterceptor implements HandlerInterceptor { * @param includePatterns the path patterns to map with a {@code null} value matching to all paths * @param interceptor the WebRequestInterceptor instance to map to the given patterns */ - public MappedInterceptor(String[] includePatterns, WebRequestInterceptor interceptor) { + public MappedInterceptor(@Nullable String[] includePatterns, WebRequestInterceptor interceptor) { this(includePatterns, null, interceptor); } @@ -88,7 +89,7 @@ public final class MappedInterceptor implements HandlerInterceptor { * @param includePatterns the path patterns to map with a {@code null} value matching to all paths * @param interceptor the WebRequestInterceptor instance to map to the given patterns */ - public MappedInterceptor(String[] includePatterns, String[] excludePatterns, WebRequestInterceptor interceptor) { + public MappedInterceptor(@Nullable String[] includePatterns, String[] excludePatterns, WebRequestInterceptor interceptor) { this(includePatterns, excludePatterns, new WebRequestHandlerInterceptorAdapter(interceptor)); } @@ -109,6 +110,7 @@ public final class MappedInterceptor implements HandlerInterceptor { /** * The configured PathMatcher, or {@code null}. */ + @Nullable public PathMatcher getPathMatcher() { return this.pathMatcher; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/MatchableHandlerMapping.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/MatchableHandlerMapping.java index af5788c7d88..b617e00e83f 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/MatchableHandlerMapping.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/MatchableHandlerMapping.java @@ -18,6 +18,7 @@ package org.springframework.web.servlet.handler; import javax.servlet.http.HttpServletRequest; +import org.springframework.lang.Nullable; import org.springframework.web.servlet.HandlerMapping; /** @@ -37,6 +38,7 @@ public interface MatchableHandlerMapping extends HandlerMapping { * @param pattern the pattern to match * @return the result from request matching, or {@code null} if none */ + @Nullable RequestMatchResult match(HttpServletRequest request, String pattern); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/SimpleMappingExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/SimpleMappingExceptionResolver.java index ff698d3160f..1b4be234f56 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/SimpleMappingExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/SimpleMappingExceptionResolver.java @@ -21,9 +21,11 @@ import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Properties; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.lang.Nullable; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.util.WebUtils; @@ -153,7 +155,7 @@ public class SimpleMappingExceptionResolver extends AbstractHandlerExceptionReso * for not exposing an exception attribute at all. * @see #DEFAULT_EXCEPTION_ATTRIBUTE */ - public void setExceptionAttribute(String exceptionAttribute) { + public void setExceptionAttribute(@Nullable String exceptionAttribute) { this.exceptionAttribute = exceptionAttribute; } @@ -201,6 +203,7 @@ public class SimpleMappingExceptionResolver extends AbstractHandlerExceptionReso * @param request current HTTP request (useful for obtaining metadata) * @return the resolved view name, or {@code null} if excluded or none found */ + @Nullable protected String determineViewName(Exception ex, HttpServletRequest request) { String viewName = null; if (this.excludedExceptions != null) { @@ -232,6 +235,7 @@ public class SimpleMappingExceptionResolver extends AbstractHandlerExceptionReso * @return the view name, or {@code null} if none found * @see #setExceptionMappings */ + @Nullable protected String findMatchingViewName(Properties exceptionMappings, Exception ex) { String viewName = null; String dominantMapping = null; @@ -287,6 +291,7 @@ public class SimpleMappingExceptionResolver extends AbstractHandlerExceptionReso * @see #setDefaultStatusCode * @see #applyStatusCodeIfPossible */ + @Nullable protected Integer determineStatusCode(HttpServletRequest request, String viewName) { if (this.statusCodes.containsKey(viewName)) { return this.statusCodes.get(viewName); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/package-info.java index 3b64fa913a0..b4eec2d094f 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/package-info.java @@ -2,4 +2,7 @@ * Provides standard HandlerMapping implementations, * including abstract base classes for custom implementations. */ +@NonNullApi package org.springframework.web.servlet.handler; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AbstractLocaleContextResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AbstractLocaleContextResolver.java index f3ab7a1f4b4..33b8b27bac4 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AbstractLocaleContextResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AbstractLocaleContextResolver.java @@ -22,6 +22,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.context.i18n.SimpleLocaleContext; +import org.springframework.lang.Nullable; import org.springframework.web.servlet.LocaleContextResolver; /** @@ -51,6 +52,7 @@ public abstract class AbstractLocaleContextResolver extends AbstractLocaleResolv /** * Return the default TimeZone that this resolver is supposed to fall back to, if any. */ + @Nullable public TimeZone getDefaultTimeZone() { return this.defaultTimeZone; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AbstractLocaleResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AbstractLocaleResolver.java index c5fa0d7ba41..2728279c38c 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AbstractLocaleResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AbstractLocaleResolver.java @@ -18,6 +18,7 @@ package org.springframework.web.servlet.i18n; import java.util.Locale; +import org.springframework.lang.Nullable; import org.springframework.web.servlet.LocaleResolver; /** @@ -43,6 +44,7 @@ public abstract class AbstractLocaleResolver implements LocaleResolver { /** * Return the default Locale that this resolver is supposed to fall back to, if any. */ + @Nullable protected Locale getDefaultLocale() { return this.defaultLocale; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AcceptHeaderLocaleResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AcceptHeaderLocaleResolver.java index c62fcef8a91..a755e789d1f 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AcceptHeaderLocaleResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/AcceptHeaderLocaleResolver.java @@ -23,6 +23,7 @@ import java.util.Locale; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.lang.Nullable; import org.springframework.web.servlet.LocaleResolver; /** @@ -84,6 +85,7 @@ public class AcceptHeaderLocaleResolver implements LocaleResolver { * The configured default locale, if any. * @since 4.3 */ + @Nullable public Locale getDefaultLocale() { return this.defaultLocale; } @@ -111,6 +113,7 @@ public class AcceptHeaderLocaleResolver implements LocaleResolver { return (supportedLocales.isEmpty() || supportedLocales.contains(locale)); } + @Nullable private Locale findSupportedLocale(HttpServletRequest request) { Enumeration requestLocales = request.getLocales(); while (requestLocales.hasMoreElements()) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/CookieLocaleResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/CookieLocaleResolver.java index 5ae5652c407..c2e366e2966 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/CookieLocaleResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/CookieLocaleResolver.java @@ -18,6 +18,7 @@ package org.springframework.web.servlet.i18n; import java.util.Locale; import java.util.TimeZone; + import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -25,6 +26,7 @@ import javax.servlet.http.HttpServletResponse; import org.springframework.context.i18n.LocaleContext; import org.springframework.context.i18n.SimpleLocaleContext; import org.springframework.context.i18n.TimeZoneAwareLocaleContext; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; import org.springframework.web.servlet.LocaleContextResolver; import org.springframework.web.servlet.LocaleResolver; @@ -131,6 +133,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte * Return the fixed Locale that this resolver will return if no cookie found, * if any. */ + @Nullable protected Locale getDefaultLocale() { return this.defaultLocale; } @@ -148,6 +151,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte * if any. * @since 4.0 */ + @Nullable protected TimeZone getDefaultTimeZone() { return this.defaultTimeZone; } @@ -283,6 +287,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte * @see #setDefaultLocale * @see javax.servlet.http.HttpServletRequest#getLocale() */ + @Nullable protected Locale determineDefaultLocale(HttpServletRequest request) { Locale defaultLocale = getDefaultLocale(); if (defaultLocale == null) { @@ -300,6 +305,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte * @return the default time zone (or {@code null} if none defined) * @see #setDefaultTimeZone */ + @Nullable protected TimeZone determineDefaultTimeZone(HttpServletRequest request) { return getDefaultTimeZone(); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/SessionLocaleResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/SessionLocaleResolver.java index 7291b47a587..343d6e6ce5c 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/SessionLocaleResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/SessionLocaleResolver.java @@ -18,11 +18,13 @@ package org.springframework.web.servlet.i18n; import java.util.Locale; import java.util.TimeZone; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.context.i18n.LocaleContext; import org.springframework.context.i18n.TimeZoneAwareLocaleContext; +import org.springframework.lang.Nullable; import org.springframework.web.util.WebUtils; /** @@ -178,6 +180,7 @@ public class SessionLocaleResolver extends AbstractLocaleContextResolver { * @return the default time zone (or {@code null} if none defined) * @see #setDefaultTimeZone */ + @Nullable protected TimeZone determineDefaultTimeZone(HttpServletRequest request) { return getDefaultTimeZone(); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/package-info.java index 24539c7a12b..7ba5d0ca41c 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/package-info.java @@ -3,4 +3,7 @@ * Provides standard LocaleResolver implementations, * and a HandlerInterceptor for locale changes. */ +@NonNullApi package org.springframework.web.servlet.i18n; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/AbstractController.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/AbstractController.java index c37e656a7e5..e742af2e425 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/AbstractController.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/AbstractController.java @@ -21,6 +21,7 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.http.HttpMethod; +import org.springframework.lang.Nullable; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.support.WebContentGenerator; import org.springframework.web.util.WebUtils; @@ -179,6 +180,7 @@ public abstract class AbstractController extends WebContentGenerator implements * The contract is the same as for {@code handleRequest}. * @see #handleRequest */ + @Nullable protected abstract ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/Controller.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/Controller.java index f4f6bc88d77..c083dd56977 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/Controller.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/Controller.java @@ -19,6 +19,7 @@ package org.springframework.web.servlet.mvc; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.lang.Nullable; import org.springframework.web.servlet.ModelAndView; /** @@ -119,6 +120,7 @@ public interface Controller { * @return a ModelAndView to render, or {@code null} if handled directly * @throws Exception in case of errors */ + @Nullable ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception; } 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 5d512887dd7..ca1c5e12cd3 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 @@ -21,6 +21,7 @@ import javax.servlet.http.HttpServletResponse; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.View; import org.springframework.web.servlet.support.RequestContextUtils; @@ -62,6 +63,7 @@ public class ParameterizableViewController extends AbstractController { * Return the name of the view to delegate to, or {@code null} if using a * View instance. */ + @Nullable public String getViewName() { return (this.view instanceof String ? (String) this.view : null); } @@ -80,6 +82,7 @@ public class ParameterizableViewController extends AbstractController { * to be resolved by the DispatcherServlet via a ViewResolver. * @since 4.1 */ + @Nullable public View getView() { return (this.view instanceof View ? (View) this.view : null); } @@ -103,6 +106,7 @@ public class ParameterizableViewController extends AbstractController { * Return the configured HTTP status code or {@code null}. * @since 4.1 */ + @Nullable public HttpStatus getStatusCode() { return this.statusCode; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/WebContentInterceptor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/WebContentInterceptor.java index 879d78eebca..74666615852 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/WebContentInterceptor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/WebContentInterceptor.java @@ -26,6 +26,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.http.CacheControl; +import org.springframework.lang.Nullable; import org.springframework.util.AntPathMatcher; import org.springframework.util.Assert; import org.springframework.util.PathMatcher; @@ -214,6 +215,7 @@ public class WebContentInterceptor extends WebContentGenerator implements Handle * @return the associated {@code CacheControl}, or {@code null} if not found * @see org.springframework.util.AntPathMatcher */ + @Nullable protected CacheControl lookupCacheControl(String urlPath) { // Direct match? CacheControl cacheControl = this.cacheControlMappings.get(urlPath); @@ -238,6 +240,7 @@ public class WebContentInterceptor extends WebContentGenerator implements Handle * @return the cacheSeconds integer value, or {@code null} if not found * @see org.springframework.util.AntPathMatcher */ + @Nullable protected Integer lookupCacheSeconds(String urlPath) { // Direct match? Integer cacheSeconds = this.cacheMappings.get(urlPath); 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 b6fd282b0b2..51fec27c760 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 @@ -17,6 +17,7 @@ package org.springframework.web.servlet.mvc.annotation; import java.io.IOException; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -24,6 +25,7 @@ import org.springframework.context.MessageSource; import org.springframework.context.MessageSourceAware; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.server.ResponseStatusException; @@ -101,7 +103,7 @@ public class ResponseStatusExceptionResolver extends AbstractHandlerExceptionRes * @return an empty ModelAndView, i.e. exception resolved */ protected ModelAndView resolveResponseStatus(ResponseStatus responseStatus, HttpServletRequest request, - HttpServletResponse response, Object handler, Exception ex) throws Exception { + HttpServletResponse response, @Nullable Object handler, Exception ex) throws Exception { int statusCode = responseStatus.code().value(); String reason = responseStatus.reason(); @@ -121,7 +123,7 @@ public class ResponseStatusExceptionResolver extends AbstractHandlerExceptionRes * @since 5.0 */ protected ModelAndView resolveResponseStatusException(ResponseStatusException ex, - HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + HttpServletRequest request, HttpServletResponse response, @Nullable Object handler) throws Exception { int statusCode = ex.getStatus().value(); String reason = ex.getReason(); @@ -139,7 +141,7 @@ public class ResponseStatusExceptionResolver extends AbstractHandlerExceptionRes * @param response current HTTP response * @since 5.0 */ - protected ModelAndView applyStatusAndReason(int statusCode, String reason, HttpServletResponse response) + protected ModelAndView applyStatusAndReason(int statusCode, @Nullable String reason, HttpServletResponse response) throws IOException { if (!StringUtils.hasLength(reason)) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/package-info.java index e24566b8164..a1572226f98 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/package-info.java @@ -1,4 +1,7 @@ /** * Support package for annotation-based Servlet MVC controllers. */ +@NonNullApi package org.springframework.web.servlet.mvc.annotation; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/CompositeRequestCondition.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/CompositeRequestCondition.java index 97949e21677..cf7fe38924f 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/CompositeRequestCondition.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/CompositeRequestCondition.java @@ -20,8 +20,10 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; + import javax.servlet.http.HttpServletRequest; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -49,7 +51,7 @@ public class CompositeRequestCondition extends AbstractRequestCondition... requestConditions) { + public CompositeRequestCondition(@Nullable RequestCondition... requestConditions) { this.requestConditions = wrap(requestConditions); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/ConsumesRequestCondition.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/ConsumesRequestCondition.java index 305012b21aa..8b156cd2313 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/ConsumesRequestCondition.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/ConsumesRequestCondition.java @@ -23,6 +23,7 @@ import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; + import javax.servlet.http.HttpServletRequest; import org.springframework.http.InvalidMediaTypeException; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestCondition.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestCondition.java index 542e1a2d740..3a199cd8082 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestCondition.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestCondition.java @@ -18,6 +18,8 @@ package org.springframework.web.servlet.mvc.condition; import javax.servlet.http.HttpServletRequest; +import org.springframework.lang.Nullable; + /** * Contract for request mapping conditions. * @@ -55,6 +57,7 @@ public interface RequestCondition { * empty content thus not causing a failure to match. * @return a condition instance in case of a match or {@code null} otherwise. */ + @Nullable T getMatchingCondition(HttpServletRequest request); /** diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestConditionHolder.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestConditionHolder.java index 4b21b39efa3..39132536c39 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestConditionHolder.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/RequestConditionHolder.java @@ -18,8 +18,11 @@ package org.springframework.web.servlet.mvc.condition; import java.util.Collection; import java.util.Collections; + import javax.servlet.http.HttpServletRequest; +import org.springframework.lang.Nullable; + /** * A holder for a {@link RequestCondition} useful when the type of the request * condition is not known ahead of time, e.g. custom condition. Since this @@ -44,7 +47,7 @@ public final class RequestConditionHolder extends AbstractRequestCondition requestCondition) { + public RequestConditionHolder(@Nullable RequestCondition requestCondition) { this.condition = (RequestCondition) requestCondition; } @@ -52,6 +55,7 @@ public final class RequestConditionHolder extends AbstractRequestCondition getCondition() { return this.condition; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/package-info.java index f6180f42264..d8e5ccdd7fa 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/condition/package-info.java @@ -1,4 +1,7 @@ /** * Common MVC logic for matching incoming requests based on conditions. */ +@NonNullApi package org.springframework.web.servlet.mvc.condition; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/AbstractHandlerMethodAdapter.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/AbstractHandlerMethodAdapter.java index 803b595d4be..677e40b0077 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/AbstractHandlerMethodAdapter.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/AbstractHandlerMethodAdapter.java @@ -20,6 +20,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.core.Ordered; +import org.springframework.lang.Nullable; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerAdapter; import org.springframework.web.servlet.ModelAndView; @@ -95,6 +96,7 @@ public abstract class AbstractHandlerMethodAdapter extends WebContentGenerator i * or {@code null} if the request has been handled directly * @throws Exception in case of errors */ + @Nullable protected abstract ModelAndView handleInternal(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfo.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfo.java index 88fb9b45dda..2f6670c1958 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfo.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfo.java @@ -17,9 +17,11 @@ package org.springframework.web.servlet.mvc.method; import java.util.List; + import javax.servlet.http.HttpServletRequest; import org.springframework.http.HttpMethod; +import org.springframework.lang.Nullable; import org.springframework.util.PathMatcher; import org.springframework.util.StringUtils; import org.springframework.web.accept.ContentNegotiationManager; @@ -105,6 +107,7 @@ public final class RequestMappingInfo implements RequestCondition getCustomCondition() { return this.customConditionHolder.getCondition(); } @@ -532,6 +536,7 @@ public final class RequestMappingInfo implements RequestCondition Object readWithMessageConverters(NativeWebRequest webRequest, MethodParameter parameter, + protected Object readWithMessageConverters(NativeWebRequest webRequest, @Nullable MethodParameter parameter, Type paramType) throws IOException, HttpMediaTypeNotSupportedException, HttpMessageNotReadableException { HttpInputMessage inputMessage = createInputMessage(webRequest); @@ -157,7 +159,8 @@ public abstract class AbstractMessageConverterMethodArgumentResolver implements * @throws HttpMediaTypeNotSupportedException if no suitable message converter is found */ @SuppressWarnings("unchecked") - protected Object readWithMessageConverters(HttpInputMessage inputMessage, MethodParameter parameter, + @Nullable + protected Object readWithMessageConverters(HttpInputMessage inputMessage, @Nullable MethodParameter parameter, Type targetType) throws IOException, HttpMediaTypeNotSupportedException, HttpMessageNotReadableException { MediaType contentType; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java index 26434dc83e7..f93a785aad9 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExceptionHandlerExceptionResolver.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -37,6 +38,7 @@ import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter; import org.springframework.http.converter.xml.SourceHttpMessageConverter; +import org.springframework.lang.Nullable; import org.springframework.ui.ModelMap; import org.springframework.web.accept.ContentNegotiationManager; import org.springframework.web.bind.annotation.ControllerAdvice; @@ -121,6 +123,7 @@ public class ExceptionHandlerExceptionResolver extends AbstractHandlerMethodExce /** * Return the custom argument resolvers, or {@code null}. */ + @Nullable public List getCustomArgumentResolvers() { return this.customArgumentResolvers; } @@ -143,6 +146,7 @@ public class ExceptionHandlerExceptionResolver extends AbstractHandlerMethodExce * Return the configured argument resolvers, or possibly {@code null} if * not initialized yet via {@link #afterPropertiesSet()}. */ + @Nullable public HandlerMethodArgumentResolverComposite getArgumentResolvers() { return this.argumentResolvers; } @@ -159,6 +163,7 @@ public class ExceptionHandlerExceptionResolver extends AbstractHandlerMethodExce /** * Return the custom return value handlers, or {@code null}. */ + @Nullable public List getCustomReturnValueHandlers() { return this.customReturnValueHandlers; } @@ -181,6 +186,7 @@ public class ExceptionHandlerExceptionResolver extends AbstractHandlerMethodExce * Return the configured handlers, or possibly {@code null} if not * initialized yet via {@link #afterPropertiesSet()}. */ + @Nullable public HandlerMethodReturnValueHandlerComposite getReturnValueHandlers() { return this.returnValueHandlers; } @@ -423,7 +429,8 @@ public class ExceptionHandlerExceptionResolver extends AbstractHandlerMethodExce * @param exception the raised exception * @return a method to handle the exception, or {@code null} */ - protected ServletInvocableHandlerMethod getExceptionHandlerMethod(HandlerMethod handlerMethod, Exception exception) { + @Nullable + protected ServletInvocableHandlerMethod getExceptionHandlerMethod(@Nullable HandlerMethod handlerMethod, Exception exception) { Class handlerType = (handlerMethod != null ? handlerMethod.getBeanType() : null); if (handlerMethod != null) { 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 e559e993171..32c344576ae 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 @@ -18,9 +18,11 @@ package org.springframework.web.servlet.mvc.method.annotation; import java.util.Map; import java.util.Map.Entry; + import javax.servlet.ServletRequest; import org.springframework.beans.MutablePropertyValues; +import org.springframework.lang.Nullable; import org.springframework.web.bind.ServletRequestDataBinder; import org.springframework.web.servlet.HandlerMapping; @@ -39,7 +41,7 @@ public class ExtendedServletRequestDataBinder extends ServletRequestDataBinder { * if the binder is just used to convert a plain parameter value) * @see #DEFAULT_OBJECT_NAME */ - public ExtendedServletRequestDataBinder(Object target) { + public ExtendedServletRequestDataBinder(@Nullable Object target) { super(target); } @@ -50,7 +52,7 @@ public class ExtendedServletRequestDataBinder extends ServletRequestDataBinder { * @param objectName the name of the target object * @see #DEFAULT_OBJECT_NAME */ - public ExtendedServletRequestDataBinder(Object target, String objectName) { + public ExtendedServletRequestDataBinder(@Nullable Object target, String objectName) { super(target, objectName); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessor.java index d03c606d801..d2038bd8a94 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/HttpEntityMethodProcessor.java @@ -36,6 +36,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.http.server.ServletServerHttpResponse; +import org.springframework.lang.Nullable; import org.springframework.ui.ModelMap; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -142,6 +143,7 @@ public class HttpEntityMethodProcessor extends AbstractMessageConverterMethodPro } } + @Nullable private Type getHttpEntityType(MethodParameter parameter) { Assert.isAssignable(HttpEntity.class, parameter.getParameterType()); Type parameterType = parameter.getGenericParameterType(); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ModelAndViewMethodReturnValueHandler.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ModelAndViewMethodReturnValueHandler.java index 10ea4028121..25786f460cd 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ModelAndViewMethodReturnValueHandler.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ModelAndViewMethodReturnValueHandler.java @@ -17,6 +17,7 @@ package org.springframework.web.servlet.mvc.method.annotation; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.util.PatternMatchUtils; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodReturnValueHandler; @@ -62,6 +63,7 @@ public class ModelAndViewMethodReturnValueHandler implements HandlerMethodReturn /** * The configured redirect patterns, if any. */ + @Nullable public String[] getRedirectPatterns() { return this.redirectPatterns; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.java index 8b0dd0e7877..559d3dd7b9e 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.java @@ -44,6 +44,7 @@ import org.springframework.core.MethodParameter; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.SynthesizingMethodParameter; +import org.springframework.lang.Nullable; import org.springframework.objenesis.ObjenesisException; import org.springframework.objenesis.SpringObjenesis; import org.springframework.util.AntPathMatcher; @@ -489,6 +490,7 @@ public class MvcUriComponentsBuilder { }); } + @Nullable private static CompositeUriComponentsContributor getConfiguredUriComponentsContributor() { WebApplicationContext wac = getWebApplicationContext(); if (wac == null) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandler.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandler.java index 1787960349d..5326d1e6407 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandler.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandler.java @@ -39,6 +39,7 @@ import org.springframework.core.task.TaskExecutor; import org.springframework.http.MediaType; import org.springframework.http.codec.ServerSentEvent; import org.springframework.http.server.ServerHttpResponse; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.MimeType; @@ -107,6 +108,7 @@ class ReactiveTypeHandler { * @return an emitter for streaming or {@code null} if handled internally * with a {@link DeferredResult}. */ + @Nullable public ResponseBodyEmitter handleValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mav, NativeWebRequest request) throws Exception { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestBodyAdvice.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestBodyAdvice.java index ee0be6504d5..bd282e3f868 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestBodyAdvice.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestBodyAdvice.java @@ -22,6 +22,7 @@ import java.lang.reflect.Type; import org.springframework.core.MethodParameter; import org.springframework.http.HttpInputMessage; import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.lang.Nullable; /** * Allows customizing the request before its body is read and converted into an @@ -60,7 +61,8 @@ public interface RequestBodyAdvice { * @return the value to use or {@code null} which may then raise an * {@code HttpMessageNotReadableException} if the argument is required. */ - Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, + @Nullable + Object handleEmptyBody(@Nullable Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class> converterType); /** 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 36df1ef1d82..cfd8ec4ea9c 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 @@ -25,6 +25,7 @@ import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @@ -46,6 +47,7 @@ import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter; import org.springframework.http.converter.xml.SourceHttpMessageConverter; +import org.springframework.lang.Nullable; import org.springframework.ui.ModelMap; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -197,6 +199,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter /** * Return the custom argument resolvers, or {@code null}. */ + @Nullable public List getCustomArgumentResolvers() { return this.customArgumentResolvers; } @@ -219,6 +222,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter * Return the configured argument resolvers, or possibly {@code null} if * not initialized yet via {@link #afterPropertiesSet()}. */ + @Nullable public List getArgumentResolvers() { return (this.argumentResolvers != null) ? this.argumentResolvers.getResolvers() : null; } @@ -240,6 +244,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter * Return the argument resolvers for {@code @InitBinder} methods, or possibly * {@code null} if not initialized yet via {@link #afterPropertiesSet()}. */ + @Nullable public List getInitBinderArgumentResolvers() { return (this.initBinderArgumentResolvers != null) ? this.initBinderArgumentResolvers.getResolvers() : null; } @@ -256,6 +261,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter /** * Return the custom return value handlers, or {@code null}. */ + @Nullable public List getCustomReturnValueHandlers() { return this.customReturnValueHandlers; } @@ -278,6 +284,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter * Return the configured handlers, or possibly {@code null} if not * initialized yet via {@link #afterPropertiesSet()}. */ + @Nullable public List getReturnValueHandlers() { return this.returnValueHandlers.getHandlers(); } @@ -303,6 +310,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter /** * Return the configured {@link ModelAndViewResolver}s, or {@code null}. */ + @Nullable public List getModelAndViewResolvers() { return modelAndViewResolvers; } @@ -364,6 +372,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter /** * Return the configured WebBindingInitializer, or {@code null} if none. */ + @Nullable public WebBindingInitializer getWebBindingInitializer() { return this.webBindingInitializer; } @@ -520,6 +529,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter /** * Return the owning factory of this bean instance, or {@code null} if none. */ + @Nullable protected ConfigurableBeanFactory getBeanFactory() { return this.beanFactory; } @@ -805,6 +815,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter * @since 4.2 * @see #createInvocableHandlerMethod(HandlerMethod) */ + @Nullable protected ModelAndView invokeHandlerMethod(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception { @@ -944,6 +955,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter return new ServletRequestDataBinderFactory(binderMethods, getWebBindingInitializer()); } + @Nullable private ModelAndView getModelAndView(ModelAndViewContainer mavContainer, ModelFactory modelFactory, NativeWebRequest webRequest) 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 c79facb1ab6..223b933d77e 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 @@ -20,10 +20,12 @@ import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; import java.util.List; import java.util.Set; + import javax.servlet.http.HttpServletRequest; import org.springframework.context.EmbeddedValueResolverAware; import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.lang.Nullable; import org.springframework.stereotype.Controller; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -219,6 +221,7 @@ public class RequestMappingHandlerMapping extends RequestMappingInfoHandlerMappi * @param handlerType the handler type for which to create the condition * @return the condition, or {@code null} */ + @Nullable protected RequestCondition getCustomTypeCondition(Class handlerType) { return null; } @@ -234,6 +237,7 @@ public class RequestMappingHandlerMapping extends RequestMappingInfoHandlerMappi * @param method the handler method for which to create the condition * @return the condition, or {@code null} */ + @Nullable protected RequestCondition getCustomMethodCondition(Method method) { return null; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitter.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitter.java index 43bad268376..de41ce1293d 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitter.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitter.java @@ -22,6 +22,7 @@ import java.util.Set; import org.springframework.http.MediaType; import org.springframework.http.server.ServerHttpResponse; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -98,6 +99,7 @@ public class ResponseBodyEmitter { /** * Return the configured timeout value, if any. */ + @Nullable public Long getTimeout() { return this.timeout; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandler.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandler.java index d5718a3ee49..6b1d4cec5ee 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandler.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandler.java @@ -34,6 +34,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; import org.springframework.validation.BindException; import org.springframework.web.HttpMediaTypeNotAcceptableException; @@ -446,6 +447,7 @@ public abstract class ResponseEntityExceptionHandler { * @return a {@code ResponseEntity} instance * @since 4.2.8 */ + @Nullable protected ResponseEntity handleAsyncRequestTimeoutException( AsyncRequestTimeoutException ex, HttpHeaders headers, HttpStatus status, WebRequest webRequest) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletModelAttributeMethodProcessor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletModelAttributeMethodProcessor.java index a59e0aa00f9..2a8497a5340 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletModelAttributeMethodProcessor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletModelAttributeMethodProcessor.java @@ -18,12 +18,14 @@ package org.springframework.web.servlet.mvc.method.annotation; import java.util.Collections; import java.util.Map; + import javax.servlet.ServletRequest; import org.springframework.core.MethodParameter; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.converter.Converter; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; import org.springframework.validation.DataBinder; import org.springframework.web.bind.ServletRequestDataBinder; @@ -90,6 +92,7 @@ public class ServletModelAttributeMethodProcessor extends ModelAttributeMethodPr * @param request the current request * @return the request value to try to convert, or {@code null} if none */ + @Nullable protected String getRequestValueForAttribute(String attributeName, NativeWebRequest request) { Map variables = getUriTemplateVariables(request); String variableValue = variables.get(attributeName); @@ -124,7 +127,8 @@ public class ServletModelAttributeMethodProcessor extends ModelAttributeMethodPr * conversion found * @throws Exception */ - protected Object createAttributeFromRequestValue(String sourceValue, String attributeName, + @Nullable + protected Object createAttributeFromRequestValue(String sourceValue, @Nullable String attributeName, MethodParameter methodParam, WebDataBinderFactory binderFactory, NativeWebRequest request) throws Exception { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ViewNameMethodReturnValueHandler.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ViewNameMethodReturnValueHandler.java index 9601ce60e3c..0130d963c73 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ViewNameMethodReturnValueHandler.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ViewNameMethodReturnValueHandler.java @@ -17,6 +17,7 @@ package org.springframework.web.servlet.mvc.method.annotation; import org.springframework.core.MethodParameter; +import org.springframework.lang.Nullable; import org.springframework.util.PatternMatchUtils; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodReturnValueHandler; @@ -62,6 +63,7 @@ public class ViewNameMethodReturnValueHandler implements HandlerMethodReturnValu /** * The configured redirect patterns, if any. */ + @Nullable public String[] getRedirectPatterns() { return this.redirectPatterns; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/package-info.java index 46c680b5ade..54c61e6a9ea 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/package-info.java @@ -4,4 +4,7 @@ * {@link org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping} * and {@link org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter}. */ +@NonNullApi package org.springframework.web.servlet.mvc.method.annotation; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/package-info.java index 14f90619264..8ba7aa6f126 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/package-info.java @@ -2,4 +2,7 @@ * Servlet-based infrastructure for handler method processing, * building on the {@code org.springframework.web.method} package. */ +@NonNullApi package org.springframework.web.servlet.mvc.method; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/package-info.java index 7217100f442..0bfa4e40d10 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/package-info.java @@ -2,4 +2,7 @@ * Standard controller implementations for the Servlet MVC framework that comes with * Spring. Provides various controller styles, including an annotation-based model. */ +@NonNullApi package org.springframework.web.servlet.mvc; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.java index 80e61a3881d..cbe00855760 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.java @@ -18,6 +18,7 @@ package org.springframework.web.servlet.mvc.support; import java.io.IOException; import java.util.List; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -30,6 +31,7 @@ import org.springframework.core.Ordered; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.validation.BindException; @@ -181,7 +183,7 @@ public class DefaultHandlerExceptionResolver extends AbstractHandlerExceptionRes * @throws IOException potentially thrown from response.sendError() */ protected ModelAndView handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException ex, - HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { + HttpServletRequest request, HttpServletResponse response, @Nullable Object handler) throws IOException { pageNotFoundLogger.warn(ex.getMessage()); String[] supportedMethods = ex.getSupportedMethods(); @@ -448,7 +450,7 @@ public class DefaultHandlerExceptionResolver extends AbstractHandlerExceptionRes * @since 4.0 */ protected ModelAndView handleNoHandlerFoundException(NoHandlerFoundException ex, - HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { + HttpServletRequest request, HttpServletResponse response, @Nullable Object handler) throws IOException { response.sendError(HttpServletResponse.SC_NOT_FOUND); return new ModelAndView(); @@ -467,7 +469,7 @@ public class DefaultHandlerExceptionResolver extends AbstractHandlerExceptionRes * @since 4.2.8 */ protected ModelAndView handleAsyncRequestTimeoutException(AsyncRequestTimeoutException ex, - HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { + HttpServletRequest request, HttpServletResponse response, @Nullable Object handler) throws IOException { if (!response.isCommitted()) { response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/RedirectAttributes.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/RedirectAttributes.java index e8952b58f4f..1ac0887c6bc 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/RedirectAttributes.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/RedirectAttributes.java @@ -19,6 +19,7 @@ package org.springframework.web.servlet.mvc.support; import java.util.Collection; import java.util.Map; +import org.springframework.lang.Nullable; import org.springframework.ui.Model; import org.springframework.web.servlet.FlashMap; @@ -76,7 +77,7 @@ public interface RedirectAttributes extends Model { * @param attributeName the attribute name; never {@code null} * @param attributeValue the attribute value; may be {@code null} */ - RedirectAttributes addFlashAttribute(String attributeName, Object attributeValue); + RedirectAttributes addFlashAttribute(String attributeName, @Nullable Object attributeValue); /** * Add the given flash storage using a diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/package-info.java index 4958b2b3c3b..07460be108b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/package-info.java @@ -2,4 +2,7 @@ * Support package for MVC controllers. * Contains a special HandlerMapping for controller conventions. */ +@NonNullApi package org.springframework.web.servlet.mvc.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/package-info.java index 19b495821b2..359de4aa57b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/package-info.java @@ -7,4 +7,7 @@ * Expert One-On-One J2EE Design and Development * by Rod Johnson (Wrox, 2002). */ +@NonNullApi package org.springframework.web.servlet; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/AbstractResourceResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/AbstractResourceResolver.java index 75afad31e98..d04fafe712a 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/AbstractResourceResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/AbstractResourceResolver.java @@ -23,6 +23,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; /** * Base class for {@link org.springframework.web.servlet.resource.ResourceResolver} @@ -58,6 +59,7 @@ public abstract class AbstractResourceResolver implements ResourceResolver { } + @Nullable protected abstract Resource resolveResourceInternal(HttpServletRequest request, String requestPath, List locations, ResourceResolverChain chain); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/DefaultResourceTransformerChain.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/DefaultResourceTransformerChain.java index 7cbb46bfa11..8209d67472f 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/DefaultResourceTransformerChain.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/DefaultResourceTransformerChain.java @@ -22,6 +22,7 @@ import java.util.List; import javax.servlet.http.HttpServletRequest; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -71,6 +72,7 @@ class DefaultResourceTransformerChain implements ResourceTransformerChain { } } + @Nullable private ResourceTransformer getNext() { Assert.state(this.index <= this.transformers.size(), "Current index exceeds the number of configured ResourceTransformer's"); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/PathResourceResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/PathResourceResolver.java index 2119b7a7a06..9cd8beb2f59 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/PathResourceResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/PathResourceResolver.java @@ -20,11 +20,13 @@ import java.io.IOException; import java.net.URLDecoder; import java.util.Arrays; import java.util.List; + import javax.servlet.http.HttpServletRequest; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.core.io.UrlResource; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; import org.springframework.web.context.support.ServletContextResource; @@ -85,6 +87,7 @@ public class PathResourceResolver extends AbstractResourceResolver { return (StringUtils.hasText(resourcePath) && getResource(resourcePath, locations) != null ? resourcePath : null); } + @Nullable private Resource getResource(String resourcePath, List locations) { for (Resource location : locations) { try { @@ -117,6 +120,7 @@ public class PathResourceResolver extends AbstractResourceResolver { * @param location the location to check * @return the resource, or {@code null} if none found */ + @Nullable protected Resource getResource(String resourcePath, Resource location) throws IOException { Resource resource = location.createRelative(resourcePath); if (resource.exists() && resource.isReadable()) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java index 1d268c1565b..bea87e00dc7 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; + import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -40,6 +41,7 @@ import org.springframework.http.converter.ResourceHttpMessageConverter; import org.springframework.http.converter.ResourceRegionHttpMessageConverter; import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.http.server.ServletServerHttpResponse; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; @@ -391,6 +393,7 @@ public class ResourceHttpRequestHandler extends WebContentGenerator } } + @Nullable protected Resource getResource(HttpServletRequest request) throws IOException { String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); if (path == null) { @@ -511,6 +514,7 @@ public class ResourceHttpRequestHandler extends WebContentGenerator * @param resource the resource to check * @return the corresponding media type, or {@code null} if none found */ + @Nullable protected MediaType getMediaType(HttpServletRequest request, Resource resource) { return this.contentNegotiationStrategy.getMediaTypeForResource(resource); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceResolver.java index d9a974129de..f1555287d04 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceResolver.java @@ -17,9 +17,11 @@ package org.springframework.web.servlet.resource; import java.util.List; + import javax.servlet.http.HttpServletRequest; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; /** * A strategy for resolving a request to a server-side resource. @@ -45,6 +47,7 @@ public interface ResourceResolver { * @param chain the chain of remaining resolvers to delegate to * @return the resolved resource or {@code null} if unresolved */ + @Nullable Resource resolveResource(HttpServletRequest request, String requestPath, List locations, ResourceResolverChain chain); @@ -58,6 +61,7 @@ public interface ResourceResolver { * @param chain the chain of resolvers to delegate to * @return the resolved public URL path or {@code null} if unresolved */ + @Nullable String resolveUrlPath(String resourcePath, List locations, ResourceResolverChain chain); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceResolverChain.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceResolverChain.java index 65a03a2436b..e12e49b90b1 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceResolverChain.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceResolverChain.java @@ -17,9 +17,11 @@ package org.springframework.web.servlet.resource; import java.util.List; + import javax.servlet.http.HttpServletRequest; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; /** * A contract for invoking a chain of {@link ResourceResolver}s where each resolver @@ -40,6 +42,7 @@ public interface ResourceResolverChain { * @param locations the locations to search in when looking up resources * @return the resolved resource or {@code null} if unresolved */ + @Nullable Resource resolveResource(HttpServletRequest request, String requestPath, List locations); /** @@ -51,6 +54,7 @@ public interface ResourceResolverChain { * @param locations the locations to search in when looking up resources * @return the resolved public URL path or {@code null} if unresolved */ + @Nullable String resolveUrlPath(String resourcePath, List locations); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceTransformerSupport.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceTransformerSupport.java index de6b7758373..41a1255993a 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceTransformerSupport.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceTransformerSupport.java @@ -20,6 +20,7 @@ import java.util.Collections; import javax.servlet.http.HttpServletRequest; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; /** @@ -65,6 +66,7 @@ public abstract class ResourceTransformerSupport implements ResourceTransformer * @param transformerChain the transformer chain * @return the resolved URL or null */ + @Nullable protected String resolveUrlPath(String resourcePath, HttpServletRequest request, Resource resource, ResourceTransformerChain transformerChain) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceUrlProvider.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceUrlProvider.java index bf74842dad4..b75b37cde26 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceUrlProvider.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceUrlProvider.java @@ -32,6 +32,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.core.annotation.AnnotationAwareOrderComparator; +import org.springframework.lang.Nullable; import org.springframework.util.AntPathMatcher; import org.springframework.util.PathMatcher; import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; @@ -169,6 +170,7 @@ public class ResourceUrlProvider implements ApplicationListener matchingPatterns = new ArrayList<>(); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/WebJarsResourceResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/WebJarsResourceResolver.java index 71c2a490e56..d0253e4563b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/WebJarsResourceResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/WebJarsResourceResolver.java @@ -23,6 +23,7 @@ import javax.servlet.http.HttpServletRequest; import org.webjars.WebJarAssetLocator; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; /** * A {@code ResourceResolver} that delegates to the chain to locate a resource and then @@ -98,6 +99,7 @@ public class WebJarsResourceResolver extends AbstractResourceResolver { return path; } + @Nullable protected String findWebJarResourcePath(String path) { int startOffset = (path.startsWith("/") ? 1 : 0); int endOffset = path.indexOf("/", 1); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/package-info.java index 04c78d3e50f..89c174b3c62 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/package-info.java @@ -1,4 +1,7 @@ /** * Support classes for serving static resources. */ +@NonNullApi package org.springframework.web.servlet.resource; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/AbstractAnnotationConfigDispatcherServletInitializer.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/AbstractAnnotationConfigDispatcherServletInitializer.java index 20b2b9e45b4..08485446191 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/AbstractAnnotationConfigDispatcherServletInitializer.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/AbstractAnnotationConfigDispatcherServletInitializer.java @@ -16,6 +16,7 @@ package org.springframework.web.servlet.support; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; @@ -49,6 +50,7 @@ public abstract class AbstractAnnotationConfigDispatcherServletInitializer * Returns {@code null} if {@link #getRootConfigClasses()} returns {@code null}. */ @Override + @Nullable protected WebApplicationContext createRootApplicationContext() { Class[] configClasses = getRootConfigClasses(); if (!ObjectUtils.isEmpty(configClasses)) { @@ -83,6 +85,7 @@ public abstract class AbstractAnnotationConfigDispatcherServletInitializer * @return the configuration classes for the root application context, or {@code null} * if creation and registration of a root context is not desired */ + @Nullable protected abstract Class[] getRootConfigClasses(); /** @@ -93,6 +96,7 @@ public abstract class AbstractAnnotationConfigDispatcherServletInitializer * @return the configuration classes for the dispatcher servlet application context or * {@code null} if all configuration is specified through root config classes. */ + @Nullable protected abstract Class[] getServletConfigClasses(); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/AbstractDispatcherServletInitializer.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/AbstractDispatcherServletInitializer.java index 3fe22004efd..1700d95765c 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/AbstractDispatcherServletInitializer.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/AbstractDispatcherServletInitializer.java @@ -17,6 +17,7 @@ package org.springframework.web.servlet.support; import java.util.EnumSet; + import javax.servlet.DispatcherType; import javax.servlet.Filter; import javax.servlet.FilterRegistration; @@ -27,6 +28,7 @@ import javax.servlet.ServletRegistration; import org.springframework.context.ApplicationContextInitializer; import org.springframework.core.Conventions; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.web.context.AbstractContextLoaderInitializer; @@ -150,6 +152,7 @@ public abstract class AbstractDispatcherServletInitializer extends AbstractConte * @see DispatcherServlet#setContextInitializers * @see #getRootApplicationContextInitializers() */ + @Nullable protected ApplicationContextInitializer[] getServletApplicationContextInitializers() { return null; } @@ -166,6 +169,7 @@ public abstract class AbstractDispatcherServletInitializer extends AbstractConte * @return an array of filters or {@code null} * @see #registerServletFilter(ServletContext, Filter) */ + @Nullable protected Filter[] getServletFilters() { return null; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/AbstractFlashMapManager.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/AbstractFlashMapManager.java index 0cc4d99ef87..b4a139e24cd 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/AbstractFlashMapManager.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/AbstractFlashMapManager.java @@ -27,6 +27,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.MultiValueMap; @@ -143,6 +144,7 @@ public abstract class AbstractFlashMapManager implements FlashMapManager { * Return a FlashMap contained in the given list that matches the request. * @return a matching FlashMap or {@code null} */ + @Nullable private FlashMap getMatchingFlashMap(List allMaps, HttpServletRequest request) { List result = new LinkedList<>(); for (FlashMap flashMap : allMaps) { @@ -241,6 +243,7 @@ public abstract class AbstractFlashMapManager implements FlashMapManager { * @param request the current request * @return a List with FlashMap instances, or {@code null} if none found */ + @Nullable protected abstract List retrieveFlashMaps(HttpServletRequest request); /** @@ -262,6 +265,7 @@ public abstract class AbstractFlashMapManager implements FlashMapManager { * @return the mutex to use (may be {@code null} if none applicable) * @since 4.0.3 */ + @Nullable protected Object getFlashMapsMutex(HttpServletRequest request) { return DEFAULT_FLASH_MAPS_MUTEX; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/BindStatus.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/BindStatus.java index dd003191e75..9487cbaf0d6 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/BindStatus.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/BindStatus.java @@ -23,6 +23,7 @@ import java.util.List; import org.springframework.beans.BeanWrapper; import org.springframework.beans.PropertyAccessorFactory; import org.springframework.context.NoSuchMessageException; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; import org.springframework.validation.BindingResult; import org.springframework.validation.Errors; @@ -199,6 +200,7 @@ public class BindStatus { * Note that the complete bind path as required by the bind tag is * "customer.address.street", if bound to a "customer" bean. */ + @Nullable public String getExpression() { return this.expression; } @@ -209,6 +211,7 @@ public class BindStatus { *

    This value will be an HTML-escaped String if the original value * already was a String. */ + @Nullable public Object getValue() { return this.value; } @@ -218,6 +221,7 @@ public class BindStatus { * '{@code getValue().getClass()}' since '{@code getValue()}' may * return '{@code null}'. */ + @Nullable public Class getValueType() { return this.valueType; } @@ -226,6 +230,7 @@ public class BindStatus { * Return the actual value of the field, i.e. the raw property value, * or {@code null} if not available. */ + @Nullable public Object getActualValue() { return this.actualValue; } @@ -258,6 +263,7 @@ public class BindStatus { * Return the error codes for the field or object, if any. * Returns an empty array instead of null if none. */ + @Nullable public String[] getErrorCodes() { return this.errorCodes; } @@ -303,6 +309,7 @@ public class BindStatus { * @return the current Errors instance, or {@code null} if none * @see org.springframework.validation.BindingResult */ + @Nullable public Errors getErrors() { return this.errors; } @@ -312,6 +319,7 @@ public class BindStatus { * is currently bound to. * @return the current PropertyEditor, or {@code null} if none */ + @Nullable public PropertyEditor getEditor() { return this.editor; } @@ -322,6 +330,7 @@ public class BindStatus { * @param valueClass the value class that an editor is needed for * @return the associated PropertyEditor, or {@code null} if none */ + @Nullable public PropertyEditor findEditor(Class valueClass) { return (this.bindingResult != null ? this.bindingResult.findEditor(this.expression, valueClass) : null); } 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 69d5cefe803..4384f6d626a 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 @@ -18,11 +18,14 @@ package org.springframework.web.servlet.support; import java.util.Locale; import java.util.Map; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.jstl.core.Config; +import org.springframework.lang.Nullable; + /** * JSP-aware (and JSTL-aware) subclass of RequestContext, allowing for * population of the context from a {@code javax.servlet.jsp.PageContext}. @@ -55,7 +58,7 @@ public class JspAwareRequestContext extends RequestContext { * @param model the model attributes for the current view * (can be {@code null}, using the request attributes for Errors retrieval) */ - public JspAwareRequestContext(PageContext pageContext, Map model) { + public JspAwareRequestContext(PageContext pageContext, @Nullable Map model) { initContext(pageContext, model); } @@ -66,7 +69,7 @@ public class JspAwareRequestContext extends RequestContext { * @param model the model attributes for the current view * (can be {@code null}, using the request attributes for Errors retrieval) */ - protected void initContext(PageContext pageContext, Map model) { + protected void initContext(PageContext pageContext, @Nullable Map model) { if (!(pageContext.getRequest() instanceof HttpServletRequest)) { throw new IllegalArgumentException("RequestContext only supports HTTP requests"); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/JstlUtils.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/JstlUtils.java index 959ba68d3ac..0a9a8b6d812 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/JstlUtils.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/JstlUtils.java @@ -19,6 +19,7 @@ package org.springframework.web.servlet.support; import java.util.Locale; import java.util.ResourceBundle; import java.util.TimeZone; + import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @@ -28,6 +29,7 @@ import javax.servlet.jsp.jstl.fmt.LocalizationContext; import org.springframework.context.MessageSource; import org.springframework.context.support.MessageSourceResourceBundle; import org.springframework.context.support.ResourceBundleMessageSource; +import org.springframework.lang.Nullable; /** * Helper class for preparing JSTL views, @@ -77,7 +79,7 @@ public abstract class JstlUtils { * typically the current ApplicationContext (may be {@code null}) * @see #exposeLocalizationContext(RequestContext) */ - public static void exposeLocalizationContext(HttpServletRequest request, MessageSource messageSource) { + public static void exposeLocalizationContext(HttpServletRequest request, @Nullable MessageSource messageSource) { Locale jstlLocale = RequestContextUtils.getLocale(request); Config.set(request, Config.FMT_LOCALE, jstlLocale); TimeZone timeZone = RequestContextUtils.getTimeZone(request); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContext.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContext.java index a6e7156f5dc..67152102e94 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContext.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContext.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TimeZone; + import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -33,6 +34,7 @@ import org.springframework.context.NoSuchMessageException; import org.springframework.context.i18n.LocaleContext; import org.springframework.context.i18n.SimpleTimeZoneAwareLocaleContext; import org.springframework.context.i18n.TimeZoneAwareLocaleContext; +import org.springframework.lang.Nullable; import org.springframework.ui.context.Theme; import org.springframework.ui.context.ThemeSource; import org.springframework.ui.context.support.ResourceBundleThemeSource; @@ -160,7 +162,7 @@ public class RequestContext { * @see org.springframework.web.context.WebApplicationContext * @see org.springframework.web.servlet.DispatcherServlet */ - public RequestContext(HttpServletRequest request, ServletContext servletContext) { + public RequestContext(HttpServletRequest request, @Nullable ServletContext servletContext) { initContext(request, null, servletContext, null); } @@ -175,7 +177,7 @@ public class RequestContext { * @see org.springframework.web.servlet.DispatcherServlet * @see #RequestContext(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.ServletContext, Map) */ - public RequestContext(HttpServletRequest request, Map model) { + public RequestContext(HttpServletRequest request, @Nullable Map model) { initContext(request, null, null, model); } @@ -193,8 +195,8 @@ public class RequestContext { * @see org.springframework.web.context.WebApplicationContext * @see org.springframework.web.servlet.DispatcherServlet */ - public RequestContext(HttpServletRequest request, HttpServletResponse response, ServletContext servletContext, - Map model) { + public RequestContext(HttpServletRequest request, HttpServletResponse response, @Nullable ServletContext servletContext, + @Nullable Map model) { initContext(request, response, servletContext, model); } @@ -220,8 +222,8 @@ public class RequestContext { * @see org.springframework.web.servlet.DispatcherServlet#LOCALE_RESOLVER_ATTRIBUTE * @see org.springframework.web.servlet.DispatcherServlet#THEME_RESOLVER_ATTRIBUTE */ - protected void initContext(HttpServletRequest request, HttpServletResponse response, ServletContext servletContext, - Map model) { + protected void initContext(HttpServletRequest request, HttpServletResponse response, @Nullable ServletContext servletContext, + @Nullable Map model) { this.request = request; this.response = response; @@ -299,6 +301,7 @@ public class RequestContext { * session or application scope; returns {@code null} if not found. * @return the fallback time zone (or {@code null} if none derivable from the request) */ + @Nullable protected TimeZone getFallbackTimeZone() { if (jstlPresent) { TimeZone timeZone = JstlLocaleResolver.getJstlTimeZone(getRequest(), getServletContext()); @@ -314,6 +317,7 @@ public class RequestContext { *

    The default implementation returns the default theme (with name "theme"). * @return the fallback theme (never {@code null}) */ + @Nullable protected Theme getFallbackTheme() { ThemeSource themeSource = RequestContextUtils.getThemeSource(getRequest()); if (themeSource == null) { @@ -359,6 +363,7 @@ public class RequestContext { * Return the model Map that this RequestContext encapsulates, if any. * @return the populated model Map, or {@code null} if none available */ + @Nullable public final Map getModel() { return this.model; } @@ -379,6 +384,7 @@ public class RequestContext { * Also includes a fallback check for JSTL's TimeZone attribute. * @see RequestContextUtils#getTimeZone */ + @Nullable public TimeZone getTimeZone() { return this.timeZone; } @@ -534,6 +540,7 @@ public class RequestContext { * WebApplicationContext under the name {@code "requestDataValueProcessor"}. * Or {@code null} if no matching bean was found. */ + @Nullable public RequestDataValueProcessor getRequestDataValueProcessor() { return this.requestDataValueProcessor; } @@ -639,7 +646,7 @@ public class RequestContext { * @param defaultMessage String to return if the lookup fails * @return the message */ - public String getMessage(String code, Object[] args, String defaultMessage) { + public String getMessage(String code, @Nullable Object[] args, String defaultMessage) { return getMessage(code, args, defaultMessage, isDefaultHtmlEscape()); } @@ -650,7 +657,7 @@ public class RequestContext { * @param defaultMessage String to return if the lookup fails * @return the message */ - public String getMessage(String code, List args, String defaultMessage) { + public String getMessage(String code, @Nullable List args, String defaultMessage) { return getMessage(code, (args != null ? args.toArray() : null), defaultMessage, isDefaultHtmlEscape()); } @@ -662,7 +669,7 @@ public class RequestContext { * @param htmlEscape HTML escape the message? * @return the message */ - public String getMessage(String code, Object[] args, String defaultMessage, boolean htmlEscape) { + public String getMessage(String code, @Nullable Object[] args, String defaultMessage, boolean htmlEscape) { String msg = this.webApplicationContext.getMessage(code, args, defaultMessage, this.locale); return (htmlEscape ? HtmlUtils.htmlEscape(msg) : msg); } @@ -684,7 +691,7 @@ public class RequestContext { * @return the message * @throws org.springframework.context.NoSuchMessageException if not found */ - public String getMessage(String code, Object[] args) throws NoSuchMessageException { + public String getMessage(String code, @Nullable Object[] args) throws NoSuchMessageException { return getMessage(code, args, isDefaultHtmlEscape()); } @@ -695,7 +702,7 @@ public class RequestContext { * @return the message * @throws org.springframework.context.NoSuchMessageException if not found */ - public String getMessage(String code, List args) throws NoSuchMessageException { + public String getMessage(String code, @Nullable List args) throws NoSuchMessageException { return getMessage(code, (args != null ? args.toArray() : null), isDefaultHtmlEscape()); } @@ -707,7 +714,7 @@ public class RequestContext { * @return the message * @throws org.springframework.context.NoSuchMessageException if not found */ - public String getMessage(String code, Object[] args, boolean htmlEscape) throws NoSuchMessageException { + public String getMessage(String code, @Nullable Object[] args, boolean htmlEscape) throws NoSuchMessageException { String msg = this.webApplicationContext.getMessage(code, args, this.locale); return (htmlEscape ? HtmlUtils.htmlEscape(msg) : msg); } @@ -755,7 +762,7 @@ public class RequestContext { * @param defaultMessage String to return if the lookup fails * @return the message */ - public String getThemeMessage(String code, Object[] args, String defaultMessage) { + public String getThemeMessage(String code, @Nullable Object[] args, String defaultMessage) { return getTheme().getMessageSource().getMessage(code, args, defaultMessage, this.locale); } @@ -768,7 +775,7 @@ public class RequestContext { * @param defaultMessage String to return if the lookup fails * @return the message */ - public String getThemeMessage(String code, List args, String defaultMessage) { + public String getThemeMessage(String code, @Nullable List args, String defaultMessage) { return getTheme().getMessageSource().getMessage(code, (args != null ? args.toArray() : null), defaultMessage, this.locale); } @@ -794,7 +801,7 @@ public class RequestContext { * @return the message * @throws org.springframework.context.NoSuchMessageException if not found */ - public String getThemeMessage(String code, Object[] args) throws NoSuchMessageException { + public String getThemeMessage(String code, @Nullable Object[] args) throws NoSuchMessageException { return getTheme().getMessageSource().getMessage(code, args, this.locale); } @@ -807,7 +814,7 @@ public class RequestContext { * @return the message * @throws org.springframework.context.NoSuchMessageException if not found */ - public String getThemeMessage(String code, List args) throws NoSuchMessageException { + public String getThemeMessage(String code, @Nullable List args) throws NoSuchMessageException { return getTheme().getMessageSource().getMessage(code, (args != null ? args.toArray() : null), this.locale); } @@ -828,6 +835,7 @@ public class RequestContext { * @param name name of the bind object * @return the Errors instance, or {@code null} if not found */ + @Nullable public Errors getErrors(String name) { return getErrors(name, isDefaultHtmlEscape()); } @@ -838,6 +846,7 @@ public class RequestContext { * @param htmlEscape create an Errors instance with automatic HTML escaping? * @return the Errors instance, or {@code null} if not found */ + @Nullable public Errors getErrors(String name, boolean htmlEscape) { if (this.errorsMap == null) { this.errorsMap = new HashMap<>(); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContextUtils.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContextUtils.java index c9c7590f887..f97f8b0a5bb 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContextUtils.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContextUtils.java @@ -19,6 +19,7 @@ package org.springframework.web.servlet.support; import java.util.Locale; import java.util.Map; import java.util.TimeZone; + import javax.servlet.ServletContext; import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; @@ -26,6 +27,7 @@ import javax.servlet.http.HttpServletResponse; import org.springframework.context.i18n.LocaleContext; import org.springframework.context.i18n.TimeZoneAwareLocaleContext; +import org.springframework.lang.Nullable; import org.springframework.ui.context.Theme; import org.springframework.ui.context.ThemeSource; import org.springframework.util.Assert; @@ -81,6 +83,7 @@ public abstract class RequestContextUtils { * @see WebApplicationContextUtils#getWebApplicationContext(ServletContext) * @see ContextLoader#getCurrentWebApplicationContext() */ + @Nullable public static WebApplicationContext findWebApplicationContext( HttpServletRequest request, ServletContext servletContext) { @@ -112,6 +115,7 @@ public abstract class RequestContextUtils { * @see ServletRequest#getServletContext() * @see ContextLoader#getCurrentWebApplicationContext() */ + @Nullable public static WebApplicationContext findWebApplicationContext(HttpServletRequest request) { return findWebApplicationContext(request, request.getServletContext()); } @@ -122,6 +126,7 @@ public abstract class RequestContextUtils { * @param request current HTTP request * @return the current LocaleResolver, or {@code null} if not found */ + @Nullable public static LocaleResolver getLocaleResolver(HttpServletRequest request) { return (LocaleResolver) request.getAttribute(DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE); } @@ -163,6 +168,7 @@ public abstract class RequestContextUtils { * @see #getLocaleResolver * @see org.springframework.context.i18n.LocaleContextHolder#getTimeZone() */ + @Nullable public static TimeZone getTimeZone(HttpServletRequest request) { LocaleResolver localeResolver = getLocaleResolver(request); if (localeResolver instanceof LocaleContextResolver) { @@ -180,6 +186,7 @@ public abstract class RequestContextUtils { * @param request current HTTP request * @return the current ThemeResolver, or {@code null} if not found */ + @Nullable public static ThemeResolver getThemeResolver(HttpServletRequest request) { return (ThemeResolver) request.getAttribute(DispatcherServlet.THEME_RESOLVER_ATTRIBUTE); } @@ -201,6 +208,7 @@ public abstract class RequestContextUtils { * @return the current theme, or {@code null} if not found * @see #getThemeResolver */ + @Nullable public static Theme getTheme(HttpServletRequest request) { ThemeResolver themeResolver = getThemeResolver(request); ThemeSource themeSource = getThemeSource(request); @@ -220,6 +228,7 @@ public abstract class RequestContextUtils { * @see FlashMap */ @SuppressWarnings("unchecked") + @Nullable public static Map getInputFlashMap(HttpServletRequest request) { return (Map) request.getAttribute(DispatcherServlet.INPUT_FLASH_MAP_ATTRIBUTE); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestDataValueProcessor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestDataValueProcessor.java index d78c80015f3..967db3b9aa0 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestDataValueProcessor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestDataValueProcessor.java @@ -17,8 +17,11 @@ package org.springframework.web.servlet.support; import java.util.Map; + import javax.servlet.http.HttpServletRequest; +import org.springframework.lang.Nullable; + /** * A contract for inspecting and potentially modifying request data values such * as URL query parameters or form field values before they are rendered by a @@ -61,6 +64,7 @@ public interface RequestDataValueProcessor { * @param request the current request * @return additional hidden form fields to be added, or {@code null} */ + @Nullable Map getExtraHiddenFields(HttpServletRequest request); /** diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/ServletUriComponentsBuilder.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/ServletUriComponentsBuilder.java index f39c12a45bc..8cc802ba4f4 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/ServletUriComponentsBuilder.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/ServletUriComponentsBuilder.java @@ -17,10 +17,12 @@ package org.springframework.web.servlet.support; import java.util.Enumeration; + import javax.servlet.http.HttpServletRequest; import org.springframework.http.HttpRequest; import org.springframework.http.server.ServletServerHttpRequest; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; import org.springframework.web.context.request.RequestAttributes; @@ -212,6 +214,7 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder { * @return the removed path extension for possible re-use, or {@code null} * @since 4.0 */ + @Nullable public String removePathExtension() { String extension = null; if (this.originalPath != null) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/package-info.java index 66deafef017..ac384bde84d 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/package-info.java @@ -3,4 +3,7 @@ * Provides easy evaluation of the request context in views, * and miscellaneous HandlerInterceptor implementations. */ +@NonNullApi package org.springframework.web.servlet.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/BindTag.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/BindTag.java index e773e2a29f2..5481cc53e37 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/BindTag.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/BindTag.java @@ -17,9 +17,11 @@ package org.springframework.web.servlet.tags; import java.beans.PropertyEditor; + import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.PageContext; +import org.springframework.lang.Nullable; import org.springframework.validation.Errors; import org.springframework.web.servlet.support.BindStatus; @@ -155,6 +157,7 @@ public class BindTag extends HtmlEscapingAwareTag implements EditorAwareTag { * @return the property that this tag is currently bound to, * or {@code null} if none */ + @Nullable public final String getProperty() { return this.status.getExpression(); } @@ -164,6 +167,7 @@ public class BindTag extends HtmlEscapingAwareTag implements EditorAwareTag { * Intended for cooperating nesting tags. * @return the current Errors instance, or {@code null} if none */ + @Nullable public final Errors getErrors() { return this.status.getErrors(); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/EditorAwareTag.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/EditorAwareTag.java index 384e75f6dcc..a5dc589e702 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/EditorAwareTag.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/EditorAwareTag.java @@ -17,8 +17,11 @@ package org.springframework.web.servlet.tags; import java.beans.PropertyEditor; + import javax.servlet.jsp.JspException; +import org.springframework.lang.Nullable; + /** * Interface to be implemented by JSP tags that expose a * PropertyEditor for a property that they are currently bound to. @@ -36,6 +39,7 @@ public interface EditorAwareTag { * @return the current PropertyEditor, or {@code null} if none * @throws JspException if resolving the editor failed */ + @Nullable PropertyEditor getEditor() throws JspException; } 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 eb1bbba3b03..703bba3019a 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 @@ -26,6 +26,7 @@ import javax.servlet.jsp.JspTagException; import org.springframework.context.MessageSource; import org.springframework.context.MessageSourceResolvable; import org.springframework.context.NoSuchMessageException; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import org.springframework.web.util.JavaScriptUtils; @@ -264,6 +265,7 @@ public class MessageTag extends HtmlEscapingAwareTag implements ArgumentAware { * @throws JspException if argument conversion failed * @see #setArguments */ + @Nullable protected Object[] resolveArguments(Object arguments) throws JspException { if (arguments instanceof String) { String[] stringArray = diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/AbstractDataBoundFormElementTag.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/AbstractDataBoundFormElementTag.java index 8a9b82528c5..682d7915180 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/AbstractDataBoundFormElementTag.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/AbstractDataBoundFormElementTag.java @@ -17,12 +17,14 @@ package org.springframework.web.servlet.tags.form; import java.beans.PropertyEditor; + import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import org.springframework.beans.PropertyAccessor; +import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; import org.springframework.web.servlet.support.BindStatus; import org.springframework.web.servlet.support.RequestDataValueProcessor; @@ -123,6 +125,7 @@ public abstract class AbstractDataBoundFormElementTag extends AbstractFormTag im * @see #getId() * @see #autogenerateId() */ + @Nullable protected String resolveId() throws JspException { Object id = evaluate("id", getId()); if (id != null) { @@ -137,6 +140,7 @@ public abstract class AbstractDataBoundFormElementTag extends AbstractFormTag im *

    The default implementation simply delegates to {@link #getName()}, * deleting invalid characters (such as "[" or "]"). */ + @Nullable protected String autogenerateId() throws JspException { return StringUtils.deleteAny(getName(), "[]"); } @@ -150,6 +154,7 @@ public abstract class AbstractDataBoundFormElementTag extends AbstractFormTag im * the value of the '{@code name}' attribute without changing the bind path. * @return the value for the HTML '{@code name}' attribute */ + @Nullable protected String getName() throws JspException { return getPropertyPath(); } @@ -200,6 +205,7 @@ public abstract class AbstractDataBoundFormElementTag extends AbstractFormTag im /** * Get the {@link PropertyEditor}, if any, in use for value bound to this tag. */ + @Nullable protected PropertyEditor getPropertyEditor() throws JspException { return getBindStatus().getEditor(); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/AbstractFormTag.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/AbstractFormTag.java index 8227f35353c..1fbc7e64f41 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/AbstractFormTag.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/AbstractFormTag.java @@ -17,8 +17,10 @@ package org.springframework.web.servlet.tags.form; import java.beans.PropertyEditor; + import javax.servlet.jsp.JspException; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; import org.springframework.web.servlet.tags.HtmlEscapingAwareTag; @@ -56,7 +58,7 @@ public abstract class AbstractFormTag extends HtmlEscapingAwareTag { * or empty, no attribute is written. * @see TagWriter#writeOptionalAttributeValue(String, String) */ - protected final void writeOptionalAttribute(TagWriter tagWriter, String attributeName, String value) + protected final void writeOptionalAttribute(TagWriter tagWriter, String attributeName, @Nullable String value) throws JspException { if (value != null) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/ErrorsTag.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/ErrorsTag.java index a55e203acf0..054011d7dbb 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/ErrorsTag.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/ErrorsTag.java @@ -19,6 +19,7 @@ package org.springframework.web.servlet.tags.form; import java.util.ArrayList; import java.util.Arrays; import java.util.List; + import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.BodyTag; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/TagWriter.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/TagWriter.java index 0f723d1a48b..f4b83ccf64e 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/TagWriter.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/TagWriter.java @@ -19,9 +19,11 @@ package org.springframework.web.servlet.tags.form; import java.io.IOException; import java.io.Writer; import java.util.Stack; + import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -100,7 +102,7 @@ public class TagWriter { * or zero length. * @see #writeAttribute(String, String) */ - public void writeOptionalAttributeValue(String attributeName, String attributeValue) throws JspException { + public void writeOptionalAttributeValue(String attributeName, @Nullable String attributeValue) throws JspException { if (StringUtils.hasText(attributeValue)) { writeAttribute(attributeName, attributeValue); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/package-info.java index e132e7070e5..467feafe30c 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/package-info.java @@ -3,4 +3,7 @@ * Supports JSP view implementations within Spring's web MVC framework. * See {@code spring.tld} for descriptions of the various tags. */ +@NonNullApi package org.springframework.web.servlet.tags; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/theme/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/theme/package-info.java index d3f409797be..b4ff12b15d6 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/theme/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/theme/package-info.java @@ -17,4 +17,7 @@ *

  • The {@code pagedlist} demo application uses themes
  • * */ +@NonNullApi package org.springframework.web.servlet.theme; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/AbstractCachingViewResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/AbstractCachingViewResolver.java index a9653bb323b..52e69919db6 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/AbstractCachingViewResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/AbstractCachingViewResolver.java @@ -20,9 +20,11 @@ import java.util.LinkedHashMap; import java.util.Locale; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.lang.Nullable; import org.springframework.web.context.support.WebApplicationObjectSupport; import org.springframework.web.servlet.View; import org.springframework.web.servlet.ViewResolver; @@ -240,6 +242,7 @@ public abstract class AbstractCachingViewResolver extends WebApplicationObjectSu * @throws Exception if the view couldn't be resolved * @see #loadView */ + @Nullable protected View createView(String viewName, Locale locale) throws Exception { return loadView(viewName, locale); } @@ -257,6 +260,7 @@ public abstract class AbstractCachingViewResolver extends WebApplicationObjectSu * @throws Exception if the view couldn't be resolved * @see #resolveViewName */ + @Nullable protected abstract View loadView(String viewName, Locale locale) throws Exception; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/AbstractView.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/AbstractView.java index e746c5f5b07..9733c6c1697 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/AbstractView.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/AbstractView.java @@ -32,6 +32,7 @@ import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.BeanNameAware; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; import org.springframework.web.context.support.ContextExposingHttpServletRequest; import org.springframework.web.context.support.WebApplicationObjectSupport; @@ -127,6 +128,7 @@ public abstract class AbstractView extends WebApplicationObjectSupport implement /** * Return the name of the RequestContext attribute, if any. */ + @Nullable public String getRequestContextAttribute() { return this.requestContextAttribute; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java index 71a47d3b5ec..1ba64f6ea28 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java @@ -33,6 +33,7 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.core.Ordered; import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -240,6 +241,7 @@ public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport * @param request the current servlet request * @return the list of media types requested, if any */ + @Nullable protected List getMediaTypes(HttpServletRequest request) { try { ServletWebRequest webRequest = new ServletWebRequest(request); @@ -317,6 +319,7 @@ public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport return candidateViews; } + @Nullable private View getBestView(List candidateViews, List requestedMediaTypes, RequestAttributes attrs) { for (View candidateView : candidateViews) { if (candidateView instanceof SmartView) { 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 5d126856fdb..9c25542793f 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 @@ -20,10 +20,12 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.Properties; + import javax.servlet.http.HttpServletResponse; import org.springframework.beans.BeanUtils; import org.springframework.core.Ordered; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; import org.springframework.util.PatternMatchUtils; import org.springframework.web.servlet.View; @@ -200,6 +202,7 @@ public class UrlBasedViewResolver extends AbstractCachingViewResolver implements /** * Return the content type for all views, if any. */ + @Nullable protected String getContentType() { return this.contentType; } @@ -288,6 +291,7 @@ public class UrlBasedViewResolver extends AbstractCachingViewResolver implements /** * Return the name of the RequestContext attribute for all views, if any. */ + @Nullable protected String getRequestContextAttribute() { return this.requestContextAttribute; } @@ -343,7 +347,7 @@ public class UrlBasedViewResolver extends AbstractCachingViewResolver implements *
      * @see AbstractView#setExposePathVariables */ - public void setExposePathVariables(Boolean exposePathVariables) { + public void setExposePathVariables(@Nullable Boolean exposePathVariables) { this.exposePathVariables = exposePathVariables; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/document/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/document/package-info.java index 7e4a4b40dc1..c074a1f04ba 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/document/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/document/package-info.java @@ -2,4 +2,7 @@ * Support classes for document generation, * providing View implementations for PDF and Excel. */ +@NonNullApi package org.springframework.web.servlet.view.document; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/feed/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/feed/package-info.java index 802c2e9afd1..6ac449575fe 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/feed/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/feed/package-info.java @@ -2,4 +2,7 @@ * Support classes for feed generation, providing View implementations for Atom and RSS. * Based on the ROME tools project. */ +@NonNullApi package org.springframework.web.servlet.view.feed; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/freemarker/FreeMarkerView.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/freemarker/FreeMarkerView.java index 0b6cc3dc042..0558b942dbf 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/freemarker/FreeMarkerView.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/freemarker/FreeMarkerView.java @@ -52,6 +52,7 @@ import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.BeanInitializationException; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.ApplicationContextException; +import org.springframework.lang.Nullable; import org.springframework.web.servlet.support.RequestContextUtils; import org.springframework.web.servlet.view.AbstractTemplateView; @@ -399,6 +400,7 @@ public class FreeMarkerView extends AbstractTemplateView { } @Override + @Nullable public String getInitParameter(String paramName) { return null; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/freemarker/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/freemarker/package-info.java index 415eef0b202..e7cfa6f28a0 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/freemarker/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/freemarker/package-info.java @@ -4,4 +4,7 @@ * as Spring web view technology. * Contains a View implementation for FreeMarker templates. */ +@NonNullApi package org.springframework.web.servlet.view.freemarker; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/groovy/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/groovy/package-info.java index 74a6188ddec..48600573def 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/groovy/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/groovy/package-info.java @@ -4,4 +4,7 @@ * Groovy Templates as Spring web view technology. * Contains a View implementation for Groovy templates. */ +@NonNullApi package org.springframework.web.servlet.view.groovy; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/json/MappingJackson2JsonView.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/json/MappingJackson2JsonView.java index b365d2c8f70..7656cdd1c0b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/json/MappingJackson2JsonView.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/json/MappingJackson2JsonView.java @@ -34,6 +34,7 @@ import com.fasterxml.jackson.databind.ser.FilterProvider; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.http.converter.json.MappingJacksonValue; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.validation.BindingResult; @@ -173,6 +174,7 @@ public class MappingJackson2JsonView extends AbstractJackson2View { this.jsonpParameterNames = jsonpParameterNames; } + @Nullable private String getJsonpParameterValue(HttpServletRequest request) { if (this.jsonpParameterNames != null) { for (String name : this.jsonpParameterNames) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/json/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/json/package-info.java index 53c24b52e2e..f3a8077e506 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/json/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/json/package-info.java @@ -1,4 +1,7 @@ /** * Support classes for providing a View implementation based on JSON serialization. */ +@NonNullApi package org.springframework.web.servlet.view.json; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/package-info.java index 9dd27b5879b..63a3bb554d2 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/package-info.java @@ -8,4 +8,7 @@ * by subclassing the AbstractView class in this package can be * very helpful if an application has unusual view requirements. */ +@NonNullApi package org.springframework.web.servlet.view; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/script/ScriptTemplateView.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/script/ScriptTemplateView.java index 823f17b3f3d..f9d4ab0b0ed 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/script/ScriptTemplateView.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/script/ScriptTemplateView.java @@ -41,6 +41,7 @@ import org.springframework.context.ApplicationContextException; import org.springframework.core.NamedThreadLocal; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; +import org.springframework.lang.Nullable; import org.springframework.scripting.support.StandardScriptEvalException; import org.springframework.scripting.support.StandardScriptUtils; import org.springframework.util.Assert; @@ -311,6 +312,7 @@ public class ScriptTemplateView extends AbstractUrlBasedView { } } + @Nullable protected Resource getResource(String location) { for (String path : this.resourceLoaderPaths) { Resource resource = this.resourceLoader.getResource(path + location); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/script/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/script/package-info.java index 141d353730d..4d01c8d4ced 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/script/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/script/package-info.java @@ -3,4 +3,7 @@ * (as included in Java 6+), e.g. using JavaScript via Nashorn on JDK 8. * Contains a View implementation for scripted templates. */ +@NonNullApi package org.springframework.web.servlet.view.script; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/tiles3/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/tiles3/package-info.java index 8934e376a99..9905c3fe0ad 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/tiles3/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/tiles3/package-info.java @@ -4,4 +4,7 @@ * (the standalone version of Tiles) as Spring web view technology. * Contains a View implementation for Tiles definitions. */ +@NonNullApi package org.springframework.web.servlet.view.tiles3; + +import org.springframework.lang.NonNullApi; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xml/MarshallingView.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xml/MarshallingView.java index 582807358bd..a39cd13b41b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xml/MarshallingView.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xml/MarshallingView.java @@ -18,11 +18,13 @@ package org.springframework.web.servlet.view.xml; import java.io.ByteArrayOutputStream; import java.util.Map; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.bind.JAXBElement; import javax.xml.transform.stream.StreamResult; +import org.springframework.lang.Nullable; import org.springframework.oxm.Marshaller; import org.springframework.util.Assert; import org.springframework.validation.BindingResult; @@ -123,6 +125,7 @@ public class MarshallingView extends AbstractView { * {@linkplain #setModelKey(String) model key} is not supported by the marshaller * @see #setModelKey(String) */ + @Nullable protected Object locateToBeMarshalled(Map model) throws IllegalStateException { if (this.modelKey != null) { Object value = model.get(this.modelKey); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xml/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xml/package-info.java index d6cb9c7f3d2..fe2e0281269 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xml/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xml/package-info.java @@ -1,4 +1,7 @@ /** * Support classes for providing a View implementation based on XML Marshalling. */ +@NonNullApi package org.springframework.web.servlet.view.xml; + +import org.springframework.lang.NonNullApi; 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 0cf770d4b61..5bf371aa4d7 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 @@ -22,6 +22,7 @@ import java.io.Reader; import java.util.Enumeration; import java.util.Map; import java.util.Properties; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.transform.ErrorListener; @@ -44,6 +45,7 @@ import org.w3c.dom.Node; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContextException; import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; @@ -194,7 +196,7 @@ public class XsltView extends AbstractUrlBasedView { * @see #setTransformerFactoryClass * @see #getTransformerFactory() */ - protected TransformerFactory newTransformerFactory(Class transformerFactoryClass) { + protected TransformerFactory newTransformerFactory(@Nullable Class transformerFactoryClass) { if (transformerFactoryClass != null) { try { return ReflectionUtils.accessibleConstructor(transformerFactoryClass).newInstance(); @@ -267,6 +269,7 @@ public class XsltView extends AbstractUrlBasedView { * @see #setSourceKey * @see #convertSource */ + @Nullable protected Source locateSource(Map model) throws Exception { if (this.sourceKey != null) { return convertSource(model.get(this.sourceKey)); @@ -468,7 +471,7 @@ public class XsltView extends AbstractUrlBasedView { *

      Only works for {@link StreamSource StreamSources}. * @param source the XSLT Source to close (may be {@code null}) */ - private void closeSourceIfNecessary(Source source) { + private void closeSourceIfNecessary(@Nullable Source source) { if (source instanceof StreamSource) { StreamSource streamSource = (StreamSource) source; if (streamSource.getReader() != null) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xslt/package-info.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xslt/package-info.java index 4203e0f9893..aad6d770839 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xslt/package-info.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/xslt/package-info.java @@ -2,4 +2,7 @@ * Support classes for XSLT, * providing a View implementation for XSLT stylesheets. */ +@NonNullApi package org.springframework.web.servlet.view.xslt; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/CloseStatus.java b/spring-websocket/src/main/java/org/springframework/web/socket/CloseStatus.java index c34307370ec..ba380390fb5 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/CloseStatus.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/CloseStatus.java @@ -16,6 +16,7 @@ package org.springframework.web.socket; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -177,6 +178,7 @@ public final class CloseStatus { /** * Return the reason, or {@code null} if none. */ + @Nullable public String getReason() { return this.reason; } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/WebSocketSession.java b/spring-websocket/src/main/java/org/springframework/web/socket/WebSocketSession.java index d212b9596b1..cad0cef7fce 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/WebSocketSession.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/WebSocketSession.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; import org.springframework.http.HttpHeaders; +import org.springframework.lang.Nullable; /** * A WebSocket session abstraction. Allows sending messages over a WebSocket @@ -71,6 +72,7 @@ public interface WebSocketSession extends Closeable { /** * Return the address on which the request was received. */ + @Nullable InetSocketAddress getLocalAddress(); /** @@ -83,6 +85,7 @@ public interface WebSocketSession extends Closeable { * @return the protocol identifier, or {@code null} if no protocol * was specified or negotiated successfully */ + @Nullable String getAcceptedProtocol(); /** diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/adapter/NativeWebSocketSession.java b/spring-websocket/src/main/java/org/springframework/web/socket/adapter/NativeWebSocketSession.java index ef703279129..b0098f01c6a 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/adapter/NativeWebSocketSession.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/adapter/NativeWebSocketSession.java @@ -16,6 +16,7 @@ package org.springframework.web.socket.adapter; +import org.springframework.lang.Nullable; import org.springframework.web.socket.WebSocketSession; /** @@ -31,6 +32,7 @@ public interface NativeWebSocketSession extends WebSocketSession { * Return the underlying native WebSocketSession, if available. * @return the native session or {@code null} */ + @Nullable Object getNativeSession(); /** @@ -38,6 +40,7 @@ public interface NativeWebSocketSession extends WebSocketSession { * @param requiredType the required type of the session * @return the native session of the required type or {@code null} */ + @Nullable T getNativeSession(Class requiredType); } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/adapter/jetty/JettyWebSocketSession.java b/spring-websocket/src/main/java/org/springframework/web/socket/adapter/jetty/JettyWebSocketSession.java index f36ebe5bacd..6d70c7e83b4 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/adapter/jetty/JettyWebSocketSession.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/adapter/jetty/JettyWebSocketSession.java @@ -31,6 +31,7 @@ import org.eclipse.jetty.websocket.api.WebSocketException; import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig; import org.springframework.http.HttpHeaders; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; import org.springframework.web.socket.BinaryMessage; @@ -81,7 +82,7 @@ public class JettyWebSocketSession extends AbstractWebSocketSession { * @param user the user associated with the session; if {@code null} we'll fallback on the * user available via {@link org.eclipse.jetty.websocket.api.Session#getUpgradeRequest()} */ - public JettyWebSocketSession(Map attributes, Principal user) { + public JettyWebSocketSession(Map attributes, @Nullable Principal user) { super(attributes); this.user = user; } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/adapter/jetty/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/adapter/jetty/package-info.java index bd8564d6579..8d4d0c71b98 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/adapter/jetty/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/adapter/jetty/package-info.java @@ -1,4 +1,7 @@ /** * Adapter classes for the Jetty WebSocket API. */ +@NonNullApi package org.springframework.web.socket.adapter.jetty; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/adapter/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/adapter/package-info.java index 338750e1ef5..b049cd80051 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/adapter/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/adapter/package-info.java @@ -1,4 +1,7 @@ /** * Classes adapting Spring's WebSocket API to and from WebSocket providers. */ +@NonNullApi package org.springframework.web.socket.adapter; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/adapter/standard/ConvertingEncoderDecoderSupport.java b/spring-websocket/src/main/java/org/springframework/web/socket/adapter/standard/ConvertingEncoderDecoderSupport.java index 76aeb7cad83..6b2cc7bbe59 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/adapter/standard/ConvertingEncoderDecoderSupport.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/adapter/standard/ConvertingEncoderDecoderSupport.java @@ -17,6 +17,7 @@ package org.springframework.web.socket.adapter.standard; import java.nio.ByteBuffer; + import javax.websocket.DecodeException; import javax.websocket.Decoder; import javax.websocket.EncodeException; @@ -32,6 +33,7 @@ import org.springframework.core.GenericTypeResolver; import org.springframework.core.convert.ConversionException; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.context.ContextLoader; @@ -122,6 +124,7 @@ public abstract class ConvertingEncoderDecoderSupport { * not using {@link ContextLoader}, this method should be overridden. * @return the {@link ApplicationContext} or {@code null} */ + @Nullable protected ApplicationContext getApplicationContext() { return ContextLoader.getCurrentWebApplicationContext(); } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/adapter/standard/StandardWebSocketSession.java b/spring-websocket/src/main/java/org/springframework/web/socket/adapter/standard/StandardWebSocketSession.java index 84a8228c6b0..06f6452f3dd 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/adapter/standard/StandardWebSocketSession.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/adapter/standard/StandardWebSocketSession.java @@ -24,12 +24,14 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; + import javax.websocket.CloseReason; import javax.websocket.CloseReason.CloseCodes; import javax.websocket.Extension; import javax.websocket.Session; import org.springframework.http.HttpHeaders; +import org.springframework.lang.Nullable; import org.springframework.util.CollectionUtils; import org.springframework.web.socket.BinaryMessage; import org.springframework.web.socket.CloseStatus; @@ -89,7 +91,7 @@ public class StandardWebSocketSession extends AbstractWebSocketSession * fallback on the user available in the underlying WebSocket session */ public StandardWebSocketSession(HttpHeaders headers, Map attributes, - InetSocketAddress localAddress, InetSocketAddress remoteAddress, Principal user) { + InetSocketAddress localAddress, InetSocketAddress remoteAddress, @Nullable Principal user) { super(attributes); headers = (headers != null) ? headers : new HttpHeaders(); diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/adapter/standard/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/adapter/standard/package-info.java index b8c121ae866..752d7f9b5ac 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/adapter/standard/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/adapter/standard/package-info.java @@ -1,4 +1,7 @@ /** * Adapter classes for the standard Java WebSocket API. */ +@NonNullApi package org.springframework.web.socket.adapter.standard; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/jetty/JettyWebSocketClient.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/jetty/JettyWebSocketClient.java index 79e1807a554..f83f29f6662 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/jetty/JettyWebSocketClient.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/jetty/JettyWebSocketClient.java @@ -32,6 +32,7 @@ import org.springframework.core.task.AsyncListenableTaskExecutor; import org.springframework.core.task.SimpleAsyncTaskExecutor; import org.springframework.core.task.TaskExecutor; import org.springframework.http.HttpHeaders; +import org.springframework.lang.Nullable; import org.springframework.util.concurrent.ListenableFuture; import org.springframework.util.concurrent.ListenableFutureTask; import org.springframework.web.socket.WebSocketExtension; @@ -89,7 +90,7 @@ public class JettyWebSocketClient extends AbstractWebSocketClient implements Lif * *

      By default an instance of {@code SimpleAsyncTaskExecutor} is used. */ - public void setTaskExecutor(AsyncListenableTaskExecutor taskExecutor) { + public void setTaskExecutor(@Nullable AsyncListenableTaskExecutor taskExecutor) { this.taskExecutor = taskExecutor; } @@ -192,6 +193,7 @@ public class JettyWebSocketClient extends AbstractWebSocketClient implements Lif * @return the user to make available through {@link WebSocketSession#getPrincipal()}; * by default this method returns {@code null} */ + @Nullable protected Principal getUser() { return null; } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/jetty/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/jetty/package-info.java index 04d236c6c51..6aeae7bd114 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/jetty/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/jetty/package-info.java @@ -1,4 +1,7 @@ /** * Client-side support for the Jetty WebSocket API. */ +@NonNullApi package org.springframework.web.socket.client.jetty; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/package-info.java index c8cea9f47fd..7c946ac3953 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/package-info.java @@ -1,4 +1,7 @@ /** * Client-side abstractions for WebSocket applications. */ +@NonNullApi package org.springframework.web.socket.client; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/StandardWebSocketClient.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/StandardWebSocketClient.java index 908097b7472..0c40e883e14 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/StandardWebSocketClient.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/StandardWebSocketClient.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.concurrent.Callable; + import javax.websocket.ClientEndpointConfig; import javax.websocket.ClientEndpointConfig.Configurator; import javax.websocket.ContainerProvider; @@ -38,6 +39,7 @@ import org.springframework.core.task.AsyncListenableTaskExecutor; import org.springframework.core.task.SimpleAsyncTaskExecutor; import org.springframework.core.task.TaskExecutor; import org.springframework.http.HttpHeaders; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.concurrent.ListenableFuture; import org.springframework.util.concurrent.ListenableFutureTask; @@ -100,6 +102,7 @@ public class StandardWebSocketClient extends AbstractWebSocketClient { /** * The configured user properties, or {@code null}. */ + @Nullable public Map getUserProperties() { return this.userProperties; } @@ -110,7 +113,7 @@ public class StandardWebSocketClient extends AbstractWebSocketClient { * {@code doHandshake} methods will block until the connection is established. *

      By default, an instance of {@code SimpleAsyncTaskExecutor} is used. */ - public void setTaskExecutor(AsyncListenableTaskExecutor taskExecutor) { + public void setTaskExecutor(@Nullable AsyncListenableTaskExecutor taskExecutor) { this.taskExecutor = taskExecutor; } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/package-info.java index 8682f9067bb..90ceabc8bba 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/package-info.java @@ -1,4 +1,7 @@ /** * Client-side classes for use with standard Java WebSocket endpoints. */ +@NonNullApi package org.springframework.web.socket.client.standard; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java b/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java index 206d3dfb749..c1f9ef3e1e7 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/config/MessageBrokerBeanDefinitionParser.java @@ -38,6 +38,7 @@ import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean; +import org.springframework.lang.Nullable; import org.springframework.messaging.converter.ByteArrayMessageConverter; import org.springframework.messaging.converter.CompositeMessageConverter; import org.springframework.messaging.converter.DefaultContentTypeResolver; @@ -260,6 +261,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser { return new RuntimeBeanReference(name); } + @Nullable private RootBeanDefinition getDefaultExecutorBeanDefinition(String channelName) { if (channelName.equals("brokerChannel")) { return null; @@ -545,6 +547,7 @@ class MessageBrokerBeanDefinitionParser implements BeanDefinitionParser { registerBeanDef(beanDef, context, source); } + @Nullable private RuntimeBeanReference getValidator(Element messageBrokerElement, Object source, ParserContext parserContext) { if (messageBrokerElement.hasAttribute("validator")) { return new RuntimeBeanReference(messageBrokerElement.getAttribute("validator")); diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketMessageBrokerStats.java b/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketMessageBrokerStats.java index 0f5bd934e8c..a18318cfca9 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketMessageBrokerStats.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketMessageBrokerStats.java @@ -25,6 +25,7 @@ import java.util.concurrent.TimeUnit; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.lang.Nullable; import org.springframework.messaging.simp.stomp.StompBrokerRelayMessageHandler; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; @@ -75,6 +76,7 @@ public class WebSocketMessageBrokerStats { this.stompSubProtocolHandler = initStompSubProtocolHandler(); } + @Nullable private StompSubProtocolHandler initStompSubProtocolHandler() { for (SubProtocolHandler handler : this.webSocketHandler.getProtocolHandlers()) { if (handler instanceof StompSubProtocolHandler) { @@ -105,6 +107,7 @@ public class WebSocketMessageBrokerStats { this.loggingTask = initLoggingTask(1 * 60 * 1000); } + @Nullable private ScheduledFuture initLoggingTask(long initialDelay) { if (logger.isInfoEnabled() && this.loggingPeriod > 0) { return this.sockJsTaskScheduler.scheduleAtFixedRate(new Runnable() { diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketNamespaceUtils.java b/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketNamespaceUtils.java index 4a07250fd90..52b85fc0531 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketNamespaceUtils.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketNamespaceUtils.java @@ -27,6 +27,7 @@ import org.springframework.beans.factory.parsing.BeanComponentDefinition; import org.springframework.beans.factory.support.ManagedList; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.lang.Nullable; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; @@ -61,6 +62,7 @@ class WebSocketNamespaceUtils { return handlerRef; } + @Nullable public static RuntimeBeanReference registerSockJsService(Element element, String schedulerName, ParserContext context, Object source) { diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/config/annotation/AbstractWebSocketHandlerRegistration.java b/spring-websocket/src/main/java/org/springframework/web/socket/config/annotation/AbstractWebSocketHandlerRegistration.java index 83c5652a537..254b9445b7d 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/config/annotation/AbstractWebSocketHandlerRegistration.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/config/annotation/AbstractWebSocketHandlerRegistration.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import org.springframework.lang.Nullable; import org.springframework.scheduling.TaskScheduler; import org.springframework.util.Assert; import org.springframework.util.LinkedMultiValueMap; @@ -140,6 +141,7 @@ public abstract class AbstractWebSocketHandlerRegistration implements WebSock * if the application did not provide one. This should be done prior to * calling {@link #getMappings()}. */ + @Nullable protected SockJsServiceRegistration getSockJsServiceRegistration() { return this.sockJsServiceRegistration; } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/config/annotation/WebMvcStompEndpointRegistry.java b/spring-websocket/src/main/java/org/springframework/web/socket/config/annotation/WebMvcStompEndpointRegistry.java index d3cb5b1a8ef..781b7c7b09f 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/config/annotation/WebMvcStompEndpointRegistry.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/config/annotation/WebMvcStompEndpointRegistry.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import org.springframework.context.ApplicationContext; +import org.springframework.lang.Nullable; import org.springframework.scheduling.TaskScheduler; import org.springframework.util.Assert; import org.springframework.util.MultiValueMap; @@ -146,6 +147,7 @@ public class WebMvcStompEndpointRegistry implements StompEndpointRegistry { * Return a handler mapping with the mapped ViewControllers; or {@code null} * in case of no registrations. */ + @Nullable public AbstractHandlerMapping getHandlerMapping() { Map urlMap = new LinkedHashMap<>(); for (WebMvcStompWebSocketEndpointRegistration registration : this.registrations) { diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/config/annotation/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/config/annotation/package-info.java index 806ea6812d2..bf6f75ff811 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/config/annotation/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/config/annotation/package-info.java @@ -1,4 +1,7 @@ /** * Support for annotation-based WebSocket setup in configuration classes. */ +@NonNullApi package org.springframework.web.socket.config.annotation; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/config/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/config/package-info.java index cc601c99a07..aa058da84d9 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/config/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/config/package-info.java @@ -1,4 +1,7 @@ /** * Configuration support for WebSocket request handling. */ +@NonNullApi package org.springframework.web.socket.config; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/handler/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/handler/package-info.java index 329f2d4df30..59c0a5f1c68 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/handler/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/handler/package-info.java @@ -2,4 +2,7 @@ * Convenient {@link org.springframework.web.socket.WebSocketHandler} * implementations and decorators. */ +@NonNullApi package org.springframework.web.socket.handler; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java index 326371b3c57..2d52027b26b 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java @@ -32,6 +32,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.simp.SimpAttributes; @@ -531,6 +532,7 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE return connectedHeaders; } + @Nullable private String getDisconnectReceipt(SimpMessageHeaderAccessor simpHeaders) { String name = StompHeaderAccessor.DISCONNECT_MESSAGE_HEADER; Message message = (Message) simpHeaders.getHeader(name); diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/SubProtocolErrorHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/SubProtocolErrorHandler.java index 55fa13c5055..a9a0b8e6356 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/SubProtocolErrorHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/SubProtocolErrorHandler.java @@ -16,6 +16,7 @@ package org.springframework.web.socket.messaging; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; /** @@ -39,7 +40,8 @@ public interface SubProtocolErrorHandler

      { * @return the error message to send to the client, or {@code null} in which * case no message will be sent. */ - Message

      handleClientMessageProcessingError(Message

      clientMessage, Throwable ex); + @Nullable + Message

      handleClientMessageProcessingError(@Nullable Message

      clientMessage, Throwable ex); /** * Handle errors sent from the server side to clients, e.g. errors from the @@ -50,6 +52,7 @@ public interface SubProtocolErrorHandler

      { * @return the error message to send to the client, or {@code null} in which * case no message will be sent. */ + @Nullable Message

      handleErrorMessageToClient(Message

      errorMessage); } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/SubProtocolHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/SubProtocolHandler.java index 1324a40878f..5c51bf64790 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/SubProtocolHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/SubProtocolHandler.java @@ -18,6 +18,7 @@ package org.springframework.web.socket.messaging; import java.util.List; +import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.web.socket.CloseStatus; @@ -67,6 +68,7 @@ public interface SubProtocolHandler { * Resolve the session id from the given message or return {@code null}. * @param message the message to resolve the session id from */ + @Nullable String resolveSessionId(Message message); /** diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/package-info.java index 4bb6b141c4f..32c46749044 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/package-info.java @@ -1,4 +1,7 @@ /** * WebSocket integration for Spring's messaging module. */ +@NonNullApi package org.springframework.web.socket.messaging; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/package-info.java index 2b723940e42..43f91f240ad 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/package-info.java @@ -1,4 +1,7 @@ /** * Common abstractions and Spring configuration support for WebSocket applications. */ +@NonNullApi package org.springframework.web.socket; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/server/RequestUpgradeStrategy.java b/spring-websocket/src/main/java/org/springframework/web/socket/server/RequestUpgradeStrategy.java index 4d05f1eb72a..f0d308334f2 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/server/RequestUpgradeStrategy.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/server/RequestUpgradeStrategy.java @@ -22,6 +22,7 @@ import java.util.Map; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; +import org.springframework.lang.Nullable; import org.springframework.web.socket.WebSocketExtension; import org.springframework.web.socket.WebSocketHandler; @@ -61,7 +62,7 @@ public interface RequestUpgradeStrategy { * handshake request. */ void upgrade(ServerHttpRequest request, ServerHttpResponse response, - String selectedProtocol, List selectedExtensions, Principal user, + @Nullable String selectedProtocol, List selectedExtensions, Principal user, WebSocketHandler wsHandler, Map attributes) throws HandshakeFailureException; } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/server/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/server/package-info.java index c3b8df4a892..661a229943e 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/server/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/server/package-info.java @@ -1,4 +1,7 @@ /** * Server-side abstractions for WebSocket interactions. */ +@NonNullApi package org.springframework.web.socket.server; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/server/standard/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/server/standard/package-info.java index a7e557c3483..c3a89fe2b54 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/server/standard/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/server/standard/package-info.java @@ -1,4 +1,7 @@ /** * Server-side classes for use with standard JSR-356 WebSocket endpoints. */ +@NonNullApi package org.springframework.web.socket.server.standard; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/server/support/AbstractHandshakeHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/server/support/AbstractHandshakeHandler.java index 9cdd836e8a7..2515327f5ae 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/server/support/AbstractHandshakeHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/server/support/AbstractHandshakeHandler.java @@ -33,6 +33,7 @@ import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; @@ -340,6 +341,7 @@ public abstract class AbstractHandshakeHandler implements HandshakeHandler, Life * @return the selected protocols or {@code null} * @see #determineHandlerSupportedProtocols(WebSocketHandler) */ + @Nullable protected String selectProtocol(List requestedProtocols, WebSocketHandler webSocketHandler) { if (requestedProtocols != null) { List handlerProtocols = determineHandlerSupportedProtocols(webSocketHandler); @@ -402,6 +404,7 @@ public abstract class AbstractHandshakeHandler implements HandshakeHandler, Life * @param attributes handshake attributes to pass to the WebSocket session * @return the user for the WebSocket session, or {@code null} if not available */ + @Nullable protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler, Map attributes) { diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/server/support/HttpSessionHandshakeInterceptor.java b/spring-websocket/src/main/java/org/springframework/web/socket/server/support/HttpSessionHandshakeInterceptor.java index 57f9cd0d735..9f6142e3365 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/server/support/HttpSessionHandshakeInterceptor.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/server/support/HttpSessionHandshakeInterceptor.java @@ -25,6 +25,7 @@ import javax.servlet.http.HttpSession; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.http.server.ServletServerHttpRequest; +import org.springframework.lang.Nullable; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.server.HandshakeInterceptor; @@ -160,6 +161,7 @@ public class HttpSessionHandshakeInterceptor implements HandshakeInterceptor { return true; } + @Nullable private HttpSession getSession(ServerHttpRequest request) { if (request instanceof ServletServerHttpRequest) { ServletServerHttpRequest serverRequest = (ServletServerHttpRequest) request; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/server/support/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/server/support/package-info.java index 33b4aec1832..571d87ca514 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/server/support/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/server/support/package-info.java @@ -2,4 +2,7 @@ * Server-side support classes including container-specific strategies * for upgrading a request. */ +@NonNullApi package org.springframework.web.socket.server.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/SockJsClient.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/SockJsClient.java index 47cebcac3b2..8060e8b1690 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/SockJsClient.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/SockJsClient.java @@ -30,6 +30,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.context.Lifecycle; import org.springframework.http.HttpHeaders; +import org.springframework.lang.Nullable; import org.springframework.scheduling.TaskScheduler; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -323,6 +324,7 @@ public class SockJsClient implements WebSocketClient, Lifecycle { *

      By default this method returns {@code null}. * @return the user to associate with the session (possibly {@code null}) */ + @Nullable protected Principal getUser() { return null; } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/TransportRequest.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/TransportRequest.java index bb378bde206..a139903482d 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/TransportRequest.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/TransportRequest.java @@ -20,6 +20,7 @@ import java.net.URI; import java.security.Principal; import org.springframework.http.HttpHeaders; +import org.springframework.lang.Nullable; import org.springframework.web.socket.sockjs.frame.SockJsMessageCodec; /** @@ -62,6 +63,7 @@ public interface TransportRequest { /** * Return the user associated with the request, if any. */ + @Nullable Principal getUser(); /** diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/package-info.java index ce5ad42edd9..b47686b0ed0 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/package-info.java @@ -2,4 +2,7 @@ * SockJS client implementation of * {@link org.springframework.web.socket.client.WebSocketClient}. */ +@NonNullApi package org.springframework.web.socket.sockjs.client; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/frame/SockJsFrame.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/frame/SockJsFrame.java index 70e26db64cb..22e4c30f7b7 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/frame/SockJsFrame.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/frame/SockJsFrame.java @@ -19,6 +19,7 @@ package org.springframework.web.socket.sockjs.frame; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -104,6 +105,7 @@ public class SockJsFrame { * for SockJS "open" and "close" frames, which do not contain data, return * {@code null}. */ + @Nullable public String getFrameData() { if (getType() == SockJsFrameType.OPEN || getType() == SockJsFrameType.HEARTBEAT) { return null; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/frame/SockJsMessageCodec.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/frame/SockJsMessageCodec.java index ce55b16980f..d89cb2fa365 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/frame/SockJsMessageCodec.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/frame/SockJsMessageCodec.java @@ -19,6 +19,8 @@ package org.springframework.web.socket.sockjs.frame; import java.io.IOException; import java.io.InputStream; +import org.springframework.lang.Nullable; + /** * Encode and decode messages to and from a SockJS message frame, * essentially an array of JSON-encoded messages. For example: @@ -48,6 +50,7 @@ public interface SockJsMessageCodec { * @return an array of messages, or {@code null} if none * @throws IOException if the content could not be parsed */ + @Nullable String[] decode(String content) throws IOException; /** @@ -56,6 +59,7 @@ public interface SockJsMessageCodec { * @return an array of messages, or {@code null} if none * @throws IOException if the content could not be parsed */ + @Nullable String[] decodeInputStream(InputStream content) throws IOException; } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/frame/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/frame/package-info.java index c11a9fa88ae..ed627794e74 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/frame/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/frame/package-info.java @@ -2,4 +2,7 @@ * Support classes for creating SockJS frames including the encoding and decoding * of SockJS message frames. */ +@NonNullApi package org.springframework.web.socket.sockjs.frame; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/package-info.java index 93674d72715..319738f50ed 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/package-info.java @@ -1,4 +1,7 @@ /** * Top-level SockJS types. */ +@NonNullApi package org.springframework.web.socket.sockjs; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/support/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/support/package-info.java index 68b6ec394c9..4bed57e4d64 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/support/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/support/package-info.java @@ -3,4 +3,7 @@ * {@link org.springframework.web.socket.sockjs.support.AbstractSockJsService} * implementation. */ +@NonNullApi package org.springframework.web.socket.sockjs.support; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/AbstractHttpSendingTransportHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/AbstractHttpSendingTransportHandler.java index 87659d7c1f4..43d6e5779fb 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/AbstractHttpSendingTransportHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/AbstractHttpSendingTransportHandler.java @@ -23,6 +23,7 @@ import java.util.regex.Pattern; import org.springframework.http.MediaType; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; +import org.springframework.lang.Nullable; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; import org.springframework.web.socket.WebSocketHandler; @@ -112,6 +113,7 @@ public abstract class AbstractHttpSendingTransportHandler extends AbstractTransp protected abstract SockJsFrameFormat getFrameFormat(ServerHttpRequest request); + @Nullable protected final String getCallbackParam(ServerHttpRequest request) { String query = request.getURI().getQuery(); MultiValueMap params = UriComponentsBuilder.newInstance().query(query).build().getQueryParams(); diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/package-info.java index 0dca99d9306..4063304df4b 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/package-info.java @@ -3,4 +3,7 @@ * implementation classes as well as a concrete * {@link org.springframework.web.socket.sockjs.SockJsService}. */ +@NonNullApi package org.springframework.web.socket.sockjs.transport.handler; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/package-info.java index be76b009dac..75f11915646 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/package-info.java @@ -6,4 +6,7 @@ * counterparts for sending messages over the various transports, and * {@link org.springframework.web.socket.sockjs.transport.handler.DefaultSockJsService}. */ +@NonNullApi package org.springframework.web.socket.sockjs.transport; + +import org.springframework.lang.NonNullApi; diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/package-info.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/package-info.java index d35363ca1ad..7aeb37495c8 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/package-info.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/package-info.java @@ -2,4 +2,7 @@ * SockJS specific implementations of * {@link org.springframework.web.socket.WebSocketSession}. */ +@NonNullApi package org.springframework.web.socket.sockjs.transport.session; + +import org.springframework.lang.NonNullApi;