Skip to content

Commit 091c7a2

Browse files
committed
Add nullability annotations to module/spring-boot-r2dbc
See gh-46587
1 parent 5764db2 commit 091c7a2

25 files changed

+112
-64
lines changed

module/spring-boot-r2dbc/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ dependencies {
3434
api("org.springframework:spring-r2dbc")
3535

3636
compileOnly("com.fasterxml.jackson.core:jackson-annotations")
37+
compileOnly("com.google.code.findbugs:jsr305")
3738

3839
optional(project(":core:spring-boot-autoconfigure"))
3940
optional(project(":core:spring-boot-docker-compose"))

module/spring-boot-r2dbc/src/main/java/org/springframework/boot/r2dbc/ConnectionFactoryBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import io.r2dbc.spi.ConnectionFactoryOptions;
3333
import io.r2dbc.spi.ConnectionFactoryOptions.Builder;
3434
import io.r2dbc.spi.ValidationDepth;
35+
import org.jspecify.annotations.Nullable;
3536
import org.reactivestreams.Publisher;
3637

3738
import org.springframework.boot.context.properties.PropertyMapper;
@@ -110,7 +111,7 @@ public static ConnectionFactoryBuilder derivedFrom(ConnectionFactory connectionF
110111
return withOptions(options.mutate());
111112
}
112113

113-
private static ConnectionFactoryOptions extractOptionsIfPossible(ConnectionFactory connectionFactory) {
114+
private static @Nullable ConnectionFactoryOptions extractOptionsIfPossible(ConnectionFactory connectionFactory) {
114115
OptionsCapableConnectionFactory optionsCapable = OptionsCapableConnectionFactory.unwrapFrom(connectionFactory);
115116
if (optionsCapable != null) {
116117
return optionsCapable.getOptions();

module/spring-boot-r2dbc/src/main/java/org/springframework/boot/r2dbc/EmbeddedDatabaseConnection.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import io.r2dbc.spi.ConnectionFactory;
2222
import io.r2dbc.spi.ConnectionFactoryOptions;
23+
import org.jspecify.annotations.Nullable;
2324

2425
import org.springframework.util.Assert;
2526
import org.springframework.util.ClassUtils;
@@ -42,16 +43,17 @@ public enum EmbeddedDatabaseConnection {
4243
* H2 Database Connection.
4344
*/
4445
H2("io.r2dbc.h2.H2ConnectionFactoryProvider", "r2dbc:h2:mem:///%s?options=DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE",
45-
(options) -> options.getValue(ConnectionFactoryOptions.DRIVER).equals("h2")
46-
&& options.getValue(ConnectionFactoryOptions.PROTOCOL).equals("mem"));
46+
(options) -> "h2".equals(options.getValue(ConnectionFactoryOptions.DRIVER))
47+
&& "mem".equals(options.getValue(ConnectionFactoryOptions.PROTOCOL)));
4748

48-
private final String driverClassName;
49+
private final @Nullable String driverClassName;
4950

50-
private final String url;
51+
private final @Nullable String url;
5152

5253
private final Predicate<ConnectionFactoryOptions> embedded;
5354

54-
EmbeddedDatabaseConnection(String driverClassName, String url, Predicate<ConnectionFactoryOptions> embedded) {
55+
EmbeddedDatabaseConnection(@Nullable String driverClassName, @Nullable String url,
56+
Predicate<ConnectionFactoryOptions> embedded) {
5557
this.driverClassName = driverClassName;
5658
this.url = url;
5759
this.embedded = embedded;
@@ -61,7 +63,7 @@ public enum EmbeddedDatabaseConnection {
6163
* Returns the driver class name.
6264
* @return the driver class name
6365
*/
64-
public String getDriverClassName() {
66+
public @Nullable String getDriverClassName() {
6567
return this.driverClassName;
6668
}
6769

@@ -70,7 +72,7 @@ public String getDriverClassName() {
7072
* @param databaseName the name of the database
7173
* @return the connection URL
7274
*/
73-
public String getUrl(String databaseName) {
75+
public @Nullable String getUrl(String databaseName) {
7476
Assert.hasText(databaseName, "'databaseName' must not be empty");
7577
return (this.url != null) ? String.format(this.url, databaseName) : null;
7678
}
@@ -81,9 +83,10 @@ public String getUrl(String databaseName) {
8183
* @param classLoader the class loader used to check for classes
8284
* @return an {@link EmbeddedDatabaseConnection} or {@link #NONE}.
8385
*/
84-
public static EmbeddedDatabaseConnection get(ClassLoader classLoader) {
86+
public static EmbeddedDatabaseConnection get(@Nullable ClassLoader classLoader) {
8587
for (EmbeddedDatabaseConnection candidate : EmbeddedDatabaseConnection.values()) {
86-
if (candidate != NONE && ClassUtils.isPresent(candidate.getDriverClassName(), classLoader)) {
88+
String driverClassName = candidate.getDriverClassName();
89+
if (candidate != NONE && driverClassName != null && ClassUtils.isPresent(driverClassName, classLoader)) {
8790
return candidate;
8891
}
8992
}

module/spring-boot-r2dbc/src/main/java/org/springframework/boot/r2dbc/OptionsCapableConnectionFactory.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.r2dbc.spi.ConnectionFactoryMetadata;
2222
import io.r2dbc.spi.ConnectionFactoryOptions;
2323
import io.r2dbc.spi.Wrapped;
24+
import org.jspecify.annotations.Nullable;
2425
import org.reactivestreams.Publisher;
2526

2627
/**
@@ -77,7 +78,7 @@ public ConnectionFactory unwrap() {
7778
* @return the {@code OptionsCapableConnectionFactory} or {@code null}
7879
* @since 2.5.1
7980
*/
80-
public static OptionsCapableConnectionFactory unwrapFrom(ConnectionFactory connectionFactory) {
81+
public static @Nullable OptionsCapableConnectionFactory unwrapFrom(ConnectionFactory connectionFactory) {
8182
if (connectionFactory instanceof OptionsCapableConnectionFactory optionsCapableConnectionFactory) {
8283
return optionsCapableConnectionFactory;
8384
}

module/spring-boot-r2dbc/src/main/java/org/springframework/boot/r2dbc/autoconfigure/ConnectionFactoryConfigurations.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.r2dbc.pool.ConnectionPool;
2222
import io.r2dbc.pool.ConnectionPoolConfiguration;
2323
import io.r2dbc.spi.ConnectionFactory;
24+
import org.jspecify.annotations.Nullable;
2425

2526
import org.springframework.beans.factory.ObjectProvider;
2627
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
@@ -60,7 +61,7 @@
6061
abstract class ConnectionFactoryConfigurations {
6162

6263
protected static ConnectionFactory createConnectionFactory(R2dbcProperties properties,
63-
R2dbcConnectionDetails connectionDetails, ClassLoader classLoader,
64+
@Nullable R2dbcConnectionDetails connectionDetails, @Nullable ClassLoader classLoader,
6465
List<ConnectionFactoryOptionsBuilderCustomizer> optionsCustomizers,
6566
List<ConnectionFactoryDecorator> decorators) {
6667
try {

module/spring-boot-r2dbc/src/main/java/org/springframework/boot/r2dbc/autoconfigure/ConnectionFactoryOptionsInitializer.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import io.r2dbc.spi.ConnectionFactoryOptions;
2222
import io.r2dbc.spi.ConnectionFactoryOptions.Builder;
23+
import org.jspecify.annotations.Nullable;
2324

2425
import org.springframework.beans.factory.BeanCreationException;
2526
import org.springframework.boot.r2dbc.EmbeddedDatabaseConnection;
@@ -45,7 +46,8 @@ class ConnectionFactoryOptionsInitializer {
4546
* @throws ConnectionFactoryBeanCreationException if no suitable connection could be
4647
* determined
4748
*/
48-
ConnectionFactoryOptions.Builder initialize(R2dbcProperties properties, R2dbcConnectionDetails connectionDetails,
49+
ConnectionFactoryOptions.Builder initialize(R2dbcProperties properties,
50+
@Nullable R2dbcConnectionDetails connectionDetails,
4951
Supplier<EmbeddedDatabaseConnection> embeddedDatabaseConnection) {
5052
if (connectionDetails != null) {
5153
return connectionDetails.getConnectionFactoryOptions().mutate();
@@ -81,7 +83,7 @@ private String determineEmbeddedDatabaseName(R2dbcProperties properties) {
8183
return (databaseName != null) ? databaseName : "testdb";
8284
}
8385

84-
private String determineDatabaseName(R2dbcProperties properties) {
86+
private @Nullable String determineDatabaseName(R2dbcProperties properties) {
8587
if (properties.isGenerateUniqueName()) {
8688
return properties.determineUniqueName();
8789
}
@@ -97,28 +99,28 @@ private String determineEmbeddedUsername(R2dbcProperties properties) {
9799
}
98100

99101
private ConnectionFactoryBeanCreationException connectionFactoryBeanCreationException(String message,
100-
String r2dbcUrl, EmbeddedDatabaseConnection embeddedDatabaseConnection) {
102+
@Nullable String r2dbcUrl, EmbeddedDatabaseConnection embeddedDatabaseConnection) {
101103
return new ConnectionFactoryBeanCreationException(message, r2dbcUrl, embeddedDatabaseConnection);
102104
}
103105

104-
private String ifHasText(String candidate) {
106+
private @Nullable String ifHasText(@Nullable String candidate) {
105107
return (StringUtils.hasText(candidate)) ? candidate : null;
106108
}
107109

108110
static class ConnectionFactoryBeanCreationException extends BeanCreationException {
109111

110-
private final String url;
112+
private final @Nullable String url;
111113

112114
private final EmbeddedDatabaseConnection embeddedDatabaseConnection;
113115

114-
ConnectionFactoryBeanCreationException(String message, String url,
116+
ConnectionFactoryBeanCreationException(String message, @Nullable String url,
115117
EmbeddedDatabaseConnection embeddedDatabaseConnection) {
116118
super(message);
117119
this.url = url;
118120
this.embeddedDatabaseConnection = embeddedDatabaseConnection;
119121
}
120122

121-
String getUrl() {
123+
@Nullable String getUrl() {
122124
return this.url;
123125
}
124126

module/spring-boot-r2dbc/src/main/java/org/springframework/boot/r2dbc/autoconfigure/NoConnectionFactoryBeanFailureAnalyzer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.boot.r2dbc.autoconfigure;
1818

1919
import io.r2dbc.spi.ConnectionFactory;
20+
import org.jspecify.annotations.Nullable;
2021

2122
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
2223
import org.springframework.boot.diagnostics.AbstractFailureAnalyzer;
@@ -45,7 +46,7 @@ class NoConnectionFactoryBeanFailureAnalyzer extends AbstractFailureAnalyzer<NoS
4546
}
4647

4748
@Override
48-
protected FailureAnalysis analyze(Throwable rootFailure, NoSuchBeanDefinitionException cause) {
49+
protected @Nullable FailureAnalysis analyze(Throwable rootFailure, NoSuchBeanDefinitionException cause) {
4950
if (ConnectionFactory.class.equals(cause.getBeanType())
5051
&& this.classLoader.getResource("META-INF/services/io.r2dbc.spi.ConnectionFactoryProvider") == null) {
5152
return new FailureAnalysis("No R2DBC ConnectionFactory bean is available "

module/spring-boot-r2dbc/src/main/java/org/springframework/boot/r2dbc/autoconfigure/R2dbcAutoConfiguration.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.r2dbc.spi.ConnectionFactoryOptions;
2424
import io.r2dbc.spi.ConnectionFactoryOptions.Builder;
2525
import io.r2dbc.spi.Option;
26+
import org.jspecify.annotations.Nullable;
2627

2728
import org.springframework.boot.autoconfigure.AutoConfiguration;
2829
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@@ -79,10 +80,7 @@ public ConnectionFactoryOptions getConnectionFactoryOptions() {
7980
StringUtils::hasText);
8081
configureIf(optionsBuilder, urlOptions, ConnectionFactoryOptions.DATABASE,
8182
() -> determineDatabaseName(this.properties), StringUtils::hasText);
82-
if (this.properties.getProperties() != null) {
83-
this.properties.getProperties()
84-
.forEach((key, value) -> optionsBuilder.option(Option.valueOf(key), value));
85-
}
83+
this.properties.getProperties().forEach((key, value) -> optionsBuilder.option(Option.valueOf(key), value));
8684
return optionsBuilder.build();
8785
}
8886

@@ -98,7 +96,7 @@ private <T extends CharSequence> void configureIf(Builder optionsBuilder,
9896
}
9997
}
10098

101-
private String determineDatabaseName(R2dbcProperties properties) {
99+
private @Nullable String determineDatabaseName(R2dbcProperties properties) {
102100
if (properties.isGenerateUniqueName()) {
103101
return properties.determineUniqueName();
104102
}

module/spring-boot-r2dbc/src/main/java/org/springframework/boot/r2dbc/autoconfigure/R2dbcInitializationAutoConfiguration.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.boot.r2dbc.autoconfigure;
1818

1919
import io.r2dbc.spi.ConnectionFactory;
20+
import org.jspecify.annotations.Nullable;
2021

2122
import org.springframework.boot.autoconfigure.AutoConfiguration;
2223
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@@ -58,8 +59,8 @@ ApplicationR2dbcScriptDatabaseInitializer r2dbcScriptDatabaseInitializer(Connect
5859
properties);
5960
}
6061

61-
private static ConnectionFactory determineConnectionFactory(ConnectionFactory connectionFactory, String username,
62-
String password) {
62+
private static ConnectionFactory determineConnectionFactory(ConnectionFactory connectionFactory,
63+
@Nullable String username, @Nullable String password) {
6364
if (StringUtils.hasText(username) && StringUtils.hasText(password)) {
6465
return ConnectionFactoryBuilder.derivedFrom(connectionFactory)
6566
.username(username)

0 commit comments

Comments
 (0)