Perform NullAway build-time checks in more modules
This commit enables null-safety build-time checks in: - spring-jdbc - spring-r2dbc - spring-orm - spring-beans - spring-aop See gh-32475
This commit is contained in:
@@ -106,9 +106,9 @@ final class GenericTypeAwarePropertyDescriptor extends PropertyDescriptor {
|
||||
// by the JDK's JavaBeans Introspector...
|
||||
Set<Method> ambiguousCandidates = new HashSet<>();
|
||||
for (Method method : beanClass.getMethods()) {
|
||||
if (method.getName().equals(writeMethodToUse.getName()) &&
|
||||
!method.equals(writeMethodToUse) && !method.isBridge() &&
|
||||
method.getParameterCount() == writeMethodToUse.getParameterCount()) {
|
||||
if (method.getName().equals(this.writeMethod.getName()) &&
|
||||
!method.equals(this.writeMethod) && !method.isBridge() &&
|
||||
method.getParameterCount() == this.writeMethod.getParameterCount()) {
|
||||
ambiguousCandidates.add(method);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -179,6 +179,7 @@ public class PropertyEditorRegistrySupport implements PropertyEditorRegistry {
|
||||
* @see #registerDefaultEditors
|
||||
*/
|
||||
@Nullable
|
||||
@SuppressWarnings("NullAway")
|
||||
public PropertyEditor getDefaultEditor(Class<?> requiredType) {
|
||||
if (!this.defaultEditorsActive) {
|
||||
return null;
|
||||
|
||||
@@ -28,6 +28,7 @@ import java.util.Set;
|
||||
import org.springframework.beans.MutablePropertyValues;
|
||||
import org.springframework.beans.PropertyValues;
|
||||
import org.springframework.beans.factory.support.RootBeanDefinition;
|
||||
import org.springframework.lang.Contract;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.ReflectionUtils;
|
||||
@@ -182,6 +183,7 @@ public class InjectionMetadata {
|
||||
* @return {@code true} indicating a refresh, {@code false} otherwise
|
||||
* @see #needsRefresh(Class)
|
||||
*/
|
||||
@Contract("null, _ -> true")
|
||||
public static boolean needsRefresh(@Nullable InjectionMetadata metadata, Class<?> clazz) {
|
||||
return (metadata == null || metadata.needsRefresh(clazz));
|
||||
}
|
||||
|
||||
@@ -413,9 +413,9 @@ public class DependencyDescriptor extends InjectionPoint implements Serializable
|
||||
if (!super.equals(other)) {
|
||||
return false;
|
||||
}
|
||||
DependencyDescriptor otherDesc = (DependencyDescriptor) other;
|
||||
return (this.required == otherDesc.required && this.eager == otherDesc.eager &&
|
||||
this.nestingLevel == otherDesc.nestingLevel && this.containingClass == otherDesc.containingClass);
|
||||
return (other instanceof DependencyDescriptor otherDesc && this.required == otherDesc.required &&
|
||||
this.eager == otherDesc.eager && this.nestingLevel == otherDesc.nestingLevel &&
|
||||
this.containingClass == otherDesc.containingClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -167,6 +167,7 @@ public class FieldRetrievingFactoryBean
|
||||
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("NullAway")
|
||||
public void afterPropertiesSet() throws ClassNotFoundException, NoSuchFieldException {
|
||||
if (this.targetClass != null && this.targetObject != null) {
|
||||
throw new IllegalArgumentException("Specify either targetClass or targetObject, not both");
|
||||
|
||||
@@ -228,7 +228,7 @@ public abstract class PlaceholderConfigurerSupport extends PropertyResourceConfi
|
||||
this.beanFactory = beanFactory;
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("NullAway")
|
||||
protected void doProcessProperties(ConfigurableListableBeanFactory beanFactoryToProcess,
|
||||
StringValueResolver valueResolver) {
|
||||
|
||||
|
||||
@@ -162,6 +162,7 @@ public class PropertyPathFactoryBean implements FactoryBean<Object>, BeanNameAwa
|
||||
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("NullAway")
|
||||
public void setBeanFactory(BeanFactory beanFactory) {
|
||||
this.beanFactory = beanFactory;
|
||||
|
||||
|
||||
@@ -701,6 +701,7 @@ public class GroovyBeanDefinitionReader extends AbstractBeanDefinitionReader imp
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("NullAway")
|
||||
private GroovyDynamicElementReader createDynamicElementReader(String namespace) {
|
||||
XmlReaderContext readerContext = this.groovyDslXmlBeanDefinitionReader.createReaderContext(
|
||||
new DescriptiveResource("Groovy"));
|
||||
|
||||
@@ -130,6 +130,7 @@ class ConstructorResolver {
|
||||
* or {@code null} if none (-> use constructor argument values from bean definition)
|
||||
* @return a BeanWrapper for the new instance
|
||||
*/
|
||||
@SuppressWarnings("NullAway")
|
||||
public BeanWrapper autowireConstructor(String beanName, RootBeanDefinition mbd,
|
||||
@Nullable Constructor<?>[] chosenCtors, @Nullable Object[] explicitArgs) {
|
||||
|
||||
@@ -391,6 +392,7 @@ class ConstructorResolver {
|
||||
* method, or {@code null} if none (-> use constructor argument values from bean definition)
|
||||
* @return a BeanWrapper for the new instance
|
||||
*/
|
||||
@SuppressWarnings("NullAway")
|
||||
public BeanWrapper instantiateUsingFactoryMethod(
|
||||
String beanName, RootBeanDefinition mbd, @Nullable Object[] explicitArgs) {
|
||||
|
||||
|
||||
@@ -81,6 +81,7 @@ import org.springframework.core.annotation.MergedAnnotations;
|
||||
import org.springframework.core.annotation.MergedAnnotations.SearchStrategy;
|
||||
import org.springframework.core.log.LogMessage;
|
||||
import org.springframework.core.metrics.StartupStep;
|
||||
import org.springframework.lang.Contract;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.ClassUtils;
|
||||
@@ -1487,6 +1488,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@SuppressWarnings("NullAway")
|
||||
public Object doResolveDependency(DependencyDescriptor descriptor, @Nullable String beanName,
|
||||
@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException {
|
||||
|
||||
@@ -2066,6 +2068,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
|
||||
* i.e. whether the candidate points back to the original bean or to a factory method
|
||||
* on the original bean.
|
||||
*/
|
||||
@Contract("null, _ -> false;_, null -> false;")
|
||||
private boolean isSelfReference(@Nullable String beanName, @Nullable String candidateName) {
|
||||
return (beanName != null && candidateName != null &&
|
||||
(beanName.equals(candidateName) || (containsBeanDefinition(candidateName) &&
|
||||
|
||||
@@ -238,6 +238,7 @@ public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements
|
||||
* with, if necessary
|
||||
* @return the registered singleton object
|
||||
*/
|
||||
@SuppressWarnings("NullAway")
|
||||
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
|
||||
Assert.notNull(beanName, "Bean name must not be null");
|
||||
|
||||
|
||||
@@ -73,6 +73,7 @@ public class GenericTypeAwareAutowireCandidateResolver extends SimpleAutowireCan
|
||||
* Match the given dependency type with its generic type information against the given
|
||||
* candidate bean definition.
|
||||
*/
|
||||
@SuppressWarnings("NullAway")
|
||||
protected boolean checkGenericTypeMatch(BeanDefinitionHolder bdHolder, DependencyDescriptor descriptor) {
|
||||
ResolvableType dependencyType = descriptor.getResolvableType();
|
||||
if (dependencyType.getType() instanceof Class) {
|
||||
|
||||
@@ -411,6 +411,7 @@ public class BeanDefinitionParserDelegate {
|
||||
* {@link org.springframework.beans.factory.parsing.ProblemReporter}.
|
||||
*/
|
||||
@Nullable
|
||||
@SuppressWarnings("NullAway")
|
||||
public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, @Nullable BeanDefinition containingBean) {
|
||||
String id = ele.getAttribute(ID_ATTRIBUTE);
|
||||
String nameAttr = ele.getAttribute(NAME_ATTRIBUTE);
|
||||
|
||||
Reference in New Issue
Block a user