diff --git a/ai/mcp/src/main/java/com/linecorp/armeria/server/ai/mcp/ArmeriaStatelessServerTransport.java b/ai/mcp/src/main/java/com/linecorp/armeria/server/ai/mcp/ArmeriaStatelessServerTransport.java
index d359f2437af..f306890627e 100644
--- a/ai/mcp/src/main/java/com/linecorp/armeria/server/ai/mcp/ArmeriaStatelessServerTransport.java
+++ b/ai/mcp/src/main/java/com/linecorp/armeria/server/ai/mcp/ArmeriaStatelessServerTransport.java
@@ -25,6 +25,7 @@
import java.io.IOException;
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -33,7 +34,6 @@
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.jsonrpc.JsonRpcError;
import com.linecorp.armeria.common.jsonrpc.JsonRpcResponse;
diff --git a/ai/mcp/src/main/java/com/linecorp/armeria/server/ai/mcp/ArmeriaStreamableServerTransportProvider.java b/ai/mcp/src/main/java/com/linecorp/armeria/server/ai/mcp/ArmeriaStreamableServerTransportProvider.java
index 628d17d51e2..4d001fdd353 100644
--- a/ai/mcp/src/main/java/com/linecorp/armeria/server/ai/mcp/ArmeriaStreamableServerTransportProvider.java
+++ b/ai/mcp/src/main/java/com/linecorp/armeria/server/ai/mcp/ArmeriaStreamableServerTransportProvider.java
@@ -28,6 +28,7 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -39,7 +40,6 @@
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.jsonrpc.JsonRpcError;
import com.linecorp.armeria.common.jsonrpc.JsonRpcResponse;
@@ -112,8 +112,7 @@ public static ArmeriaStreamableServerTransportProviderBuilder builder() {
@Nullable
private final KeepAliveScheduler keepAliveScheduler;
- @Nullable
- private McpStreamableServerSession.Factory sessionFactory;
+ private McpStreamableServerSession.@Nullable Factory sessionFactory;
private volatile boolean isClosing;
ArmeriaStreamableServerTransportProvider(
diff --git a/ai/mcp/src/main/java/com/linecorp/armeria/server/ai/mcp/ArmeriaStreamableServerTransportProviderBuilder.java b/ai/mcp/src/main/java/com/linecorp/armeria/server/ai/mcp/ArmeriaStreamableServerTransportProviderBuilder.java
index cceb86a6a20..14a633f290a 100644
--- a/ai/mcp/src/main/java/com/linecorp/armeria/server/ai/mcp/ArmeriaStreamableServerTransportProviderBuilder.java
+++ b/ai/mcp/src/main/java/com/linecorp/armeria/server/ai/mcp/ArmeriaStreamableServerTransportProviderBuilder.java
@@ -20,7 +20,8 @@
import java.time.Duration;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.server.ServiceRequestContext;
import io.modelcontextprotocol.common.McpTransportContext;
diff --git a/ai/mcp/src/main/java/com/linecorp/armeria/server/ai/mcp/package-info.java b/ai/mcp/src/main/java/com/linecorp/armeria/server/ai/mcp/package-info.java
index c65a15dfd0c..f888afbf84a 100644
--- a/ai/mcp/src/main/java/com/linecorp/armeria/server/ai/mcp/package-info.java
+++ b/ai/mcp/src/main/java/com/linecorp/armeria/server/ai/mcp/package-info.java
@@ -18,8 +18,9 @@
* Model Context Protocol (MCP) support for Armeria server.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.ai.mcp;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/annotation-processor/src/main/java/com/linecorp/armeria/server/annotation/processor/package-info.java b/annotation-processor/src/main/java/com/linecorp/armeria/server/annotation/processor/package-info.java
index bade352fe82..06c0e91e3e6 100644
--- a/annotation-processor/src/main/java/com/linecorp/armeria/server/annotation/processor/package-info.java
+++ b/annotation-processor/src/main/java/com/linecorp/armeria/server/annotation/processor/package-info.java
@@ -17,7 +17,7 @@
/**
* Annotation processors for annotated services.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.annotation.processor;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/athenz/src/main/java/com/linecorp/armeria/client/athenz/AthenzClientBuilder.java b/athenz/src/main/java/com/linecorp/armeria/client/athenz/AthenzClientBuilder.java
index e3d43d8c6da..f52aa9dd4e7 100644
--- a/athenz/src/main/java/com/linecorp/armeria/client/athenz/AthenzClientBuilder.java
+++ b/athenz/src/main/java/com/linecorp/armeria/client/athenz/AthenzClientBuilder.java
@@ -23,10 +23,11 @@
import java.util.List;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.client.HttpClient;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.athenz.TokenType;
import com.linecorp.armeria.common.metric.MeterIdPrefix;
diff --git a/athenz/src/main/java/com/linecorp/armeria/client/athenz/RoleTokenClient.java b/athenz/src/main/java/com/linecorp/armeria/client/athenz/RoleTokenClient.java
index 0572b9a54d4..9c5b8d6e8b1 100644
--- a/athenz/src/main/java/com/linecorp/armeria/client/athenz/RoleTokenClient.java
+++ b/athenz/src/main/java/com/linecorp/armeria/client/athenz/RoleTokenClient.java
@@ -20,6 +20,8 @@
import java.util.List;
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.Joiner;
import com.yahoo.athenz.zts.RoleToken;
@@ -27,7 +29,6 @@
import com.linecorp.armeria.client.WebClient;
import com.linecorp.armeria.client.WebClientRequestPreparation;
import com.linecorp.armeria.common.HttpStatus;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.athenz.AccessDeniedException;
import com.linecorp.armeria.common.util.AsyncLoader;
import com.linecorp.armeria.common.util.Exceptions;
diff --git a/athenz/src/main/java/com/linecorp/armeria/client/athenz/ZtsBaseClient.java b/athenz/src/main/java/com/linecorp/armeria/client/athenz/ZtsBaseClient.java
index c02cb60fae8..4b48b2d2e9a 100644
--- a/athenz/src/main/java/com/linecorp/armeria/client/athenz/ZtsBaseClient.java
+++ b/athenz/src/main/java/com/linecorp/armeria/client/athenz/ZtsBaseClient.java
@@ -26,6 +26,7 @@
import java.util.function.Consumer;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
import org.slf4j.LoggerFactory;
import com.linecorp.armeria.client.ClientFactory;
@@ -38,7 +39,6 @@
import com.linecorp.armeria.common.CommonPools;
import com.linecorp.armeria.common.TlsKeyPair;
import com.linecorp.armeria.common.TlsProvider;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.logging.LogLevel;
import com.linecorp.armeria.common.logging.LogWriter;
diff --git a/athenz/src/main/java/com/linecorp/armeria/client/athenz/ZtsBaseClientBuilder.java b/athenz/src/main/java/com/linecorp/armeria/client/athenz/ZtsBaseClientBuilder.java
index f6cf63d0ebb..7460c95e9b6 100644
--- a/athenz/src/main/java/com/linecorp/armeria/client/athenz/ZtsBaseClientBuilder.java
+++ b/athenz/src/main/java/com/linecorp/armeria/client/athenz/ZtsBaseClientBuilder.java
@@ -29,6 +29,8 @@
import java.util.function.Consumer;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.client.ClientFactory;
@@ -39,7 +41,6 @@
import com.linecorp.armeria.client.proxy.ConnectProxyConfig;
import com.linecorp.armeria.client.proxy.ProxyConfig;
import com.linecorp.armeria.common.TlsKeyPair;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.metric.MeterIdPrefixFunction;
import com.linecorp.armeria.internal.common.util.CertificateUtil;
diff --git a/athenz/src/main/java/com/linecorp/armeria/client/athenz/package-info.java b/athenz/src/main/java/com/linecorp/armeria/client/athenz/package-info.java
index 252c2c60321..3b7e623b3fe 100644
--- a/athenz/src/main/java/com/linecorp/armeria/client/athenz/package-info.java
+++ b/athenz/src/main/java/com/linecorp/armeria/client/athenz/package-info.java
@@ -18,8 +18,9 @@
* Provides the client-side classes and interfaces for Athenz integration.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.athenz;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/athenz/src/main/java/com/linecorp/armeria/common/athenz/TokenType.java b/athenz/src/main/java/com/linecorp/armeria/common/athenz/TokenType.java
index 96b649b2115..0cfda04b664 100644
--- a/athenz/src/main/java/com/linecorp/armeria/common/athenz/TokenType.java
+++ b/athenz/src/main/java/com/linecorp/armeria/common/athenz/TokenType.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.common.athenz;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpHeaderNames;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.util.AsciiString;
diff --git a/athenz/src/main/java/com/linecorp/armeria/common/athenz/package-info.java b/athenz/src/main/java/com/linecorp/armeria/common/athenz/package-info.java
index f5f99353da2..5d2fed61f49 100644
--- a/athenz/src/main/java/com/linecorp/armeria/common/athenz/package-info.java
+++ b/athenz/src/main/java/com/linecorp/armeria/common/athenz/package-info.java
@@ -18,8 +18,9 @@
* Provides common classes and interfaces for Athenz integration.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.athenz;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/athenz/src/main/java/com/linecorp/armeria/internal/server/athenz/AthenzServiceDecoratorFactoryProvider.java b/athenz/src/main/java/com/linecorp/armeria/internal/server/athenz/AthenzServiceDecoratorFactoryProvider.java
index 4523baae2c1..6d78e6defd6 100644
--- a/athenz/src/main/java/com/linecorp/armeria/internal/server/athenz/AthenzServiceDecoratorFactoryProvider.java
+++ b/athenz/src/main/java/com/linecorp/armeria/internal/server/athenz/AthenzServiceDecoratorFactoryProvider.java
@@ -21,11 +21,12 @@
import java.time.Duration;
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableMap;
import com.linecorp.armeria.client.athenz.ZtsBaseClient;
import com.linecorp.armeria.client.athenz.ZtsBaseClientBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.Server;
import com.linecorp.armeria.server.ServerBuilder;
import com.linecorp.armeria.server.ServerListenerAdapter;
diff --git a/athenz/src/main/java/com/linecorp/armeria/internal/server/athenz/package-info.java b/athenz/src/main/java/com/linecorp/armeria/internal/server/athenz/package-info.java
index 79c9ffab146..ddd15e06e46 100644
--- a/athenz/src/main/java/com/linecorp/armeria/internal/server/athenz/package-info.java
+++ b/athenz/src/main/java/com/linecorp/armeria/internal/server/athenz/package-info.java
@@ -18,8 +18,9 @@
* Internal classes for Athenz integration.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.server.athenz;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/athenz/src/main/java/com/linecorp/armeria/server/athenz/AbstractAthenzServiceBuilder.java b/athenz/src/main/java/com/linecorp/armeria/server/athenz/AbstractAthenzServiceBuilder.java
index 62e4ac09714..4c94973326c 100644
--- a/athenz/src/main/java/com/linecorp/armeria/server/athenz/AbstractAthenzServiceBuilder.java
+++ b/athenz/src/main/java/com/linecorp/armeria/server/athenz/AbstractAthenzServiceBuilder.java
@@ -23,12 +23,13 @@
import java.net.URI;
import java.time.Duration;
+import org.jspecify.annotations.Nullable;
+
import com.yahoo.athenz.zpe.ZpeClient;
import com.yahoo.athenz.zpe.ZpeConsts;
import com.yahoo.athenz.zpe.pkey.PublicKeyStore;
import com.linecorp.armeria.client.athenz.ZtsBaseClient;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.metric.MeterIdPrefix;
diff --git a/athenz/src/main/java/com/linecorp/armeria/server/athenz/AthenzPolicyHandler.java b/athenz/src/main/java/com/linecorp/armeria/server/athenz/AthenzPolicyHandler.java
index 73ff255f6e0..cd1185bfc85 100644
--- a/athenz/src/main/java/com/linecorp/armeria/server/athenz/AthenzPolicyHandler.java
+++ b/athenz/src/main/java/com/linecorp/armeria/server/athenz/AthenzPolicyHandler.java
@@ -40,6 +40,7 @@
import java.util.List;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -63,8 +64,6 @@
import com.yahoo.athenz.zts.SignedPolicyData;
import com.yahoo.rdl.Struct;
-import com.linecorp.armeria.common.annotation.Nullable;
-
final class AthenzPolicyHandler {
// Forked from: https://github.com/AthenZ/athenz/blob/7e326fa655fef997ce913267f9dd561a9f4c82dd/clients/java/zpe/src/main/java/com/yahoo/athenz/zpe/ZpeUpdPolLoader.java#L333
diff --git a/athenz/src/main/java/com/linecorp/armeria/server/athenz/AthenzPolicyLoader.java b/athenz/src/main/java/com/linecorp/armeria/server/athenz/AthenzPolicyLoader.java
index b0849d2243f..04be4557718 100644
--- a/athenz/src/main/java/com/linecorp/armeria/server/athenz/AthenzPolicyLoader.java
+++ b/athenz/src/main/java/com/linecorp/armeria/server/athenz/AthenzPolicyLoader.java
@@ -23,6 +23,8 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableMap;
import com.yahoo.athenz.zpe.pkey.PublicKeyStore;
import com.yahoo.athenz.zts.DomainSignedPolicyData;
@@ -31,7 +33,6 @@
import com.linecorp.armeria.client.WebClient;
import com.linecorp.armeria.client.athenz.ZtsBaseClient;
import com.linecorp.armeria.common.CommonPools;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.AsyncLoader;
final class AthenzPolicyLoader {
diff --git a/athenz/src/main/java/com/linecorp/armeria/server/athenz/AthenzService.java b/athenz/src/main/java/com/linecorp/armeria/server/athenz/AthenzService.java
index 2414199f0e7..085c7cab79d 100644
--- a/athenz/src/main/java/com/linecorp/armeria/server/athenz/AthenzService.java
+++ b/athenz/src/main/java/com/linecorp/armeria/server/athenz/AthenzService.java
@@ -23,13 +23,14 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.athenz.ZtsBaseClient;
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.RequestHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.athenz.TokenType;
import com.linecorp.armeria.common.metric.MeterIdPrefix;
diff --git a/athenz/src/main/java/com/linecorp/armeria/server/athenz/AthenzServiceBuilder.java b/athenz/src/main/java/com/linecorp/armeria/server/athenz/AthenzServiceBuilder.java
index be258486a33..191806e43a9 100644
--- a/athenz/src/main/java/com/linecorp/armeria/server/athenz/AthenzServiceBuilder.java
+++ b/athenz/src/main/java/com/linecorp/armeria/server/athenz/AthenzServiceBuilder.java
@@ -23,12 +23,13 @@
import java.util.List;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.linecorp.armeria.client.HttpClient;
import com.linecorp.armeria.client.athenz.ZtsBaseClient;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.athenz.TokenType;
import com.linecorp.armeria.server.HttpService;
diff --git a/athenz/src/main/java/com/linecorp/armeria/server/athenz/MinifiedAuthZpeClient.java b/athenz/src/main/java/com/linecorp/armeria/server/athenz/MinifiedAuthZpeClient.java
index a33026de790..24a1f52e8fc 100644
--- a/athenz/src/main/java/com/linecorp/armeria/server/athenz/MinifiedAuthZpeClient.java
+++ b/athenz/src/main/java/com/linecorp/armeria/server/athenz/MinifiedAuthZpeClient.java
@@ -41,6 +41,7 @@
import javax.net.ssl.SSLContext;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -62,7 +63,6 @@
import com.linecorp.armeria.client.athenz.ZtsBaseClient;
import com.linecorp.armeria.common.TlsKeyPair;
import com.linecorp.armeria.common.TlsProvider;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.TlsEngineType;
import com.linecorp.armeria.internal.common.util.SslContextUtil;
diff --git a/athenz/src/main/java/com/linecorp/armeria/server/athenz/package-info.java b/athenz/src/main/java/com/linecorp/armeria/server/athenz/package-info.java
index a8e6c430f4b..12d9660e6b9 100644
--- a/athenz/src/main/java/com/linecorp/armeria/server/athenz/package-info.java
+++ b/athenz/src/main/java/com/linecorp/armeria/server/athenz/package-info.java
@@ -19,8 +19,9 @@
* Provides the server-side classes and interfaces for Athenz integration.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.athenz;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/athenz/src/test/java/com/linecorp/armeria/server/athenz/AthenzDocker.java b/athenz/src/test/java/com/linecorp/armeria/server/athenz/AthenzDocker.java
index 342cecae043..9afec1f0e01 100644
--- a/athenz/src/test/java/com/linecorp/armeria/server/athenz/AthenzDocker.java
+++ b/athenz/src/test/java/com/linecorp/armeria/server/athenz/AthenzDocker.java
@@ -26,6 +26,7 @@
import javax.net.ssl.SSLContext;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.ComposeContainer;
@@ -47,7 +48,6 @@
import com.linecorp.armeria.client.athenz.ZtsBaseClient;
import com.linecorp.armeria.client.athenz.ZtsBaseClientBuilder;
import com.linecorp.armeria.common.TlsKeyPair;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.SafeCloseable;
import io.micrometer.core.instrument.util.IOUtils;
diff --git a/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/common/HttpHeadersBenchmark.java b/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/common/HttpHeadersBenchmark.java
index 90afc7e2e12..4571debfc8a 100644
--- a/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/common/HttpHeadersBenchmark.java
+++ b/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/common/HttpHeadersBenchmark.java
@@ -16,11 +16,10 @@
package com.linecorp.armeria.common;
+import org.jspecify.annotations.Nullable;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Fork;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* Microbenchmarks of {@link DefaultHttpHeaders} construction.
*/
diff --git a/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/core/client/endpoint/WeightedRoundRobinStrategyBenchmark.java b/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/core/client/endpoint/WeightedRoundRobinStrategyBenchmark.java
index 62dbf3f3d75..101c2b5ab26 100644
--- a/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/core/client/endpoint/WeightedRoundRobinStrategyBenchmark.java
+++ b/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/core/client/endpoint/WeightedRoundRobinStrategyBenchmark.java
@@ -20,6 +20,7 @@
import java.util.List;
import java.util.Random;
+import org.jspecify.annotations.Nullable;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
@@ -29,7 +30,6 @@
import com.linecorp.armeria.client.endpoint.EndpointGroup;
import com.linecorp.armeria.client.endpoint.EndpointSelectionStrategy;
import com.linecorp.armeria.client.endpoint.EndpointSelector;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* Microbenchmarks of different {@link EndpointSelector} configurations.
diff --git a/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/grpc/shared/SimpleBenchmarkBase.java b/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/grpc/shared/SimpleBenchmarkBase.java
index 044fb3fa00f..ecddf340089 100644
--- a/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/grpc/shared/SimpleBenchmarkBase.java
+++ b/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/grpc/shared/SimpleBenchmarkBase.java
@@ -20,6 +20,7 @@
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Param;
import org.openjdk.jmh.annotations.Scope;
@@ -32,7 +33,6 @@
import com.google.common.util.concurrent.MoreExecutors;
import com.google.protobuf.Empty;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.grpc.GithubApi.SearchResponse;
import com.linecorp.armeria.grpc.GithubServiceGrpc;
import com.linecorp.armeria.grpc.GithubServiceGrpc.GithubServiceBlockingStub;
diff --git a/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/internal/server/annotation/MethodInvokerBenchmark.java b/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/internal/server/annotation/MethodInvokerBenchmark.java
index ebfea3fdacb..4ae9a6d5b72 100644
--- a/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/internal/server/annotation/MethodInvokerBenchmark.java
+++ b/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/internal/server/annotation/MethodInvokerBenchmark.java
@@ -23,6 +23,7 @@
import java.lang.reflect.Modifier;
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Level;
@@ -34,8 +35,6 @@
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.infra.Blackhole;
-import com.linecorp.armeria.common.annotation.Nullable;
-
@State(Scope.Benchmark)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
diff --git a/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/server/AnnotatedServiceBenchmark.java b/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/server/AnnotatedServiceBenchmark.java
index 24f01c3d07d..00a2463f2fe 100644
--- a/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/server/AnnotatedServiceBenchmark.java
+++ b/benchmarks/jmh/src/jmh/java/com/linecorp/armeria/server/AnnotatedServiceBenchmark.java
@@ -19,6 +19,7 @@
import java.util.List;
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Level;
import org.openjdk.jmh.annotations.Scope;
@@ -29,7 +30,6 @@
import com.linecorp.armeria.client.WebClient;
import com.linecorp.armeria.common.HttpResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.annotation.Get;
@State(Scope.Benchmark)
diff --git a/brave/brave5/src/main/java/com/linecorp/armeria/client/brave/package-info.java b/brave/brave5/src/main/java/com/linecorp/armeria/client/brave/package-info.java
index 7f93f2e264c..23567314b85 100644
--- a/brave/brave5/src/main/java/com/linecorp/armeria/client/brave/package-info.java
+++ b/brave/brave5/src/main/java/com/linecorp/armeria/client/brave/package-info.java
@@ -23,7 +23,7 @@
* 1.28 Breaking Changes for more information.
*/
@Deprecated
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.brave;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/brave/brave5/src/main/java/com/linecorp/armeria/common/brave/package-info.java b/brave/brave5/src/main/java/com/linecorp/armeria/common/brave/package-info.java
index c17da9cdfc2..137508e9901 100644
--- a/brave/brave5/src/main/java/com/linecorp/armeria/common/brave/package-info.java
+++ b/brave/brave5/src/main/java/com/linecorp/armeria/common/brave/package-info.java
@@ -23,7 +23,7 @@
* 1.28 Breaking Changes for more information.
*/
@Deprecated
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.brave;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/brave/brave5/src/main/java/com/linecorp/armeria/internal/common/brave/package-info.java b/brave/brave5/src/main/java/com/linecorp/armeria/internal/common/brave/package-info.java
index 50246c0524c..02c63d4e075 100644
--- a/brave/brave5/src/main/java/com/linecorp/armeria/internal/common/brave/package-info.java
+++ b/brave/brave5/src/main/java/com/linecorp/armeria/internal/common/brave/package-info.java
@@ -23,7 +23,7 @@
* 1.28 Breaking Changes for more information.
*/
@Deprecated
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.common.brave;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/brave/brave5/src/main/java/com/linecorp/armeria/server/brave/package-info.java b/brave/brave5/src/main/java/com/linecorp/armeria/server/brave/package-info.java
index d09cb9f4248..84dfd4a6c6e 100644
--- a/brave/brave5/src/main/java/com/linecorp/armeria/server/brave/package-info.java
+++ b/brave/brave5/src/main/java/com/linecorp/armeria/server/brave/package-info.java
@@ -23,7 +23,7 @@
* 1.28 Breaking Changes for more information.
*/
@Deprecated
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.brave;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/brave/brave6/src/main/java/com/linecorp/armeria/client/brave/BraveClient.java b/brave/brave6/src/main/java/com/linecorp/armeria/client/brave/BraveClient.java
index 2c2317a9b8f..7c49a4bb3fe 100644
--- a/brave/brave6/src/main/java/com/linecorp/armeria/client/brave/BraveClient.java
+++ b/brave/brave6/src/main/java/com/linecorp/armeria/client/brave/BraveClient.java
@@ -21,6 +21,7 @@
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -30,7 +31,6 @@
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.RequestHeadersBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.brave.RequestContextCurrentTraceContext;
import com.linecorp.armeria.common.logging.ClientConnectionTimings;
import com.linecorp.armeria.internal.common.RequestContextExtension;
diff --git a/brave/brave6/src/main/java/com/linecorp/armeria/client/brave/ClientRequestContextAdapter.java b/brave/brave6/src/main/java/com/linecorp/armeria/client/brave/ClientRequestContextAdapter.java
index 65348f98abb..526487a80b3 100644
--- a/brave/brave6/src/main/java/com/linecorp/armeria/client/brave/ClientRequestContextAdapter.java
+++ b/brave/brave6/src/main/java/com/linecorp/armeria/client/brave/ClientRequestContextAdapter.java
@@ -16,12 +16,13 @@
package com.linecorp.armeria.client.brave;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.RequestHeadersBuilder;
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.logging.RequestLogAccess;
import com.linecorp.armeria.common.logging.RequestLogProperty;
diff --git a/brave/brave6/src/main/java/com/linecorp/armeria/client/brave/package-info.java b/brave/brave6/src/main/java/com/linecorp/armeria/client/brave/package-info.java
index 4138427cd0d..e9eebe25e00 100644
--- a/brave/brave6/src/main/java/com/linecorp/armeria/client/brave/package-info.java
+++ b/brave/brave6/src/main/java/com/linecorp/armeria/client/brave/package-info.java
@@ -18,7 +18,7 @@
* Distributed tracing clients based on Brave,
* a Java tracing library compatible with Zipkin.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.brave;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/brave/brave6/src/main/java/com/linecorp/armeria/common/brave/RequestContextCurrentTraceContext.java b/brave/brave6/src/main/java/com/linecorp/armeria/common/brave/RequestContextCurrentTraceContext.java
index d741b0e7f63..10223e961c2 100644
--- a/brave/brave6/src/main/java/com/linecorp/armeria/common/brave/RequestContextCurrentTraceContext.java
+++ b/brave/brave6/src/main/java/com/linecorp/armeria/common/brave/RequestContextCurrentTraceContext.java
@@ -18,9 +18,10 @@
import static com.linecorp.armeria.internal.common.brave.TraceContextUtil.traceContext;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.brave.BraveClient;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.common.brave.InternalTraceContextUtil;
import com.linecorp.armeria.internal.common.brave.TraceContextUtil;
diff --git a/brave/brave6/src/main/java/com/linecorp/armeria/common/brave/package-info.java b/brave/brave6/src/main/java/com/linecorp/armeria/common/brave/package-info.java
index d6287308f84..698c130efcd 100644
--- a/brave/brave6/src/main/java/com/linecorp/armeria/common/brave/package-info.java
+++ b/brave/brave6/src/main/java/com/linecorp/armeria/common/brave/package-info.java
@@ -19,7 +19,7 @@
* Brave, a Java tracing library compatible with
* Zipkin.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.brave;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/brave/brave6/src/main/java/com/linecorp/armeria/internal/common/brave/BraveThreadLocalAccessorProvider.java b/brave/brave6/src/main/java/com/linecorp/armeria/internal/common/brave/BraveThreadLocalAccessorProvider.java
index 7c4866b4b9b..91f4c25ae27 100644
--- a/brave/brave6/src/main/java/com/linecorp/armeria/internal/common/brave/BraveThreadLocalAccessorProvider.java
+++ b/brave/brave6/src/main/java/com/linecorp/armeria/internal/common/brave/BraveThreadLocalAccessorProvider.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.internal.common.brave;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.internal.common.context.ThreadLocalAccessorProvider;
import brave.propagation.TraceContext;
diff --git a/brave/brave6/src/main/java/com/linecorp/armeria/internal/common/brave/InternalTraceContextUtil.java b/brave/brave6/src/main/java/com/linecorp/armeria/internal/common/brave/InternalTraceContextUtil.java
index 57bd319ccbc..5592731d251 100644
--- a/brave/brave6/src/main/java/com/linecorp/armeria/internal/common/brave/InternalTraceContextUtil.java
+++ b/brave/brave6/src/main/java/com/linecorp/armeria/internal/common/brave/InternalTraceContextUtil.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.internal.common.brave;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.brave.RequestContextCurrentTraceContext;
import brave.propagation.TraceContext;
diff --git a/brave/brave6/src/main/java/com/linecorp/armeria/internal/common/brave/TraceContextUtil.java b/brave/brave6/src/main/java/com/linecorp/armeria/internal/common/brave/TraceContextUtil.java
index 34c2532e32a..8eebe7f86f1 100644
--- a/brave/brave6/src/main/java/com/linecorp/armeria/internal/common/brave/TraceContextUtil.java
+++ b/brave/brave6/src/main/java/com/linecorp/armeria/internal/common/brave/TraceContextUtil.java
@@ -20,13 +20,13 @@
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.annotations.VisibleForTesting;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.brave.RequestContextCurrentTraceContext;
import brave.Tracing;
diff --git a/brave/brave6/src/main/java/com/linecorp/armeria/internal/common/brave/package-info.java b/brave/brave6/src/main/java/com/linecorp/armeria/internal/common/brave/package-info.java
index 6f86e8238b6..dc4dcbca6da 100644
--- a/brave/brave6/src/main/java/com/linecorp/armeria/internal/common/brave/package-info.java
+++ b/brave/brave6/src/main/java/com/linecorp/armeria/internal/common/brave/package-info.java
@@ -19,7 +19,7 @@
* Brave, a Java tracing library compatible with
* Zipkin. Anything in this package can be changed or removed at any time.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.common.brave;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/brave/brave6/src/main/java/com/linecorp/armeria/server/brave/RpcServiceRequestContextAdapter.java b/brave/brave6/src/main/java/com/linecorp/armeria/server/brave/RpcServiceRequestContextAdapter.java
index e641c88eef8..7a19a7bc4e7 100644
--- a/brave/brave6/src/main/java/com/linecorp/armeria/server/brave/RpcServiceRequestContextAdapter.java
+++ b/brave/brave6/src/main/java/com/linecorp/armeria/server/brave/RpcServiceRequestContextAdapter.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.server.brave;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RpcRequest;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.logging.RequestLogProperty;
import com.linecorp.armeria.internal.common.brave.SpanContextUtil;
diff --git a/brave/brave6/src/main/java/com/linecorp/armeria/server/brave/ServiceRequestContextAdapter.java b/brave/brave6/src/main/java/com/linecorp/armeria/server/brave/ServiceRequestContextAdapter.java
index 8598aef3062..b5a8d4a2573 100644
--- a/brave/brave6/src/main/java/com/linecorp/armeria/server/brave/ServiceRequestContextAdapter.java
+++ b/brave/brave6/src/main/java/com/linecorp/armeria/server/brave/ServiceRequestContextAdapter.java
@@ -16,9 +16,10 @@
package com.linecorp.armeria.server.brave;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.logging.RequestLogProperty;
import com.linecorp.armeria.internal.common.brave.SpanContextUtil;
diff --git a/brave/brave6/src/main/java/com/linecorp/armeria/server/brave/package-info.java b/brave/brave6/src/main/java/com/linecorp/armeria/server/brave/package-info.java
index d21a9588f22..a9d5e797307 100644
--- a/brave/brave6/src/main/java/com/linecorp/armeria/server/brave/package-info.java
+++ b/brave/brave6/src/main/java/com/linecorp/armeria/server/brave/package-info.java
@@ -18,7 +18,7 @@
* Distributed tracing services based on Brave,
* a Java tracing library compatible with Zipkin.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.brave;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/brave/brave6/src/test/java/com/linecorp/armeria/client/brave/BraveClientTest.java b/brave/brave6/src/test/java/com/linecorp/armeria/client/brave/BraveClientTest.java
index 5fbc0cac4ca..d4a7f390c8a 100644
--- a/brave/brave6/src/test/java/com/linecorp/armeria/client/brave/BraveClientTest.java
+++ b/brave/brave6/src/test/java/com/linecorp/armeria/client/brave/BraveClientTest.java
@@ -30,6 +30,7 @@
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
@@ -50,7 +51,6 @@
import com.linecorp.armeria.common.RpcRequest;
import com.linecorp.armeria.common.RpcResponse;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.brave.RequestContextCurrentTraceContext;
import com.linecorp.armeria.common.brave.TestSpanCollector;
import com.linecorp.armeria.common.logging.RequestLog;
diff --git a/brave/brave6/src/test/java/com/linecorp/armeria/server/brave/BraveServiceIntegrationTest.java b/brave/brave6/src/test/java/com/linecorp/armeria/server/brave/BraveServiceIntegrationTest.java
index 9836d3b364b..a459fc7203e 100644
--- a/brave/brave6/src/test/java/com/linecorp/armeria/server/brave/BraveServiceIntegrationTest.java
+++ b/brave/brave6/src/test/java/com/linecorp/armeria/server/brave/BraveServiceIntegrationTest.java
@@ -24,6 +24,7 @@
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.Test;
@@ -34,7 +35,6 @@
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.brave.RequestContextCurrentTraceContext;
import com.linecorp.armeria.common.util.SystemInfo;
import com.linecorp.armeria.server.Server;
diff --git a/bucket4j/src/main/java/com/linecorp/armeria/common/throttling/package-info.java b/bucket4j/src/main/java/com/linecorp/armeria/common/throttling/package-info.java
index e9e03c718b5..c71a7b25842 100644
--- a/bucket4j/src/main/java/com/linecorp/armeria/common/throttling/package-info.java
+++ b/bucket4j/src/main/java/com/linecorp/armeria/common/throttling/package-info.java
@@ -18,8 +18,9 @@
* Common throttling artifacts used by throttling implementation.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.throttling;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/TokenBucket.java b/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/TokenBucket.java
index 57a4a6ac6c0..a376f920fce 100644
--- a/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/TokenBucket.java
+++ b/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/TokenBucket.java
@@ -20,9 +20,10 @@
import java.time.Duration;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/TokenBucketSpec.java b/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/TokenBucketSpec.java
index 216750ccc67..55d4c92aa29 100644
--- a/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/TokenBucketSpec.java
+++ b/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/TokenBucketSpec.java
@@ -26,9 +26,9 @@
import java.util.Map;
import java.util.stream.Collectors;
-import com.google.common.base.Splitter;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.google.common.base.Splitter;
/**
* A specification of a {@link TokenBucket} configuration represented by a string. The string syntax is
diff --git a/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/TokenBucketThrottlingStrategy.java b/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/TokenBucketThrottlingStrategy.java
index 8efaea157f4..b9020f04a1c 100644
--- a/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/TokenBucketThrottlingStrategy.java
+++ b/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/TokenBucketThrottlingStrategy.java
@@ -21,9 +21,10 @@
import java.util.concurrent.CompletionStage;
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpHeaderNames;
import com.linecorp.armeria.common.Request;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.throttling.ThrottlingHeaders;
import com.linecorp.armeria.server.ServiceRequestContext;
diff --git a/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/TokenBucketThrottlingStrategyBuilder.java b/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/TokenBucketThrottlingStrategyBuilder.java
index ceb8492c749..fbf36b6e7da 100644
--- a/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/TokenBucketThrottlingStrategyBuilder.java
+++ b/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/TokenBucketThrottlingStrategyBuilder.java
@@ -21,8 +21,9 @@
import java.time.Duration;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.Request;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.throttling.ThrottlingHeaders;
diff --git a/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/package-info.java b/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/package-info.java
index c7e713603b0..8b3e7948f2b 100644
--- a/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/package-info.java
+++ b/bucket4j/src/main/java/com/linecorp/armeria/server/throttling/bucket4j/package-info.java
@@ -20,8 +20,9 @@
* and Bucket4j library.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.throttling.bucket4j;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/consul/src/main/java/com/linecorp/armeria/client/consul/ConsulEndpointGroup.java b/consul/src/main/java/com/linecorp/armeria/client/consul/ConsulEndpointGroup.java
index 75685681d38..15947d23a28 100644
--- a/consul/src/main/java/com/linecorp/armeria/client/consul/ConsulEndpointGroup.java
+++ b/consul/src/main/java/com/linecorp/armeria/client/consul/ConsulEndpointGroup.java
@@ -23,6 +23,7 @@
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -32,7 +33,6 @@
import com.linecorp.armeria.client.endpoint.DynamicEndpointGroup;
import com.linecorp.armeria.client.endpoint.EndpointGroup;
import com.linecorp.armeria.client.endpoint.EndpointSelectionStrategy;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.consul.ConsulClient;
diff --git a/consul/src/main/java/com/linecorp/armeria/client/consul/ConsulEndpointGroupBuilder.java b/consul/src/main/java/com/linecorp/armeria/client/consul/ConsulEndpointGroupBuilder.java
index 02f2be14e2e..96ee4a5cb92 100644
--- a/consul/src/main/java/com/linecorp/armeria/client/consul/ConsulEndpointGroupBuilder.java
+++ b/consul/src/main/java/com/linecorp/armeria/client/consul/ConsulEndpointGroupBuilder.java
@@ -21,10 +21,11 @@
import java.net.URI;
import java.time.Duration;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.endpoint.AbstractDynamicEndpointGroupBuilder;
import com.linecorp.armeria.client.endpoint.EndpointSelectionStrategy;
import com.linecorp.armeria.common.Flags;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.consul.ConsulConfigSetters;
import com.linecorp.armeria.internal.consul.ConsulClient;
diff --git a/consul/src/main/java/com/linecorp/armeria/client/consul/package-info.java b/consul/src/main/java/com/linecorp/armeria/client/consul/package-info.java
index db91c8b2f16..71db75f648a 100644
--- a/consul/src/main/java/com/linecorp/armeria/client/consul/package-info.java
+++ b/consul/src/main/java/com/linecorp/armeria/client/consul/package-info.java
@@ -16,9 +16,10 @@
/**
* Consul-based {@link com.linecorp.armeria.client.endpoint.EndpointGroup} implementation.
*/
-@NonNullByDefault
+@NullMarked
@UnstableApi
package com.linecorp.armeria.client.consul;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/consul/src/main/java/com/linecorp/armeria/common/consul/package-info.java b/consul/src/main/java/com/linecorp/armeria/common/consul/package-info.java
index cff821badbf..9b8d55e56c4 100644
--- a/consul/src/main/java/com/linecorp/armeria/common/consul/package-info.java
+++ b/consul/src/main/java/com/linecorp/armeria/common/consul/package-info.java
@@ -17,9 +17,10 @@
/**
* Various classes used internally. Anything in this package can be changed or removed at any time.
*/
-@NonNullByDefault
+@NullMarked
@UnstableApi
package com.linecorp.armeria.common.consul;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/consul/src/main/java/com/linecorp/armeria/internal/consul/AgentServiceClient.java b/consul/src/main/java/com/linecorp/armeria/internal/consul/AgentServiceClient.java
index 75bcca62ee0..ceb13f2d793 100644
--- a/consul/src/main/java/com/linecorp/armeria/internal/consul/AgentServiceClient.java
+++ b/consul/src/main/java/com/linecorp/armeria/internal/consul/AgentServiceClient.java
@@ -19,6 +19,8 @@
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
@@ -30,7 +32,6 @@
import com.linecorp.armeria.client.WebClient;
import com.linecorp.armeria.common.HttpData;
import com.linecorp.armeria.common.HttpResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.PercentEncoder;
/**
diff --git a/consul/src/main/java/com/linecorp/armeria/internal/consul/CatalogClient.java b/consul/src/main/java/com/linecorp/armeria/internal/consul/CatalogClient.java
index 4530421e478..5257d59ba6f 100644
--- a/consul/src/main/java/com/linecorp/armeria/internal/consul/CatalogClient.java
+++ b/consul/src/main/java/com/linecorp/armeria/internal/consul/CatalogClient.java
@@ -23,6 +23,8 @@
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.type.TypeReference;
@@ -34,7 +36,6 @@
import com.linecorp.armeria.client.WebClient;
import com.linecorp.armeria.common.HttpEntity;
import com.linecorp.armeria.common.QueryParams;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.PercentEncoder;
/**
@@ -157,9 +158,8 @@ static final class Node {
@JsonProperty("ServiceTaggedAddresses")
Map serviceTaggedAddresses;
- @Nullable
@JsonProperty("ServiceTags")
- String[] serviceTags;
+ String @Nullable [] serviceTags;
@Nullable
@JsonProperty("ServiceProxy")
diff --git a/consul/src/main/java/com/linecorp/armeria/internal/consul/Check.java b/consul/src/main/java/com/linecorp/armeria/internal/consul/Check.java
index b2040fcfdb8..b77fd65e2ac 100644
--- a/consul/src/main/java/com/linecorp/armeria/internal/consul/Check.java
+++ b/consul/src/main/java/com/linecorp/armeria/internal/consul/Check.java
@@ -17,14 +17,14 @@
import java.util.Map;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
-
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
public final class Check {
@@ -57,13 +57,11 @@ public final class Check {
@JsonProperty("DeregisterCriticalServiceAfter")
private String deregisterCriticalServiceAfter;
- @Nullable
@JsonProperty("Args")
- private String[] args;
+ private String @Nullable [] args;
- @Nullable
@JsonProperty("AliasNode")
- private String[] aliasNode;
+ private String @Nullable [] aliasNode;
@Nullable
@JsonProperty("DockerContainerID")
@@ -181,8 +179,7 @@ public void setDeregisterCriticalServiceAfter(@Nullable String deregisterCritica
this.deregisterCriticalServiceAfter = deregisterCriticalServiceAfter;
}
- @Nullable
- public String[] getArgs() {
+ public String @Nullable [] getArgs() {
return args;
}
@@ -190,8 +187,7 @@ public void setArgs(@Nullable String[] args) {
this.args = args;
}
- @Nullable
- public String[] getAliasNode() {
+ public String @Nullable [] getAliasNode() {
return aliasNode;
}
diff --git a/consul/src/main/java/com/linecorp/armeria/internal/consul/ConsulClient.java b/consul/src/main/java/com/linecorp/armeria/internal/consul/ConsulClient.java
index a08dadaac7f..9377cb6fb47 100644
--- a/consul/src/main/java/com/linecorp/armeria/internal/consul/ConsulClient.java
+++ b/consul/src/main/java/com/linecorp/armeria/internal/consul/ConsulClient.java
@@ -20,6 +20,8 @@
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.databind.ObjectMapper;
import com.linecorp.armeria.client.Endpoint;
@@ -31,7 +33,6 @@
import com.linecorp.armeria.client.retry.RetryingClient;
import com.linecorp.armeria.common.HttpHeaderNames;
import com.linecorp.armeria.common.HttpResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* A client for accessing a Consul agent API server.
diff --git a/consul/src/main/java/com/linecorp/armeria/internal/consul/ConsulClientBuilder.java b/consul/src/main/java/com/linecorp/armeria/internal/consul/ConsulClientBuilder.java
index b1dd2b701c3..f23456016d5 100644
--- a/consul/src/main/java/com/linecorp/armeria/internal/consul/ConsulClientBuilder.java
+++ b/consul/src/main/java/com/linecorp/armeria/internal/consul/ConsulClientBuilder.java
@@ -22,7 +22,8 @@
import java.net.URISyntaxException;
import java.util.regex.Pattern;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.consul.ConsulConfigSetters;
public final class ConsulClientBuilder implements ConsulConfigSetters {
diff --git a/consul/src/main/java/com/linecorp/armeria/internal/consul/ConsulClientUtil.java b/consul/src/main/java/com/linecorp/armeria/internal/consul/ConsulClientUtil.java
index b1f64f2b624..c9433431c71 100644
--- a/consul/src/main/java/com/linecorp/armeria/internal/consul/ConsulClientUtil.java
+++ b/consul/src/main/java/com/linecorp/armeria/internal/consul/ConsulClientUtil.java
@@ -15,9 +15,10 @@
*/
package com.linecorp.armeria.internal.consul;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.QueryParams;
import com.linecorp.armeria.common.QueryParamsBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* Utility methods related to Consul clients.
diff --git a/consul/src/main/java/com/linecorp/armeria/internal/consul/HealthClient.java b/consul/src/main/java/com/linecorp/armeria/internal/consul/HealthClient.java
index a650643983b..cdb2f9ca61f 100644
--- a/consul/src/main/java/com/linecorp/armeria/internal/consul/HealthClient.java
+++ b/consul/src/main/java/com/linecorp/armeria/internal/consul/HealthClient.java
@@ -25,6 +25,7 @@
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,7 +41,6 @@
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.QueryParams;
import com.linecorp.armeria.common.QueryParamsBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.PercentEncoder;
/**
@@ -180,9 +180,8 @@ public static final class Service {
@JsonProperty("Service")
String service;
- @Nullable
@JsonProperty("Tags")
- String[] tags;
+ String @Nullable [] tags;
@Nullable
@JsonProperty("Address")
diff --git a/consul/src/main/java/com/linecorp/armeria/internal/consul/package-info.java b/consul/src/main/java/com/linecorp/armeria/internal/consul/package-info.java
index f842d043a47..22a966c7f9c 100644
--- a/consul/src/main/java/com/linecorp/armeria/internal/consul/package-info.java
+++ b/consul/src/main/java/com/linecorp/armeria/internal/consul/package-info.java
@@ -17,7 +17,7 @@
/**
* Various classes used internally. Anything in this package can be changed or removed at any time.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.consul;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/consul/src/main/java/com/linecorp/armeria/server/consul/ConsulUpdatingListener.java b/consul/src/main/java/com/linecorp/armeria/server/consul/ConsulUpdatingListener.java
index 9e2c636c62a..c95a07db7e2 100644
--- a/consul/src/main/java/com/linecorp/armeria/server/consul/ConsulUpdatingListener.java
+++ b/consul/src/main/java/com/linecorp/armeria/server/consul/ConsulUpdatingListener.java
@@ -22,13 +22,13 @@
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.common.HttpMethod;
import com.linecorp.armeria.common.HttpStatus;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.SystemInfo;
import com.linecorp.armeria.internal.consul.Check;
diff --git a/consul/src/main/java/com/linecorp/armeria/server/consul/ConsulUpdatingListenerBuilder.java b/consul/src/main/java/com/linecorp/armeria/server/consul/ConsulUpdatingListenerBuilder.java
index 870df3d2522..e4cb38bbf80 100644
--- a/consul/src/main/java/com/linecorp/armeria/server/consul/ConsulUpdatingListenerBuilder.java
+++ b/consul/src/main/java/com/linecorp/armeria/server/consul/ConsulUpdatingListenerBuilder.java
@@ -21,11 +21,12 @@
import java.net.URI;
import java.time.Duration;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableSet;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.common.HttpMethod;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.consul.ConsulConfigSetters;
import com.linecorp.armeria.internal.consul.ConsulClient;
diff --git a/consul/src/main/java/com/linecorp/armeria/server/consul/package-info.java b/consul/src/main/java/com/linecorp/armeria/server/consul/package-info.java
index cefde5aca20..cb15c19ddfc 100644
--- a/consul/src/main/java/com/linecorp/armeria/server/consul/package-info.java
+++ b/consul/src/main/java/com/linecorp/armeria/server/consul/package-info.java
@@ -16,9 +16,10 @@
/**
* Automatic service registration and discovery with Consul.
**/
-@NonNullByDefault
+@NullMarked
@UnstableApi
package com.linecorp.armeria.server.consul;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/consul/src/test/java/com/linecorp/armeria/internal/consul/ConsulTestBase.java b/consul/src/test/java/com/linecorp/armeria/internal/consul/ConsulTestBase.java
index 934120f1326..0796742611b 100644
--- a/consul/src/test/java/com/linecorp/armeria/internal/consul/ConsulTestBase.java
+++ b/consul/src/test/java/com/linecorp/armeria/internal/consul/ConsulTestBase.java
@@ -26,6 +26,7 @@
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.BeforeAll;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -41,7 +42,6 @@
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.CompletionActions;
import com.linecorp.armeria.internal.testing.FlakyTest;
import com.linecorp.armeria.server.AbstractHttpService;
diff --git a/core/src/main/java/com/linecorp/armeria/client/AbstractClientOptionsBuilder.java b/core/src/main/java/com/linecorp/armeria/client/AbstractClientOptionsBuilder.java
index 6c42b6452cb..4b6f2bcf62c 100644
--- a/core/src/main/java/com/linecorp/armeria/client/AbstractClientOptionsBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/AbstractClientOptionsBuilder.java
@@ -29,6 +29,8 @@
import java.util.function.Function;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.client.endpoint.EndpointGroup;
@@ -43,7 +45,6 @@
import com.linecorp.armeria.common.RequestContextStorage;
import com.linecorp.armeria.common.RequestId;
import com.linecorp.armeria.common.SuccessFunction;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.auth.AuthToken;
import com.linecorp.armeria.common.auth.BasicToken;
diff --git a/core/src/main/java/com/linecorp/armeria/client/AbstractDnsResolverBuilder.java b/core/src/main/java/com/linecorp/armeria/client/AbstractDnsResolverBuilder.java
index ac2a7e5c11c..cc2927d6889 100644
--- a/core/src/main/java/com/linecorp/armeria/client/AbstractDnsResolverBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/AbstractDnsResolverBuilder.java
@@ -26,11 +26,12 @@
import java.util.List;
import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
+
import com.github.benmanes.caffeine.cache.CaffeineSpec;
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.common.Flags;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.metric.MeterIdPrefix;
import com.linecorp.armeria.common.util.TransportType;
diff --git a/core/src/main/java/com/linecorp/armeria/client/AbstractHttpRequestHandler.java b/core/src/main/java/com/linecorp/armeria/client/AbstractHttpRequestHandler.java
index 70d4105b992..818e51fe969 100644
--- a/core/src/main/java/com/linecorp/armeria/client/AbstractHttpRequestHandler.java
+++ b/core/src/main/java/com/linecorp/armeria/client/AbstractHttpRequestHandler.java
@@ -25,6 +25,7 @@
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -38,7 +39,6 @@
import com.linecorp.armeria.common.ResponseCompleteException;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLogBuilder;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.common.util.SafeCloseable;
diff --git a/core/src/main/java/com/linecorp/armeria/client/AbstractHttpRequestSubscriber.java b/core/src/main/java/com/linecorp/armeria/client/AbstractHttpRequestSubscriber.java
index a3e94085f53..cd7ba88eeb6 100644
--- a/core/src/main/java/com/linecorp/armeria/client/AbstractHttpRequestSubscriber.java
+++ b/core/src/main/java/com/linecorp/armeria/client/AbstractHttpRequestSubscriber.java
@@ -16,6 +16,7 @@
package com.linecorp.armeria.client;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
@@ -24,7 +25,6 @@
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.client.DecodedHttpResponse;
import io.netty.channel.Channel;
diff --git a/core/src/main/java/com/linecorp/armeria/client/AbstractHttpResponseDecoder.java b/core/src/main/java/com/linecorp/armeria/client/AbstractHttpResponseDecoder.java
index c477c008389..49a67b8b350 100644
--- a/core/src/main/java/com/linecorp/armeria/client/AbstractHttpResponseDecoder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/AbstractHttpResponseDecoder.java
@@ -18,9 +18,10 @@
import java.util.Iterator;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.ContentTooLargeException;
import com.linecorp.armeria.common.ContentTooLargeExceptionBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.client.DecodedHttpResponse;
import com.linecorp.armeria.internal.client.HttpSession;
import com.linecorp.armeria.internal.common.InboundTrafficController;
diff --git a/core/src/main/java/com/linecorp/armeria/client/AbstractRuleBuilder.java b/core/src/main/java/com/linecorp/armeria/client/AbstractRuleBuilder.java
index d270c6856b6..7e980d99fc7 100644
--- a/core/src/main/java/com/linecorp/armeria/client/AbstractRuleBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/AbstractRuleBuilder.java
@@ -24,6 +24,8 @@
import java.util.function.BiPredicate;
import java.util.function.Predicate;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
@@ -40,7 +42,6 @@
import com.linecorp.armeria.common.Response;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.TimeoutException;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/AbstractRuleWithContentBuilder.java b/core/src/main/java/com/linecorp/armeria/client/AbstractRuleWithContentBuilder.java
index 81ff0d24341..e5ad6d81db5 100644
--- a/core/src/main/java/com/linecorp/armeria/client/AbstractRuleWithContentBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/AbstractRuleWithContentBuilder.java
@@ -22,13 +22,14 @@
import java.util.function.BiFunction;
import java.util.function.BiPredicate;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.circuitbreaker.CircuitBreakerRuleWithContent;
import com.linecorp.armeria.client.retry.RetryRuleWithContent;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpResponseDuplicator;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.Response;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/AbstractWebClientBuilder.java b/core/src/main/java/com/linecorp/armeria/client/AbstractWebClientBuilder.java
index 8bd45312343..b87cef0c4cd 100644
--- a/core/src/main/java/com/linecorp/armeria/client/AbstractWebClientBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/AbstractWebClientBuilder.java
@@ -24,11 +24,12 @@
import java.net.URI;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.endpoint.EndpointGroup;
import com.linecorp.armeria.common.Scheme;
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* A skeletal builder implementation for {@link WebClient}.
diff --git a/core/src/main/java/com/linecorp/armeria/client/AggregatedHttpRequestHandler.java b/core/src/main/java/com/linecorp/armeria/client/AggregatedHttpRequestHandler.java
index 4c6f8eb6784..f3ed358653f 100644
--- a/core/src/main/java/com/linecorp/armeria/client/AggregatedHttpRequestHandler.java
+++ b/core/src/main/java/com/linecorp/armeria/client/AggregatedHttpRequestHandler.java
@@ -18,12 +18,13 @@
import java.util.function.BiFunction;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.AggregatedHttpRequest;
import com.linecorp.armeria.common.HttpData;
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.RequestHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.client.DecodedHttpResponse;
import io.netty.channel.Channel;
diff --git a/core/src/main/java/com/linecorp/armeria/client/BlockingWebClient.java b/core/src/main/java/com/linecorp/armeria/client/BlockingWebClient.java
index 16039b9f780..7cfd06b1672 100644
--- a/core/src/main/java/com/linecorp/armeria/client/BlockingWebClient.java
+++ b/core/src/main/java/com/linecorp/armeria/client/BlockingWebClient.java
@@ -21,6 +21,8 @@
import java.net.URI;
import java.nio.charset.Charset;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.AggregatedHttpRequest;
import com.linecorp.armeria.common.AggregatedHttpResponse;
import com.linecorp.armeria.common.HttpData;
@@ -30,7 +32,6 @@
import com.linecorp.armeria.common.QueryParams;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.BlockingTaskExecutor;
import com.linecorp.armeria.common.util.Unwrappable;
diff --git a/core/src/main/java/com/linecorp/armeria/client/BlockingWebClientRequestPreparation.java b/core/src/main/java/com/linecorp/armeria/client/BlockingWebClientRequestPreparation.java
index 6b874002eac..f88c65acff1 100644
--- a/core/src/main/java/com/linecorp/armeria/client/BlockingWebClientRequestPreparation.java
+++ b/core/src/main/java/com/linecorp/armeria/client/BlockingWebClientRequestPreparation.java
@@ -27,6 +27,7 @@
import java.util.Map.Entry;
import java.util.function.Predicate;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import com.fasterxml.jackson.core.type.TypeReference;
@@ -44,7 +45,6 @@
import com.linecorp.armeria.common.JacksonObjectMapperProvider;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.ResponseEntity;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.util.AttributeKey;
diff --git a/core/src/main/java/com/linecorp/armeria/client/Bootstraps.java b/core/src/main/java/com/linecorp/armeria/client/Bootstraps.java
index 40daef2bf47..296f21a32db 100644
--- a/core/src/main/java/com/linecorp/armeria/client/Bootstraps.java
+++ b/core/src/main/java/com/linecorp/armeria/client/Bootstraps.java
@@ -23,9 +23,10 @@
import java.util.Objects;
import java.util.Set;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.SslContextFactory;
import io.netty.bootstrap.Bootstrap;
diff --git a/core/src/main/java/com/linecorp/armeria/client/Client.java b/core/src/main/java/com/linecorp/armeria/client/Client.java
index d5871efb848..59bfa57ebb1 100644
--- a/core/src/main/java/com/linecorp/armeria/client/Client.java
+++ b/core/src/main/java/com/linecorp/armeria/client/Client.java
@@ -18,13 +18,14 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.Request;
import com.linecorp.armeria.common.Response;
import com.linecorp.armeria.common.RpcRequest;
import com.linecorp.armeria.common.RpcResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Unwrappable;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/ClientBuilder.java b/core/src/main/java/com/linecorp/armeria/client/ClientBuilder.java
index 5d1a820fff5..416136a7844 100644
--- a/core/src/main/java/com/linecorp/armeria/client/ClientBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/ClientBuilder.java
@@ -25,6 +25,8 @@
import java.util.function.Function;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.endpoint.EndpointGroup;
import com.linecorp.armeria.client.redirect.RedirectConfig;
import com.linecorp.armeria.common.RequestId;
@@ -32,7 +34,6 @@
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
import com.linecorp.armeria.common.SuccessFunction;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.auth.AuthToken;
import com.linecorp.armeria.common.auth.BasicToken;
diff --git a/core/src/main/java/com/linecorp/armeria/client/ClientBuilderParams.java b/core/src/main/java/com/linecorp/armeria/client/ClientBuilderParams.java
index 097b3616b69..6eac41630ad 100644
--- a/core/src/main/java/com/linecorp/armeria/client/ClientBuilderParams.java
+++ b/core/src/main/java/com/linecorp/armeria/client/ClientBuilderParams.java
@@ -20,9 +20,10 @@
import java.net.URI;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.endpoint.EndpointGroup;
import com.linecorp.armeria.common.Scheme;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/ClientBuilderParamsBuilder.java b/core/src/main/java/com/linecorp/armeria/client/ClientBuilderParamsBuilder.java
index 43671e7b98d..8f30927fbb7 100644
--- a/core/src/main/java/com/linecorp/armeria/client/ClientBuilderParamsBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/ClientBuilderParamsBuilder.java
@@ -22,11 +22,12 @@
import java.net.URI;
import java.net.URISyntaxException;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.endpoint.EndpointGroup;
import com.linecorp.armeria.common.Scheme;
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.client.ClientBuilderParamsUtil;
import com.linecorp.armeria.internal.client.endpoint.UndefinedEndpointGroup;
diff --git a/core/src/main/java/com/linecorp/armeria/client/ClientFactory.java b/core/src/main/java/com/linecorp/armeria/client/ClientFactory.java
index aec7929db09..a95abd1cac2 100644
--- a/core/src/main/java/com/linecorp/armeria/client/ClientFactory.java
+++ b/core/src/main/java/com/linecorp/armeria/client/ClientFactory.java
@@ -29,6 +29,7 @@
import java.util.concurrent.ExecutionException;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,7 +41,6 @@
import com.linecorp.armeria.common.Scheme;
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.common.util.ListenableAsyncCloseable;
import com.linecorp.armeria.common.util.ReleasableHolder;
diff --git a/core/src/main/java/com/linecorp/armeria/client/ClientFactoryBuilder.java b/core/src/main/java/com/linecorp/armeria/client/ClientFactoryBuilder.java
index 2f0f795a0c8..9c479a0afcf 100644
--- a/core/src/main/java/com/linecorp/armeria/client/ClientFactoryBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/ClientFactoryBuilder.java
@@ -46,6 +46,8 @@
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.TrustManagerFactory;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
@@ -64,7 +66,6 @@
import com.linecorp.armeria.common.TlsPeerVerifierFactory;
import com.linecorp.armeria.common.TlsProvider;
import com.linecorp.armeria.common.TlsSetters;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.outlier.OutlierDetection;
import com.linecorp.armeria.common.util.EventLoopGroups;
diff --git a/core/src/main/java/com/linecorp/armeria/client/ClientRequestContext.java b/core/src/main/java/com/linecorp/armeria/client/ClientRequestContext.java
index ea4a1cda800..4fbafd390f9 100644
--- a/core/src/main/java/com/linecorp/armeria/client/ClientRequestContext.java
+++ b/core/src/main/java/com/linecorp/armeria/client/ClientRequestContext.java
@@ -28,6 +28,8 @@
import java.util.function.Function;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.google.errorprone.annotations.MustBeClosed;
import com.linecorp.armeria.client.endpoint.EndpointGroup;
@@ -43,7 +45,6 @@
import com.linecorp.armeria.common.Response;
import com.linecorp.armeria.common.RpcRequest;
import com.linecorp.armeria.common.TimeoutException;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.util.SafeCloseable;
diff --git a/core/src/main/java/com/linecorp/armeria/client/ClientRequestContextBuilder.java b/core/src/main/java/com/linecorp/armeria/client/ClientRequestContextBuilder.java
index 65ce8bef323..43e445d9459 100644
--- a/core/src/main/java/com/linecorp/armeria/client/ClientRequestContextBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/ClientRequestContextBuilder.java
@@ -22,6 +22,8 @@
import javax.net.ssl.SSLSession;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.endpoint.EndpointGroup;
import com.linecorp.armeria.common.AbstractRequestContextBuilder;
import com.linecorp.armeria.common.HttpMethod;
@@ -29,7 +31,6 @@
import com.linecorp.armeria.common.RequestId;
import com.linecorp.armeria.common.RpcRequest;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.ClientConnectionTimings;
import com.linecorp.armeria.common.util.SystemInfo;
import com.linecorp.armeria.internal.client.DefaultClientRequestContext;
diff --git a/core/src/main/java/com/linecorp/armeria/client/ClientRequestContextCaptor.java b/core/src/main/java/com/linecorp/armeria/client/ClientRequestContextCaptor.java
index abda9672568..bb1719d5f6d 100644
--- a/core/src/main/java/com/linecorp/armeria/client/ClientRequestContextCaptor.java
+++ b/core/src/main/java/com/linecorp/armeria/client/ClientRequestContextCaptor.java
@@ -19,7 +19,8 @@
import java.util.NoSuchElementException;
import java.util.function.Supplier;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.util.SafeCloseable;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/ClientRequestContextWrapper.java b/core/src/main/java/com/linecorp/armeria/client/ClientRequestContextWrapper.java
index 3013ab6c22d..48825916ca4 100644
--- a/core/src/main/java/com/linecorp/armeria/client/ClientRequestContextWrapper.java
+++ b/core/src/main/java/com/linecorp/armeria/client/ClientRequestContextWrapper.java
@@ -22,6 +22,8 @@
import java.util.function.Consumer;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.endpoint.EndpointGroup;
import com.linecorp.armeria.common.ExchangeType;
import com.linecorp.armeria.common.HttpHeaders;
@@ -30,7 +32,6 @@
import com.linecorp.armeria.common.RequestContextWrapper;
import com.linecorp.armeria.common.RequestId;
import com.linecorp.armeria.common.RpcRequest;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.TimeoutMode;
diff --git a/core/src/main/java/com/linecorp/armeria/client/ClientTlsConfig.java b/core/src/main/java/com/linecorp/armeria/client/ClientTlsConfig.java
index dea42bafd1c..ea1d13b3828 100644
--- a/core/src/main/java/com/linecorp/armeria/client/ClientTlsConfig.java
+++ b/core/src/main/java/com/linecorp/armeria/client/ClientTlsConfig.java
@@ -20,11 +20,12 @@
import java.util.Set;
import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.common.AbstractTlsConfig;
import com.linecorp.armeria.common.TlsProvider;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.metric.MeterIdPrefix;
diff --git a/core/src/main/java/com/linecorp/armeria/client/ClientTlsSpec.java b/core/src/main/java/com/linecorp/armeria/client/ClientTlsSpec.java
index 44b9fa61741..ed9b8fa1654 100644
--- a/core/src/main/java/com/linecorp/armeria/client/ClientTlsSpec.java
+++ b/core/src/main/java/com/linecorp/armeria/client/ClientTlsSpec.java
@@ -23,10 +23,11 @@
import javax.net.ssl.KeyManagerFactory;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.AbstractTlsSpec;
import com.linecorp.armeria.common.TlsKeyPair;
import com.linecorp.armeria.common.TlsPeerVerifierFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.TlsEngineType;
diff --git a/core/src/main/java/com/linecorp/armeria/client/ClientTlsSpecBuilder.java b/core/src/main/java/com/linecorp/armeria/client/ClientTlsSpecBuilder.java
index 6ba73616620..9341419464d 100644
--- a/core/src/main/java/com/linecorp/armeria/client/ClientTlsSpecBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/ClientTlsSpecBuilder.java
@@ -23,9 +23,10 @@
import javax.net.ssl.KeyManagerFactory;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.AbstractTlsSpecBuilder;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.common.util.SslContextUtil;
diff --git a/core/src/main/java/com/linecorp/armeria/client/Clients.java b/core/src/main/java/com/linecorp/armeria/client/Clients.java
index fb983a73620..f450efbdc32 100644
--- a/core/src/main/java/com/linecorp/armeria/client/Clients.java
+++ b/core/src/main/java/com/linecorp/armeria/client/Clients.java
@@ -21,6 +21,8 @@
import java.util.function.Consumer;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.errorprone.annotations.MustBeClosed;
@@ -31,7 +33,6 @@
import com.linecorp.armeria.common.Scheme;
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.SafeCloseable;
import com.linecorp.armeria.common.util.Unwrappable;
diff --git a/core/src/main/java/com/linecorp/armeria/client/ConnectionPoolMetrics.java b/core/src/main/java/com/linecorp/armeria/client/ConnectionPoolMetrics.java
index db9e33223bc..d5c444379c3 100644
--- a/core/src/main/java/com/linecorp/armeria/client/ConnectionPoolMetrics.java
+++ b/core/src/main/java/com/linecorp/armeria/client/ConnectionPoolMetrics.java
@@ -28,6 +28,7 @@
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -35,7 +36,6 @@
import com.google.errorprone.annotations.concurrent.GuardedBy;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.metric.MeterIdPrefix;
import com.linecorp.armeria.common.util.SafeCloseable;
import com.linecorp.armeria.common.util.ThreadFactories;
diff --git a/core/src/main/java/com/linecorp/armeria/client/DecoratingClientFactory.java b/core/src/main/java/com/linecorp/armeria/client/DecoratingClientFactory.java
index f61839eac07..2a78d09bcf5 100644
--- a/core/src/main/java/com/linecorp/armeria/client/DecoratingClientFactory.java
+++ b/core/src/main/java/com/linecorp/armeria/client/DecoratingClientFactory.java
@@ -20,11 +20,12 @@
import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.endpoint.EndpointGroup;
import com.linecorp.armeria.common.Scheme;
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.AbstractUnwrappable;
import com.linecorp.armeria.common.util.ReleasableHolder;
diff --git a/core/src/main/java/com/linecorp/armeria/client/DefaultClientFactory.java b/core/src/main/java/com/linecorp/armeria/client/DefaultClientFactory.java
index 9c4cc44aadb..011cc5d6812 100644
--- a/core/src/main/java/com/linecorp/armeria/client/DefaultClientFactory.java
+++ b/core/src/main/java/com/linecorp/armeria/client/DefaultClientFactory.java
@@ -26,6 +26,7 @@
import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -39,7 +40,6 @@
import com.linecorp.armeria.common.Scheme;
import com.linecorp.armeria.common.SessionProtocol;
import com.linecorp.armeria.common.TlsProvider;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.AsyncCloseableSupport;
import com.linecorp.armeria.common.util.ReleasableHolder;
import com.linecorp.armeria.common.util.ShutdownHooks;
diff --git a/core/src/main/java/com/linecorp/armeria/client/DefaultDnsCache.java b/core/src/main/java/com/linecorp/armeria/client/DefaultDnsCache.java
index a9b2b6e2f0f..8a2bb000416 100644
--- a/core/src/main/java/com/linecorp/armeria/client/DefaultDnsCache.java
+++ b/core/src/main/java/com/linecorp/armeria/client/DefaultDnsCache.java
@@ -26,6 +26,7 @@
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,7 +41,6 @@
import com.google.common.collect.ImmutableList;
import com.google.common.primitives.Ints;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.metric.MeterIdPrefix;
import com.linecorp.armeria.internal.common.metric.CaffeineMetricSupport;
diff --git a/core/src/main/java/com/linecorp/armeria/client/DefaultDnsQueryLifecycleObserver.java b/core/src/main/java/com/linecorp/armeria/client/DefaultDnsQueryLifecycleObserver.java
index 102a2c5f64e..eec656cb1e0 100644
--- a/core/src/main/java/com/linecorp/armeria/client/DefaultDnsQueryLifecycleObserver.java
+++ b/core/src/main/java/com/linecorp/armeria/client/DefaultDnsQueryLifecycleObserver.java
@@ -19,10 +19,11 @@
import java.util.List;
import java.util.stream.Collectors;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.Ascii;
import com.google.common.collect.ImmutableList;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.metric.MeterIdPrefix;
import com.linecorp.armeria.internal.common.util.StringUtil;
diff --git a/core/src/main/java/com/linecorp/armeria/client/DefaultEventLoopScheduler.java b/core/src/main/java/com/linecorp/armeria/client/DefaultEventLoopScheduler.java
index be96031c1d3..d03a91ecf9d 100644
--- a/core/src/main/java/com/linecorp/armeria/client/DefaultEventLoopScheduler.java
+++ b/core/src/main/java/com/linecorp/armeria/client/DefaultEventLoopScheduler.java
@@ -30,6 +30,7 @@
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.ToIntFunction;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -39,7 +40,6 @@
import com.linecorp.armeria.client.endpoint.EndpointGroup;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.ReleasableHolder;
import com.linecorp.armeria.internal.common.util.ReentrantShortLock;
diff --git a/core/src/main/java/com/linecorp/armeria/client/DefaultRequestOptions.java b/core/src/main/java/com/linecorp/armeria/client/DefaultRequestOptions.java
index 573c7913e73..a6b3b0a59e6 100644
--- a/core/src/main/java/com/linecorp/armeria/client/DefaultRequestOptions.java
+++ b/core/src/main/java/com/linecorp/armeria/client/DefaultRequestOptions.java
@@ -19,11 +19,12 @@
import java.util.Map;
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableMap;
import com.linecorp.armeria.common.ExchangeType;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.util.AttributeKey;
diff --git a/core/src/main/java/com/linecorp/armeria/client/DefaultWebClient.java b/core/src/main/java/com/linecorp/armeria/client/DefaultWebClient.java
index 77adbb3ead9..ed93f70a42e 100644
--- a/core/src/main/java/com/linecorp/armeria/client/DefaultWebClient.java
+++ b/core/src/main/java/com/linecorp/armeria/client/DefaultWebClient.java
@@ -18,6 +18,8 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.Strings;
import com.linecorp.armeria.client.endpoint.EndpointGroup;
@@ -28,7 +30,6 @@
import com.linecorp.armeria.common.RequestTargetForm;
import com.linecorp.armeria.common.Scheme;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.client.ClientUtil;
import com.linecorp.armeria.internal.client.DefaultClientRequestContext;
import com.linecorp.armeria.internal.client.TailPreClient;
diff --git a/core/src/main/java/com/linecorp/armeria/client/DnsCache.java b/core/src/main/java/com/linecorp/armeria/client/DnsCache.java
index 3728529fd84..c16dd5bbff7 100644
--- a/core/src/main/java/com/linecorp/armeria/client/DnsCache.java
+++ b/core/src/main/java/com/linecorp/armeria/client/DnsCache.java
@@ -21,9 +21,10 @@
import java.net.UnknownHostException;
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.handler.codec.dns.DnsQuestion;
diff --git a/core/src/main/java/com/linecorp/armeria/client/DnsCacheListener.java b/core/src/main/java/com/linecorp/armeria/client/DnsCacheListener.java
index 154e9e651d3..76951a28e4c 100644
--- a/core/src/main/java/com/linecorp/armeria/client/DnsCacheListener.java
+++ b/core/src/main/java/com/linecorp/armeria/client/DnsCacheListener.java
@@ -19,7 +19,8 @@
import java.net.UnknownHostException;
import java.util.List;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.handler.codec.dns.DnsQuestion;
diff --git a/core/src/main/java/com/linecorp/armeria/client/DnsResolverGroupBuilder.java b/core/src/main/java/com/linecorp/armeria/client/DnsResolverGroupBuilder.java
index eb90ff00c94..21c1d702748 100644
--- a/core/src/main/java/com/linecorp/armeria/client/DnsResolverGroupBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/DnsResolverGroupBuilder.java
@@ -22,8 +22,9 @@
import java.time.Duration;
import java.util.function.ToLongFunction;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.retry.Backoff;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.micrometer.core.instrument.MeterRegistry;
diff --git a/core/src/main/java/com/linecorp/armeria/client/DnsTimeoutException.java b/core/src/main/java/com/linecorp/armeria/client/DnsTimeoutException.java
index 64497183aa5..82ad01e4905 100644
--- a/core/src/main/java/com/linecorp/armeria/client/DnsTimeoutException.java
+++ b/core/src/main/java/com/linecorp/armeria/client/DnsTimeoutException.java
@@ -16,9 +16,10 @@
package com.linecorp.armeria.client;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.Flags;
import com.linecorp.armeria.common.TimeoutException;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* A {@link TimeoutException} raised when a response has not been received from a DNS server within timeout.
diff --git a/core/src/main/java/com/linecorp/armeria/client/Endpoint.java b/core/src/main/java/com/linecorp/armeria/client/Endpoint.java
index 9a5ed4b7ecd..1114e56bb4f 100644
--- a/core/src/main/java/com/linecorp/armeria/client/Endpoint.java
+++ b/core/src/main/java/com/linecorp/armeria/client/Endpoint.java
@@ -39,6 +39,8 @@
import javax.annotation.Nonnull;
+import org.jspecify.annotations.Nullable;
+
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.google.common.annotations.VisibleForTesting;
@@ -53,7 +55,6 @@
import com.linecorp.armeria.common.Scheme;
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.loadbalancer.Weighted;
import com.linecorp.armeria.common.util.DomainSocketAddress;
diff --git a/core/src/main/java/com/linecorp/armeria/client/EventLoopScheduler.java b/core/src/main/java/com/linecorp/armeria/client/EventLoopScheduler.java
index 6e30be54cd3..441c3e8b3ad 100644
--- a/core/src/main/java/com/linecorp/armeria/client/EventLoopScheduler.java
+++ b/core/src/main/java/com/linecorp/armeria/client/EventLoopScheduler.java
@@ -16,9 +16,10 @@
package com.linecorp.armeria.client;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.endpoint.EndpointGroup;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.ReleasableHolder;
import io.netty.channel.EventLoop;
diff --git a/core/src/main/java/com/linecorp/armeria/client/FutureTransformingRequestPreparation.java b/core/src/main/java/com/linecorp/armeria/client/FutureTransformingRequestPreparation.java
index ed099b4f398..ad2ff3b48e7 100644
--- a/core/src/main/java/com/linecorp/armeria/client/FutureTransformingRequestPreparation.java
+++ b/core/src/main/java/com/linecorp/armeria/client/FutureTransformingRequestPreparation.java
@@ -24,6 +24,7 @@
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -38,7 +39,6 @@
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.MediaType;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.Exceptions;
diff --git a/core/src/main/java/com/linecorp/armeria/client/Http1ClientKeepAliveHandler.java b/core/src/main/java/com/linecorp/armeria/client/Http1ClientKeepAliveHandler.java
index 520c207e358..20ac28bc402 100644
--- a/core/src/main/java/com/linecorp/armeria/client/Http1ClientKeepAliveHandler.java
+++ b/core/src/main/java/com/linecorp/armeria/client/Http1ClientKeepAliveHandler.java
@@ -18,10 +18,11 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpHeaderNames;
import com.linecorp.armeria.common.HttpMethod;
import com.linecorp.armeria.common.RequestHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.client.HttpSession;
import com.linecorp.armeria.internal.client.UserAgentUtil;
import com.linecorp.armeria.internal.common.ConnectionEventListener;
diff --git a/core/src/main/java/com/linecorp/armeria/client/Http1ResponseDecoder.java b/core/src/main/java/com/linecorp/armeria/client/Http1ResponseDecoder.java
index 886d2f95f96..663d51b244e 100644
--- a/core/src/main/java/com/linecorp/armeria/client/Http1ResponseDecoder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/Http1ResponseDecoder.java
@@ -19,6 +19,7 @@
import static com.linecorp.armeria.internal.client.ClosedStreamExceptionUtil.newClosedSessionException;
import static com.linecorp.armeria.internal.common.KeepAliveHandlerUtil.needsKeepAliveHandler;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -30,7 +31,6 @@
import com.linecorp.armeria.common.ProtocolViolationException;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.metric.MoreMeters;
import com.linecorp.armeria.internal.common.ArmeriaHttpUtil;
import com.linecorp.armeria.internal.common.InboundTrafficController;
diff --git a/core/src/main/java/com/linecorp/armeria/client/Http2ResponseDecoder.java b/core/src/main/java/com/linecorp/armeria/client/Http2ResponseDecoder.java
index fa462b9350f..cd4152ca34c 100644
--- a/core/src/main/java/com/linecorp/armeria/client/Http2ResponseDecoder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/Http2ResponseDecoder.java
@@ -22,6 +22,7 @@
import static io.netty.handler.codec.http2.Http2Error.PROTOCOL_ERROR;
import static io.netty.handler.codec.http2.Http2Exception.connectionError;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -31,7 +32,6 @@
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.HttpStatusClass;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.stream.ClosedStreamException;
import com.linecorp.armeria.internal.common.ArmeriaHttpUtil;
import com.linecorp.armeria.internal.common.Http2GoAwayHandler;
diff --git a/core/src/main/java/com/linecorp/armeria/client/HttpChannelPool.java b/core/src/main/java/com/linecorp/armeria/client/HttpChannelPool.java
index a499c41c7f6..8d8c8f46c82 100644
--- a/core/src/main/java/com/linecorp/armeria/client/HttpChannelPool.java
+++ b/core/src/main/java/com/linecorp/armeria/client/HttpChannelPool.java
@@ -35,6 +35,7 @@
import java.util.function.BiFunction;
import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -51,7 +52,6 @@
import com.linecorp.armeria.common.NonBlocking;
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.ClientConnectionTimingsBuilder;
import com.linecorp.armeria.common.util.AsyncCloseable;
import com.linecorp.armeria.common.util.AsyncCloseableSupport;
diff --git a/core/src/main/java/com/linecorp/armeria/client/HttpClientDelegate.java b/core/src/main/java/com/linecorp/armeria/client/HttpClientDelegate.java
index 4d9b7c1f306..0ea996cdab8 100644
--- a/core/src/main/java/com/linecorp/armeria/client/HttpClientDelegate.java
+++ b/core/src/main/java/com/linecorp/armeria/client/HttpClientDelegate.java
@@ -24,6 +24,8 @@
import java.util.List;
import java.util.function.BiConsumer;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.HttpChannelPool.PoolKey;
import com.linecorp.armeria.client.endpoint.EmptyEndpointGroupException;
import com.linecorp.armeria.client.proxy.HAProxyConfig;
@@ -37,7 +39,6 @@
import com.linecorp.armeria.common.TlsKeyPair;
import com.linecorp.armeria.common.TlsPeerVerifierFactory;
import com.linecorp.armeria.common.TlsProvider;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.ClientConnectionTimings;
import com.linecorp.armeria.common.logging.ClientConnectionTimingsBuilder;
import com.linecorp.armeria.common.util.SafeCloseable;
diff --git a/core/src/main/java/com/linecorp/armeria/client/HttpClientFactory.java b/core/src/main/java/com/linecorp/armeria/client/HttpClientFactory.java
index fc4c7636839..a90b0ce1c27 100644
--- a/core/src/main/java/com/linecorp/armeria/client/HttpClientFactory.java
+++ b/core/src/main/java/com/linecorp/armeria/client/HttpClientFactory.java
@@ -31,6 +31,7 @@
import java.util.function.Supplier;
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -46,7 +47,6 @@
import com.linecorp.armeria.common.Scheme;
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.metric.MeterIdPrefix;
import com.linecorp.armeria.common.util.AsyncCloseableSupport;
import com.linecorp.armeria.common.util.ReleasableHolder;
diff --git a/core/src/main/java/com/linecorp/armeria/client/HttpClientPipelineConfigurator.java b/core/src/main/java/com/linecorp/armeria/client/HttpClientPipelineConfigurator.java
index d1efec6f1b9..f32d6cb1325 100644
--- a/core/src/main/java/com/linecorp/armeria/client/HttpClientPipelineConfigurator.java
+++ b/core/src/main/java/com/linecorp/armeria/client/HttpClientPipelineConfigurator.java
@@ -37,6 +37,7 @@
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLException;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import org.slf4j.Logger;
@@ -49,7 +50,6 @@
import com.linecorp.armeria.common.RequestId;
import com.linecorp.armeria.common.RequestTarget;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.ClientConnectionTimingsBuilder;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.common.util.SystemInfo;
diff --git a/core/src/main/java/com/linecorp/armeria/client/HttpResponseDecoder.java b/core/src/main/java/com/linecorp/armeria/client/HttpResponseDecoder.java
index bbce2e5adb2..7dbdf25cf32 100644
--- a/core/src/main/java/com/linecorp/armeria/client/HttpResponseDecoder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/HttpResponseDecoder.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.client;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.internal.client.DecodedHttpResponse;
import com.linecorp.armeria.internal.client.HttpSession;
import com.linecorp.armeria.internal.common.InboundTrafficController;
diff --git a/core/src/main/java/com/linecorp/armeria/client/HttpResponseWrapper.java b/core/src/main/java/com/linecorp/armeria/client/HttpResponseWrapper.java
index 09336ac0a45..8a8c1b6b95c 100644
--- a/core/src/main/java/com/linecorp/armeria/client/HttpResponseWrapper.java
+++ b/core/src/main/java/com/linecorp/armeria/client/HttpResponseWrapper.java
@@ -21,6 +21,7 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -33,7 +34,6 @@
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.ResponseCompleteException;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLogProperty;
import com.linecorp.armeria.common.stream.CancelledSubscriptionException;
import com.linecorp.armeria.common.stream.StreamWriter;
diff --git a/core/src/main/java/com/linecorp/armeria/client/HttpSessionHandler.java b/core/src/main/java/com/linecorp/armeria/client/HttpSessionHandler.java
index 675307ca6da..a085991a209 100644
--- a/core/src/main/java/com/linecorp/armeria/client/HttpSessionHandler.java
+++ b/core/src/main/java/com/linecorp/armeria/client/HttpSessionHandler.java
@@ -30,6 +30,7 @@
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -42,7 +43,6 @@
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.outlier.OutlierDetection;
import com.linecorp.armeria.common.outlier.OutlierDetectionDecision;
diff --git a/core/src/main/java/com/linecorp/armeria/client/InvalidHttpResponseException.java b/core/src/main/java/com/linecorp/armeria/client/InvalidHttpResponseException.java
index 890b9c49181..07f309899cc 100644
--- a/core/src/main/java/com/linecorp/armeria/client/InvalidHttpResponseException.java
+++ b/core/src/main/java/com/linecorp/armeria/client/InvalidHttpResponseException.java
@@ -19,9 +19,10 @@
import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.AggregatedHttpResponse;
import com.linecorp.armeria.common.HttpResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/InvalidResponseException.java b/core/src/main/java/com/linecorp/armeria/client/InvalidResponseException.java
index f905e5c8207..c24b4fa2145 100644
--- a/core/src/main/java/com/linecorp/armeria/client/InvalidResponseException.java
+++ b/core/src/main/java/com/linecorp/armeria/client/InvalidResponseException.java
@@ -15,7 +15,7 @@
*/
package com.linecorp.armeria.client;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A {@link RuntimeException} raised when a client received an invalid response.
diff --git a/core/src/main/java/com/linecorp/armeria/client/InvalidResponseHeadersException.java b/core/src/main/java/com/linecorp/armeria/client/InvalidResponseHeadersException.java
index 7d43067b5de..b33b04294c0 100644
--- a/core/src/main/java/com/linecorp/armeria/client/InvalidResponseHeadersException.java
+++ b/core/src/main/java/com/linecorp/armeria/client/InvalidResponseHeadersException.java
@@ -17,8 +17,9 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* An {@link InvalidResponseException} raised when a client received a response with invalid headers.
diff --git a/core/src/main/java/com/linecorp/armeria/client/NoopHostFileEntriesResolver.java b/core/src/main/java/com/linecorp/armeria/client/NoopHostFileEntriesResolver.java
index 8dc905697ca..bb14ed3c6e3 100644
--- a/core/src/main/java/com/linecorp/armeria/client/NoopHostFileEntriesResolver.java
+++ b/core/src/main/java/com/linecorp/armeria/client/NoopHostFileEntriesResolver.java
@@ -18,7 +18,7 @@
import java.net.InetAddress;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.netty.resolver.HostsFileEntriesResolver;
import io.netty.resolver.ResolvedAddressTypes;
diff --git a/core/src/main/java/com/linecorp/armeria/client/NullTlsProvider.java b/core/src/main/java/com/linecorp/armeria/client/NullTlsProvider.java
index 90519034de4..1c5c4e92144 100644
--- a/core/src/main/java/com/linecorp/armeria/client/NullTlsProvider.java
+++ b/core/src/main/java/com/linecorp/armeria/client/NullTlsProvider.java
@@ -16,9 +16,10 @@
package com.linecorp.armeria.client;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.TlsKeyPair;
import com.linecorp.armeria.common.TlsProvider;
-import com.linecorp.armeria.common.annotation.Nullable;
enum NullTlsProvider implements TlsProvider {
INSTANCE;
diff --git a/core/src/main/java/com/linecorp/armeria/client/RedirectingClient.java b/core/src/main/java/com/linecorp/armeria/client/RedirectingClient.java
index 1f83fa3610f..c8b729a0d05 100644
--- a/core/src/main/java/com/linecorp/armeria/client/RedirectingClient.java
+++ b/core/src/main/java/com/linecorp/armeria/client/RedirectingClient.java
@@ -29,6 +29,8 @@
import java.util.function.BiPredicate;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableSet;
@@ -53,7 +55,6 @@
import com.linecorp.armeria.common.RequestTargetForm;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLogBuilder;
import com.linecorp.armeria.common.logging.RequestLogProperty;
import com.linecorp.armeria.common.stream.AbortedStreamException;
diff --git a/core/src/main/java/com/linecorp/armeria/client/RefreshingAddressResolver.java b/core/src/main/java/com/linecorp/armeria/client/RefreshingAddressResolver.java
index b27403ca9c6..ceea750d753 100644
--- a/core/src/main/java/com/linecorp/armeria/client/RefreshingAddressResolver.java
+++ b/core/src/main/java/com/linecorp/armeria/client/RefreshingAddressResolver.java
@@ -31,6 +31,7 @@
import java.util.concurrent.TimeUnit;
import java.util.function.ToLongFunction;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -39,7 +40,6 @@
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.client.retry.Backoff;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.internal.client.dns.DefaultDnsResolver;
import com.linecorp.armeria.internal.client.dns.DnsQuestionWithoutTrailingDot;
diff --git a/core/src/main/java/com/linecorp/armeria/client/RefreshingAddressResolverGroup.java b/core/src/main/java/com/linecorp/armeria/client/RefreshingAddressResolverGroup.java
index b8b4c601da1..cc9f65abe0e 100644
--- a/core/src/main/java/com/linecorp/armeria/client/RefreshingAddressResolverGroup.java
+++ b/core/src/main/java/com/linecorp/armeria/client/RefreshingAddressResolverGroup.java
@@ -21,6 +21,8 @@
import java.util.function.Consumer;
import java.util.function.ToLongFunction;
+import org.jspecify.annotations.Nullable;
+
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.RemovalListener;
@@ -30,7 +32,6 @@
import com.linecorp.armeria.client.RefreshingAddressResolver.CacheEntry;
import com.linecorp.armeria.client.retry.Backoff;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.SystemInfo;
import com.linecorp.armeria.internal.client.dns.DefaultDnsResolver;
diff --git a/core/src/main/java/com/linecorp/armeria/client/RequestOptions.java b/core/src/main/java/com/linecorp/armeria/client/RequestOptions.java
index 1c2d31f6093..5cb011b9ac9 100644
--- a/core/src/main/java/com/linecorp/armeria/client/RequestOptions.java
+++ b/core/src/main/java/com/linecorp/armeria/client/RequestOptions.java
@@ -21,12 +21,13 @@
import java.util.Map;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.ExchangeType;
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.Request;
import com.linecorp.armeria.common.Response;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.util.AttributeKey;
diff --git a/core/src/main/java/com/linecorp/armeria/client/RequestOptionsBuilder.java b/core/src/main/java/com/linecorp/armeria/client/RequestOptionsBuilder.java
index 3e20f258762..575ca2abcef 100644
--- a/core/src/main/java/com/linecorp/armeria/client/RequestOptionsBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/RequestOptionsBuilder.java
@@ -24,10 +24,11 @@
import java.util.HashMap;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableMap;
import com.linecorp.armeria.common.ExchangeType;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.util.AttributeKey;
diff --git a/core/src/main/java/com/linecorp/armeria/client/RequestOptionsSetters.java b/core/src/main/java/com/linecorp/armeria/client/RequestOptionsSetters.java
index be2cd008221..3c48b9f2308 100644
--- a/core/src/main/java/com/linecorp/armeria/client/RequestOptionsSetters.java
+++ b/core/src/main/java/com/linecorp/armeria/client/RequestOptionsSetters.java
@@ -18,12 +18,13 @@
import java.time.Duration;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.ExchangeType;
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.Request;
import com.linecorp.armeria.common.Response;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.util.AttributeKey;
diff --git a/core/src/main/java/com/linecorp/armeria/client/RestClientBuilder.java b/core/src/main/java/com/linecorp/armeria/client/RestClientBuilder.java
index 399fe338173..27b95eb0539 100644
--- a/core/src/main/java/com/linecorp/armeria/client/RestClientBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/RestClientBuilder.java
@@ -23,12 +23,13 @@
import java.util.function.Function;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.endpoint.EndpointGroup;
import com.linecorp.armeria.client.redirect.RedirectConfig;
import com.linecorp.armeria.common.RequestId;
import com.linecorp.armeria.common.SessionProtocol;
import com.linecorp.armeria.common.SuccessFunction;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.auth.AuthToken;
import com.linecorp.armeria.common.auth.BasicToken;
diff --git a/core/src/main/java/com/linecorp/armeria/client/RestClientPreparation.java b/core/src/main/java/com/linecorp/armeria/client/RestClientPreparation.java
index 8a187953483..cfdc35fc9e6 100644
--- a/core/src/main/java/com/linecorp/armeria/client/RestClientPreparation.java
+++ b/core/src/main/java/com/linecorp/armeria/client/RestClientPreparation.java
@@ -23,6 +23,7 @@
import java.util.Map.Entry;
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import com.fasterxml.jackson.core.type.TypeReference;
@@ -39,7 +40,6 @@
import com.linecorp.armeria.common.JacksonObjectMapperProvider;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.ResponseEntity;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.util.AttributeKey;
diff --git a/core/src/main/java/com/linecorp/armeria/client/SessionProtocolNegotiationException.java b/core/src/main/java/com/linecorp/armeria/client/SessionProtocolNegotiationException.java
index 6eced0cba29..fa9069f468a 100644
--- a/core/src/main/java/com/linecorp/armeria/client/SessionProtocolNegotiationException.java
+++ b/core/src/main/java/com/linecorp/armeria/client/SessionProtocolNegotiationException.java
@@ -18,9 +18,10 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.Flags;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* An exception triggered when failed to negotiate the desired {@link SessionProtocol} with a server.
diff --git a/core/src/main/java/com/linecorp/armeria/client/TimeoutExceptionPredicate.java b/core/src/main/java/com/linecorp/armeria/client/TimeoutExceptionPredicate.java
index 53c25057bc9..05a00ced27a 100644
--- a/core/src/main/java/com/linecorp/armeria/client/TimeoutExceptionPredicate.java
+++ b/core/src/main/java/com/linecorp/armeria/client/TimeoutExceptionPredicate.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.client;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.TimeoutException;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.internal.client.dns.DnsUtil;
diff --git a/core/src/main/java/com/linecorp/armeria/client/TransformingRequestPreparation.java b/core/src/main/java/com/linecorp/armeria/client/TransformingRequestPreparation.java
index d76de68401a..45098487de3 100644
--- a/core/src/main/java/com/linecorp/armeria/client/TransformingRequestPreparation.java
+++ b/core/src/main/java/com/linecorp/armeria/client/TransformingRequestPreparation.java
@@ -22,6 +22,7 @@
import java.util.Map;
import java.util.Map.Entry;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import com.google.errorprone.annotations.FormatMethod;
@@ -34,7 +35,6 @@
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.MediaType;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.util.AttributeKey;
diff --git a/core/src/main/java/com/linecorp/armeria/client/WebClient.java b/core/src/main/java/com/linecorp/armeria/client/WebClient.java
index d88c0fd8917..e62020473e9 100644
--- a/core/src/main/java/com/linecorp/armeria/client/WebClient.java
+++ b/core/src/main/java/com/linecorp/armeria/client/WebClient.java
@@ -22,6 +22,8 @@
import java.net.URI;
import java.nio.charset.Charset;
+import org.jspecify.annotations.Nullable;
+
import com.google.errorprone.annotations.CheckReturnValue;
import com.linecorp.armeria.client.endpoint.EndpointGroup;
@@ -33,7 +35,6 @@
import com.linecorp.armeria.common.QueryParams;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.BlockingTaskExecutor;
import com.linecorp.armeria.common.util.Unwrappable;
diff --git a/core/src/main/java/com/linecorp/armeria/client/WebClientBuilder.java b/core/src/main/java/com/linecorp/armeria/client/WebClientBuilder.java
index 6a36afce33e..3ce570fd155 100644
--- a/core/src/main/java/com/linecorp/armeria/client/WebClientBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/WebClientBuilder.java
@@ -23,12 +23,13 @@
import java.util.function.Function;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.endpoint.EndpointGroup;
import com.linecorp.armeria.client.redirect.RedirectConfig;
import com.linecorp.armeria.common.RequestId;
import com.linecorp.armeria.common.SessionProtocol;
import com.linecorp.armeria.common.SuccessFunction;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.auth.AuthToken;
import com.linecorp.armeria.common.auth.BasicToken;
import com.linecorp.armeria.common.auth.OAuth1aToken;
diff --git a/core/src/main/java/com/linecorp/armeria/client/WebClientRequestPreparation.java b/core/src/main/java/com/linecorp/armeria/client/WebClientRequestPreparation.java
index 6486be67ac8..ce273e5421b 100644
--- a/core/src/main/java/com/linecorp/armeria/client/WebClientRequestPreparation.java
+++ b/core/src/main/java/com/linecorp/armeria/client/WebClientRequestPreparation.java
@@ -26,6 +26,7 @@
import java.util.List;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import com.fasterxml.jackson.core.type.TypeReference;
@@ -44,7 +45,6 @@
import com.linecorp.armeria.common.JacksonObjectMapperProvider;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.ResponseEntity;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.util.AttributeKey;
diff --git a/core/src/main/java/com/linecorp/armeria/client/WebClientUtil.java b/core/src/main/java/com/linecorp/armeria/client/WebClientUtil.java
index eaae60f2edf..a780c0511c6 100644
--- a/core/src/main/java/com/linecorp/armeria/client/WebClientUtil.java
+++ b/core/src/main/java/com/linecorp/armeria/client/WebClientUtil.java
@@ -17,8 +17,9 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.QueryParams;
-import com.linecorp.armeria.common.annotation.Nullable;
final class WebClientUtil {
diff --git a/core/src/main/java/com/linecorp/armeria/client/WebSocketHttp1ClientChannelHandler.java b/core/src/main/java/com/linecorp/armeria/client/WebSocketHttp1ClientChannelHandler.java
index cf6d0171792..c8ddfe9abcd 100644
--- a/core/src/main/java/com/linecorp/armeria/client/WebSocketHttp1ClientChannelHandler.java
+++ b/core/src/main/java/com/linecorp/armeria/client/WebSocketHttp1ClientChannelHandler.java
@@ -20,6 +20,7 @@
import static com.linecorp.armeria.internal.client.ClosedStreamExceptionUtil.newClosedSessionException;
import static io.netty.handler.codec.http.LastHttpContent.EMPTY_LAST_CONTENT;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -29,7 +30,6 @@
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.ProtocolViolationException;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.client.DecodedHttpResponse;
import com.linecorp.armeria.internal.client.HttpSession;
import com.linecorp.armeria.internal.common.ArmeriaHttpUtil;
diff --git a/core/src/main/java/com/linecorp/armeria/client/WebSocketHttp1ResponseWrapper.java b/core/src/main/java/com/linecorp/armeria/client/WebSocketHttp1ResponseWrapper.java
index 47abd673080..c8cdd50dcb1 100644
--- a/core/src/main/java/com/linecorp/armeria/client/WebSocketHttp1ResponseWrapper.java
+++ b/core/src/main/java/com/linecorp/armeria/client/WebSocketHttp1ResponseWrapper.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.client;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.ClosedSessionException;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.client.DecodedHttpResponse;
import com.linecorp.armeria.internal.client.websocket.WebSocketClientUtil;
diff --git a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/AbstractCircuitBreakerClient.java b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/AbstractCircuitBreakerClient.java
index 82395df94d7..b278d58b3c2 100644
--- a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/AbstractCircuitBreakerClient.java
+++ b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/AbstractCircuitBreakerClient.java
@@ -23,6 +23,8 @@
import java.util.concurrent.CompletionStage;
import java.util.function.BiFunction;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.client.Client;
@@ -30,7 +32,6 @@
import com.linecorp.armeria.client.SimpleDecoratingClient;
import com.linecorp.armeria.common.Request;
import com.linecorp.armeria.common.Response;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.circuitbreaker.CircuitBreakerCallback;
import com.linecorp.armeria.common.util.CompletionActions;
diff --git a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/AbstractCircuitBreakerClientBuilder.java b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/AbstractCircuitBreakerClientBuilder.java
index e0e061ec8bf..09e7e5850cf 100644
--- a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/AbstractCircuitBreakerClientBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/AbstractCircuitBreakerClientBuilder.java
@@ -21,11 +21,12 @@
import java.util.function.BiFunction;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.Client;
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.common.Request;
import com.linecorp.armeria.common.Response;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerBuilder.java b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerBuilder.java
index 67933f59b9e..32c2aa47026 100644
--- a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerBuilder.java
@@ -23,9 +23,10 @@
import java.util.Collections;
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Ticker;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerClient.java b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerClient.java
index 798f39148d5..6a6557340d1 100644
--- a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerClient.java
+++ b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerClient.java
@@ -23,6 +23,8 @@
import java.util.function.BiFunction;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.HttpClient;
import com.linecorp.armeria.common.HttpMethod;
@@ -30,7 +32,6 @@
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpResponseDuplicator;
import com.linecorp.armeria.common.Response;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.circuitbreaker.CircuitBreakerCallback;
import com.linecorp.armeria.common.logging.RequestLogProperty;
diff --git a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerClientHandler.java b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerClientHandler.java
index 57b25191a18..9e7d5e48617 100644
--- a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerClientHandler.java
+++ b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerClientHandler.java
@@ -18,9 +18,10 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.common.Request;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.circuitbreaker.CircuitBreakerCallback;
diff --git a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerConfig.java b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerConfig.java
index f9c78d2d692..be1bb79dd3f 100644
--- a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerConfig.java
+++ b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerConfig.java
@@ -19,9 +19,9 @@
import java.time.Duration;
import java.util.List;
-import com.google.common.base.MoreObjects;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.google.common.base.MoreObjects;
/**
* Stores configurations of circuit breaker.
diff --git a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerFactory.java b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerFactory.java
index e80ba47d630..60e4a8e4a53 100644
--- a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerFactory.java
+++ b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerFactory.java
@@ -16,7 +16,7 @@
package com.linecorp.armeria.client.circuitbreaker;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A functional interface that represents a mapper factory, mapping a combination of host, method and path
diff --git a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRpcClient.java b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRpcClient.java
index eebde7dbaed..f62cbe955a7 100644
--- a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRpcClient.java
+++ b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRpcClient.java
@@ -21,11 +21,12 @@
import java.util.function.BiFunction;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.RpcClient;
import com.linecorp.armeria.common.RpcRequest;
import com.linecorp.armeria.common.RpcResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.circuitbreaker.CircuitBreakerCallback;
diff --git a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRule.java b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRule.java
index 8648bf2c7db..f6c6e1a2508 100644
--- a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRule.java
+++ b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRule.java
@@ -22,6 +22,8 @@
import java.util.concurrent.CompletionStage;
import java.util.function.BiPredicate;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
@@ -36,7 +38,6 @@
import com.linecorp.armeria.common.Response;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.TimeoutException;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRuleBuilder.java b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRuleBuilder.java
index 4086fb6eeef..14ec0c92b3a 100644
--- a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRuleBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRuleBuilder.java
@@ -26,11 +26,12 @@
import java.util.function.BiFunction;
import java.util.function.BiPredicate;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.AbstractRuleBuilder;
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.Response;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.client.RuleFilter;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRuleUtil.java b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRuleUtil.java
index 90b7fffd69e..4af53de4126 100644
--- a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRuleUtil.java
+++ b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRuleUtil.java
@@ -19,11 +19,12 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpResponseDuplicator;
import com.linecorp.armeria.common.Response;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.UnmodifiableFuture;
final class CircuitBreakerRuleUtil {
diff --git a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRuleWithContent.java b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRuleWithContent.java
index 676c8f1f651..8a673fd4c43 100644
--- a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRuleWithContent.java
+++ b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/CircuitBreakerRuleWithContent.java
@@ -23,6 +23,8 @@
import java.util.function.BiFunction;
import java.util.function.BiPredicate;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
@@ -33,7 +35,6 @@
import com.linecorp.armeria.common.HttpMethod;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.Response;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* Determines whether a {@link Response} should be reported as a success or failure to a
diff --git a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/DefaultCircuitBreakerCallback.java b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/DefaultCircuitBreakerCallback.java
index 7f27f148af4..93e0e981e51 100644
--- a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/DefaultCircuitBreakerCallback.java
+++ b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/DefaultCircuitBreakerCallback.java
@@ -18,8 +18,9 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.circuitbreaker.CircuitBreakerCallback;
final class DefaultCircuitBreakerCallback implements CircuitBreakerCallback {
diff --git a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/DefaultCircuitBreakerClientHandler.java b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/DefaultCircuitBreakerClientHandler.java
index a66f3f5dc1f..205c5b9a74d 100644
--- a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/DefaultCircuitBreakerClientHandler.java
+++ b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/DefaultCircuitBreakerClientHandler.java
@@ -18,12 +18,12 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.common.Request;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.circuitbreaker.CircuitBreakerCallback;
final class DefaultCircuitBreakerClientHandler implements CircuitBreakerClientHandler {
diff --git a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/EventCount.java b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/EventCount.java
index 9846b7f9d52..b7af1066403 100644
--- a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/EventCount.java
+++ b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/EventCount.java
@@ -18,7 +18,7 @@
import static com.google.common.base.Preconditions.checkArgument;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* An immutable object that stores the count of events.
diff --git a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/NonBlockingCircuitBreaker.java b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/NonBlockingCircuitBreaker.java
index 05beb916a36..0408bd04f1d 100644
--- a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/NonBlockingCircuitBreaker.java
+++ b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/NonBlockingCircuitBreaker.java
@@ -22,6 +22,7 @@
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -29,7 +30,6 @@
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.circuitbreaker.CircuitBreakerCallback;
import com.linecorp.armeria.common.util.EventCount;
import com.linecorp.armeria.common.util.EventCounter;
diff --git a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/package-info.java b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/package-info.java
index b07081e487b..40ee6547f07 100644
--- a/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/client/circuitbreaker/package-info.java
@@ -122,7 +122,7 @@
* {@code exceptionFilter}
* A filter that decides whether a circuit breaker should deal with a given error.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.circuitbreaker;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/client/cookie/package-info.java b/core/src/main/java/com/linecorp/armeria/client/cookie/package-info.java
index ffd10a6f7da..990ba833964 100644
--- a/core/src/main/java/com/linecorp/armeria/client/cookie/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/client/cookie/package-info.java
@@ -17,7 +17,7 @@
/**
* Cookie aware client.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.cookie;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/client/encoding/DecodingClient.java b/core/src/main/java/com/linecorp/armeria/client/encoding/DecodingClient.java
index 1c5dcfeed17..5731fe00315 100644
--- a/core/src/main/java/com/linecorp/armeria/client/encoding/DecodingClient.java
+++ b/core/src/main/java/com/linecorp/armeria/client/encoding/DecodingClient.java
@@ -24,6 +24,8 @@
import java.util.Set;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
@@ -40,7 +42,6 @@
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.RequestHeadersBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.encoding.DefaultHttpDecodedResponse;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/encoding/package-info.java b/core/src/main/java/com/linecorp/armeria/client/encoding/package-info.java
index 58721ac9f52..1e9c0df5a10 100644
--- a/core/src/main/java/com/linecorp/armeria/client/encoding/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/client/encoding/package-info.java
@@ -17,7 +17,7 @@
/**
* HTTP content decoding client.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.encoding;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/AbstractEndpointGroup.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/AbstractEndpointGroup.java
index b714cdb9e2f..b19bdd3aca4 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/AbstractEndpointGroup.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/AbstractEndpointGroup.java
@@ -18,8 +18,9 @@
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.AbstractListenable;
abstract class AbstractEndpointGroup extends AbstractListenable> implements EndpointGroup {
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/AbstractEndpointSelector.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/AbstractEndpointSelector.java
index 95a4206168c..0e21f280f11 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/AbstractEndpointSelector.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/AbstractEndpointSelector.java
@@ -23,11 +23,12 @@
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.client.AbstractAsyncSelector;
import com.linecorp.armeria.internal.client.ClientPendingThrowableUtil;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/CompositeEndpointGroup.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/CompositeEndpointGroup.java
index 1fa6fdd8aaa..a0c5ea0e1bd 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/CompositeEndpointGroup.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/CompositeEndpointGroup.java
@@ -24,12 +24,13 @@
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.atomic.AtomicReference;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.AsyncCloseable;
import com.linecorp.armeria.common.util.AsyncCloseableSupport;
import com.linecorp.armeria.common.util.ListenableAsyncCloseable;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/DefaultEndpointSelector.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/DefaultEndpointSelector.java
index 6b584109253..18984119c46 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/DefaultEndpointSelector.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/DefaultEndpointSelector.java
@@ -18,9 +18,10 @@
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.loadbalancer.LoadBalancer;
import com.linecorp.armeria.common.util.ListenableAsyncCloseable;
import com.linecorp.armeria.internal.common.util.ReentrantShortLock;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/DynamicEndpointGroup.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/DynamicEndpointGroup.java
index 1d9991301ed..e7d8e351347 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/DynamicEndpointGroup.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/DynamicEndpointGroup.java
@@ -33,6 +33,7 @@
import java.util.concurrent.locks.Lock;
import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -43,7 +44,6 @@
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.common.Flags;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.AsyncCloseableSupport;
import com.linecorp.armeria.common.util.EventLoopCheckingFuture;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/DynamicEndpointGroupBuilder.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/DynamicEndpointGroupBuilder.java
index 3b4ca4ea29c..cb7d685171c 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/DynamicEndpointGroupBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/DynamicEndpointGroupBuilder.java
@@ -17,8 +17,9 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.Flags;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/EmptyEndpointGroupException.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/EmptyEndpointGroupException.java
index 0e8289fb852..0b3cfc60f47 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/EmptyEndpointGroupException.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/EmptyEndpointGroupException.java
@@ -15,9 +15,10 @@
*/
package com.linecorp.armeria.client.endpoint;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.common.Flags;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* An {@link EndpointGroupException} raised when the resolution of an {@link EndpointGroup} fails
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/EndpointGroup.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/EndpointGroup.java
index 0b4e5aca137..1ec970f6a22 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/EndpointGroup.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/EndpointGroup.java
@@ -25,12 +25,13 @@
import java.util.concurrent.ScheduledExecutorService;
import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.client.retry.RetryingClient;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.AsyncCloseable;
import com.linecorp.armeria.common.util.Listenable;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/EndpointGroupException.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/EndpointGroupException.java
index 56af8d0a06f..81d52b2489f 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/EndpointGroupException.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/EndpointGroupException.java
@@ -16,7 +16,7 @@
package com.linecorp.armeria.client.endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A {@link RuntimeException} raised when the resolution of an {@link EndpointGroup} fails.
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/EndpointGroupUtil.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/EndpointGroupUtil.java
index 681dd0852c5..3180f633993 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/EndpointGroupUtil.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/EndpointGroupUtil.java
@@ -19,7 +19,7 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
final class EndpointGroupUtil {
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/EndpointSelector.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/EndpointSelector.java
index 725a74ee285..d575ea4a7da 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/EndpointSelector.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/EndpointSelector.java
@@ -19,11 +19,12 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ScheduledExecutorService;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.common.Flags;
import com.linecorp.armeria.common.Request;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* Selects an {@link Endpoint} from an {@link EndpointGroup}.
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/OrElseEndpointGroup.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/OrElseEndpointGroup.java
index 8c221eb252d..70771c8941c 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/OrElseEndpointGroup.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/OrElseEndpointGroup.java
@@ -22,11 +22,12 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ScheduledExecutorService;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.AsyncCloseableSupport;
import com.linecorp.armeria.common.util.ListenableAsyncCloseable;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/PropertiesEndpointGroup.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/PropertiesEndpointGroup.java
index 40539aa67db..59bcca7b9aa 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/PropertiesEndpointGroup.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/PropertiesEndpointGroup.java
@@ -27,12 +27,13 @@
import java.util.Properties;
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.client.endpoint.FileWatcherRegistry.FileWatchRegisterKey;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* A {@link Properties} backed {@link EndpointGroup}. The list of {@link Endpoint}s are loaded from the
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/PropertiesEndpointGroupBuilder.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/PropertiesEndpointGroupBuilder.java
index 697a89c3e0b..4a2e941dce8 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/PropertiesEndpointGroupBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/PropertiesEndpointGroupBuilder.java
@@ -27,10 +27,11 @@
import java.util.Map.Entry;
import java.util.Properties;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* Builds a {@link PropertiesEndpointGroup}.
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/RestartableThread.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/RestartableThread.java
index 8c3ba52104a..a7090e034c7 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/RestartableThread.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/RestartableThread.java
@@ -21,7 +21,8 @@
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Supplier;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.internal.common.util.ReentrantShortLock;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/RoundRobinStrategy.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/RoundRobinStrategy.java
index ff87f4a8875..470240d643d 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/RoundRobinStrategy.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/RoundRobinStrategy.java
@@ -18,10 +18,11 @@
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.client.endpoint.DefaultEndpointSelector.LoadBalancerFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.loadbalancer.LoadBalancer;
enum RoundRobinStrategy
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/StickyEndpointSelectionStrategy.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/StickyEndpointSelectionStrategy.java
index ff639161c6f..13a2b7975e3 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/StickyEndpointSelectionStrategy.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/StickyEndpointSelectionStrategy.java
@@ -20,11 +20,12 @@
import java.util.List;
import java.util.function.ToLongFunction;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.client.endpoint.DefaultEndpointSelector.LoadBalancerFactory;
import com.linecorp.armeria.common.HttpRequest;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.loadbalancer.LoadBalancer;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/WeightRampingUpStrategy.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/WeightRampingUpStrategy.java
index 138fcd44f0b..6cc6ed9c71b 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/WeightRampingUpStrategy.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/WeightRampingUpStrategy.java
@@ -22,10 +22,11 @@
import java.util.function.Function;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.client.endpoint.DefaultEndpointSelector.LoadBalancerFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.loadbalancer.LoadBalancer;
import com.linecorp.armeria.common.loadbalancer.UpdatableLoadBalancer;
import com.linecorp.armeria.common.loadbalancer.WeightTransition;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/WeightRampingUpStrategyBuilder.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/WeightRampingUpStrategyBuilder.java
index 8cd7c9a6567..80d8b82993b 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/WeightRampingUpStrategyBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/WeightRampingUpStrategyBuilder.java
@@ -21,9 +21,10 @@
import java.util.function.Function;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.common.CommonPools;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.loadbalancer.AbstractRampingUpLoadBalancerBuilder;
import com.linecorp.armeria.common.loadbalancer.WeightTransition;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/WeightedRoundRobinStrategy.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/WeightedRoundRobinStrategy.java
index 873130a7720..ca4ab1167f0 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/WeightedRoundRobinStrategy.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/WeightedRoundRobinStrategy.java
@@ -18,10 +18,11 @@
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.client.endpoint.DefaultEndpointSelector.LoadBalancerFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.loadbalancer.LoadBalancer;
enum WeightedRoundRobinStrategy
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsAddressEndpointGroup.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsAddressEndpointGroup.java
index fa961308957..98a57b21142 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsAddressEndpointGroup.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsAddressEndpointGroup.java
@@ -20,6 +20,8 @@
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSortedSet;
@@ -28,7 +30,6 @@
import com.linecorp.armeria.client.endpoint.EndpointSelectionStrategy;
import com.linecorp.armeria.client.retry.Backoff;
import com.linecorp.armeria.common.CommonPools;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.SystemInfo;
import com.linecorp.armeria.internal.client.dns.ByteArrayDnsRecord;
import com.linecorp.armeria.internal.client.dns.DefaultDnsResolver;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsAddressEndpointGroupBuilder.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsAddressEndpointGroupBuilder.java
index c907a02fa54..12ff8f0dea1 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsAddressEndpointGroupBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsAddressEndpointGroupBuilder.java
@@ -17,10 +17,11 @@
import static com.google.common.base.Preconditions.checkArgument;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.client.dns.DefaultDnsResolver;
import io.netty.channel.EventLoop;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsEndpointGroup.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsEndpointGroup.java
index aeee34feaf7..370617c2f90 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsEndpointGroup.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsEndpointGroup.java
@@ -24,6 +24,7 @@
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -36,7 +37,6 @@
import com.linecorp.armeria.client.endpoint.DynamicEndpointGroup;
import com.linecorp.armeria.client.endpoint.EndpointSelectionStrategy;
import com.linecorp.armeria.client.retry.Backoff;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.client.dns.DefaultDnsResolver;
import com.linecorp.armeria.internal.client.dns.DnsQuestionWithoutTrailingDot;
import com.linecorp.armeria.internal.client.dns.DnsUtil;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsEndpointGroupBuilder.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsEndpointGroupBuilder.java
index cca0945a26c..26381991d63 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsEndpointGroupBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsEndpointGroupBuilder.java
@@ -25,6 +25,8 @@
import java.util.List;
import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.Ascii;
import com.google.common.collect.ImmutableList;
@@ -35,7 +37,6 @@
import com.linecorp.armeria.client.endpoint.EndpointSelectionStrategy;
import com.linecorp.armeria.client.retry.Backoff;
import com.linecorp.armeria.common.CommonPools;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.TransportType;
import com.linecorp.armeria.internal.client.dns.DefaultDnsResolver;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsTextEndpointGroup.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsTextEndpointGroup.java
index 4b9ef114558..48560f6ded3 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsTextEndpointGroup.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsTextEndpointGroup.java
@@ -19,6 +19,8 @@
import java.util.List;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSortedSet;
@@ -27,7 +29,6 @@
import com.linecorp.armeria.client.endpoint.EndpointSelectionStrategy;
import com.linecorp.armeria.client.retry.Backoff;
import com.linecorp.armeria.common.CommonPools;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.client.dns.ByteArrayDnsRecord;
import com.linecorp.armeria.internal.client.dns.DefaultDnsResolver;
import com.linecorp.armeria.internal.client.dns.DnsQuestionWithoutTrailingDot;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsTextEndpointGroupBuilder.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsTextEndpointGroupBuilder.java
index c18de6d94f0..916932d214b 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsTextEndpointGroupBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/DnsTextEndpointGroupBuilder.java
@@ -19,8 +19,9 @@
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import io.netty.channel.EventLoop;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/package-info.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/package-info.java
index 268649dfa17..489d9c8e258 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/dns/package-info.java
@@ -17,7 +17,7 @@
/**
* DNS-based {@link com.linecorp.armeria.client.endpoint.EndpointGroup} implementation.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.endpoint.dns;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/AbstractHealthCheckedEndpointGroupBuilder.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/AbstractHealthCheckedEndpointGroupBuilder.java
index 48e5f2b8188..dbf5d151dea 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/AbstractHealthCheckedEndpointGroupBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/AbstractHealthCheckedEndpointGroupBuilder.java
@@ -25,6 +25,8 @@
import java.util.function.Function;
import java.util.function.Predicate;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.math.LongMath;
@@ -41,7 +43,6 @@
import com.linecorp.armeria.common.HttpHeaderNames;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.auth.AuthToken;
import com.linecorp.armeria.common.util.AsyncCloseable;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/DefaultHealthCheckerContext.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/DefaultHealthCheckerContext.java
index 7c7e9ea5ff2..17ccd806d00 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/DefaultHealthCheckerContext.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/DefaultHealthCheckerContext.java
@@ -31,6 +31,8 @@
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.BiConsumer;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
@@ -44,7 +46,6 @@
import com.linecorp.armeria.common.Attributes;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.AsyncCloseable;
import com.linecorp.armeria.common.util.EventLoopCheckingFuture;
import com.linecorp.armeria.internal.common.util.ReentrantShortLock;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/HealthCheckContextGroup.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/HealthCheckContextGroup.java
index 3746efeb9db..a24bc60cf07 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/HealthCheckContextGroup.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/HealthCheckContextGroup.java
@@ -24,10 +24,11 @@
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.AsyncCloseable;
import com.linecorp.armeria.common.util.Exceptions;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/HealthCheckedEndpointGroup.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/HealthCheckedEndpointGroup.java
index a83597ec653..85d0a67279a 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/HealthCheckedEndpointGroup.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/HealthCheckedEndpointGroup.java
@@ -36,6 +36,7 @@
import java.util.function.Predicate;
import java.util.stream.Collectors;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -51,7 +52,6 @@
import com.linecorp.armeria.client.endpoint.EndpointGroup;
import com.linecorp.armeria.client.retry.Backoff;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.metric.MeterIdPrefix;
import com.linecorp.armeria.common.util.AsyncCloseable;
import com.linecorp.armeria.internal.common.util.ReentrantShortLock;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/HealthCheckerContext.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/HealthCheckerContext.java
index 22e365844bf..22ff0d84fb2 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/HealthCheckerContext.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/HealthCheckerContext.java
@@ -18,13 +18,14 @@
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.Client;
import com.linecorp.armeria.client.ClientOptions;
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/PartialHealthCheckStrategyBuilder.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/PartialHealthCheckStrategyBuilder.java
index e8a4a5b2e40..6e6d1699afc 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/PartialHealthCheckStrategyBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/PartialHealthCheckStrategyBuilder.java
@@ -17,8 +17,9 @@
import static com.google.common.base.Preconditions.checkArgument;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.endpoint.healthcheck.PartialHealthCheckStrategy.EndpointLimitingFunction;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* A builder for creating a new {@link PartialHealthCheckStrategy}.
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/package-info.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/package-info.java
index 218a9aceea3..0de1cbf2e21 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/healthcheck/package-info.java
@@ -18,7 +18,7 @@
* Filters out unhealthy {@link com.linecorp.armeria.client.Endpoint}s from an existing
* {@link com.linecorp.armeria.client.endpoint.EndpointGroup} by sending health check requests.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.endpoint.healthcheck;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/client/endpoint/package-info.java b/core/src/main/java/com/linecorp/armeria/client/endpoint/package-info.java
index bd250b821c4..35103d22da2 100644
--- a/core/src/main/java/com/linecorp/armeria/client/endpoint/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/client/endpoint/package-info.java
@@ -22,7 +22,7 @@
* {@link com.linecorp.armeria.client.endpoint.EndpointGroup}
*
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.endpoint;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/client/limit/DefaultConcurrencyLimit.java b/core/src/main/java/com/linecorp/armeria/client/limit/DefaultConcurrencyLimit.java
index 567c8a27144..ee68233a8aa 100644
--- a/core/src/main/java/com/linecorp/armeria/client/limit/DefaultConcurrencyLimit.java
+++ b/core/src/main/java/com/linecorp/armeria/client/limit/DefaultConcurrencyLimit.java
@@ -28,6 +28,7 @@
import java.util.function.IntSupplier;
import java.util.function.Predicate;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -36,7 +37,6 @@
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.common.ContextAwareEventLoop;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.SafeCloseable;
import com.linecorp.armeria.common.util.UnmodifiableFuture;
diff --git a/core/src/main/java/com/linecorp/armeria/client/limit/package-info.java b/core/src/main/java/com/linecorp/armeria/client/limit/package-info.java
index bd583f73cdf..269e9ac7aac 100644
--- a/core/src/main/java/com/linecorp/armeria/client/limit/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/client/limit/package-info.java
@@ -16,7 +16,7 @@
/**
* Limits the number of executed {@link com.linecorp.armeria.common.Request}s.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.limit;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/client/logging/ContentPreviewingClient.java b/core/src/main/java/com/linecorp/armeria/client/logging/ContentPreviewingClient.java
index dae5137558b..6ab1194194b 100644
--- a/core/src/main/java/com/linecorp/armeria/client/logging/ContentPreviewingClient.java
+++ b/core/src/main/java/com/linecorp/armeria/client/logging/ContentPreviewingClient.java
@@ -24,6 +24,8 @@
import java.util.function.BiFunction;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.HttpClient;
import com.linecorp.armeria.client.SimpleDecoratingHttpClient;
@@ -34,7 +36,6 @@
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.Response;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.ContentPreviewer;
import com.linecorp.armeria.common.logging.ContentPreviewerFactory;
import com.linecorp.armeria.common.logging.RequestLog;
diff --git a/core/src/main/java/com/linecorp/armeria/client/logging/ContentPreviewingClientBuilder.java b/core/src/main/java/com/linecorp/armeria/client/logging/ContentPreviewingClientBuilder.java
index 48081ef920c..4316c117727 100644
--- a/core/src/main/java/com/linecorp/armeria/client/logging/ContentPreviewingClientBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/logging/ContentPreviewingClientBuilder.java
@@ -21,9 +21,10 @@
import java.util.function.BiFunction;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.HttpClient;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.ContentPreviewerFactory;
import com.linecorp.armeria.common.util.Functions;
diff --git a/core/src/main/java/com/linecorp/armeria/client/logging/LoggingClientBuilder.java b/core/src/main/java/com/linecorp/armeria/client/logging/LoggingClientBuilder.java
index 0f098152b3a..5de1383b662 100644
--- a/core/src/main/java/com/linecorp/armeria/client/logging/LoggingClientBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/logging/LoggingClientBuilder.java
@@ -19,6 +19,7 @@
import java.util.function.Function;
import java.util.function.Predicate;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import com.linecorp.armeria.client.ClientRequestContext;
@@ -27,7 +28,6 @@
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.HttpStatusClass;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.LogLevel;
import com.linecorp.armeria.common.logging.LogWriter;
import com.linecorp.armeria.common.logging.RequestLog;
diff --git a/core/src/main/java/com/linecorp/armeria/client/logging/LoggingRpcClientBuilder.java b/core/src/main/java/com/linecorp/armeria/client/logging/LoggingRpcClientBuilder.java
index 607f71765f0..53d0a29cfa9 100644
--- a/core/src/main/java/com/linecorp/armeria/client/logging/LoggingRpcClientBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/logging/LoggingRpcClientBuilder.java
@@ -19,6 +19,7 @@
import java.util.function.Function;
import java.util.function.Predicate;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import com.linecorp.armeria.client.ClientRequestContext;
@@ -27,7 +28,6 @@
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.HttpStatusClass;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.LogLevel;
import com.linecorp.armeria.common.logging.LogWriter;
import com.linecorp.armeria.common.logging.RequestLog;
diff --git a/core/src/main/java/com/linecorp/armeria/client/logging/package-info.java b/core/src/main/java/com/linecorp/armeria/client/logging/package-info.java
index 806c8e3760d..667f15c5bfb 100644
--- a/core/src/main/java/com/linecorp/armeria/client/logging/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/client/logging/package-info.java
@@ -17,7 +17,7 @@
/**
* Logging client decorators.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.logging;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/client/metric/AbstractMetricCollectingClient.java b/core/src/main/java/com/linecorp/armeria/client/metric/AbstractMetricCollectingClient.java
index a68054271e3..2f6f548d24a 100644
--- a/core/src/main/java/com/linecorp/armeria/client/metric/AbstractMetricCollectingClient.java
+++ b/core/src/main/java/com/linecorp/armeria/client/metric/AbstractMetricCollectingClient.java
@@ -19,13 +19,14 @@
import java.util.function.BiPredicate;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.Client;
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.SimpleDecoratingClient;
import com.linecorp.armeria.common.Request;
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.Response;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.metric.MeterIdPrefixFunction;
import com.linecorp.armeria.internal.common.metric.RequestMetricSupport;
diff --git a/core/src/main/java/com/linecorp/armeria/client/metric/MetricCollectingClient.java b/core/src/main/java/com/linecorp/armeria/client/metric/MetricCollectingClient.java
index 59337abcb02..92e5690633d 100644
--- a/core/src/main/java/com/linecorp/armeria/client/metric/MetricCollectingClient.java
+++ b/core/src/main/java/com/linecorp/armeria/client/metric/MetricCollectingClient.java
@@ -20,11 +20,12 @@
import java.util.function.BiPredicate;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.HttpClient;
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.metric.MeterIdPrefixFunction;
diff --git a/core/src/main/java/com/linecorp/armeria/client/metric/MetricCollectingRpcClient.java b/core/src/main/java/com/linecorp/armeria/client/metric/MetricCollectingRpcClient.java
index 727cfbc408e..174e38be2f8 100644
--- a/core/src/main/java/com/linecorp/armeria/client/metric/MetricCollectingRpcClient.java
+++ b/core/src/main/java/com/linecorp/armeria/client/metric/MetricCollectingRpcClient.java
@@ -20,11 +20,12 @@
import java.util.function.BiPredicate;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.RpcClient;
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.RpcRequest;
import com.linecorp.armeria.common.RpcResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.metric.MeterIdPrefixFunction;
diff --git a/core/src/main/java/com/linecorp/armeria/client/metric/package-info.java b/core/src/main/java/com/linecorp/armeria/client/metric/package-info.java
index 5ec35186cf1..67bfda3de43 100644
--- a/core/src/main/java/com/linecorp/armeria/client/metric/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/client/metric/package-info.java
@@ -17,7 +17,7 @@
/**
* Metric-collecting client decorators.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.metric;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/client/observation/DefaultHttpClientObservationConvention.java b/core/src/main/java/com/linecorp/armeria/client/observation/DefaultHttpClientObservationConvention.java
index 68c16b9b1bc..1c53b31ba98 100644
--- a/core/src/main/java/com/linecorp/armeria/client/observation/DefaultHttpClientObservationConvention.java
+++ b/core/src/main/java/com/linecorp/armeria/client/observation/DefaultHttpClientObservationConvention.java
@@ -20,6 +20,8 @@
import java.net.InetSocketAddress;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.client.ClientRequestContext;
@@ -27,7 +29,6 @@
import com.linecorp.armeria.client.observation.HttpClientObservationDocumentation.LowCardinalityKeys;
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.logging.RequestLogAccess;
import com.linecorp.armeria.common.logging.RequestLogProperty;
diff --git a/core/src/main/java/com/linecorp/armeria/client/observation/ObservationClient.java b/core/src/main/java/com/linecorp/armeria/client/observation/ObservationClient.java
index 21da214ee71..63e1fefd1f8 100644
--- a/core/src/main/java/com/linecorp/armeria/client/observation/ObservationClient.java
+++ b/core/src/main/java/com/linecorp/armeria/client/observation/ObservationClient.java
@@ -20,6 +20,8 @@
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.HttpClient;
import com.linecorp.armeria.client.SimpleDecoratingHttpClient;
@@ -27,7 +29,6 @@
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.RequestHeadersBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.common.RequestContextExtension;
import com.linecorp.armeria.server.observation.ObservationService;
diff --git a/core/src/main/java/com/linecorp/armeria/client/observation/package-info.java b/core/src/main/java/com/linecorp/armeria/client/observation/package-info.java
index eae4ef33f51..cdc12b08238 100644
--- a/core/src/main/java/com/linecorp/armeria/client/observation/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/client/observation/package-info.java
@@ -18,8 +18,9 @@
* Observation basing on Micrometer Observation.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.observation;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/core/src/main/java/com/linecorp/armeria/client/package-info.java b/core/src/main/java/com/linecorp/armeria/client/package-info.java
index 77b6c6b2e78..161d101b8e5 100644
--- a/core/src/main/java/com/linecorp/armeria/client/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/client/package-info.java
@@ -23,7 +23,7 @@
* {@link com.linecorp.armeria.client.ClientBuilder}
*
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/client/proxy/ConnectProxyConfig.java b/core/src/main/java/com/linecorp/armeria/client/proxy/ConnectProxyConfig.java
index 7cb08d5dda2..7d5f870ad19 100644
--- a/core/src/main/java/com/linecorp/armeria/client/proxy/ConnectProxyConfig.java
+++ b/core/src/main/java/com/linecorp/armeria/client/proxy/ConnectProxyConfig.java
@@ -19,10 +19,11 @@
import java.net.InetSocketAddress;
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.common.HttpHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* CONNECT proxy configuration.
diff --git a/core/src/main/java/com/linecorp/armeria/client/proxy/DirectProxyConfig.java b/core/src/main/java/com/linecorp/armeria/client/proxy/DirectProxyConfig.java
index 7eb33e83ee0..e91176111f8 100644
--- a/core/src/main/java/com/linecorp/armeria/client/proxy/DirectProxyConfig.java
+++ b/core/src/main/java/com/linecorp/armeria/client/proxy/DirectProxyConfig.java
@@ -18,7 +18,7 @@
import java.net.InetSocketAddress;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Represents a direct connection without a proxy.
diff --git a/core/src/main/java/com/linecorp/armeria/client/proxy/HAProxyConfig.java b/core/src/main/java/com/linecorp/armeria/client/proxy/HAProxyConfig.java
index 2633755e043..0a33daf7d06 100644
--- a/core/src/main/java/com/linecorp/armeria/client/proxy/HAProxyConfig.java
+++ b/core/src/main/java/com/linecorp/armeria/client/proxy/HAProxyConfig.java
@@ -22,9 +22,10 @@
import java.net.InetSocketAddress;
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.ServiceRequestContext;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/proxy/ProxyConfig.java b/core/src/main/java/com/linecorp/armeria/client/proxy/ProxyConfig.java
index e26c2590b01..def7b5a3c46 100644
--- a/core/src/main/java/com/linecorp/armeria/client/proxy/ProxyConfig.java
+++ b/core/src/main/java/com/linecorp/armeria/client/proxy/ProxyConfig.java
@@ -22,9 +22,10 @@
import java.net.InetSocketAddress;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientFactory;
import com.linecorp.armeria.common.HttpHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.server.ServiceRequestContext;
diff --git a/core/src/main/java/com/linecorp/armeria/client/proxy/Socks4ProxyConfig.java b/core/src/main/java/com/linecorp/armeria/client/proxy/Socks4ProxyConfig.java
index d8f76ef6fa5..5e99d6e4f54 100644
--- a/core/src/main/java/com/linecorp/armeria/client/proxy/Socks4ProxyConfig.java
+++ b/core/src/main/java/com/linecorp/armeria/client/proxy/Socks4ProxyConfig.java
@@ -19,9 +19,9 @@
import java.net.InetSocketAddress;
import java.util.Objects;
-import com.google.common.base.MoreObjects;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.google.common.base.MoreObjects;
/**
* SOCKS4 proxy configuration.
diff --git a/core/src/main/java/com/linecorp/armeria/client/proxy/Socks5ProxyConfig.java b/core/src/main/java/com/linecorp/armeria/client/proxy/Socks5ProxyConfig.java
index b100ff90439..dbf68578810 100644
--- a/core/src/main/java/com/linecorp/armeria/client/proxy/Socks5ProxyConfig.java
+++ b/core/src/main/java/com/linecorp/armeria/client/proxy/Socks5ProxyConfig.java
@@ -19,9 +19,9 @@
import java.net.InetSocketAddress;
import java.util.Objects;
-import com.google.common.base.MoreObjects;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.google.common.base.MoreObjects;
/**
* SOCKS5 proxy configuration.
diff --git a/core/src/main/java/com/linecorp/armeria/client/proxy/WrappingProxyConfigSelector.java b/core/src/main/java/com/linecorp/armeria/client/proxy/WrappingProxyConfigSelector.java
index 2795da54963..dff392d2066 100644
--- a/core/src/main/java/com/linecorp/armeria/client/proxy/WrappingProxyConfigSelector.java
+++ b/core/src/main/java/com/linecorp/armeria/client/proxy/WrappingProxyConfigSelector.java
@@ -27,12 +27,12 @@
import java.net.URISyntaxException;
import java.util.List;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* See {@link ProxyConfigSelector#of(ProxySelector)} for more information.
diff --git a/core/src/main/java/com/linecorp/armeria/client/proxy/package-info.java b/core/src/main/java/com/linecorp/armeria/client/proxy/package-info.java
index 0e46294c38f..c582551f09f 100644
--- a/core/src/main/java/com/linecorp/armeria/client/proxy/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/client/proxy/package-info.java
@@ -17,7 +17,7 @@
/**
* Proxy configuration.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.proxy;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/client/redirect/RedirectConfig.java b/core/src/main/java/com/linecorp/armeria/client/redirect/RedirectConfig.java
index dd501690415..3101e1cc6ff 100644
--- a/core/src/main/java/com/linecorp/armeria/client/redirect/RedirectConfig.java
+++ b/core/src/main/java/com/linecorp/armeria/client/redirect/RedirectConfig.java
@@ -21,9 +21,10 @@
import java.util.Set;
import java.util.function.BiPredicate;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/redirect/RedirectConfigBuilder.java b/core/src/main/java/com/linecorp/armeria/client/redirect/RedirectConfigBuilder.java
index 1d1cfccef57..5effbcce804 100644
--- a/core/src/main/java/com/linecorp/armeria/client/redirect/RedirectConfigBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/redirect/RedirectConfigBuilder.java
@@ -24,6 +24,8 @@
import java.util.Set;
import java.util.function.BiPredicate;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
@@ -31,7 +33,6 @@
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.WebClient;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/redirect/RedirectsException.java b/core/src/main/java/com/linecorp/armeria/client/redirect/RedirectsException.java
index c98c4a4c647..7905dd3d455 100644
--- a/core/src/main/java/com/linecorp/armeria/client/redirect/RedirectsException.java
+++ b/core/src/main/java/com/linecorp/armeria/client/redirect/RedirectsException.java
@@ -15,7 +15,8 @@
*/
package com.linecorp.armeria.client.redirect;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/redirect/package-info.java b/core/src/main/java/com/linecorp/armeria/client/redirect/package-info.java
index 92e858ee40f..67ad3d5ad92 100644
--- a/core/src/main/java/com/linecorp/armeria/client/redirect/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/client/redirect/package-info.java
@@ -17,7 +17,7 @@
/**
* automatic redirection.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.redirect;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/client/retry/AbstractBackoffBuilder.java b/core/src/main/java/com/linecorp/armeria/client/retry/AbstractBackoffBuilder.java
index c2c194f1d05..29abcc1c31c 100644
--- a/core/src/main/java/com/linecorp/armeria/client/retry/AbstractBackoffBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/retry/AbstractBackoffBuilder.java
@@ -21,7 +21,7 @@
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.Supplier;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A skeletal builder implementation for {@link Backoff}.
diff --git a/core/src/main/java/com/linecorp/armeria/client/retry/AbstractRetryingClient.java b/core/src/main/java/com/linecorp/armeria/client/retry/AbstractRetryingClient.java
index e8e5cc277e3..aaade35dde7 100644
--- a/core/src/main/java/com/linecorp/armeria/client/retry/AbstractRetryingClient.java
+++ b/core/src/main/java/com/linecorp/armeria/client/retry/AbstractRetryingClient.java
@@ -21,6 +21,7 @@
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -34,7 +35,6 @@
import com.linecorp.armeria.common.Request;
import com.linecorp.armeria.common.Response;
import com.linecorp.armeria.common.RpcRequest;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.TimeoutMode;
import com.linecorp.armeria.internal.client.ClientUtil;
diff --git a/core/src/main/java/com/linecorp/armeria/client/retry/AbstractRetryingClientBuilder.java b/core/src/main/java/com/linecorp/armeria/client/retry/AbstractRetryingClientBuilder.java
index 75553cdc940..023dd78bef5 100644
--- a/core/src/main/java/com/linecorp/armeria/client/retry/AbstractRetryingClientBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/retry/AbstractRetryingClientBuilder.java
@@ -22,13 +22,14 @@
import java.time.Duration;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
import com.linecorp.armeria.client.Client;
import com.linecorp.armeria.common.Flags;
import com.linecorp.armeria.common.Response;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* Builds a new {@link AbstractRetryingClient} or its decorator function.
diff --git a/core/src/main/java/com/linecorp/armeria/client/retry/Backoff.java b/core/src/main/java/com/linecorp/armeria/client/retry/Backoff.java
index 5b8a289fd33..3b28c3ab663 100644
--- a/core/src/main/java/com/linecorp/armeria/client/retry/Backoff.java
+++ b/core/src/main/java/com/linecorp/armeria/client/retry/Backoff.java
@@ -23,8 +23,9 @@
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.Flags;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.Unwrappable;
diff --git a/core/src/main/java/com/linecorp/armeria/client/retry/BackoffSpec.java b/core/src/main/java/com/linecorp/armeria/client/retry/BackoffSpec.java
index 0a9639aad99..54ebc9a04c5 100644
--- a/core/src/main/java/com/linecorp/armeria/client/retry/BackoffSpec.java
+++ b/core/src/main/java/com/linecorp/armeria/client/retry/BackoffSpec.java
@@ -21,6 +21,8 @@
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Ascii;
import com.google.common.base.MoreObjects;
@@ -28,8 +30,6 @@
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* A specification of a {@link Backoff} configuration represented by a string. The string syntax is
* a series of comma-separated options(key-values pair) and each values is colon-separated.
diff --git a/core/src/main/java/com/linecorp/armeria/client/retry/RetryConfig.java b/core/src/main/java/com/linecorp/armeria/client/retry/RetryConfig.java
index 44d953668b5..d36bfd28df2 100644
--- a/core/src/main/java/com/linecorp/armeria/client/retry/RetryConfig.java
+++ b/core/src/main/java/com/linecorp/armeria/client/retry/RetryConfig.java
@@ -19,13 +19,13 @@
import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.Response;
import com.linecorp.armeria.common.RpcResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* Holds retry config used by a {@link RetryingClient}.
diff --git a/core/src/main/java/com/linecorp/armeria/client/retry/RetryConfigBuilder.java b/core/src/main/java/com/linecorp/armeria/client/retry/RetryConfigBuilder.java
index 5d759e93fcf..5543d37f461 100644
--- a/core/src/main/java/com/linecorp/armeria/client/retry/RetryConfigBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/retry/RetryConfigBuilder.java
@@ -21,13 +21,14 @@
import java.time.Duration;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
import com.linecorp.armeria.client.retry.RetryLimiters.AlwaysRetryLimiter;
import com.linecorp.armeria.common.Flags;
import com.linecorp.armeria.common.Response;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* Builds a {@link RetryConfig}.
diff --git a/core/src/main/java/com/linecorp/armeria/client/retry/RetryDecision.java b/core/src/main/java/com/linecorp/armeria/client/retry/RetryDecision.java
index 44ae89d9e4e..e432a710f17 100644
--- a/core/src/main/java/com/linecorp/armeria/client/retry/RetryDecision.java
+++ b/core/src/main/java/com/linecorp/armeria/client/retry/RetryDecision.java
@@ -18,11 +18,11 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* A {@link RetryDecision} that determines whether a {@link RetryRule} retries with a {@link Backoff},
* skips the current {@link RetryRule} or no retries.
diff --git a/core/src/main/java/com/linecorp/armeria/client/retry/RetryRule.java b/core/src/main/java/com/linecorp/armeria/client/retry/RetryRule.java
index f47aa032866..5c811c3e2bc 100644
--- a/core/src/main/java/com/linecorp/armeria/client/retry/RetryRule.java
+++ b/core/src/main/java/com/linecorp/armeria/client/retry/RetryRule.java
@@ -22,6 +22,8 @@
import java.util.concurrent.CompletionStage;
import java.util.function.BiPredicate;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
@@ -37,7 +39,6 @@
import com.linecorp.armeria.common.Response;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.TimeoutException;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/client/retry/RetryRuleBuilder.java b/core/src/main/java/com/linecorp/armeria/client/retry/RetryRuleBuilder.java
index 4e230b0a23c..fba24aa9d52 100644
--- a/core/src/main/java/com/linecorp/armeria/client/retry/RetryRuleBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/retry/RetryRuleBuilder.java
@@ -25,10 +25,11 @@
import java.util.function.BiFunction;
import java.util.function.BiPredicate;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.AbstractRuleBuilder;
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.common.RequestHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.UnmodifiableFuture;
import com.linecorp.armeria.internal.client.RuleFilter;
diff --git a/core/src/main/java/com/linecorp/armeria/client/retry/RetryRuleUtil.java b/core/src/main/java/com/linecorp/armeria/client/retry/RetryRuleUtil.java
index 5ab40a2eb77..b370f3fb0b2 100644
--- a/core/src/main/java/com/linecorp/armeria/client/retry/RetryRuleUtil.java
+++ b/core/src/main/java/com/linecorp/armeria/client/retry/RetryRuleUtil.java
@@ -19,11 +19,12 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpResponseDuplicator;
import com.linecorp.armeria.common.Response;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.UnmodifiableFuture;
final class RetryRuleUtil {
diff --git a/core/src/main/java/com/linecorp/armeria/client/retry/RetryRuleWithContent.java b/core/src/main/java/com/linecorp/armeria/client/retry/RetryRuleWithContent.java
index 9865e722b95..0e431130904 100644
--- a/core/src/main/java/com/linecorp/armeria/client/retry/RetryRuleWithContent.java
+++ b/core/src/main/java/com/linecorp/armeria/client/retry/RetryRuleWithContent.java
@@ -23,6 +23,8 @@
import java.util.function.BiFunction;
import java.util.function.BiPredicate;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
@@ -36,7 +38,6 @@
import com.linecorp.armeria.common.HttpStatusClass;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.Response;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* Determines whether a failed request should be retried using the content of a {@link Response}.
diff --git a/core/src/main/java/com/linecorp/armeria/client/retry/RetryingClient.java b/core/src/main/java/com/linecorp/armeria/client/retry/RetryingClient.java
index a1e3e238e7c..0d5437ce39e 100644
--- a/core/src/main/java/com/linecorp/armeria/client/retry/RetryingClient.java
+++ b/core/src/main/java/com/linecorp/armeria/client/retry/RetryingClient.java
@@ -26,6 +26,7 @@
import java.util.concurrent.CompletionStage;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -43,7 +44,6 @@
import com.linecorp.armeria.common.RequestHeadersBuilder;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.SplitHttpResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.logging.RequestLogAccess;
import com.linecorp.armeria.common.logging.RequestLogBuilder;
diff --git a/core/src/main/java/com/linecorp/armeria/client/retry/package-info.java b/core/src/main/java/com/linecorp/armeria/client/retry/package-info.java
index 20540948492..e2a41e08300 100644
--- a/core/src/main/java/com/linecorp/armeria/client/retry/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/client/retry/package-info.java
@@ -17,7 +17,7 @@
/**
* A {@link com.linecorp.armeria.client.Client} decorator that handles failures and retries requests.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.retry;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/client/websocket/WebSocketClientBuilder.java b/core/src/main/java/com/linecorp/armeria/client/websocket/WebSocketClientBuilder.java
index 992308ed527..91e7501a89b 100644
--- a/core/src/main/java/com/linecorp/armeria/client/websocket/WebSocketClientBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/client/websocket/WebSocketClientBuilder.java
@@ -31,6 +31,8 @@
import java.util.function.Function;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
@@ -58,7 +60,6 @@
import com.linecorp.armeria.common.Scheme;
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SuccessFunction;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.auth.AuthToken;
import com.linecorp.armeria.common.auth.BasicToken;
diff --git a/core/src/main/java/com/linecorp/armeria/client/websocket/WebSocketSession.java b/core/src/main/java/com/linecorp/armeria/client/websocket/WebSocketSession.java
index db2e7da5a5a..8bbb3fd7121 100644
--- a/core/src/main/java/com/linecorp/armeria/client/websocket/WebSocketSession.java
+++ b/core/src/main/java/com/linecorp/armeria/client/websocket/WebSocketSession.java
@@ -19,6 +19,7 @@
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import com.google.common.base.MoreObjects;
@@ -27,7 +28,6 @@
import com.linecorp.armeria.common.HttpData;
import com.linecorp.armeria.common.HttpHeaderNames;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.stream.PublisherBasedStreamMessage;
import com.linecorp.armeria.common.stream.StreamMessage;
diff --git a/core/src/main/java/com/linecorp/armeria/client/websocket/package-info.java b/core/src/main/java/com/linecorp/armeria/client/websocket/package-info.java
index 848479aec63..80086109444 100644
--- a/core/src/main/java/com/linecorp/armeria/client/websocket/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/client/websocket/package-info.java
@@ -17,7 +17,7 @@
/**
* Client-side classes for the WebSocket Protocol.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.websocket;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/common/AbstractContextAwareExecutor.java b/core/src/main/java/com/linecorp/armeria/common/AbstractContextAwareExecutor.java
index 16b165e347b..a75ae8aa388 100644
--- a/core/src/main/java/com/linecorp/armeria/common/AbstractContextAwareExecutor.java
+++ b/core/src/main/java/com/linecorp/armeria/common/AbstractContextAwareExecutor.java
@@ -20,10 +20,10 @@
import java.util.concurrent.Executor;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.context.ArmeriaContextPropagation;
abstract class AbstractContextAwareExecutor implements Executor {
diff --git a/core/src/main/java/com/linecorp/armeria/common/AbstractHttpEntity.java b/core/src/main/java/com/linecorp/armeria/common/AbstractHttpEntity.java
index 94781926477..f0687e96d99 100644
--- a/core/src/main/java/com/linecorp/armeria/common/AbstractHttpEntity.java
+++ b/core/src/main/java/com/linecorp/armeria/common/AbstractHttpEntity.java
@@ -16,12 +16,12 @@
package com.linecorp.armeria.common;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
import com.google.common.base.Objects;
-import com.linecorp.armeria.common.annotation.Nullable;
-
abstract class AbstractHttpEntity implements HttpEntity {
private final HttpHeaders headers;
diff --git a/core/src/main/java/com/linecorp/armeria/common/AbstractHttpHeadersBuilder.java b/core/src/main/java/com/linecorp/armeria/common/AbstractHttpHeadersBuilder.java
index b0fef50fea9..1b9a962119f 100644
--- a/core/src/main/java/com/linecorp/armeria/common/AbstractHttpHeadersBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/AbstractHttpHeadersBuilder.java
@@ -15,7 +15,7 @@
*/
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.netty.util.AsciiString;
diff --git a/core/src/main/java/com/linecorp/armeria/common/AbstractHttpHeadersJsonDeserializer.java b/core/src/main/java/com/linecorp/armeria/common/AbstractHttpHeadersJsonDeserializer.java
index fbf527a43db..e1d0aeccd4f 100644
--- a/core/src/main/java/com/linecorp/armeria/common/AbstractHttpHeadersJsonDeserializer.java
+++ b/core/src/main/java/com/linecorp/armeria/common/AbstractHttpHeadersJsonDeserializer.java
@@ -22,6 +22,8 @@
import java.util.Iterator;
import java.util.Map.Entry;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
@@ -30,8 +32,6 @@
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.linecorp.armeria.common.annotation.Nullable;
-
import io.netty.util.AsciiString;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/AbstractHttpMessageBuilder.java b/core/src/main/java/com/linecorp/armeria/common/AbstractHttpMessageBuilder.java
index 91e6e49e358..785370c2428 100644
--- a/core/src/main/java/com/linecorp/armeria/common/AbstractHttpMessageBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/AbstractHttpMessageBuilder.java
@@ -22,13 +22,13 @@
import java.nio.charset.StandardCharsets;
import java.util.Map.Entry;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.google.errorprone.annotations.FormatMethod;
import com.google.errorprone.annotations.FormatString;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.common.JacksonUtil;
diff --git a/core/src/main/java/com/linecorp/armeria/common/AbstractHttpRequestBuilder.java b/core/src/main/java/com/linecorp/armeria/common/AbstractHttpRequestBuilder.java
index 5dee216529f..6aea26eae58 100644
--- a/core/src/main/java/com/linecorp/armeria/common/AbstractHttpRequestBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/AbstractHttpRequestBuilder.java
@@ -26,12 +26,12 @@
import java.util.Map;
import java.util.Map.Entry;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import com.google.errorprone.annotations.FormatMethod;
import com.google.errorprone.annotations.FormatString;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.stream.StreamMessage;
import com.linecorp.armeria.internal.common.util.TemporaryThreadLocals;
diff --git a/core/src/main/java/com/linecorp/armeria/common/AbstractRequestContextBuilder.java b/core/src/main/java/com/linecorp/armeria/common/AbstractRequestContextBuilder.java
index 89945e7869b..db3dc3fdc49 100644
--- a/core/src/main/java/com/linecorp/armeria/common/AbstractRequestContextBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/AbstractRequestContextBuilder.java
@@ -27,9 +27,10 @@
import javax.net.ssl.SSLSession;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.Client;
import com.linecorp.armeria.client.ClientRequestContextBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.metric.NoopMeterRegistry;
import com.linecorp.armeria.internal.common.DefaultRequestTarget;
import com.linecorp.armeria.server.Service;
diff --git a/core/src/main/java/com/linecorp/armeria/common/AbstractTlsConfig.java b/core/src/main/java/com/linecorp/armeria/common/AbstractTlsConfig.java
index ff5dd754fd3..eada6ca8838 100644
--- a/core/src/main/java/com/linecorp/armeria/common/AbstractTlsConfig.java
+++ b/core/src/main/java/com/linecorp/armeria/common/AbstractTlsConfig.java
@@ -19,7 +19,8 @@
import java.util.Objects;
import java.util.function.Consumer;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.metric.MeterIdPrefix;
diff --git a/core/src/main/java/com/linecorp/armeria/common/AbstractTlsConfigBuilder.java b/core/src/main/java/com/linecorp/armeria/common/AbstractTlsConfigBuilder.java
index 77e51eb2df0..914511b4454 100644
--- a/core/src/main/java/com/linecorp/armeria/common/AbstractTlsConfigBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/AbstractTlsConfigBuilder.java
@@ -23,7 +23,8 @@
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.TrustManagerFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.metric.MeterIdPrefix;
diff --git a/core/src/main/java/com/linecorp/armeria/common/AbstractTlsSpec.java b/core/src/main/java/com/linecorp/armeria/common/AbstractTlsSpec.java
index d509dbcd3f0..d713efc450d 100644
--- a/core/src/main/java/com/linecorp/armeria/common/AbstractTlsSpec.java
+++ b/core/src/main/java/com/linecorp/armeria/common/AbstractTlsSpec.java
@@ -25,12 +25,13 @@
import javax.net.ssl.KeyManagerFactory;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.TlsEngineType;
import com.linecorp.armeria.internal.common.util.SslContextUtil;
diff --git a/core/src/main/java/com/linecorp/armeria/common/AbstractTlsSpecBuilder.java b/core/src/main/java/com/linecorp/armeria/common/AbstractTlsSpecBuilder.java
index a88440cd766..c4b4b29c500 100644
--- a/core/src/main/java/com/linecorp/armeria/common/AbstractTlsSpecBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/AbstractTlsSpecBuilder.java
@@ -23,10 +23,11 @@
import java.util.List;
import java.util.Set;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.TlsEngineType;
import com.linecorp.armeria.internal.common.util.SslContextUtil;
diff --git a/core/src/main/java/com/linecorp/armeria/common/AggregatedHttpObject.java b/core/src/main/java/com/linecorp/armeria/common/AggregatedHttpObject.java
index aedbc7826c7..18ab7c3c85c 100644
--- a/core/src/main/java/com/linecorp/armeria/common/AggregatedHttpObject.java
+++ b/core/src/main/java/com/linecorp/armeria/common/AggregatedHttpObject.java
@@ -18,7 +18,7 @@
import java.nio.charset.Charset;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A complete HTTP headers and content that are readily available.
diff --git a/core/src/main/java/com/linecorp/armeria/common/AggregatedHttpRequest.java b/core/src/main/java/com/linecorp/armeria/common/AggregatedHttpRequest.java
index 4b600a0d8e6..b21395d7a0a 100644
--- a/core/src/main/java/com/linecorp/armeria/common/AggregatedHttpRequest.java
+++ b/core/src/main/java/com/linecorp/armeria/common/AggregatedHttpRequest.java
@@ -26,12 +26,12 @@
import java.util.Locale;
import java.util.Locale.LanguageRange;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.errorprone.annotations.FormatMethod;
import com.google.errorprone.annotations.FormatString;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* A complete HTTP request whose content is readily available as a single {@link HttpData}.
*/
diff --git a/core/src/main/java/com/linecorp/armeria/common/AggregationOptions.java b/core/src/main/java/com/linecorp/armeria/common/AggregationOptions.java
index 08e62ef2932..424290b7c3c 100644
--- a/core/src/main/java/com/linecorp/armeria/common/AggregationOptions.java
+++ b/core/src/main/java/com/linecorp/armeria/common/AggregationOptions.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.unsafe.PooledObjects;
diff --git a/core/src/main/java/com/linecorp/armeria/common/AggregationOptionsBuilder.java b/core/src/main/java/com/linecorp/armeria/common/AggregationOptionsBuilder.java
index 147196de695..b36ee0750d9 100644
--- a/core/src/main/java/com/linecorp/armeria/common/AggregationOptionsBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/AggregationOptionsBuilder.java
@@ -18,7 +18,8 @@
import static java.util.Objects.requireNonNull;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.unsafe.PooledObjects;
diff --git a/core/src/main/java/com/linecorp/armeria/common/AttributesBuilder.java b/core/src/main/java/com/linecorp/armeria/common/AttributesBuilder.java
index c48b1db8b63..ef59b3274c2 100644
--- a/core/src/main/java/com/linecorp/armeria/common/AttributesBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/AttributesBuilder.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.util.AttributeKey;
diff --git a/core/src/main/java/com/linecorp/armeria/common/AttributesGetters.java b/core/src/main/java/com/linecorp/armeria/common/AttributesGetters.java
index 4a56575ad29..0841ab33ffa 100644
--- a/core/src/main/java/com/linecorp/armeria/common/AttributesGetters.java
+++ b/core/src/main/java/com/linecorp/armeria/common/AttributesGetters.java
@@ -19,7 +19,8 @@
import java.util.Iterator;
import java.util.Map.Entry;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.util.AttributeKey;
diff --git a/core/src/main/java/com/linecorp/armeria/common/AttributesSetters.java b/core/src/main/java/com/linecorp/armeria/common/AttributesSetters.java
index 6e9a01db1fb..e14f63fb8c8 100644
--- a/core/src/main/java/com/linecorp/armeria/common/AttributesSetters.java
+++ b/core/src/main/java/com/linecorp/armeria/common/AttributesSetters.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.util.AttributeKey;
diff --git a/core/src/main/java/com/linecorp/armeria/common/Bytes.java b/core/src/main/java/com/linecorp/armeria/common/Bytes.java
index 810c5abd917..8778084844f 100644
--- a/core/src/main/java/com/linecorp/armeria/common/Bytes.java
+++ b/core/src/main/java/com/linecorp/armeria/common/Bytes.java
@@ -24,9 +24,9 @@
import java.nio.charset.StandardCharsets;
import java.util.concurrent.Executor;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.stream.StreamMessage;
import com.linecorp.armeria.common.stream.SubscriptionOption;
diff --git a/core/src/main/java/com/linecorp/armeria/common/CacheControl.java b/core/src/main/java/com/linecorp/armeria/common/CacheControl.java
index 8fdecb3c538..a1a9aabfd42 100644
--- a/core/src/main/java/com/linecorp/armeria/common/CacheControl.java
+++ b/core/src/main/java/com/linecorp/armeria/common/CacheControl.java
@@ -15,7 +15,7 @@
*/
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Directives for HTTP caching mechanisms in requests or responses. Use {@link ServerCacheControl} for
diff --git a/core/src/main/java/com/linecorp/armeria/common/CacheControlBuilder.java b/core/src/main/java/com/linecorp/armeria/common/CacheControlBuilder.java
index 457ddeb46b5..65ec9b4a364 100644
--- a/core/src/main/java/com/linecorp/armeria/common/CacheControlBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/CacheControlBuilder.java
@@ -19,7 +19,7 @@
import java.time.Duration;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A skeletal builder implementation of {@link CacheControl}. Use {@link ServerCacheControlBuilder} for
diff --git a/core/src/main/java/com/linecorp/armeria/common/CancellationException.java b/core/src/main/java/com/linecorp/armeria/common/CancellationException.java
index 31e97d7414b..4a731cb17d3 100644
--- a/core/src/main/java/com/linecorp/armeria/common/CancellationException.java
+++ b/core/src/main/java/com/linecorp/armeria/common/CancellationException.java
@@ -16,7 +16,7 @@
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A {@link RuntimeException} raised when a requested invocation is forced to stop before its completion.
diff --git a/core/src/main/java/com/linecorp/armeria/common/ClientCacheControl.java b/core/src/main/java/com/linecorp/armeria/common/ClientCacheControl.java
index de1a0930b06..e577a489b19 100644
--- a/core/src/main/java/com/linecorp/armeria/common/ClientCacheControl.java
+++ b/core/src/main/java/com/linecorp/armeria/common/ClientCacheControl.java
@@ -22,11 +22,11 @@
import java.util.Map;
import java.util.function.BiConsumer;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* Directives for HTTP caching mechanisms in requests.
*
diff --git a/core/src/main/java/com/linecorp/armeria/common/ClientCacheControlBuilder.java b/core/src/main/java/com/linecorp/armeria/common/ClientCacheControlBuilder.java
index 28089a63513..8eb9ae717c7 100644
--- a/core/src/main/java/com/linecorp/armeria/common/ClientCacheControlBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/ClientCacheControlBuilder.java
@@ -17,7 +17,7 @@
import java.time.Duration;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Creates a new {@link ClientCacheControl} using the builder pattern.
diff --git a/core/src/main/java/com/linecorp/armeria/common/ClientCookieDecoder.java b/core/src/main/java/com/linecorp/armeria/common/ClientCookieDecoder.java
index 0867741779d..4d36d9b1372 100644
--- a/core/src/main/java/com/linecorp/armeria/common/ClientCookieDecoder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/ClientCookieDecoder.java
@@ -35,11 +35,10 @@
import java.util.Arrays;
import java.util.Date;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
-
import io.netty.handler.codec.DateFormatter;
import io.netty.handler.codec.http.cookie.CookieHeaderNames;
import io.netty.handler.codec.http.cookie.CookieHeaderNames.SameSite;
diff --git a/core/src/main/java/com/linecorp/armeria/common/ClosedSessionException.java b/core/src/main/java/com/linecorp/armeria/common/ClosedSessionException.java
index ef8f68aa7e5..fcc880f03d0 100644
--- a/core/src/main/java/com/linecorp/armeria/common/ClosedSessionException.java
+++ b/core/src/main/java/com/linecorp/armeria/common/ClosedSessionException.java
@@ -15,7 +15,8 @@
*/
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.stream.ClosedStreamException;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/CompletableRpcResponse.java b/core/src/main/java/com/linecorp/armeria/common/CompletableRpcResponse.java
index 02a7fd44f6c..e261224f8e3 100644
--- a/core/src/main/java/com/linecorp/armeria/common/CompletableRpcResponse.java
+++ b/core/src/main/java/com/linecorp/armeria/common/CompletableRpcResponse.java
@@ -21,9 +21,10 @@
import java.util.concurrent.CancellationException;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.EventLoopCheckingFuture;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/ConcurrentAttributes.java b/core/src/main/java/com/linecorp/armeria/common/ConcurrentAttributes.java
index 921a8002021..9f5302176d5 100644
--- a/core/src/main/java/com/linecorp/armeria/common/ConcurrentAttributes.java
+++ b/core/src/main/java/com/linecorp/armeria/common/ConcurrentAttributes.java
@@ -18,7 +18,8 @@
import static java.util.Objects.requireNonNull;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.util.AttributeKey;
diff --git a/core/src/main/java/com/linecorp/armeria/common/ContentDisposition.java b/core/src/main/java/com/linecorp/armeria/common/ContentDisposition.java
index 5c50bcdecb6..5e487679589 100644
--- a/core/src/main/java/com/linecorp/armeria/common/ContentDisposition.java
+++ b/core/src/main/java/com/linecorp/armeria/common/ContentDisposition.java
@@ -49,13 +49,13 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Ascii;
import com.google.common.collect.ImmutableList;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.multipart.MultipartFilenameDecodingMode;
import com.linecorp.armeria.internal.common.util.TemporaryThreadLocals;
diff --git a/core/src/main/java/com/linecorp/armeria/common/ContentDispositionBuilder.java b/core/src/main/java/com/linecorp/armeria/common/ContentDispositionBuilder.java
index 18c2c59ae1d..825cf0d945d 100644
--- a/core/src/main/java/com/linecorp/armeria/common/ContentDispositionBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/ContentDispositionBuilder.java
@@ -37,7 +37,7 @@
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A builder class for creating {@link ContentDisposition}.
diff --git a/core/src/main/java/com/linecorp/armeria/common/ContentTooLargeException.java b/core/src/main/java/com/linecorp/armeria/common/ContentTooLargeException.java
index 2cbbb0600bb..cf9d160db4b 100644
--- a/core/src/main/java/com/linecorp/armeria/common/ContentTooLargeException.java
+++ b/core/src/main/java/com/linecorp/armeria/common/ContentTooLargeException.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.internal.common.util.TemporaryThreadLocals;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/ContentTooLargeExceptionBuilder.java b/core/src/main/java/com/linecorp/armeria/common/ContentTooLargeExceptionBuilder.java
index 4158699bf54..1101a70947d 100644
--- a/core/src/main/java/com/linecorp/armeria/common/ContentTooLargeExceptionBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/ContentTooLargeExceptionBuilder.java
@@ -19,7 +19,8 @@
import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Objects.requireNonNull;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/Cookie.java b/core/src/main/java/com/linecorp/armeria/common/Cookie.java
index cdbd30182ec..693c6787541 100644
--- a/core/src/main/java/com/linecorp/armeria/common/Cookie.java
+++ b/core/src/main/java/com/linecorp/armeria/common/Cookie.java
@@ -38,11 +38,11 @@
import java.util.List;
import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* An interface defining an
* HTTP cookie.
diff --git a/core/src/main/java/com/linecorp/armeria/common/CookieBuilder.java b/core/src/main/java/com/linecorp/armeria/common/CookieBuilder.java
index 543d4ca2adb..c58e3960dfe 100644
--- a/core/src/main/java/com/linecorp/armeria/common/CookieBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/CookieBuilder.java
@@ -20,7 +20,7 @@
import java.util.BitSet;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Builds a {@link Cookie}.
diff --git a/core/src/main/java/com/linecorp/armeria/common/CookieUtil.java b/core/src/main/java/com/linecorp/armeria/common/CookieUtil.java
index 26ab8d1a042..f08ce0dcdf6 100644
--- a/core/src/main/java/com/linecorp/armeria/common/CookieUtil.java
+++ b/core/src/main/java/com/linecorp/armeria/common/CookieUtil.java
@@ -37,13 +37,12 @@
import java.util.Iterator;
import java.util.List;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import com.linecorp.armeria.common.annotation.Nullable;
-
import io.netty.handler.codec.http.HttpConstants;
import io.netty.util.internal.InternalThreadLocalMap;
diff --git a/core/src/main/java/com/linecorp/armeria/common/DefaultAggregatedHttpRequest.java b/core/src/main/java/com/linecorp/armeria/common/DefaultAggregatedHttpRequest.java
index 2504369a3a1..a32fb54dee1 100644
--- a/core/src/main/java/com/linecorp/armeria/common/DefaultAggregatedHttpRequest.java
+++ b/core/src/main/java/com/linecorp/armeria/common/DefaultAggregatedHttpRequest.java
@@ -16,11 +16,11 @@
package com.linecorp.armeria.common;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
-import com.linecorp.armeria.common.annotation.Nullable;
-
final class DefaultAggregatedHttpRequest extends AbstractAggregatedHttpMessage
implements AggregatedHttpRequest {
diff --git a/core/src/main/java/com/linecorp/armeria/common/DefaultAggregatedHttpResponse.java b/core/src/main/java/com/linecorp/armeria/common/DefaultAggregatedHttpResponse.java
index d07badc2cad..d6b98e33afb 100644
--- a/core/src/main/java/com/linecorp/armeria/common/DefaultAggregatedHttpResponse.java
+++ b/core/src/main/java/com/linecorp/armeria/common/DefaultAggregatedHttpResponse.java
@@ -18,11 +18,11 @@
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
-import com.linecorp.armeria.common.annotation.Nullable;
-
final class DefaultAggregatedHttpResponse extends AbstractAggregatedHttpMessage
implements AggregatedHttpResponse {
diff --git a/core/src/main/java/com/linecorp/armeria/common/DefaultAggregationOptions.java b/core/src/main/java/com/linecorp/armeria/common/DefaultAggregationOptions.java
index 935f9940af9..56564ed464f 100644
--- a/core/src/main/java/com/linecorp/armeria/common/DefaultAggregationOptions.java
+++ b/core/src/main/java/com/linecorp/armeria/common/DefaultAggregationOptions.java
@@ -18,9 +18,9 @@
import java.util.Objects;
-import com.google.common.base.MoreObjects;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.google.common.base.MoreObjects;
import io.netty.buffer.ByteBufAllocator;
import io.netty.util.concurrent.EventExecutor;
diff --git a/core/src/main/java/com/linecorp/armeria/common/DefaultConcurrentAttributes.java b/core/src/main/java/com/linecorp/armeria/common/DefaultConcurrentAttributes.java
index a6f92f3cb7e..c32760bc597 100644
--- a/core/src/main/java/com/linecorp/armeria/common/DefaultConcurrentAttributes.java
+++ b/core/src/main/java/com/linecorp/armeria/common/DefaultConcurrentAttributes.java
@@ -41,11 +41,12 @@
import java.util.concurrent.atomic.AtomicReferenceArray;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Objects;
import com.google.common.collect.Iterators;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.util.ReentrantShortLock;
import io.netty.util.AttributeKey;
diff --git a/core/src/main/java/com/linecorp/armeria/common/DefaultCookie.java b/core/src/main/java/com/linecorp/armeria/common/DefaultCookie.java
index 6ad287010e0..30436445552 100644
--- a/core/src/main/java/com/linecorp/armeria/common/DefaultCookie.java
+++ b/core/src/main/java/com/linecorp/armeria/common/DefaultCookie.java
@@ -32,11 +32,11 @@
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* The default {@link Cookie} implementation.
*/
diff --git a/core/src/main/java/com/linecorp/armeria/common/DefaultDependencyInjector.java b/core/src/main/java/com/linecorp/armeria/common/DefaultDependencyInjector.java
index dc76512199e..76093def230 100644
--- a/core/src/main/java/com/linecorp/armeria/common/DefaultDependencyInjector.java
+++ b/core/src/main/java/com/linecorp/armeria/common/DefaultDependencyInjector.java
@@ -21,12 +21,12 @@
import java.util.Map;
import java.util.concurrent.locks.Lock;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.util.ReentrantShortLock;
final class DefaultDependencyInjector implements DependencyInjector {
diff --git a/core/src/main/java/com/linecorp/armeria/common/DefaultHttpHeaders.java b/core/src/main/java/com/linecorp/armeria/common/DefaultHttpHeaders.java
index a974bd3c209..4698ff0126a 100644
--- a/core/src/main/java/com/linecorp/armeria/common/DefaultHttpHeaders.java
+++ b/core/src/main/java/com/linecorp/armeria/common/DefaultHttpHeaders.java
@@ -15,7 +15,7 @@
*/
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
@SuppressWarnings("checkstyle:EqualsHashCode")
class DefaultHttpHeaders extends HttpHeadersBase implements HttpHeaders {
diff --git a/core/src/main/java/com/linecorp/armeria/common/DefaultQueryParams.java b/core/src/main/java/com/linecorp/armeria/common/DefaultQueryParams.java
index c296681956d..0375199295e 100644
--- a/core/src/main/java/com/linecorp/armeria/common/DefaultQueryParams.java
+++ b/core/src/main/java/com/linecorp/armeria/common/DefaultQueryParams.java
@@ -15,7 +15,7 @@
*/
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
@SuppressWarnings({ "checkstyle:EqualsHashCode", "EqualsAndHashcode" })
final class DefaultQueryParams extends QueryParamsBase implements QueryParams {
diff --git a/core/src/main/java/com/linecorp/armeria/common/DefaultRequestEntity.java b/core/src/main/java/com/linecorp/armeria/common/DefaultRequestEntity.java
index f3da2bf6aa3..4dca48c3849 100644
--- a/core/src/main/java/com/linecorp/armeria/common/DefaultRequestEntity.java
+++ b/core/src/main/java/com/linecorp/armeria/common/DefaultRequestEntity.java
@@ -16,7 +16,7 @@
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
final class DefaultRequestEntity extends AbstractHttpEntity implements RequestEntity {
diff --git a/core/src/main/java/com/linecorp/armeria/common/DefaultRequestHeaders.java b/core/src/main/java/com/linecorp/armeria/common/DefaultRequestHeaders.java
index 7df712e3221..1fd8242a656 100644
--- a/core/src/main/java/com/linecorp/armeria/common/DefaultRequestHeaders.java
+++ b/core/src/main/java/com/linecorp/armeria/common/DefaultRequestHeaders.java
@@ -20,7 +20,7 @@
import java.util.Locale;
import java.util.Locale.LanguageRange;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
@SuppressWarnings({ "checkstyle:EqualsHashCode", "EqualsAndHashcode" })
final class DefaultRequestHeaders extends DefaultHttpHeaders implements RequestHeaders {
diff --git a/core/src/main/java/com/linecorp/armeria/common/DefaultRequestHeadersBuilder.java b/core/src/main/java/com/linecorp/armeria/common/DefaultRequestHeadersBuilder.java
index 1ad1740e42d..25cff573705 100644
--- a/core/src/main/java/com/linecorp/armeria/common/DefaultRequestHeadersBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/DefaultRequestHeadersBuilder.java
@@ -24,12 +24,12 @@
import java.util.Locale;
import java.util.Locale.LanguageRange;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
-import com.linecorp.armeria.common.annotation.Nullable;
-
final class DefaultRequestHeadersBuilder extends AbstractHttpHeadersBuilder
implements RequestHeadersBuilder {
diff --git a/core/src/main/java/com/linecorp/armeria/common/DefaultRequestId.java b/core/src/main/java/com/linecorp/armeria/common/DefaultRequestId.java
index 754b892c4df..b462e6f3a21 100644
--- a/core/src/main/java/com/linecorp/armeria/common/DefaultRequestId.java
+++ b/core/src/main/java/com/linecorp/armeria/common/DefaultRequestId.java
@@ -17,7 +17,8 @@
import java.util.concurrent.ThreadLocalRandom;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.internal.common.util.TemporaryThreadLocals;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/DefaultResponseEntity.java b/core/src/main/java/com/linecorp/armeria/common/DefaultResponseEntity.java
index 91b8ed3c7e3..9c2772596c5 100644
--- a/core/src/main/java/com/linecorp/armeria/common/DefaultResponseEntity.java
+++ b/core/src/main/java/com/linecorp/armeria/common/DefaultResponseEntity.java
@@ -16,7 +16,7 @@
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
final class DefaultResponseEntity extends AbstractHttpEntity implements ResponseEntity {
diff --git a/core/src/main/java/com/linecorp/armeria/common/DefaultResponseHeaders.java b/core/src/main/java/com/linecorp/armeria/common/DefaultResponseHeaders.java
index bf4251eb0e5..827ec9cb0b9 100644
--- a/core/src/main/java/com/linecorp/armeria/common/DefaultResponseHeaders.java
+++ b/core/src/main/java/com/linecorp/armeria/common/DefaultResponseHeaders.java
@@ -15,7 +15,7 @@
*/
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
@SuppressWarnings({ "checkstyle:EqualsHashCode", "EqualsAndHashcode" })
final class DefaultResponseHeaders extends DefaultHttpHeaders implements ResponseHeaders {
diff --git a/core/src/main/java/com/linecorp/armeria/common/DefaultRpcRequest.java b/core/src/main/java/com/linecorp/armeria/common/DefaultRpcRequest.java
index b285816cbab..97365fbaa1c 100644
--- a/core/src/main/java/com/linecorp/armeria/common/DefaultRpcRequest.java
+++ b/core/src/main/java/com/linecorp/armeria/common/DefaultRpcRequest.java
@@ -23,11 +23,11 @@
import java.util.Collections;
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* Default {@link RpcRequest} implementation.
*/
diff --git a/core/src/main/java/com/linecorp/armeria/common/DependencyInjector.java b/core/src/main/java/com/linecorp/armeria/common/DependencyInjector.java
index a8ce54270ce..97372b559dc 100644
--- a/core/src/main/java/com/linecorp/armeria/common/DependencyInjector.java
+++ b/core/src/main/java/com/linecorp/armeria/common/DependencyInjector.java
@@ -17,9 +17,10 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.SafeCloseable;
import com.linecorp.armeria.internal.common.ReflectiveDependencyInjector;
diff --git a/core/src/main/java/com/linecorp/armeria/common/EmptyHttpResponseException.java b/core/src/main/java/com/linecorp/armeria/common/EmptyHttpResponseException.java
index c3b51d1cd8f..3c1588a17f0 100644
--- a/core/src/main/java/com/linecorp/armeria/common/EmptyHttpResponseException.java
+++ b/core/src/main/java/com/linecorp/armeria/common/EmptyHttpResponseException.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/Flags.java b/core/src/main/java/com/linecorp/armeria/common/Flags.java
index 42ef35cc0c7..69a5f24ea44 100644
--- a/core/src/main/java/com/linecorp/armeria/common/Flags.java
+++ b/core/src/main/java/com/linecorp/armeria/common/Flags.java
@@ -37,6 +37,7 @@
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLException;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -54,7 +55,6 @@
import com.linecorp.armeria.client.retry.Backoff;
import com.linecorp.armeria.client.retry.RetryingClient;
import com.linecorp.armeria.client.retry.RetryingRpcClient;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.multipart.MultipartFilenameDecodingMode;
import com.linecorp.armeria.common.util.Exceptions;
diff --git a/core/src/main/java/com/linecorp/armeria/common/FlagsProvider.java b/core/src/main/java/com/linecorp/armeria/common/FlagsProvider.java
index e95d923f675..cdb6ec1535a 100644
--- a/core/src/main/java/com/linecorp/armeria/common/FlagsProvider.java
+++ b/core/src/main/java/com/linecorp/armeria/common/FlagsProvider.java
@@ -29,6 +29,8 @@
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLException;
+import org.jspecify.annotations.Nullable;
+
import com.github.benmanes.caffeine.cache.CaffeineSpec;
import com.linecorp.armeria.client.ClientBuilder;
@@ -38,7 +40,6 @@
import com.linecorp.armeria.client.retry.Backoff;
import com.linecorp.armeria.client.retry.RetryingClient;
import com.linecorp.armeria.client.retry.RetryingRpcClient;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.multipart.MultipartFilenameDecodingMode;
import com.linecorp.armeria.common.util.Exceptions;
diff --git a/core/src/main/java/com/linecorp/armeria/common/FlagsUtil.java b/core/src/main/java/com/linecorp/armeria/common/FlagsUtil.java
index 8efb627b38f..03a6c66e9a0 100644
--- a/core/src/main/java/com/linecorp/armeria/common/FlagsUtil.java
+++ b/core/src/main/java/com/linecorp/armeria/common/FlagsUtil.java
@@ -18,9 +18,9 @@
import java.util.List;
import java.util.ServiceLoader;
-import com.google.common.collect.ImmutableList;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.google.common.collect.ImmutableList;
final class FlagsUtil {
diff --git a/core/src/main/java/com/linecorp/armeria/common/HttpHeaderGetters.java b/core/src/main/java/com/linecorp/armeria/common/HttpHeaderGetters.java
index 397e4536fdb..e880a167be7 100644
--- a/core/src/main/java/com/linecorp/armeria/common/HttpHeaderGetters.java
+++ b/core/src/main/java/com/linecorp/armeria/common/HttpHeaderGetters.java
@@ -25,9 +25,10 @@
import java.util.function.Consumer;
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.Streams;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.util.AsciiString;
diff --git a/core/src/main/java/com/linecorp/armeria/common/HttpHeaderNames.java b/core/src/main/java/com/linecorp/armeria/common/HttpHeaderNames.java
index d93e4141ca7..ff549509cad 100644
--- a/core/src/main/java/com/linecorp/armeria/common/HttpHeaderNames.java
+++ b/core/src/main/java/com/linecorp/armeria/common/HttpHeaderNames.java
@@ -35,11 +35,12 @@
import java.util.BitSet;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.Ascii;
import com.google.common.collect.ImmutableMap;
import com.google.common.math.IntMath;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.util.AsciiString;
@@ -71,8 +72,8 @@ public final class HttpHeaderNames {
private static final String[] PROHIBITED_NAME_CHAR_NAMES;
private static final byte LAST_PROHIBITED_NAME_CHAR;
- @Nullable
- private static ImmutableMap.Builder inverseMapBuilder = ImmutableMap.builder();
+ private static ImmutableMap.@Nullable Builder inverseMapBuilder =
+ ImmutableMap.builder();
static {
PROHIBITED_NAME_CHARS = new BitSet();
diff --git a/core/src/main/java/com/linecorp/armeria/common/HttpHeadersBase.java b/core/src/main/java/com/linecorp/armeria/common/HttpHeadersBase.java
index e67e1309d6e..9c70290e14e 100644
--- a/core/src/main/java/com/linecorp/armeria/common/HttpHeadersBase.java
+++ b/core/src/main/java/com/linecorp/armeria/common/HttpHeadersBase.java
@@ -49,13 +49,14 @@
import java.util.StringJoiner;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.math.IntMath;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.util.StringUtil;
import com.linecorp.armeria.internal.common.util.TemporaryThreadLocals;
diff --git a/core/src/main/java/com/linecorp/armeria/common/HttpHeadersBuilder.java b/core/src/main/java/com/linecorp/armeria/common/HttpHeadersBuilder.java
index 228deee99ad..389a708d034 100644
--- a/core/src/main/java/com/linecorp/armeria/common/HttpHeadersBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/HttpHeadersBuilder.java
@@ -21,7 +21,7 @@
import java.util.Map;
import java.util.Map.Entry;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Builds an {@link HttpHeaders}.
diff --git a/core/src/main/java/com/linecorp/armeria/common/HttpMethod.java b/core/src/main/java/com/linecorp/armeria/common/HttpMethod.java
index c69acff75b9..c3cc6d70f63 100644
--- a/core/src/main/java/com/linecorp/armeria/common/HttpMethod.java
+++ b/core/src/main/java/com/linecorp/armeria/common/HttpMethod.java
@@ -35,9 +35,9 @@
import java.util.EnumSet;
import java.util.Set;
-import com.google.common.collect.Sets;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.google.common.collect.Sets;
/**
* HTTP request method.
diff --git a/core/src/main/java/com/linecorp/armeria/common/HttpRequest.java b/core/src/main/java/com/linecorp/armeria/common/HttpRequest.java
index 01a739afca1..ad14ff2ded5 100644
--- a/core/src/main/java/com/linecorp/armeria/common/HttpRequest.java
+++ b/core/src/main/java/com/linecorp/armeria/common/HttpRequest.java
@@ -31,6 +31,7 @@
import java.util.function.Consumer;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
@@ -44,7 +45,6 @@
import com.linecorp.armeria.common.FixedHttpRequest.OneElementFixedHttpRequest;
import com.linecorp.armeria.common.FixedHttpRequest.RegularFixedHttpRequest;
import com.linecorp.armeria.common.FixedHttpRequest.TwoElementFixedHttpRequest;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.stream.PublisherBasedStreamMessage;
import com.linecorp.armeria.common.stream.StreamMessage;
diff --git a/core/src/main/java/com/linecorp/armeria/common/HttpResponse.java b/core/src/main/java/com/linecorp/armeria/common/HttpResponse.java
index c5073a0c6d9..27175c1c593 100644
--- a/core/src/main/java/com/linecorp/armeria/common/HttpResponse.java
+++ b/core/src/main/java/com/linecorp/armeria/common/HttpResponse.java
@@ -35,6 +35,7 @@
import java.util.function.Function;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
@@ -49,7 +50,6 @@
import com.linecorp.armeria.common.FixedHttpResponse.RegularFixedHttpResponse;
import com.linecorp.armeria.common.FixedHttpResponse.ThreeElementFixedHttpResponse;
import com.linecorp.armeria.common.FixedHttpResponse.TwoElementFixedHttpResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.stream.PublisherBasedStreamMessage;
import com.linecorp.armeria.common.stream.StreamMessage;
diff --git a/core/src/main/java/com/linecorp/armeria/common/HttpStatus.java b/core/src/main/java/com/linecorp/armeria/common/HttpStatus.java
index a7eff2274c3..5210b862894 100644
--- a/core/src/main/java/com/linecorp/armeria/common/HttpStatus.java
+++ b/core/src/main/java/com/linecorp/armeria/common/HttpStatus.java
@@ -18,7 +18,8 @@
import static java.util.Objects.requireNonNull;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.internal.common.util.StringUtil;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/ImmutableAttributes.java b/core/src/main/java/com/linecorp/armeria/common/ImmutableAttributes.java
index 97d68463350..e3462b9b965 100644
--- a/core/src/main/java/com/linecorp/armeria/common/ImmutableAttributes.java
+++ b/core/src/main/java/com/linecorp/armeria/common/ImmutableAttributes.java
@@ -25,11 +25,11 @@
import java.util.Map.Entry;
import java.util.NoSuchElementException;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterators;
-import com.linecorp.armeria.common.annotation.Nullable;
-
import io.netty.util.AttributeKey;
final class ImmutableAttributes implements Attributes {
diff --git a/core/src/main/java/com/linecorp/armeria/common/ImmutableAttributesBuilder.java b/core/src/main/java/com/linecorp/armeria/common/ImmutableAttributesBuilder.java
index 216a5c22117..243d91fad35 100644
--- a/core/src/main/java/com/linecorp/armeria/common/ImmutableAttributesBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/ImmutableAttributesBuilder.java
@@ -21,7 +21,7 @@
import java.util.HashMap;
import java.util.Map;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.netty.util.AttributeKey;
diff --git a/core/src/main/java/com/linecorp/armeria/common/IpAddressRejectedException.java b/core/src/main/java/com/linecorp/armeria/common/IpAddressRejectedException.java
index 6413fa798a9..da0e5b3d57f 100644
--- a/core/src/main/java/com/linecorp/armeria/common/IpAddressRejectedException.java
+++ b/core/src/main/java/com/linecorp/armeria/common/IpAddressRejectedException.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/MappedTlsProvider.java b/core/src/main/java/com/linecorp/armeria/common/MappedTlsProvider.java
index c350d228f19..f9f8cd50295 100644
--- a/core/src/main/java/com/linecorp/armeria/common/MappedTlsProvider.java
+++ b/core/src/main/java/com/linecorp/armeria/common/MappedTlsProvider.java
@@ -25,11 +25,11 @@
import java.util.Map;
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
-import com.linecorp.armeria.common.annotation.Nullable;
-
final class MappedTlsProvider implements TlsProvider {
private final Map tlsKeyPairs;
diff --git a/core/src/main/java/com/linecorp/armeria/common/MediaType.java b/core/src/main/java/com/linecorp/armeria/common/MediaType.java
index 36dc28f6b02..72572a871cb 100644
--- a/core/src/main/java/com/linecorp/armeria/common/MediaType.java
+++ b/core/src/main/java/com/linecorp/armeria/common/MediaType.java
@@ -50,6 +50,8 @@
import java.util.function.Function;
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.google.common.base.Ascii;
@@ -64,7 +66,6 @@
import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/MediaTypeJsonDeserializer.java b/core/src/main/java/com/linecorp/armeria/common/MediaTypeJsonDeserializer.java
index 4a5e94dbbc1..e4269245a68 100644
--- a/core/src/main/java/com/linecorp/armeria/common/MediaTypeJsonDeserializer.java
+++ b/core/src/main/java/com/linecorp/armeria/common/MediaTypeJsonDeserializer.java
@@ -17,14 +17,14 @@
import java.io.IOException;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* Jackson {@link JsonDeserializer} for {@link MediaType}.
*/
diff --git a/core/src/main/java/com/linecorp/armeria/common/MediaTypeSet.java b/core/src/main/java/com/linecorp/armeria/common/MediaTypeSet.java
index cdc011d6bf7..aae7ae1de5f 100644
--- a/core/src/main/java/com/linecorp/armeria/common/MediaTypeSet.java
+++ b/core/src/main/java/com/linecorp/armeria/common/MediaTypeSet.java
@@ -26,13 +26,13 @@
import java.util.List;
import java.util.Set;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* An immutable {@link Set} of {@link MediaType}s which provides useful methods for content negotiation.
*
diff --git a/core/src/main/java/com/linecorp/armeria/common/NoHttpContentException.java b/core/src/main/java/com/linecorp/armeria/common/NoHttpContentException.java
index 081e90cc801..f94ad480e75 100644
--- a/core/src/main/java/com/linecorp/armeria/common/NoHttpContentException.java
+++ b/core/src/main/java/com/linecorp/armeria/common/NoHttpContentException.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/OrElseDependencyInjector.java b/core/src/main/java/com/linecorp/armeria/common/OrElseDependencyInjector.java
index 058a6056b6e..a0761478edd 100644
--- a/core/src/main/java/com/linecorp/armeria/common/OrElseDependencyInjector.java
+++ b/core/src/main/java/com/linecorp/armeria/common/OrElseDependencyInjector.java
@@ -15,11 +15,10 @@
*/
package com.linecorp.armeria.common;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
-
final class OrElseDependencyInjector implements DependencyInjector {
private static final Logger logger = LoggerFactory.getLogger(OrElseDependencyInjector.class);
diff --git a/core/src/main/java/com/linecorp/armeria/common/PropagatingContextAwareBlockingTaskExecutor.java b/core/src/main/java/com/linecorp/armeria/common/PropagatingContextAwareBlockingTaskExecutor.java
index f94bc42968d..94274eea83a 100644
--- a/core/src/main/java/com/linecorp/armeria/common/PropagatingContextAwareBlockingTaskExecutor.java
+++ b/core/src/main/java/com/linecorp/armeria/common/PropagatingContextAwareBlockingTaskExecutor.java
@@ -19,9 +19,10 @@
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.BlockingTaskExecutor;
final class PropagatingContextAwareBlockingTaskExecutor
diff --git a/core/src/main/java/com/linecorp/armeria/common/PropagatingContextAwareExecutor.java b/core/src/main/java/com/linecorp/armeria/common/PropagatingContextAwareExecutor.java
index e0a04fe6e40..db4d18f35b6 100644
--- a/core/src/main/java/com/linecorp/armeria/common/PropagatingContextAwareExecutor.java
+++ b/core/src/main/java/com/linecorp/armeria/common/PropagatingContextAwareExecutor.java
@@ -20,9 +20,9 @@
import java.util.concurrent.Executor;
import java.util.function.Function;
-import com.google.common.base.MoreObjects;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.google.common.base.MoreObjects;
final class PropagatingContextAwareExecutor extends AbstractContextAwareExecutor {
diff --git a/core/src/main/java/com/linecorp/armeria/common/PropagatingContextAwareExecutorService.java b/core/src/main/java/com/linecorp/armeria/common/PropagatingContextAwareExecutorService.java
index e88b7ccf895..9af18f69fe3 100644
--- a/core/src/main/java/com/linecorp/armeria/common/PropagatingContextAwareExecutorService.java
+++ b/core/src/main/java/com/linecorp/armeria/common/PropagatingContextAwareExecutorService.java
@@ -20,9 +20,9 @@
import java.util.concurrent.ExecutorService;
import java.util.function.Function;
-import com.google.common.base.MoreObjects;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.google.common.base.MoreObjects;
final class PropagatingContextAwareExecutorService
extends AbstractContextAwareExecutorService {
diff --git a/core/src/main/java/com/linecorp/armeria/common/PropagatingContextAwareScheduledExecutorService.java b/core/src/main/java/com/linecorp/armeria/common/PropagatingContextAwareScheduledExecutorService.java
index 752db561a57..9adea986605 100644
--- a/core/src/main/java/com/linecorp/armeria/common/PropagatingContextAwareScheduledExecutorService.java
+++ b/core/src/main/java/com/linecorp/armeria/common/PropagatingContextAwareScheduledExecutorService.java
@@ -20,9 +20,9 @@
import java.util.concurrent.ScheduledExecutorService;
import java.util.function.Function;
-import com.google.common.base.MoreObjects;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.google.common.base.MoreObjects;
final class PropagatingContextAwareScheduledExecutorService
extends AbstractContextAwareScheduledExecutorService {
diff --git a/core/src/main/java/com/linecorp/armeria/common/ProtocolViolationException.java b/core/src/main/java/com/linecorp/armeria/common/ProtocolViolationException.java
index fd79fccd33e..28d1aa80fd4 100644
--- a/core/src/main/java/com/linecorp/armeria/common/ProtocolViolationException.java
+++ b/core/src/main/java/com/linecorp/armeria/common/ProtocolViolationException.java
@@ -15,7 +15,7 @@
*/
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A {@link RuntimeException} raised when a remote peer violated the current {@link SessionProtocol}.
diff --git a/core/src/main/java/com/linecorp/armeria/common/PublisherBasedHttpResponse.java b/core/src/main/java/com/linecorp/armeria/common/PublisherBasedHttpResponse.java
index 21a61529cd8..d4884253a93 100644
--- a/core/src/main/java/com/linecorp/armeria/common/PublisherBasedHttpResponse.java
+++ b/core/src/main/java/com/linecorp/armeria/common/PublisherBasedHttpResponse.java
@@ -19,9 +19,9 @@
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.stream.PublisherBasedStreamMessage;
import com.linecorp.armeria.internal.common.stream.SurroundingPublisher;
diff --git a/core/src/main/java/com/linecorp/armeria/common/QueryParamGetters.java b/core/src/main/java/com/linecorp/armeria/common/QueryParamGetters.java
index 0b39c9b8d82..0e1a39763da 100644
--- a/core/src/main/java/com/linecorp/armeria/common/QueryParamGetters.java
+++ b/core/src/main/java/com/linecorp/armeria/common/QueryParamGetters.java
@@ -25,9 +25,10 @@
import java.util.function.Consumer;
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.Streams;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.util.TemporaryThreadLocals;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/QueryParams.java b/core/src/main/java/com/linecorp/armeria/common/QueryParams.java
index bbf80acaf0b..25c1ac309ef 100644
--- a/core/src/main/java/com/linecorp/armeria/common/QueryParams.java
+++ b/core/src/main/java/com/linecorp/armeria/common/QueryParams.java
@@ -23,9 +23,10 @@
import java.util.Date;
import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.Strings;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.util.TemporaryThreadLocals;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/QueryParamsBase.java b/core/src/main/java/com/linecorp/armeria/common/QueryParamsBase.java
index 46d35c365bc..b5c2cd38816 100644
--- a/core/src/main/java/com/linecorp/armeria/common/QueryParamsBase.java
+++ b/core/src/main/java/com/linecorp/armeria/common/QueryParamsBase.java
@@ -29,7 +29,7 @@
*/
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* The base container implementation of {@link QueryParams} and {@link QueryParamsBuilder}.
diff --git a/core/src/main/java/com/linecorp/armeria/common/QueryParamsBuilder.java b/core/src/main/java/com/linecorp/armeria/common/QueryParamsBuilder.java
index 6590d326384..cf6119a8dc7 100644
--- a/core/src/main/java/com/linecorp/armeria/common/QueryParamsBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/QueryParamsBuilder.java
@@ -21,7 +21,7 @@
import java.util.Map;
import java.util.Map.Entry;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Builds a {@link QueryParams}.
diff --git a/core/src/main/java/com/linecorp/armeria/common/RefreshingTlsProvider.java b/core/src/main/java/com/linecorp/armeria/common/RefreshingTlsProvider.java
index 03b900c13bf..3158ee30fc7 100644
--- a/core/src/main/java/com/linecorp/armeria/common/RefreshingTlsProvider.java
+++ b/core/src/main/java/com/linecorp/armeria/common/RefreshingTlsProvider.java
@@ -28,13 +28,12 @@
import java.util.function.Consumer;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
-
final class RefreshingTlsProvider implements TlsProvider {
private static final Logger logger = LoggerFactory.getLogger(RefreshingTlsProvider.class);
diff --git a/core/src/main/java/com/linecorp/armeria/common/RequestContext.java b/core/src/main/java/com/linecorp/armeria/common/RequestContext.java
index 1f0935431ba..71932b219a4 100644
--- a/core/src/main/java/com/linecorp/armeria/common/RequestContext.java
+++ b/core/src/main/java/com/linecorp/armeria/common/RequestContext.java
@@ -38,12 +38,12 @@
import javax.net.ssl.SSLSession;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import com.google.errorprone.annotations.MustBeClosed;
import com.linecorp.armeria.client.ClientRequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.logging.RequestLogAccess;
diff --git a/core/src/main/java/com/linecorp/armeria/common/RequestContextStorage.java b/core/src/main/java/com/linecorp/armeria/common/RequestContextStorage.java
index 1d90bda9203..6e5b2ee79fa 100644
--- a/core/src/main/java/com/linecorp/armeria/common/RequestContextStorage.java
+++ b/core/src/main/java/com/linecorp/armeria/common/RequestContextStorage.java
@@ -20,7 +20,8 @@
import java.util.function.Function;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.Unwrappable;
import com.linecorp.armeria.internal.common.RequestContextUtil;
diff --git a/core/src/main/java/com/linecorp/armeria/common/RequestContextStorageWrapper.java b/core/src/main/java/com/linecorp/armeria/common/RequestContextStorageWrapper.java
index 6553e110d12..0edbcd6a652 100644
--- a/core/src/main/java/com/linecorp/armeria/common/RequestContextStorageWrapper.java
+++ b/core/src/main/java/com/linecorp/armeria/common/RequestContextStorageWrapper.java
@@ -17,7 +17,8 @@
import java.util.function.Function;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.util.AbstractUnwrappable;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/RequestContextWrapper.java b/core/src/main/java/com/linecorp/armeria/common/RequestContextWrapper.java
index 2973d6965b3..faf322839c7 100644
--- a/core/src/main/java/com/linecorp/armeria/common/RequestContextWrapper.java
+++ b/core/src/main/java/com/linecorp/armeria/common/RequestContextWrapper.java
@@ -27,7 +27,8 @@
import javax.net.ssl.SSLSession;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.logging.RequestLogAccess;
import com.linecorp.armeria.common.logging.RequestLogBuilder;
import com.linecorp.armeria.common.util.AbstractUnwrappable;
diff --git a/core/src/main/java/com/linecorp/armeria/common/RequestEntity.java b/core/src/main/java/com/linecorp/armeria/common/RequestEntity.java
index b50183c8570..d39c4836343 100644
--- a/core/src/main/java/com/linecorp/armeria/common/RequestEntity.java
+++ b/core/src/main/java/com/linecorp/armeria/common/RequestEntity.java
@@ -18,7 +18,8 @@
import static java.util.Objects.requireNonNull;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/RequestHeaderGetters.java b/core/src/main/java/com/linecorp/armeria/common/RequestHeaderGetters.java
index a7267c0b2c2..e9ff326754c 100644
--- a/core/src/main/java/com/linecorp/armeria/common/RequestHeaderGetters.java
+++ b/core/src/main/java/com/linecorp/armeria/common/RequestHeaderGetters.java
@@ -22,9 +22,9 @@
import java.util.Locale;
import java.util.Locale.LanguageRange;
-import com.google.common.collect.ImmutableList;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.google.common.collect.ImmutableList;
/**
* Provides the getter methods to {@link RequestHeaders} and {@link RequestHeadersBuilder}.
diff --git a/core/src/main/java/com/linecorp/armeria/common/RequestTarget.java b/core/src/main/java/com/linecorp/armeria/common/RequestTarget.java
index b3a7b434540..eb393f9e231 100644
--- a/core/src/main/java/com/linecorp/armeria/common/RequestTarget.java
+++ b/core/src/main/java/com/linecorp/armeria/common/RequestTarget.java
@@ -17,7 +17,8 @@
import static java.util.Objects.requireNonNull;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.common.DefaultRequestTarget;
import com.linecorp.armeria.internal.common.util.TemporaryThreadLocals;
diff --git a/core/src/main/java/com/linecorp/armeria/common/RpcRequest.java b/core/src/main/java/com/linecorp/armeria/common/RpcRequest.java
index 5a855f3aebe..cd98c641a82 100644
--- a/core/src/main/java/com/linecorp/armeria/common/RpcRequest.java
+++ b/core/src/main/java/com/linecorp/armeria/common/RpcRequest.java
@@ -21,9 +21,9 @@
import java.util.List;
-import com.google.common.collect.ImmutableList;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.google.common.collect.ImmutableList;
/**
* An RPC {@link Request}.
diff --git a/core/src/main/java/com/linecorp/armeria/common/RpcResponse.java b/core/src/main/java/com/linecorp/armeria/common/RpcResponse.java
index b276394153f..5bcde41c6bc 100644
--- a/core/src/main/java/com/linecorp/armeria/common/RpcResponse.java
+++ b/core/src/main/java/com/linecorp/armeria/common/RpcResponse.java
@@ -22,7 +22,8 @@
import java.util.concurrent.CompletionStage;
import java.util.concurrent.Future;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.util.Exceptions;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/Scheme.java b/core/src/main/java/com/linecorp/armeria/common/Scheme.java
index 36d5ac714f2..c51cdd31ff4 100644
--- a/core/src/main/java/com/linecorp/armeria/common/Scheme.java
+++ b/core/src/main/java/com/linecorp/armeria/common/Scheme.java
@@ -20,11 +20,11 @@
import java.util.Map;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.Ascii;
import com.google.common.collect.ImmutableMap;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* A pair of {@link SerializationFormat} and {@link SessionProtocol}.
*
diff --git a/core/src/main/java/com/linecorp/armeria/common/SerializationFormat.java b/core/src/main/java/com/linecorp/armeria/common/SerializationFormat.java
index 98e29570e22..667e0e567b2 100644
--- a/core/src/main/java/com/linecorp/armeria/common/SerializationFormat.java
+++ b/core/src/main/java/com/linecorp/armeria/common/SerializationFormat.java
@@ -27,6 +27,7 @@
import java.util.ServiceLoader;
import java.util.Set;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -39,7 +40,6 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/SerializationFormatProvider.java b/core/src/main/java/com/linecorp/armeria/common/SerializationFormatProvider.java
index 8f7c583e12d..339a13d7ff1 100644
--- a/core/src/main/java/com/linecorp/armeria/common/SerializationFormatProvider.java
+++ b/core/src/main/java/com/linecorp/armeria/common/SerializationFormatProvider.java
@@ -20,11 +20,12 @@
import java.util.Set;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.Ascii;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/ServerCacheControl.java b/core/src/main/java/com/linecorp/armeria/common/ServerCacheControl.java
index 191ede659ec..3c03efbcc68 100644
--- a/core/src/main/java/com/linecorp/armeria/common/ServerCacheControl.java
+++ b/core/src/main/java/com/linecorp/armeria/common/ServerCacheControl.java
@@ -22,11 +22,11 @@
import java.util.Map;
import java.util.function.BiConsumer;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* Directives for HTTP caching mechanisms in responses.
*
diff --git a/core/src/main/java/com/linecorp/armeria/common/ServerCacheControlBuilder.java b/core/src/main/java/com/linecorp/armeria/common/ServerCacheControlBuilder.java
index fe92433ff77..f7b34de9cf1 100644
--- a/core/src/main/java/com/linecorp/armeria/common/ServerCacheControlBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/ServerCacheControlBuilder.java
@@ -17,7 +17,7 @@
import java.time.Duration;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Creates a new {@link ServerCacheControl} using the builder pattern.
diff --git a/core/src/main/java/com/linecorp/armeria/common/SessionProtocol.java b/core/src/main/java/com/linecorp/armeria/common/SessionProtocol.java
index 0d04e323718..64a722a17a9 100644
--- a/core/src/main/java/com/linecorp/armeria/common/SessionProtocol.java
+++ b/core/src/main/java/com/linecorp/armeria/common/SessionProtocol.java
@@ -23,11 +23,12 @@
import java.util.Map;
import java.util.Set;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.Ascii;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/StreamTimeoutException.java b/core/src/main/java/com/linecorp/armeria/common/StreamTimeoutException.java
index 112183f3f78..ea914ee3485 100644
--- a/core/src/main/java/com/linecorp/armeria/common/StreamTimeoutException.java
+++ b/core/src/main/java/com/linecorp/armeria/common/StreamTimeoutException.java
@@ -18,7 +18,8 @@
import java.time.Duration;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.stream.StreamMessage;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/StringMultimap.java b/core/src/main/java/com/linecorp/armeria/common/StringMultimap.java
index 5e64edf5711..7f1da9255e6 100644
--- a/core/src/main/java/com/linecorp/armeria/common/StringMultimap.java
+++ b/core/src/main/java/com/linecorp/armeria/common/StringMultimap.java
@@ -48,12 +48,13 @@
import java.util.function.Consumer;
import java.util.function.Predicate;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterators;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.util.StringUtil;
import io.netty.handler.codec.DateFormatter;
diff --git a/core/src/main/java/com/linecorp/armeria/common/StringMultimapBuilder.java b/core/src/main/java/com/linecorp/armeria/common/StringMultimapBuilder.java
index ef75c855f5f..a851f0b1030 100644
--- a/core/src/main/java/com/linecorp/armeria/common/StringMultimapBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/StringMultimapBuilder.java
@@ -29,11 +29,11 @@
import java.util.function.Consumer;
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* Skeletal builder implementation of {@link StringMultimap} and/or its subtypes.
*
diff --git a/core/src/main/java/com/linecorp/armeria/common/StringMultimapGetters.java b/core/src/main/java/com/linecorp/armeria/common/StringMultimapGetters.java
index a689418c912..aeefc1661c5 100644
--- a/core/src/main/java/com/linecorp/armeria/common/StringMultimapGetters.java
+++ b/core/src/main/java/com/linecorp/armeria/common/StringMultimapGetters.java
@@ -23,7 +23,7 @@
import java.util.function.Consumer;
import java.util.stream.Stream;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Provides the getter methods to {@link StringMultimap}.
diff --git a/core/src/main/java/com/linecorp/armeria/common/StringValueConverter.java b/core/src/main/java/com/linecorp/armeria/common/StringValueConverter.java
index a7fcfc4f103..6310f160367 100644
--- a/core/src/main/java/com/linecorp/armeria/common/StringValueConverter.java
+++ b/core/src/main/java/com/linecorp/armeria/common/StringValueConverter.java
@@ -35,7 +35,8 @@
import java.util.Calendar;
import java.util.Date;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.internal.common.util.StringUtil;
import io.netty.handler.codec.DateFormatter;
diff --git a/core/src/main/java/com/linecorp/armeria/common/SystemPropertyFlagsProvider.java b/core/src/main/java/com/linecorp/armeria/common/SystemPropertyFlagsProvider.java
index 990bcee8d1b..01719eb571d 100644
--- a/core/src/main/java/com/linecorp/armeria/common/SystemPropertyFlagsProvider.java
+++ b/core/src/main/java/com/linecorp/armeria/common/SystemPropertyFlagsProvider.java
@@ -28,6 +28,7 @@
import java.util.function.Predicate;
import java.util.stream.Collectors;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -37,7 +38,6 @@
import com.google.common.collect.Streams;
import com.linecorp.armeria.client.ResponseTimeoutMode;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.multipart.MultipartFilenameDecodingMode;
import com.linecorp.armeria.common.util.InetAddressPredicates;
import com.linecorp.armeria.common.util.Sampler;
diff --git a/core/src/main/java/com/linecorp/armeria/common/ThreadLocalRequestContextStorage.java b/core/src/main/java/com/linecorp/armeria/common/ThreadLocalRequestContextStorage.java
index cc110929c89..c266acef72b 100644
--- a/core/src/main/java/com/linecorp/armeria/common/ThreadLocalRequestContextStorage.java
+++ b/core/src/main/java/com/linecorp/armeria/common/ThreadLocalRequestContextStorage.java
@@ -19,7 +19,7 @@
import static com.linecorp.armeria.internal.common.RequestContextUtil.newIllegalContextPoppingException;
import static java.util.Objects.requireNonNull;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.netty.util.concurrent.FastThreadLocal;
import io.netty.util.internal.InternalThreadLocalMap;
diff --git a/core/src/main/java/com/linecorp/armeria/common/TimeoutException.java b/core/src/main/java/com/linecorp/armeria/common/TimeoutException.java
index d48a5d519b1..fc486830cb4 100644
--- a/core/src/main/java/com/linecorp/armeria/common/TimeoutException.java
+++ b/core/src/main/java/com/linecorp/armeria/common/TimeoutException.java
@@ -16,7 +16,7 @@
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A {@link RuntimeException} raised when a requested invocation does not complete before its deadline.
diff --git a/core/src/main/java/com/linecorp/armeria/common/TlsKeyPair.java b/core/src/main/java/com/linecorp/armeria/common/TlsKeyPair.java
index 51f5f2a8092..dfdc2a6a3dc 100644
--- a/core/src/main/java/com/linecorp/armeria/common/TlsKeyPair.java
+++ b/core/src/main/java/com/linecorp/armeria/common/TlsKeyPair.java
@@ -28,10 +28,11 @@
import java.security.cert.X509Certificate;
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.SystemInfo;
import com.linecorp.armeria.internal.common.util.SelfSignedCertificate;
diff --git a/core/src/main/java/com/linecorp/armeria/common/TlsProvider.java b/core/src/main/java/com/linecorp/armeria/common/TlsProvider.java
index 28672f83099..5a7a5eb78eb 100644
--- a/core/src/main/java/com/linecorp/armeria/common/TlsProvider.java
+++ b/core/src/main/java/com/linecorp/armeria/common/TlsProvider.java
@@ -25,10 +25,11 @@
import java.util.function.Consumer;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.client.ClientFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.server.Server;
diff --git a/core/src/main/java/com/linecorp/armeria/common/TlsSetters.java b/core/src/main/java/com/linecorp/armeria/common/TlsSetters.java
index cf42957a4f6..7a1a47c63cb 100644
--- a/core/src/main/java/com/linecorp/armeria/common/TlsSetters.java
+++ b/core/src/main/java/com/linecorp/armeria/common/TlsSetters.java
@@ -24,7 +24,8 @@
import javax.net.ssl.KeyManagerFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.handler.ssl.SslContextBuilder;
diff --git a/core/src/main/java/com/linecorp/armeria/common/annotation/NonNullByDefault.java b/core/src/main/java/com/linecorp/armeria/common/annotation/NonNullByDefault.java
index c9922723077..c0e20beca99 100644
--- a/core/src/main/java/com/linecorp/armeria/common/annotation/NonNullByDefault.java
+++ b/core/src/main/java/com/linecorp/armeria/common/annotation/NonNullByDefault.java
@@ -24,10 +24,15 @@
import javax.annotation.Nonnull;
import javax.annotation.meta.TypeQualifierDefault;
+import org.jspecify.annotations.NullMarked;
+
/**
* Indicates the return values, parameters and fields are non-nullable by default. Annotate a package with
* this annotation and annotate nullable return values, parameters and fields with {@link Nullable}.
+ *
+ * @deprecated use {@link NullMarked}
*/
+@Deprecated
@Nonnull
@Documented
@Target(ElementType.PACKAGE)
diff --git a/core/src/main/java/com/linecorp/armeria/common/annotation/Nullable.java b/core/src/main/java/com/linecorp/armeria/common/annotation/Nullable.java
index cec410020e9..bbc51c5e727 100644
--- a/core/src/main/java/com/linecorp/armeria/common/annotation/Nullable.java
+++ b/core/src/main/java/com/linecorp/armeria/common/annotation/Nullable.java
@@ -29,7 +29,10 @@
/**
* Indicates the return values, parameters and fields are nullable.
* @see NonNullByDefault
+ *
+ * @deprecated use {@link org.jspecify.annotations.Nullable}
*/
+@Deprecated
@Documented
@TypeQualifierNickname
@Nonnull(when = When.MAYBE)
diff --git a/core/src/main/java/com/linecorp/armeria/common/annotation/package-info.java b/core/src/main/java/com/linecorp/armeria/common/annotation/package-info.java
index 8d0cf73c8af..c563d7740cf 100644
--- a/core/src/main/java/com/linecorp/armeria/common/annotation/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/common/annotation/package-info.java
@@ -17,5 +17,7 @@
/**
* Common annotations.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.annotation;
+
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/common/auth/AuthUtil.java b/core/src/main/java/com/linecorp/armeria/common/auth/AuthUtil.java
index 1957e6f86ef..6fc94124e56 100644
--- a/core/src/main/java/com/linecorp/armeria/common/auth/AuthUtil.java
+++ b/core/src/main/java/com/linecorp/armeria/common/auth/AuthUtil.java
@@ -16,7 +16,7 @@
package com.linecorp.armeria.common.auth;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
final class AuthUtil {
diff --git a/core/src/main/java/com/linecorp/armeria/common/auth/BasicToken.java b/core/src/main/java/com/linecorp/armeria/common/auth/BasicToken.java
index 8d023b653e1..a13db55951e 100644
--- a/core/src/main/java/com/linecorp/armeria/common/auth/BasicToken.java
+++ b/core/src/main/java/com/linecorp/armeria/common/auth/BasicToken.java
@@ -23,10 +23,11 @@
import java.util.Base64;
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.common.HttpHeaderNames;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* The bearer token of
diff --git a/core/src/main/java/com/linecorp/armeria/common/auth/OAuth1aToken.java b/core/src/main/java/com/linecorp/armeria/common/auth/OAuth1aToken.java
index 8e7501f3799..f5d3531ca39 100644
--- a/core/src/main/java/com/linecorp/armeria/common/auth/OAuth1aToken.java
+++ b/core/src/main/java/com/linecorp/armeria/common/auth/OAuth1aToken.java
@@ -23,10 +23,11 @@
import java.util.Map.Entry;
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.common.HttpHeaderNames;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.util.TemporaryThreadLocals;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/auth/OAuth1aTokenBuilder.java b/core/src/main/java/com/linecorp/armeria/common/auth/OAuth1aTokenBuilder.java
index 97dd9739219..7b87b4e0c07 100644
--- a/core/src/main/java/com/linecorp/armeria/common/auth/OAuth1aTokenBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/auth/OAuth1aTokenBuilder.java
@@ -30,11 +30,11 @@
import java.util.Map;
import java.util.Map.Entry;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.Ascii;
import com.google.common.collect.ImmutableMap;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* Builds a new {@link OAuth1aToken}.
*/
diff --git a/core/src/main/java/com/linecorp/armeria/common/auth/OAuth2Token.java b/core/src/main/java/com/linecorp/armeria/common/auth/OAuth2Token.java
index 96781862de4..d9dfee452e0 100644
--- a/core/src/main/java/com/linecorp/armeria/common/auth/OAuth2Token.java
+++ b/core/src/main/java/com/linecorp/armeria/common/auth/OAuth2Token.java
@@ -19,8 +19,9 @@
import static com.linecorp.armeria.common.auth.AuthUtil.secureEquals;
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpHeaderNames;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* The bearer token of OAuth 2.0 authentication.
diff --git a/core/src/main/java/com/linecorp/armeria/common/auth/package-info.java b/core/src/main/java/com/linecorp/armeria/common/auth/package-info.java
index 840ccb6c924..ac8800820d0 100644
--- a/core/src/main/java/com/linecorp/armeria/common/auth/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/common/auth/package-info.java
@@ -17,7 +17,7 @@
/**
* HTTP authorization common.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.auth;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/common/circuitbreaker/CircuitBreakerCallback.java b/core/src/main/java/com/linecorp/armeria/common/circuitbreaker/CircuitBreakerCallback.java
index ded24c946f4..d8bbbfc91d9 100644
--- a/core/src/main/java/com/linecorp/armeria/common/circuitbreaker/CircuitBreakerCallback.java
+++ b/core/src/main/java/com/linecorp/armeria/common/circuitbreaker/CircuitBreakerCallback.java
@@ -16,11 +16,12 @@
package com.linecorp.armeria.common.circuitbreaker;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.circuitbreaker.CircuitBreaker;
import com.linecorp.armeria.client.circuitbreaker.CircuitBreakerClient;
import com.linecorp.armeria.client.circuitbreaker.CircuitBreakerClientHandler;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/circuitbreaker/package-info.java b/core/src/main/java/com/linecorp/armeria/common/circuitbreaker/package-info.java
index 36808aa1863..55c8b376d01 100644
--- a/core/src/main/java/com/linecorp/armeria/common/circuitbreaker/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/common/circuitbreaker/package-info.java
@@ -17,7 +17,7 @@
/**
* Provides the common classes for {@link com.linecorp.armeria.client.circuitbreaker.CircuitBreaker}.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.circuitbreaker;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/common/encoding/AbstractStreamDecoder.java b/core/src/main/java/com/linecorp/armeria/common/encoding/AbstractStreamDecoder.java
index 6286ba02204..46964c470a0 100644
--- a/core/src/main/java/com/linecorp/armeria/common/encoding/AbstractStreamDecoder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/encoding/AbstractStreamDecoder.java
@@ -16,9 +16,10 @@
package com.linecorp.armeria.common.encoding;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.ContentTooLargeException;
import com.linecorp.armeria.common.HttpData;
-import com.linecorp.armeria.common.annotation.Nullable;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
diff --git a/core/src/main/java/com/linecorp/armeria/common/encoding/package-info.java b/core/src/main/java/com/linecorp/armeria/common/encoding/package-info.java
index fc200c960d2..6228650d9e2 100644
--- a/core/src/main/java/com/linecorp/armeria/common/encoding/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/common/encoding/package-info.java
@@ -17,7 +17,7 @@
/**
* Provides the common classes for HTTP content encoding.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.encoding;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/AbstractRampingUpLoadBalancerBuilder.java b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/AbstractRampingUpLoadBalancerBuilder.java
index e73a2731d63..8e0744b5df6 100644
--- a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/AbstractRampingUpLoadBalancerBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/AbstractRampingUpLoadBalancerBuilder.java
@@ -23,8 +23,9 @@
import java.time.Duration;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.CommonPools;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.Ticker;
diff --git a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/LoadBalancer.java b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/LoadBalancer.java
index 97cf708f47f..ca0540cc43c 100644
--- a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/LoadBalancer.java
+++ b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/LoadBalancer.java
@@ -21,11 +21,12 @@
import java.util.function.ToIntFunction;
import java.util.function.ToLongFunction;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.common.HttpRequest;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.SafeCloseable;
diff --git a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/RampingUpLoadBalancer.java b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/RampingUpLoadBalancer.java
index f73e80f042d..8df0ffb7532 100644
--- a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/RampingUpLoadBalancer.java
+++ b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/RampingUpLoadBalancer.java
@@ -28,6 +28,7 @@
import java.util.function.Function;
import java.util.function.ToIntFunction;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -37,7 +38,6 @@
import com.google.common.math.IntMath;
import com.google.common.primitives.Ints;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Ticker;
import com.linecorp.armeria.internal.common.loadbalancer.WeightedObject;
import com.linecorp.armeria.internal.common.util.ReentrantShortLock;
diff --git a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/RampingUpLoadBalancerBuilder.java b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/RampingUpLoadBalancerBuilder.java
index 6fa6341410c..1d9dfde5ce6 100644
--- a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/RampingUpLoadBalancerBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/RampingUpLoadBalancerBuilder.java
@@ -19,10 +19,11 @@
import java.util.List;
import java.util.function.ToIntFunction;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.common.CommonPools;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.util.concurrent.EventExecutor;
diff --git a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/RoundRobinLoadBalancer.java b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/RoundRobinLoadBalancer.java
index d8f30be2fb1..6deddea58fd 100644
--- a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/RoundRobinLoadBalancer.java
+++ b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/RoundRobinLoadBalancer.java
@@ -19,11 +19,11 @@
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* A round robin {@link LoadBalancer}.
*
diff --git a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/SimpleLoadBalancer.java b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/SimpleLoadBalancer.java
index 82855b0cff8..eab537b7f32 100644
--- a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/SimpleLoadBalancer.java
+++ b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/SimpleLoadBalancer.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.common.loadbalancer;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/StickyLoadBalancer.java b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/StickyLoadBalancer.java
index ce97b8d95d3..f3d0685de13 100644
--- a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/StickyLoadBalancer.java
+++ b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/StickyLoadBalancer.java
@@ -19,12 +19,12 @@
import java.util.List;
import java.util.function.ToLongFunction;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
import com.google.common.hash.Hashing;
-import com.linecorp.armeria.common.annotation.Nullable;
-
final class StickyLoadBalancer implements LoadBalancer {
private final ToLongFunction super C> contextHasher;
diff --git a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/WeightedRandomLoadBalancer.java b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/WeightedRandomLoadBalancer.java
index 8c828c9a9fa..8d6b61f014c 100644
--- a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/WeightedRandomLoadBalancer.java
+++ b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/WeightedRandomLoadBalancer.java
@@ -25,12 +25,13 @@
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.ToIntFunction;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.MoreObjects;
import com.google.common.collect.Streams;
import com.google.errorprone.annotations.concurrent.GuardedBy;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.loadbalancer.WeightedObject;
import com.linecorp.armeria.internal.common.util.ReentrantShortLock;
diff --git a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/WeightedRoundRobinLoadBalancer.java b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/WeightedRoundRobinLoadBalancer.java
index b96d2110870..0571473a698 100644
--- a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/WeightedRoundRobinLoadBalancer.java
+++ b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/WeightedRoundRobinLoadBalancer.java
@@ -23,6 +23,7 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.ToIntFunction;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -31,7 +32,6 @@
import com.google.common.collect.Iterables;
import com.google.common.collect.Streams;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.loadbalancer.WeightedObject;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/package-info.java b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/package-info.java
index c5ea97a2536..a07f640e85e 100644
--- a/core/src/main/java/com/linecorp/armeria/common/loadbalancer/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/common/loadbalancer/package-info.java
@@ -17,9 +17,10 @@
/**
* Provides classes for load balancing.
*/
-@NonNullByDefault
+@NullMarked
@UnstableApi
package com.linecorp.armeria.common.loadbalancer;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/AbstractHeadersSanitizerBuilder.java b/core/src/main/java/com/linecorp/armeria/common/logging/AbstractHeadersSanitizerBuilder.java
index 09e4f8c0b6f..0a83bba1f9f 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/AbstractHeadersSanitizerBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/AbstractHeadersSanitizerBuilder.java
@@ -22,10 +22,11 @@
import java.util.Set;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableSet;
import com.linecorp.armeria.common.HttpHeaderNames;
-import com.linecorp.armeria.common.annotation.Nullable;
import io.netty.util.AsciiString;
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/AbstractLogFormatterBuilder.java b/core/src/main/java/com/linecorp/armeria/common/logging/AbstractLogFormatterBuilder.java
index 33d77e8885e..9716e38d292 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/AbstractLogFormatterBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/AbstractLogFormatterBuilder.java
@@ -21,9 +21,10 @@
import java.util.function.BiFunction;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* A skeletal builder implementation for {@link LogFormatter}.
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/BeanFieldInfo.java b/core/src/main/java/com/linecorp/armeria/common/logging/BeanFieldInfo.java
index 455b5a226d2..7262f68c3f5 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/BeanFieldInfo.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/BeanFieldInfo.java
@@ -18,7 +18,8 @@
import java.lang.annotation.Annotation;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/BuiltInProperty.java b/core/src/main/java/com/linecorp/armeria/common/logging/BuiltInProperty.java
index 72b4ba45212..07a1baabe39 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/BuiltInProperty.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/BuiltInProperty.java
@@ -29,6 +29,8 @@
import javax.net.ssl.SSLSession;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableMap;
import com.google.common.io.BaseEncoding;
@@ -43,7 +45,6 @@
import com.linecorp.armeria.common.RpcRequest;
import com.linecorp.armeria.common.RpcResponse;
import com.linecorp.armeria.common.Scheme;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.internal.common.util.StringUtil;
import com.linecorp.armeria.server.HttpService;
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/ContentPreviewer.java b/core/src/main/java/com/linecorp/armeria/common/logging/ContentPreviewer.java
index 2a57728a21d..e956071eb8f 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/ContentPreviewer.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/ContentPreviewer.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.common.logging;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpData;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* Produces the preview of {@link RequestLog}.
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/DefaultRequestLog.java b/core/src/main/java/com/linecorp/armeria/common/logging/DefaultRequestLog.java
index dac13587ebc..476d22ee30c 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/DefaultRequestLog.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/DefaultRequestLog.java
@@ -59,6 +59,7 @@
import javax.net.ssl.SSLSession;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -80,7 +81,6 @@
import com.linecorp.armeria.common.Scheme;
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.EventLoopCheckingFuture;
import com.linecorp.armeria.common.util.SystemInfo;
import com.linecorp.armeria.common.util.UnmodifiableFuture;
@@ -496,8 +496,7 @@ private static void completeSatisfiedFutures(RequestLogFuture[] satisfiedFutures
}
}
- @Nullable
- private RequestLogFuture[] removeSatisfiedFutures(List pendingFutures) {
+ private RequestLogFuture @Nullable [] removeSatisfiedFutures(List pendingFutures) {
if (pendingFutures.isEmpty()) {
return null;
}
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/ExportGroupBuilder.java b/core/src/main/java/com/linecorp/armeria/common/logging/ExportGroupBuilder.java
index f40ee9cef89..0f5429c77d4 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/ExportGroupBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/ExportGroupBuilder.java
@@ -21,10 +21,11 @@
import java.util.Set;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableSet;
import com.linecorp.armeria.common.HttpHeaderNames;
-import com.linecorp.armeria.common.annotation.Nullable;
import io.netty.util.AsciiString;
import io.netty.util.AttributeKey;
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/FieldMasker.java b/core/src/main/java/com/linecorp/armeria/common/logging/FieldMasker.java
index 8f507701872..e54b5e5b4a7 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/FieldMasker.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/FieldMasker.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.common.logging;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.logging.FieldMaskers.FallThroughFieldMasker;
import com.linecorp.armeria.common.logging.FieldMaskers.NoMaskFieldMasker;
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/FieldMaskerBuilder.java b/core/src/main/java/com/linecorp/armeria/common/logging/FieldMaskerBuilder.java
index 7465062bb92..d0984ae02d9 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/FieldMaskerBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/FieldMaskerBuilder.java
@@ -21,11 +21,12 @@
import java.util.List;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/FieldMaskers.java b/core/src/main/java/com/linecorp/armeria/common/logging/FieldMaskers.java
index 09ebb70cd76..0f001d95704 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/FieldMaskers.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/FieldMaskers.java
@@ -16,7 +16,7 @@
package com.linecorp.armeria.common.logging;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
final class FieldMaskers {
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/HeaderMaskingFunction.java b/core/src/main/java/com/linecorp/armeria/common/logging/HeaderMaskingFunction.java
index c665f2446cb..7a682e55272 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/HeaderMaskingFunction.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/HeaderMaskingFunction.java
@@ -16,7 +16,7 @@
package com.linecorp.armeria.common.logging;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.netty.util.AsciiString;
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/HeadersSanitizer.java b/core/src/main/java/com/linecorp/armeria/common/logging/HeadersSanitizer.java
index 4811b7fa78d..a973c17dae2 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/HeadersSanitizer.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/HeadersSanitizer.java
@@ -18,12 +18,13 @@
import java.util.function.BiFunction;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.databind.JsonNode;
import com.linecorp.armeria.common.HttpHeaderNames;
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* A sanitizer that sanitizes {@link HttpHeaders}.
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/JsonHeadersSanitizerBuilder.java b/core/src/main/java/com/linecorp/armeria/common/logging/JsonHeadersSanitizerBuilder.java
index 48a70be0737..4899b6b42a3 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/JsonHeadersSanitizerBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/JsonHeadersSanitizerBuilder.java
@@ -18,10 +18,11 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.JacksonUtil;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/JsonLogFormatter.java b/core/src/main/java/com/linecorp/armeria/common/logging/JsonLogFormatter.java
index 1164d2e3947..1b29e04ec27 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/JsonLogFormatter.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/JsonLogFormatter.java
@@ -21,6 +21,7 @@
import java.util.List;
import java.util.function.BiFunction;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -31,7 +32,6 @@
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.TextFormatter;
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/LengthLimitingContentPreviewer.java b/core/src/main/java/com/linecorp/armeria/common/logging/LengthLimitingContentPreviewer.java
index ea70a972806..86e23548491 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/LengthLimitingContentPreviewer.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/LengthLimitingContentPreviewer.java
@@ -22,12 +22,13 @@
import java.util.ArrayList;
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.math.IntMath;
import com.google.common.primitives.Ints;
import com.linecorp.armeria.common.ByteBufAccessMode;
import com.linecorp.armeria.common.HttpData;
-import com.linecorp.armeria.common.annotation.Nullable;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/LogLevel.java b/core/src/main/java/com/linecorp/armeria/common/logging/LogLevel.java
index fdffdb28fa3..84896df6214 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/LogLevel.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/LogLevel.java
@@ -17,10 +17,9 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* Log level.
*/
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/LogWriterBuilder.java b/core/src/main/java/com/linecorp/armeria/common/logging/LogWriterBuilder.java
index 2a3e0f38f8a..6813e4468ee 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/LogWriterBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/LogWriterBuilder.java
@@ -22,13 +22,13 @@
import java.util.function.BiPredicate;
import java.util.function.Predicate;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.HttpStatusClass;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/LoggingDecoratorBuilder.java b/core/src/main/java/com/linecorp/armeria/common/logging/LoggingDecoratorBuilder.java
index 6eacfed7396..828ed825dba 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/LoggingDecoratorBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/LoggingDecoratorBuilder.java
@@ -22,6 +22,7 @@
import java.util.function.Function;
import java.util.function.Predicate;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -29,7 +30,6 @@
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.HttpStatusClass;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/NoopContentPreviewer.java b/core/src/main/java/com/linecorp/armeria/common/logging/NoopContentPreviewer.java
index ec61dafd732..b7bb8ec246f 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/NoopContentPreviewer.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/NoopContentPreviewer.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.common.logging;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpData;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* A skeletal {@link ContentPreviewer} implementation in order for a user to implement only the methods
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/PreviewSpec.java b/core/src/main/java/com/linecorp/armeria/common/logging/PreviewSpec.java
index 6706def7e71..83843d74dd5 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/PreviewSpec.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/PreviewSpec.java
@@ -19,9 +19,10 @@
import java.util.function.BiFunction;
import java.util.function.BiPredicate;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import io.netty.buffer.ByteBuf;
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/RegexBasedSanitizer.java b/core/src/main/java/com/linecorp/armeria/common/logging/RegexBasedSanitizer.java
index 524727618a8..54facd48339 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/RegexBasedSanitizer.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/RegexBasedSanitizer.java
@@ -22,10 +22,11 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* Regex based sanitizer.
diff --git a/core/src/main/java/com/linecorp/armeria/common/logging/RequestContextExporter.java b/core/src/main/java/com/linecorp/armeria/common/logging/RequestContextExporter.java
index 96bd382cef5..e7ff7a1b2b5 100644
--- a/core/src/main/java/com/linecorp/armeria/common/logging/RequestContextExporter.java
+++ b/core/src/main/java/com/linecorp/armeria/common/logging/RequestContextExporter.java
@@ -26,13 +26,14 @@
import java.util.Set;
import java.util.concurrent.atomic.AtomicLong;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.ExportGroupBuilder.ExportEntry;
import io.netty.util.AsciiString;
@@ -61,15 +62,11 @@ public static RequestContextExporterBuilder builder() {
@Nullable
private final BuiltInProperties builtInProperties;
- @Nullable
- private final ExportEntry[] builtInPropertyArray;
- @Nullable
- private final ExportEntry>[] attrs;
+ private final ExportEntry @Nullable [] builtInPropertyArray;
+ private final ExportEntry> @Nullable [] attrs;
private final int numAttrs;
- @Nullable
- private final ExportEntry[] reqHeaders;
- @Nullable
- private final ExportEntry[] resHeaders;
+ private final ExportEntry @Nullable [] reqHeaders;
+ private final ExportEntry @Nullable [] resHeaders;
RequestContextExporter(Set> builtInPropertySet,
Set>> attrs,
@@ -329,8 +326,7 @@ private static final class State extends Object2ObjectOpenHashMap{@link com.linecorp.armeria.common.logging.RequestLogBuilder}
*
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.logging;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/common/metric/AbstractMetricCollectingBuilder.java b/core/src/main/java/com/linecorp/armeria/common/metric/AbstractMetricCollectingBuilder.java
index 62e551252c7..75b32330146 100644
--- a/core/src/main/java/com/linecorp/armeria/common/metric/AbstractMetricCollectingBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/metric/AbstractMetricCollectingBuilder.java
@@ -19,10 +19,11 @@
import java.util.function.BiPredicate;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientBuilder;
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.SuccessFunction;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.server.ServerBuilder;
diff --git a/core/src/main/java/com/linecorp/armeria/common/metric/DropwizardMeterRegistries.java b/core/src/main/java/com/linecorp/armeria/common/metric/DropwizardMeterRegistries.java
index a9f1b9aae80..3bd4f3895a5 100644
--- a/core/src/main/java/com/linecorp/armeria/common/metric/DropwizardMeterRegistries.java
+++ b/core/src/main/java/com/linecorp/armeria/common/metric/DropwizardMeterRegistries.java
@@ -19,11 +19,11 @@
import static java.util.Comparator.comparing;
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.codahale.metrics.MetricRegistry;
import com.google.common.annotations.VisibleForTesting;
-import com.linecorp.armeria.common.annotation.Nullable;
-
import io.micrometer.core.instrument.Clock;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.Tag;
diff --git a/core/src/main/java/com/linecorp/armeria/common/metric/MeterIdPrefix.java b/core/src/main/java/com/linecorp/armeria/common/metric/MeterIdPrefix.java
index 861074edab4..a7ebc0811ad 100644
--- a/core/src/main/java/com/linecorp/armeria/common/metric/MeterIdPrefix.java
+++ b/core/src/main/java/com/linecorp/armeria/common/metric/MeterIdPrefix.java
@@ -24,9 +24,9 @@
import java.util.Collections;
import java.util.List;
-import com.google.common.collect.ImmutableList;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.google.common.collect.ImmutableList;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.Tag;
diff --git a/core/src/main/java/com/linecorp/armeria/common/metric/NoopMeterRegistry.java b/core/src/main/java/com/linecorp/armeria/common/metric/NoopMeterRegistry.java
index 8b2ea89aa15..9bddbfc5542 100644
--- a/core/src/main/java/com/linecorp/armeria/common/metric/NoopMeterRegistry.java
+++ b/core/src/main/java/com/linecorp/armeria/common/metric/NoopMeterRegistry.java
@@ -20,7 +20,7 @@
import java.util.function.ToDoubleFunction;
import java.util.function.ToLongFunction;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.micrometer.core.instrument.Clock;
import io.micrometer.core.instrument.Counter;
diff --git a/core/src/main/java/com/linecorp/armeria/common/metric/package-info.java b/core/src/main/java/com/linecorp/armeria/common/metric/package-info.java
index cf85d26963b..d8900b2dbcb 100644
--- a/core/src/main/java/com/linecorp/armeria/common/metric/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/common/metric/package-info.java
@@ -17,7 +17,7 @@
/**
* Common metric collection utilities.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.metric;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/common/multipart/AggregatedBodyPart.java b/core/src/main/java/com/linecorp/armeria/common/multipart/AggregatedBodyPart.java
index 49bb88bf4a0..cba645efa56 100644
--- a/core/src/main/java/com/linecorp/armeria/common/multipart/AggregatedBodyPart.java
+++ b/core/src/main/java/com/linecorp/armeria/common/multipart/AggregatedBodyPart.java
@@ -17,11 +17,12 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.AggregatedHttpObject;
import com.linecorp.armeria.common.ContentDisposition;
import com.linecorp.armeria.common.HttpData;
import com.linecorp.armeria.common.HttpHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* A complete body part whose headers and content are readily available.
diff --git a/core/src/main/java/com/linecorp/armeria/common/multipart/AggregatedMultipart.java b/core/src/main/java/com/linecorp/armeria/common/multipart/AggregatedMultipart.java
index 68103853452..abd70e76ecf 100644
--- a/core/src/main/java/com/linecorp/armeria/common/multipart/AggregatedMultipart.java
+++ b/core/src/main/java/com/linecorp/armeria/common/multipart/AggregatedMultipart.java
@@ -23,9 +23,9 @@
import java.util.List;
import java.util.Set;
-import com.google.common.collect.ImmutableList;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.google.common.collect.ImmutableList;
/**
* A complete multipart whose body parts are readily available.
diff --git a/core/src/main/java/com/linecorp/armeria/common/multipart/BodyPart.java b/core/src/main/java/com/linecorp/armeria/common/multipart/BodyPart.java
index faadcda3d40..f0f5fa95772 100644
--- a/core/src/main/java/com/linecorp/armeria/common/multipart/BodyPart.java
+++ b/core/src/main/java/com/linecorp/armeria/common/multipart/BodyPart.java
@@ -23,6 +23,7 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import com.google.errorprone.annotations.CheckReturnValue;
@@ -31,7 +32,6 @@
import com.linecorp.armeria.common.HttpData;
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.MediaType;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.stream.ByteStreamMessage;
import com.linecorp.armeria.common.stream.StreamMessage;
diff --git a/core/src/main/java/com/linecorp/armeria/common/multipart/BodyPartBuilder.java b/core/src/main/java/com/linecorp/armeria/common/multipart/BodyPartBuilder.java
index 1a526c030e0..d2968044220 100644
--- a/core/src/main/java/com/linecorp/armeria/common/multipart/BodyPartBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/multipart/BodyPartBuilder.java
@@ -22,6 +22,7 @@
import java.nio.file.Path;
import java.util.List;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import com.google.common.collect.ImmutableList;
@@ -30,7 +31,6 @@
import com.linecorp.armeria.common.HttpData;
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.MediaType;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.stream.ByteStreamMessage;
import com.linecorp.armeria.common.stream.StreamMessage;
diff --git a/core/src/main/java/com/linecorp/armeria/common/multipart/DefaultBodyPart.java b/core/src/main/java/com/linecorp/armeria/common/multipart/DefaultBodyPart.java
index 739151274ce..6cffe117b8a 100644
--- a/core/src/main/java/com/linecorp/armeria/common/multipart/DefaultBodyPart.java
+++ b/core/src/main/java/com/linecorp/armeria/common/multipart/DefaultBodyPart.java
@@ -22,11 +22,12 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.common.HttpData;
import com.linecorp.armeria.common.HttpHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.stream.ByteStreamMessage;
import com.linecorp.armeria.common.stream.StreamMessages;
import com.linecorp.armeria.internal.common.HttpObjectAggregator;
diff --git a/core/src/main/java/com/linecorp/armeria/common/multipart/DefaultMultipart.java b/core/src/main/java/com/linecorp/armeria/common/multipart/DefaultMultipart.java
index f0206dd6807..0367222487e 100644
--- a/core/src/main/java/com/linecorp/armeria/common/multipart/DefaultMultipart.java
+++ b/core/src/main/java/com/linecorp/armeria/common/multipart/DefaultMultipart.java
@@ -23,6 +23,7 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadLocalRandom;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
@@ -39,7 +40,6 @@
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.stream.ByteStreamMessage;
import com.linecorp.armeria.common.stream.StreamMessage;
import com.linecorp.armeria.common.stream.SubscriptionOption;
diff --git a/core/src/main/java/com/linecorp/armeria/common/multipart/MimeParser.java b/core/src/main/java/com/linecorp/armeria/common/multipart/MimeParser.java
index 7ad1a7486a9..9513dc10684 100644
--- a/core/src/main/java/com/linecorp/armeria/common/multipart/MimeParser.java
+++ b/core/src/main/java/com/linecorp/armeria/common/multipart/MimeParser.java
@@ -33,6 +33,7 @@
import java.nio.charset.StandardCharsets;
import java.util.regex.Pattern;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,7 +41,6 @@
import com.linecorp.armeria.common.HttpData;
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.HttpHeadersBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.multipart.MultipartDecoder.BodyPartPublisher;
import com.linecorp.armeria.common.stream.StreamDecoderInput;
import com.linecorp.armeria.common.stream.StreamDecoderOutput;
diff --git a/core/src/main/java/com/linecorp/armeria/common/multipart/Multipart.java b/core/src/main/java/com/linecorp/armeria/common/multipart/Multipart.java
index 3b264fbae5a..126dfa5430d 100644
--- a/core/src/main/java/com/linecorp/armeria/common/multipart/Multipart.java
+++ b/core/src/main/java/com/linecorp/armeria/common/multipart/Multipart.java
@@ -24,6 +24,7 @@
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import org.reactivestreams.Subscriber;
@@ -38,7 +39,6 @@
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.stream.ByteStreamMessage;
import com.linecorp.armeria.common.stream.StreamMessage;
diff --git a/core/src/main/java/com/linecorp/armeria/common/multipart/MultipartDecoder.java b/core/src/main/java/com/linecorp/armeria/common/multipart/MultipartDecoder.java
index c0672443a8d..35de17a594d 100644
--- a/core/src/main/java/com/linecorp/armeria/common/multipart/MultipartDecoder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/multipart/MultipartDecoder.java
@@ -21,13 +21,13 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import com.google.common.math.LongMath;
import com.linecorp.armeria.common.HttpData;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.stream.AbortedStreamException;
import com.linecorp.armeria.common.stream.CancelledSubscriptionException;
import com.linecorp.armeria.common.stream.DefaultStreamMessage;
diff --git a/core/src/main/java/com/linecorp/armeria/common/multipart/MultipartEncoder.java b/core/src/main/java/com/linecorp/armeria/common/multipart/MultipartEncoder.java
index 04c7178b93b..3c8eae12637 100644
--- a/core/src/main/java/com/linecorp/armeria/common/multipart/MultipartEncoder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/multipart/MultipartEncoder.java
@@ -22,11 +22,11 @@
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import com.linecorp.armeria.common.HttpData;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.stream.AbortedStreamException;
import com.linecorp.armeria.common.stream.CancelledSubscriptionException;
import com.linecorp.armeria.common.stream.DefaultStreamMessage;
diff --git a/core/src/main/java/com/linecorp/armeria/common/multipart/package-info.java b/core/src/main/java/com/linecorp/armeria/common/multipart/package-info.java
index 31320554fa4..59549da0e36 100644
--- a/core/src/main/java/com/linecorp/armeria/common/multipart/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/common/multipart/package-info.java
@@ -17,7 +17,7 @@
/**
* Multiple part messages support.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.multipart;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/common/outlier/DefaultOutlierDetector.java b/core/src/main/java/com/linecorp/armeria/common/outlier/DefaultOutlierDetector.java
index fe73be356dd..332b5a5e6ca 100644
--- a/core/src/main/java/com/linecorp/armeria/common/outlier/DefaultOutlierDetector.java
+++ b/core/src/main/java/com/linecorp/armeria/common/outlier/DefaultOutlierDetector.java
@@ -18,9 +18,10 @@
import java.time.Duration;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.EventCount;
import com.linecorp.armeria.common.util.EventCounter;
import com.linecorp.armeria.common.util.Ticker;
diff --git a/core/src/main/java/com/linecorp/armeria/common/outlier/OutlierDetectingRuleBuilder.java b/core/src/main/java/com/linecorp/armeria/common/outlier/OutlierDetectingRuleBuilder.java
index f1674993737..3fce95b4ac3 100644
--- a/core/src/main/java/com/linecorp/armeria/common/outlier/OutlierDetectingRuleBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/outlier/OutlierDetectingRuleBuilder.java
@@ -22,10 +22,11 @@
import java.util.function.BiFunction;
import java.util.function.Predicate;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/outlier/OutlierRule.java b/core/src/main/java/com/linecorp/armeria/common/outlier/OutlierRule.java
index 2d210fa56a3..647ff6d2f6d 100644
--- a/core/src/main/java/com/linecorp/armeria/common/outlier/OutlierRule.java
+++ b/core/src/main/java/com/linecorp/armeria/common/outlier/OutlierRule.java
@@ -19,9 +19,10 @@
import static com.linecorp.armeria.common.outlier.OutlierDetectingRuleBuilder.DEFAULT_RULE;
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/core/src/main/java/com/linecorp/armeria/common/outlier/package-info.java b/core/src/main/java/com/linecorp/armeria/common/outlier/package-info.java
index 7e7ac1447ad..ee3f95ae029 100644
--- a/core/src/main/java/com/linecorp/armeria/common/outlier/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/common/outlier/package-info.java
@@ -17,9 +17,10 @@
/**
* Provides classes for detecting outliers.
*/
-@NonNullByDefault
+@NullMarked
@UnstableApi
package com.linecorp.armeria.common.outlier;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/core/src/main/java/com/linecorp/armeria/common/package-info.java b/core/src/main/java/com/linecorp/armeria/common/package-info.java
index 09a203a53b9..fc59f42904e 100644
--- a/core/src/main/java/com/linecorp/armeria/common/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/common/package-info.java
@@ -22,7 +22,7 @@
* {@link com.linecorp.armeria.common.RequestContext}
*
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/common/sse/DefaultServerSentEvent.java b/core/src/main/java/com/linecorp/armeria/common/sse/DefaultServerSentEvent.java
index 8eba5be73e6..1b5beca59ef 100644
--- a/core/src/main/java/com/linecorp/armeria/common/sse/DefaultServerSentEvent.java
+++ b/core/src/main/java/com/linecorp/armeria/common/sse/DefaultServerSentEvent.java
@@ -18,9 +18,9 @@
import java.time.Duration;
import java.util.Objects;
-import com.google.common.base.MoreObjects;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.google.common.base.MoreObjects;
/**
* A default implementation of the {@link ServerSentEvent} interface.
diff --git a/core/src/main/java/com/linecorp/armeria/common/sse/ServerSentEvent.java b/core/src/main/java/com/linecorp/armeria/common/sse/ServerSentEvent.java
index 0227cf1adbc..09363c78ab6 100644
--- a/core/src/main/java/com/linecorp/armeria/common/sse/ServerSentEvent.java
+++ b/core/src/main/java/com/linecorp/armeria/common/sse/ServerSentEvent.java
@@ -18,9 +18,9 @@
import java.time.Duration;
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.annotation.ProducesEventStream;
import com.linecorp.armeria.server.annotation.ServerSentEventResponseConverterFunction;
diff --git a/core/src/main/java/com/linecorp/armeria/common/sse/ServerSentEventBuilder.java b/core/src/main/java/com/linecorp/armeria/common/sse/ServerSentEventBuilder.java
index ecb0d847b45..bbb6ab99a61 100644
--- a/core/src/main/java/com/linecorp/armeria/common/sse/ServerSentEventBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/sse/ServerSentEventBuilder.java
@@ -19,7 +19,7 @@
import java.time.Duration;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A builder which creates a {@link ServerSentEvent} instance.
diff --git a/core/src/main/java/com/linecorp/armeria/common/sse/package-info.java b/core/src/main/java/com/linecorp/armeria/common/sse/package-info.java
index 3942c3649b9..47311a2a6a1 100644
--- a/core/src/main/java/com/linecorp/armeria/common/sse/package-info.java
+++ b/core/src/main/java/com/linecorp/armeria/common/sse/package-info.java
@@ -17,7 +17,7 @@
/**
* Server-Sent Events support.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.sse;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/core/src/main/java/com/linecorp/armeria/common/stream/AbstractByteStreamMessageBuilder.java b/core/src/main/java/com/linecorp/armeria/common/stream/AbstractByteStreamMessageBuilder.java
index ea46e82841a..0b3f6b14e79 100644
--- a/core/src/main/java/com/linecorp/armeria/common/stream/AbstractByteStreamMessageBuilder.java
+++ b/core/src/main/java/com/linecorp/armeria/common/stream/AbstractByteStreamMessageBuilder.java
@@ -21,8 +21,9 @@
import java.util.concurrent.ExecutorService;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpData;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.stream.InternalStreamMessageUtil;
abstract class AbstractByteStreamMessageBuilder> {
diff --git a/core/src/main/java/com/linecorp/armeria/common/stream/AggregationSupport.java b/core/src/main/java/com/linecorp/armeria/common/stream/AggregationSupport.java
index 726c989739f..4cb2bd90503 100644
--- a/core/src/main/java/com/linecorp/armeria/common/stream/AggregationSupport.java
+++ b/core/src/main/java/com/linecorp/armeria/common/stream/AggregationSupport.java
@@ -24,6 +24,8 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.AggregatedHttpMessage;
import com.linecorp.armeria.common.AggregationOptions;
import com.linecorp.armeria.common.HttpMessage;
@@ -31,7 +33,6 @@
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.RequestHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.internal.common.HttpMessageAggregator;
diff --git a/core/src/main/java/com/linecorp/armeria/common/stream/AsyncFileWriter.java b/core/src/main/java/com/linecorp/armeria/common/stream/AsyncFileWriter.java
index fa9679476a5..2ceda594c56 100644
--- a/core/src/main/java/com/linecorp/armeria/common/stream/AsyncFileWriter.java
+++ b/core/src/main/java/com/linecorp/armeria/common/stream/AsyncFileWriter.java
@@ -30,6 +30,7 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import org.slf4j.Logger;
@@ -38,7 +39,6 @@
import com.google.common.collect.Maps;
import com.linecorp.armeria.common.HttpData;
-import com.linecorp.armeria.common.annotation.Nullable;
import io.netty.buffer.ByteBuf;
import io.netty.util.concurrent.EventExecutor;
diff --git a/core/src/main/java/com/linecorp/armeria/common/stream/AsyncMapStreamMessage.java b/core/src/main/java/com/linecorp/armeria/common/stream/AsyncMapStreamMessage.java
index f1b46fed5f2..6f2cb96f11b 100644
--- a/core/src/main/java/com/linecorp/armeria/common/stream/AsyncMapStreamMessage.java
+++ b/core/src/main/java/com/linecorp/armeria/common/stream/AsyncMapStreamMessage.java
@@ -21,13 +21,13 @@
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import com.google.common.math.IntMath;
import com.google.common.math.LongMath;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.stream.StreamMessageUtil;
import io.netty.util.concurrent.EventExecutor;
diff --git a/core/src/main/java/com/linecorp/armeria/common/stream/CancellableStreamMessage.java b/core/src/main/java/com/linecorp/armeria/common/stream/CancellableStreamMessage.java
index 20cb59e0fca..b4b941d93ee 100644
--- a/core/src/main/java/com/linecorp/armeria/common/stream/CancellableStreamMessage.java
+++ b/core/src/main/java/com/linecorp/armeria/common/stream/CancellableStreamMessage.java
@@ -26,6 +26,7 @@
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import org.slf4j.Logger;
@@ -33,7 +34,6 @@
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.CompositeException;
import com.linecorp.armeria.common.util.EventLoopCheckingFuture;
import com.linecorp.armeria.internal.common.stream.AbortingSubscriber;
diff --git a/core/src/main/java/com/linecorp/armeria/common/stream/ClosedStreamException.java b/core/src/main/java/com/linecorp/armeria/common/stream/ClosedStreamException.java
index 996c4210156..8b484fef1bb 100644
--- a/core/src/main/java/com/linecorp/armeria/common/stream/ClosedStreamException.java
+++ b/core/src/main/java/com/linecorp/armeria/common/stream/ClosedStreamException.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.common.stream;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.Flags;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* A {@link RuntimeException} that is raised when a {@link StreamMessage} or an HTTP/2 stream
diff --git a/core/src/main/java/com/linecorp/armeria/common/stream/ConcatArrayStreamMessage.java b/core/src/main/java/com/linecorp/armeria/common/stream/ConcatArrayStreamMessage.java
index b4a64ad2f5a..0509b6fe696 100644
--- a/core/src/main/java/com/linecorp/armeria/common/stream/ConcatArrayStreamMessage.java
+++ b/core/src/main/java/com/linecorp/armeria/common/stream/ConcatArrayStreamMessage.java
@@ -39,10 +39,10 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.stream.NoopSubscription;
import com.linecorp.armeria.internal.common.stream.SubscriptionArbiter;
diff --git a/core/src/main/java/com/linecorp/armeria/common/stream/ConcatPublisherStreamMessage.java b/core/src/main/java/com/linecorp/armeria/common/stream/ConcatPublisherStreamMessage.java
index 15d46071389..8f412100faa 100644
--- a/core/src/main/java/com/linecorp/armeria/common/stream/ConcatPublisherStreamMessage.java
+++ b/core/src/main/java/com/linecorp/armeria/common/stream/ConcatPublisherStreamMessage.java
@@ -22,11 +22,11 @@
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.stream.NoopSubscription;
import com.linecorp.armeria.internal.common.stream.SubscriptionArbiter;
diff --git a/core/src/main/java/com/linecorp/armeria/common/stream/DefaultByteStreamMessage.java b/core/src/main/java/com/linecorp/armeria/common/stream/DefaultByteStreamMessage.java
index 9a5491088e8..a1304d2249f 100644
--- a/core/src/main/java/com/linecorp/armeria/common/stream/DefaultByteStreamMessage.java
+++ b/core/src/main/java/com/linecorp/armeria/common/stream/DefaultByteStreamMessage.java
@@ -22,6 +22,7 @@
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
@@ -29,7 +30,6 @@
import com.linecorp.armeria.common.ByteBufAccessMode;
import com.linecorp.armeria.common.HttpData;
-import com.linecorp.armeria.common.annotation.Nullable;
import io.netty.buffer.ByteBuf;
import io.netty.util.concurrent.EventExecutor;
diff --git a/core/src/main/java/com/linecorp/armeria/common/stream/DefaultStreamMessage.java b/core/src/main/java/com/linecorp/armeria/common/stream/DefaultStreamMessage.java
index 8c872644da3..28b6f17b275 100644
--- a/core/src/main/java/com/linecorp/armeria/common/stream/DefaultStreamMessage.java
+++ b/core/src/main/java/com/linecorp/armeria/common/stream/DefaultStreamMessage.java
@@ -25,11 +25,11 @@
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
import org.jctools.queues.MpscChunkedArrayQueue;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.common.stream.AbortingSubscriber;
import com.linecorp.armeria.internal.common.stream.StreamMessageUtil;
diff --git a/core/src/main/java/com/linecorp/armeria/common/stream/DefaultStreamMessageDuplicator.java b/core/src/main/java/com/linecorp/armeria/common/stream/DefaultStreamMessageDuplicator.java
index 2f4734c45de..c5bfe19537f 100644
--- a/core/src/main/java/com/linecorp/armeria/common/stream/DefaultStreamMessageDuplicator.java
+++ b/core/src/main/java/com/linecorp/armeria/common/stream/DefaultStreamMessageDuplicator.java
@@ -36,6 +36,7 @@
import java.util.concurrent.atomic.AtomicLongFieldUpdater;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import org.slf4j.Logger;
@@ -49,7 +50,6 @@
import com.linecorp.armeria.common.ByteBufAccessMode;
import com.linecorp.armeria.common.ContentTooLargeException;
import com.linecorp.armeria.common.HttpData;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.CompositeException;
import com.linecorp.armeria.common.util.EventLoopCheckingFuture;
@@ -887,9 +887,8 @@ static final class SignalQueue {
private final SignalLengthGetter
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.grpc.protocol;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/AbstractMessageDeframer.java b/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/AbstractMessageDeframer.java
index f2d3c565ba3..5c254bd3d84 100644
--- a/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/AbstractMessageDeframer.java
+++ b/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/AbstractMessageDeframer.java
@@ -20,9 +20,10 @@
import java.io.IOException;
import java.io.InputStream;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.stream.StreamDecoderInput;
import com.linecorp.armeria.internal.common.grpc.protocol.StatusCodes;
diff --git a/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/ArmeriaMessageDeframer.java b/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/ArmeriaMessageDeframer.java
index b09b661c3cf..c3f4b5f99ec 100644
--- a/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/ArmeriaMessageDeframer.java
+++ b/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/ArmeriaMessageDeframer.java
@@ -49,8 +49,9 @@
import static com.google.common.base.Preconditions.checkState;
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpData;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.stream.HttpDecoder;
import com.linecorp.armeria.common.stream.StreamDecoderInput;
diff --git a/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/ArmeriaMessageFramer.java b/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/ArmeriaMessageFramer.java
index bb249755957..9b4b90f1f60 100644
--- a/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/ArmeriaMessageFramer.java
+++ b/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/ArmeriaMessageFramer.java
@@ -53,10 +53,11 @@
import java.io.InputStream;
import java.io.OutputStream;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.linecorp.armeria.common.HttpData;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.common.grpc.protocol.StatusCodes;
diff --git a/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/ArmeriaStatusException.java b/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/ArmeriaStatusException.java
index 457e7c9fdbd..78c2e2a6430 100644
--- a/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/ArmeriaStatusException.java
+++ b/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/ArmeriaStatusException.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.common.grpc.protocol;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
@@ -29,8 +30,7 @@ public final class ArmeriaStatusException extends RuntimeException {
private final int code;
- @Nullable
- private final byte[] grpcStatusDetailsBin;
+ private final byte @Nullable [] grpcStatusDetailsBin;
/**
* Constructs an {@link ArmeriaStatusException} for the given gRPC status code and message.
@@ -45,7 +45,7 @@ public ArmeriaStatusException(int code, @Nullable String message) {
* {@code com.google.rpc.Status} to follow the
* unofficial specification.
*/
- public ArmeriaStatusException(int code, @Nullable String message, @Nullable byte[] grpcStatusDetailsBin) {
+ public ArmeriaStatusException(int code, @Nullable String message, byte @Nullable [] grpcStatusDetailsBin) {
this(code, message, grpcStatusDetailsBin, null);
}
@@ -62,7 +62,7 @@ public ArmeriaStatusException(int code, @Nullable String message, @Nullable Thro
* {@code com.google.rpc.Status} to follow the
* unofficial specification.
*/
- public ArmeriaStatusException(int code, @Nullable String message, @Nullable byte[] grpcStatusDetailsBin,
+ public ArmeriaStatusException(int code, @Nullable String message, byte @Nullable [] grpcStatusDetailsBin,
@Nullable Throwable cause) {
super(message, cause);
this.code = code;
@@ -79,8 +79,7 @@ public int getCode() {
/**
* Returns the gRPC details binary for this {@link ArmeriaStatusException}.
*/
- @Nullable
- public byte[] getGrpcStatusDetailsBin() {
+ public byte @Nullable [] getGrpcStatusDetailsBin() {
return grpcStatusDetailsBin;
}
}
diff --git a/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/DeframedMessage.java b/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/DeframedMessage.java
index 1a0b13bce89..51f3fa0d2c1 100644
--- a/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/DeframedMessage.java
+++ b/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/DeframedMessage.java
@@ -22,9 +22,10 @@
import java.io.InputStream;
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.SafeCloseable;
diff --git a/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/GrpcWebTrailers.java b/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/GrpcWebTrailers.java
index dff10cc3082..d192dc3a483 100644
--- a/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/GrpcWebTrailers.java
+++ b/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/GrpcWebTrailers.java
@@ -16,11 +16,12 @@
package com.linecorp.armeria.common.grpc.protocol;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.retry.RetryRuleWithContent;
import com.linecorp.armeria.common.AggregatedHttpResponse;
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.common.InternalGrpcWebTrailers;
diff --git a/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/package-info.java b/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/package-info.java
index 8904425cf46..14d788a29d0 100644
--- a/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/package-info.java
+++ b/grpc-protocol/src/main/java/com/linecorp/armeria/common/grpc/protocol/package-info.java
@@ -25,8 +25,9 @@
* it's an advanced API.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.grpc.protocol;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/grpc-protocol/src/main/java/com/linecorp/armeria/internal/client/grpc/protocol/InternalGrpcWebUtil.java b/grpc-protocol/src/main/java/com/linecorp/armeria/internal/client/grpc/protocol/InternalGrpcWebUtil.java
index 9541b20b519..8d126397844 100644
--- a/grpc-protocol/src/main/java/com/linecorp/armeria/internal/client/grpc/protocol/InternalGrpcWebUtil.java
+++ b/grpc-protocol/src/main/java/com/linecorp/armeria/internal/client/grpc/protocol/InternalGrpcWebUtil.java
@@ -20,11 +20,12 @@
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.io.ByteStreams;
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.HttpHeadersBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.protocol.DeframedMessage;
import io.netty.buffer.ByteBuf;
diff --git a/grpc-protocol/src/main/java/com/linecorp/armeria/internal/client/grpc/protocol/package-info.java b/grpc-protocol/src/main/java/com/linecorp/armeria/internal/client/grpc/protocol/package-info.java
index 68473733366..b8c30ea0c62 100644
--- a/grpc-protocol/src/main/java/com/linecorp/armeria/internal/client/grpc/protocol/package-info.java
+++ b/grpc-protocol/src/main/java/com/linecorp/armeria/internal/client/grpc/protocol/package-info.java
@@ -17,8 +17,9 @@
* Internal common classes for handling the gRPC wire protocol.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.client.grpc.protocol;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/grpc-protocol/src/main/java/com/linecorp/armeria/internal/common/grpc/protocol/Base64Decoder.java b/grpc-protocol/src/main/java/com/linecorp/armeria/internal/common/grpc/protocol/Base64Decoder.java
index 773f8161717..eee533e26fc 100644
--- a/grpc-protocol/src/main/java/com/linecorp/armeria/internal/common/grpc/protocol/Base64Decoder.java
+++ b/grpc-protocol/src/main/java/com/linecorp/armeria/internal/common/grpc/protocol/Base64Decoder.java
@@ -34,7 +34,7 @@
*/
package com.linecorp.armeria.internal.common.grpc.protocol;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
diff --git a/grpc-protocol/src/main/java/com/linecorp/armeria/internal/common/grpc/protocol/GrpcTrailersUtil.java b/grpc-protocol/src/main/java/com/linecorp/armeria/internal/common/grpc/protocol/GrpcTrailersUtil.java
index d5aabb4c552..a76d0e81647 100644
--- a/grpc-protocol/src/main/java/com/linecorp/armeria/internal/common/grpc/protocol/GrpcTrailersUtil.java
+++ b/grpc-protocol/src/main/java/com/linecorp/armeria/internal/common/grpc/protocol/GrpcTrailersUtil.java
@@ -21,9 +21,10 @@
import java.util.Base64;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.HttpHeadersBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.protocol.GrpcHeaderNames;
import com.linecorp.armeria.common.grpc.protocol.StatusMessageEscaper;
import com.linecorp.armeria.internal.common.util.StringUtil;
@@ -45,7 +46,7 @@ public final class GrpcTrailersUtil {
*/
public static void addStatusMessageToTrailers(
HttpHeadersBuilder trailersBuilder, int code, @Nullable String message,
- @Nullable byte[] details) {
+ byte @Nullable [] details) {
trailersBuilder.endOfStream(true);
trailersBuilder.add(GrpcHeaderNames.GRPC_STATUS, StringUtil.toString(code));
if (message != null) {
diff --git a/grpc-protocol/src/main/java/com/linecorp/armeria/internal/common/grpc/protocol/package-info.java b/grpc-protocol/src/main/java/com/linecorp/armeria/internal/common/grpc/protocol/package-info.java
index 49874a92e2e..95971ddbde2 100644
--- a/grpc-protocol/src/main/java/com/linecorp/armeria/internal/common/grpc/protocol/package-info.java
+++ b/grpc-protocol/src/main/java/com/linecorp/armeria/internal/common/grpc/protocol/package-info.java
@@ -17,8 +17,9 @@
* Internal common classes for handling the gRPC wire protocol.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.common.grpc.protocol;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/grpc-protocol/src/main/java/com/linecorp/armeria/server/grpc/protocol/AbstractUnsafeUnaryGrpcService.java b/grpc-protocol/src/main/java/com/linecorp/armeria/server/grpc/protocol/AbstractUnsafeUnaryGrpcService.java
index 4aa8515eb14..eda4e32d192 100644
--- a/grpc-protocol/src/main/java/com/linecorp/armeria/server/grpc/protocol/AbstractUnsafeUnaryGrpcService.java
+++ b/grpc-protocol/src/main/java/com/linecorp/armeria/server/grpc/protocol/AbstractUnsafeUnaryGrpcService.java
@@ -23,6 +23,7 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
@@ -37,7 +38,6 @@
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.ResponseHeadersBuilder;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.grpc.protocol.ArmeriaMessageDeframer;
import com.linecorp.armeria.common.grpc.protocol.ArmeriaMessageFramer;
diff --git a/grpc-protocol/src/main/java/com/linecorp/armeria/server/grpc/protocol/package-info.java b/grpc-protocol/src/main/java/com/linecorp/armeria/server/grpc/protocol/package-info.java
index 26a0c0e8b08..970edad8b4c 100644
--- a/grpc-protocol/src/main/java/com/linecorp/armeria/server/grpc/protocol/package-info.java
+++ b/grpc-protocol/src/main/java/com/linecorp/armeria/server/grpc/protocol/package-info.java
@@ -26,8 +26,9 @@
* it's an advanced API.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.grpc.protocol;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/grpc/src/main/java/com/linecorp/armeria/client/grpc/GrpcClientBuilder.java b/grpc/src/main/java/com/linecorp/armeria/client/grpc/GrpcClientBuilder.java
index 59e627af848..60455b93243 100644
--- a/grpc/src/main/java/com/linecorp/armeria/client/grpc/GrpcClientBuilder.java
+++ b/grpc/src/main/java/com/linecorp/armeria/client/grpc/GrpcClientBuilder.java
@@ -40,6 +40,7 @@
import java.util.function.Supplier;
import org.curioswitch.common.protobuf.json.MessageMarshaller;
+import org.jspecify.annotations.Nullable;
import com.google.common.collect.ImmutableList;
import com.google.protobuf.ByteString;
@@ -68,7 +69,6 @@
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
import com.linecorp.armeria.common.SuccessFunction;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.auth.AuthToken;
import com.linecorp.armeria.common.auth.BasicToken;
diff --git a/grpc/src/main/java/com/linecorp/armeria/client/grpc/GrpcClientCall.java b/grpc/src/main/java/com/linecorp/armeria/client/grpc/GrpcClientCall.java
index 9147b3b2497..d230a2944c3 100644
--- a/grpc/src/main/java/com/linecorp/armeria/client/grpc/GrpcClientCall.java
+++ b/grpc/src/main/java/com/linecorp/armeria/client/grpc/GrpcClientCall.java
@@ -20,8 +20,9 @@
import static com.linecorp.armeria.internal.client.grpc.InternalGrpcClientCall.GRPC_METHOD_DESCRIPTOR;
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.grpc.CallOptions;
diff --git a/grpc/src/main/java/com/linecorp/armeria/client/grpc/GrpcClientStubFactory.java b/grpc/src/main/java/com/linecorp/armeria/client/grpc/GrpcClientStubFactory.java
index 57eb09d86a2..396863b6c97 100644
--- a/grpc/src/main/java/com/linecorp/armeria/client/grpc/GrpcClientStubFactory.java
+++ b/grpc/src/main/java/com/linecorp/armeria/client/grpc/GrpcClientStubFactory.java
@@ -16,7 +16,7 @@
package com.linecorp.armeria.client.grpc;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.grpc.Channel;
import io.grpc.ServiceDescriptor;
diff --git a/grpc/src/main/java/com/linecorp/armeria/client/grpc/package-info.java b/grpc/src/main/java/com/linecorp/armeria/client/grpc/package-info.java
index 9185ced8709..3f1859b7343 100644
--- a/grpc/src/main/java/com/linecorp/armeria/client/grpc/package-info.java
+++ b/grpc/src/main/java/com/linecorp/armeria/client/grpc/package-info.java
@@ -17,7 +17,7 @@
/**
* An armeria client that uses the gRPC wire protocol.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.grpc;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GoogleGrpcExceptionHandlerFunction.java b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GoogleGrpcExceptionHandlerFunction.java
index 9d32de1003e..caeff8a65b7 100644
--- a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GoogleGrpcExceptionHandlerFunction.java
+++ b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GoogleGrpcExceptionHandlerFunction.java
@@ -18,8 +18,9 @@
import static com.linecorp.armeria.common.grpc.GoogleGrpcExceptionHandlerFunctionUtil.handleException;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.grpc.Metadata;
diff --git a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GoogleGrpcExceptionHandlerFunctionUtil.java b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GoogleGrpcExceptionHandlerFunctionUtil.java
index 127118871b5..b7460272346 100644
--- a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GoogleGrpcExceptionHandlerFunctionUtil.java
+++ b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GoogleGrpcExceptionHandlerFunctionUtil.java
@@ -19,8 +19,9 @@
import static com.linecorp.armeria.internal.common.grpc.MetadataUtil.GRPC_STATUS_DETAILS_BIN_KEY;
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import io.grpc.Metadata;
diff --git a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GoogleGrpcStatusFunction.java b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GoogleGrpcStatusFunction.java
index 96661adddcf..f945f3046d4 100644
--- a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GoogleGrpcStatusFunction.java
+++ b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GoogleGrpcStatusFunction.java
@@ -18,8 +18,9 @@
import static com.linecorp.armeria.common.grpc.GoogleGrpcExceptionHandlerFunctionUtil.handleException;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.grpc.Metadata;
diff --git a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcCallOptions.java b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcCallOptions.java
index b863a8c2166..06ff6574137 100644
--- a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcCallOptions.java
+++ b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcCallOptions.java
@@ -16,9 +16,10 @@
package com.linecorp.armeria.common.grpc;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.grpc.GrpcClientCall;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.grpc.CallOptions;
diff --git a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcExceptionHandlerFunction.java b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcExceptionHandlerFunction.java
index db7802033ad..cff442443a6 100644
--- a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcExceptionHandlerFunction.java
+++ b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcExceptionHandlerFunction.java
@@ -18,8 +18,9 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.grpc.Metadata;
diff --git a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcJsonMarshallerBuilder.java b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcJsonMarshallerBuilder.java
index 80707d0ac59..08042d554f1 100644
--- a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcJsonMarshallerBuilder.java
+++ b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcJsonMarshallerBuilder.java
@@ -22,11 +22,11 @@
import org.curioswitch.common.protobuf.json.MessageMarshaller;
import org.curioswitch.common.protobuf.json.MessageMarshaller.Builder;
+import org.jspecify.annotations.Nullable;
import com.google.common.collect.ImmutableList;
import com.google.protobuf.Message;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.grpc.DefaultJsonMarshaller;
import io.grpc.ServiceDescriptor;
diff --git a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcJsonUtil.java b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcJsonUtil.java
index e7e915757ab..f5e004a4671 100644
--- a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcJsonUtil.java
+++ b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcJsonUtil.java
@@ -20,11 +20,10 @@
import java.util.function.Consumer;
import org.curioswitch.common.protobuf.json.MessageMarshaller;
+import org.jspecify.annotations.Nullable;
import com.google.protobuf.Message;
-import com.linecorp.armeria.common.annotation.Nullable;
-
import io.grpc.MethodDescriptor;
import io.grpc.MethodDescriptor.Marshaller;
import io.grpc.MethodDescriptor.PrototypeMarshaller;
diff --git a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcStatusFunction.java b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcStatusFunction.java
index 571a928d054..c17db7be39a 100644
--- a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcStatusFunction.java
+++ b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcStatusFunction.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.common.grpc;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.grpc.Metadata;
diff --git a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcWebTrailers.java b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcWebTrailers.java
index cd46a97f195..0af873a2363 100644
--- a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcWebTrailers.java
+++ b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GrpcWebTrailers.java
@@ -16,11 +16,12 @@
package com.linecorp.armeria.common.grpc;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.retry.RetryRuleWithContent;
import com.linecorp.armeria.common.AggregatedHttpResponse;
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.grpc.protocol.GrpcHeaderNames;
import com.linecorp.armeria.internal.common.InternalGrpcWebTrailers;
diff --git a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GsonGrpcJsonMarshallerBuilder.java b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GsonGrpcJsonMarshallerBuilder.java
index ec5e9f45721..f5b118a0556 100644
--- a/grpc/src/main/java/com/linecorp/armeria/common/grpc/GsonGrpcJsonMarshallerBuilder.java
+++ b/grpc/src/main/java/com/linecorp/armeria/common/grpc/GsonGrpcJsonMarshallerBuilder.java
@@ -21,14 +21,13 @@
import java.util.function.Consumer;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.protobuf.Message;
import com.google.protobuf.util.JsonFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* A builder for creating a new {@link GrpcJsonMarshaller} that serializes and deserializes a {@link Message}
* to and from JSON.
diff --git a/grpc/src/main/java/com/linecorp/armeria/common/grpc/package-info.java b/grpc/src/main/java/com/linecorp/armeria/common/grpc/package-info.java
index 472c56cc7e6..48a756704b4 100644
--- a/grpc/src/main/java/com/linecorp/armeria/common/grpc/package-info.java
+++ b/grpc/src/main/java/com/linecorp/armeria/common/grpc/package-info.java
@@ -17,7 +17,7 @@
/**
* gRPC-related common classes.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.grpc;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/ArmeriaChannel.java b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/ArmeriaChannel.java
index efbb7d06635..9c237520fce 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/ArmeriaChannel.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/ArmeriaChannel.java
@@ -23,6 +23,8 @@
import java.util.Map;
import java.util.function.BiFunction;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.Strings;
import com.google.common.collect.Maps;
@@ -46,7 +48,6 @@
import com.linecorp.armeria.common.Scheme;
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcJsonMarshaller;
import com.linecorp.armeria.common.logging.RequestLogProperty;
import com.linecorp.armeria.common.util.SystemInfo;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/ArmeriaClientCall.java b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/ArmeriaClientCall.java
index cc317f03656..527479240c8 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/ArmeriaClientCall.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/ArmeriaClientCall.java
@@ -30,6 +30,7 @@
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
import java.util.function.BiFunction;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import org.slf4j.Logger;
@@ -45,7 +46,6 @@
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.RequestHeadersBuilder;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcJsonMarshaller;
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
import com.linecorp.armeria.common.grpc.protocol.ArmeriaMessageFramer;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/GrpcClientFactory.java b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/GrpcClientFactory.java
index 8dfbd9dfb6a..145a0d1d51b 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/GrpcClientFactory.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/GrpcClientFactory.java
@@ -29,6 +29,7 @@
import java.util.Set;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -52,7 +53,6 @@
import com.linecorp.armeria.common.Scheme;
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcJsonMarshaller;
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
import com.linecorp.armeria.common.util.Unwrappable;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/GrpcClientFactoryUtil.java b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/GrpcClientFactoryUtil.java
index 521b7ce3cb2..d05b9c0942a 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/GrpcClientFactoryUtil.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/GrpcClientFactoryUtil.java
@@ -19,7 +19,7 @@
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.grpc.Channel;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/JavaGrpcClientStubFactory.java b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/JavaGrpcClientStubFactory.java
index 998a7ae681d..1f297849679 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/JavaGrpcClientStubFactory.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/JavaGrpcClientStubFactory.java
@@ -21,8 +21,9 @@
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.grpc.GrpcClientStubFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import io.grpc.Channel;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/KotlinGrpcClientStubFactory.java b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/KotlinGrpcClientStubFactory.java
index bae41445f4b..4395ab901ad 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/KotlinGrpcClientStubFactory.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/KotlinGrpcClientStubFactory.java
@@ -23,8 +23,9 @@
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.grpc.GrpcClientStubFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import io.grpc.BindableService;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/ReactorGrpcClientStubFactory.java b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/ReactorGrpcClientStubFactory.java
index e9852df8362..cad9ee47bc7 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/ReactorGrpcClientStubFactory.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/ReactorGrpcClientStubFactory.java
@@ -21,8 +21,9 @@
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.grpc.GrpcClientStubFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import io.grpc.Channel;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/ScalaPbGrpcClientStubFactory.java b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/ScalaPbGrpcClientStubFactory.java
index 8e9657c25e1..fd88076b3dc 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/ScalaPbGrpcClientStubFactory.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/ScalaPbGrpcClientStubFactory.java
@@ -21,8 +21,9 @@
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.grpc.GrpcClientStubFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import io.grpc.Channel;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/UnwrappableChannel.java b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/UnwrappableChannel.java
index 53f1e7b1986..4c1fbb60b9a 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/UnwrappableChannel.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/UnwrappableChannel.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.internal.client.grpc;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.util.Unwrappable;
import io.grpc.CallOptions;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/package-info.java b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/package-info.java
index c35fd819151..5a5bbbec553 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/package-info.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/client/grpc/package-info.java
@@ -17,7 +17,7 @@
/**
* Various classes used internally. Anything in this package can be changed or removed at any time.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.client.grpc;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/ForwardingCompressor.java b/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/ForwardingCompressor.java
index 4ec4bde43cc..da3d67e99cc 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/ForwardingCompressor.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/ForwardingCompressor.java
@@ -21,7 +21,8 @@
import java.io.IOException;
import java.io.OutputStream;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.grpc.protocol.Compressor;
import io.grpc.Codec.Identity;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/ForwardingDecompressor.java b/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/ForwardingDecompressor.java
index 3e8cf7c467c..cca236d9839 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/ForwardingDecompressor.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/ForwardingDecompressor.java
@@ -21,7 +21,8 @@
import java.io.IOException;
import java.io.InputStream;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.grpc.protocol.Decompressor;
import io.grpc.Codec.Identity;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/GrpcLogUtil.java b/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/GrpcLogUtil.java
index 5b3e6c965a7..ad1eba6188b 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/GrpcLogUtil.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/GrpcLogUtil.java
@@ -16,11 +16,12 @@
package com.linecorp.armeria.internal.common.grpc;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.common.RpcRequest;
import com.linecorp.armeria.common.RpcResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import io.grpc.MethodDescriptor;
import io.grpc.Status;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/GrpcMessageMarshaller.java b/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/GrpcMessageMarshaller.java
index 6a5f73ea09c..4247483336c 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/GrpcMessageMarshaller.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/GrpcMessageMarshaller.java
@@ -22,6 +22,8 @@
import java.io.IOException;
import java.io.InputStream;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.io.ByteStreams;
import com.google.protobuf.CodedInputStream;
import com.google.protobuf.CodedOutputStream;
@@ -30,7 +32,6 @@
import com.google.protobuf.UnsafeByteOperations;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcJsonMarshaller;
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
import com.linecorp.armeria.common.grpc.protocol.DeframedMessage;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/HttpStreamDeframer.java b/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/HttpStreamDeframer.java
index 9c52ccf4c71..764cf8354c4 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/HttpStreamDeframer.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/HttpStreamDeframer.java
@@ -19,13 +19,14 @@
import static com.google.common.base.Preconditions.checkState;
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpHeaderNames;
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.HttpObject;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.RequestHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.protocol.ArmeriaMessageDeframer;
import com.linecorp.armeria.common.grpc.protocol.Decompressor;
import com.linecorp.armeria.common.grpc.protocol.DeframedMessage;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/MetadataUtil.java b/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/MetadataUtil.java
index 2ca8d888645..c60f7c4ae47 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/MetadataUtil.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/MetadataUtil.java
@@ -22,6 +22,7 @@
import java.util.Map.Entry;
import java.util.Set;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -33,7 +34,6 @@
import com.linecorp.armeria.common.HttpHeaderNames;
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.HttpHeadersBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.protocol.GrpcHeaderNames;
import io.grpc.InternalMetadata;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/StatusAndMetadata.java b/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/StatusAndMetadata.java
index 2887829b801..3e20084b735 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/StatusAndMetadata.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/StatusAndMetadata.java
@@ -16,7 +16,7 @@
package com.linecorp.armeria.internal.common.grpc;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.grpc.Metadata;
import io.grpc.Status;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/TransportStatusListener.java b/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/TransportStatusListener.java
index 95d31497651..d2ab17fe3ad 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/TransportStatusListener.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/TransportStatusListener.java
@@ -16,7 +16,7 @@
package com.linecorp.armeria.internal.common.grpc;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.grpc.Metadata;
import io.grpc.Status;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/package-info.java b/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/package-info.java
index 2f3da6cc3d9..1235a46f3ec 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/package-info.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/common/grpc/package-info.java
@@ -17,7 +17,7 @@
/**
* Various classes used internally. Anything in this package can be changed or removed at any time.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.common.grpc;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/AbstractServerCall.java b/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/AbstractServerCall.java
index 06d30a88fb4..f4ee84d2bd8 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/AbstractServerCall.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/AbstractServerCall.java
@@ -26,6 +26,7 @@
import java.util.List;
import java.util.concurrent.Executor;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -41,7 +42,6 @@
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcJsonMarshaller;
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
import com.linecorp.armeria.common.grpc.ThrowableProto;
@@ -118,8 +118,7 @@ public abstract class AbstractServerCall extends ServerCall {
private final InternalGrpcExceptionHandler exceptionHandler;
// Only set once.
- @Nullable
- private ServerCall.Listener listener;
+ private ServerCall.@Nullable Listener listener;
// Message compression defaults to being enabled unless a user disables it using a server interceptor.
private boolean messageCompression = true;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/GrpcDocServicePlugin.java b/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/GrpcDocServicePlugin.java
index 84b57b94d81..57726d213dd 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/GrpcDocServicePlugin.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/GrpcDocServicePlugin.java
@@ -34,6 +34,8 @@
import java.util.regex.Pattern;
import java.util.stream.Collectors;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Strings;
import com.google.common.collect.HashMultimap;
@@ -54,7 +56,6 @@
import com.linecorp.armeria.common.HttpMethod;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
import com.linecorp.armeria.internal.server.grpc.HttpEndpointSpecification.Parameter;
import com.linecorp.armeria.server.Route;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/GrpcDocStringExtractor.java b/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/GrpcDocStringExtractor.java
index 70da68d86a5..d9b3adaeaf8 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/GrpcDocStringExtractor.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/GrpcDocStringExtractor.java
@@ -27,6 +27,7 @@
import java.util.Set;
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -38,7 +39,6 @@
import com.google.protobuf.DescriptorProtos.FileDescriptorSet;
import com.google.protobuf.DescriptorProtos.ServiceDescriptorProto;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.docs.DocService;
import com.linecorp.armeria.server.docs.DocStringExtractor;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/HttpEndpointSupport.java b/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/HttpEndpointSupport.java
index 8c279de0c42..e63d721617b 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/HttpEndpointSupport.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/HttpEndpointSupport.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.internal.server.grpc;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.server.Route;
import com.linecorp.armeria.server.docs.DocService;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/ServerStatusAndMetadata.java b/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/ServerStatusAndMetadata.java
index 52d218e1720..c03e862e34e 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/ServerStatusAndMetadata.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/ServerStatusAndMetadata.java
@@ -16,9 +16,10 @@
package com.linecorp.armeria.internal.server.grpc;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.grpc.StatusAndMetadata;
import io.grpc.Metadata;
diff --git a/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/package-info.java b/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/package-info.java
index 31ba69c49e1..b655b9aaea4 100644
--- a/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/package-info.java
+++ b/grpc/src/main/java/com/linecorp/armeria/internal/server/grpc/package-info.java
@@ -17,7 +17,7 @@
/**
* Various classes used internally. Anything in this package can be changed or removed at any time.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.server.grpc;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/AbstractUnframedGrpcService.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/AbstractUnframedGrpcService.java
index 6d6640642cc..3510f52948b 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/AbstractUnframedGrpcService.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/AbstractUnframedGrpcService.java
@@ -24,6 +24,7 @@
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import org.slf4j.Logger;
@@ -43,7 +44,6 @@
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.ResponseHeadersBuilder;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
import com.linecorp.armeria.common.grpc.protocol.ArmeriaMessageDeframer;
import com.linecorp.armeria.common.grpc.protocol.ArmeriaMessageFramer;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/ArmeriaCoroutineContextInterceptor.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/ArmeriaCoroutineContextInterceptor.java
index 7b5c8b61b2e..c97ee0ac516 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/ArmeriaCoroutineContextInterceptor.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/ArmeriaCoroutineContextInterceptor.java
@@ -26,13 +26,13 @@
import java.util.ServiceLoader;
import java.util.concurrent.ScheduledExecutorService;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.ServiceRequestContext;
import io.grpc.Metadata;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/DefaultUnframedGrpcErrorHandler.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/DefaultUnframedGrpcErrorHandler.java
index fade0593e84..b65bdbe8303 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/DefaultUnframedGrpcErrorHandler.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/DefaultUnframedGrpcErrorHandler.java
@@ -17,11 +17,11 @@
package com.linecorp.armeria.server.grpc;
import org.curioswitch.common.protobuf.json.MessageMarshaller;
+import org.jspecify.annotations.Nullable;
import com.linecorp.armeria.common.AggregatedHttpResponse;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.MediaType;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.ServiceRequestContext;
import io.grpc.Status;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/DeferredListener.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/DeferredListener.java
index a61aaa7bfa2..34c6a8a3381 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/DeferredListener.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/DeferredListener.java
@@ -24,7 +24,8 @@
import java.util.concurrent.Executor;
import java.util.function.Consumer;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.internal.server.grpc.AbstractServerCall;
import io.grpc.ServerCall;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/FramedGrpcService.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/FramedGrpcService.java
index e9ac96ae0b0..114a9695ae4 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/FramedGrpcService.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/FramedGrpcService.java
@@ -33,6 +33,7 @@
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -51,7 +52,6 @@
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.ResponseHeadersBuilder;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcJsonMarshaller;
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
import com.linecorp.armeria.common.grpc.protocol.ArmeriaMessageDeframer;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/GrpcDecoratingService.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/GrpcDecoratingService.java
index 25fa68d7d30..ea0dbf41abf 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/GrpcDecoratingService.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/GrpcDecoratingService.java
@@ -20,13 +20,14 @@
import java.util.Map;
import java.util.Set;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.linecorp.armeria.common.DependencyInjector;
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.HttpService;
import com.linecorp.armeria.server.Route;
import com.linecorp.armeria.server.ServiceConfig;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/GrpcRequestUtil.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/GrpcRequestUtil.java
index 0e2aad6fe95..30f2f4944bf 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/GrpcRequestUtil.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/GrpcRequestUtil.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.server.grpc;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.server.ServiceRequestContext;
/**
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/GrpcService.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/GrpcService.java
index affdc7da915..feea54b4672 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/GrpcService.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/GrpcService.java
@@ -23,8 +23,9 @@
import java.util.Set;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.server.HttpService;
import com.linecorp.armeria.server.HttpServiceWithRoutes;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/GrpcServiceBuilder.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/GrpcServiceBuilder.java
index 772b6cf454a..a8d9c07e937 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/GrpcServiceBuilder.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/GrpcServiceBuilder.java
@@ -29,6 +29,7 @@
import java.util.function.Function;
import org.curioswitch.common.protobuf.json.MessageMarshaller;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -41,7 +42,6 @@
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.grpc.GrpcExceptionHandlerFunction;
import com.linecorp.armeria.common.grpc.GrpcExceptionHandlerFunctionBuilder;
@@ -118,8 +118,7 @@ public final class GrpcServiceBuilder {
@Nullable
private GrpcExceptionHandlerFunction exceptionHandler;
- @Nullable
- private ImmutableList.Builder interceptors;
+ private ImmutableList.@Nullable Builder interceptors;
@Nullable
private UnframedGrpcErrorHandler unframedGrpcErrorHandler;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/HandlerRegistry.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/HandlerRegistry.java
index b82c97c4331..ab423851ff5 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/HandlerRegistry.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/HandlerRegistry.java
@@ -61,6 +61,8 @@
import java.util.Set;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.CaseFormat;
import com.google.common.base.Converter;
@@ -69,7 +71,6 @@
import com.google.common.collect.ImmutableSet;
import com.linecorp.armeria.common.DependencyInjector;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcExceptionHandlerFunction;
import com.linecorp.armeria.internal.common.grpc.InternalGrpcExceptionHandler;
import com.linecorp.armeria.internal.server.annotation.AnnotationUtil;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/HttpJsonTranscodingOptionsBuilder.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/HttpJsonTranscodingOptionsBuilder.java
index d1842d2d3c8..4ef770c176e 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/HttpJsonTranscodingOptionsBuilder.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/HttpJsonTranscodingOptionsBuilder.java
@@ -24,6 +24,8 @@
import java.util.EnumSet;
import java.util.Set;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
@@ -31,7 +33,6 @@
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.QueryParams;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/HttpJsonTranscodingPathParser.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/HttpJsonTranscodingPathParser.java
index d2308bd343d..4dfb8784e50 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/HttpJsonTranscodingPathParser.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/HttpJsonTranscodingPathParser.java
@@ -27,11 +27,12 @@
import java.util.regex.Pattern;
import java.util.stream.Collectors;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.util.StringUtil;
import com.linecorp.armeria.server.grpc.HttpJsonTranscodingPathParser.PathSegment.PathMappingType;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/HttpJsonTranscodingRouteAndPathVariables.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/HttpJsonTranscodingRouteAndPathVariables.java
index 68852768dc9..23847f56ff2 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/HttpJsonTranscodingRouteAndPathVariables.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/HttpJsonTranscodingRouteAndPathVariables.java
@@ -21,6 +21,7 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -28,7 +29,6 @@
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.common.HttpMethod;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.server.RouteUtil;
import com.linecorp.armeria.server.Route;
import com.linecorp.armeria.server.RouteBuilder;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/HttpJsonTranscodingService.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/HttpJsonTranscodingService.java
index b2df88d0395..ad34f89e9f7 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/HttpJsonTranscodingService.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/HttpJsonTranscodingService.java
@@ -38,6 +38,7 @@
import java.util.function.Function;
import java.util.stream.Collectors;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -97,7 +98,6 @@
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.RequestHeadersBuilder;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
import com.linecorp.armeria.common.grpc.protocol.GrpcHeaderNames;
import com.linecorp.armeria.common.logging.RequestLogProperty;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/ProtoReflectionServiceInterceptor.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/ProtoReflectionServiceInterceptor.java
index 6363358bafa..f76ef6f751f 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/ProtoReflectionServiceInterceptor.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/ProtoReflectionServiceInterceptor.java
@@ -16,7 +16,7 @@
package com.linecorp.armeria.server.grpc;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.grpc.Context;
import io.grpc.Contexts;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/ServerCallUtil.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/ServerCallUtil.java
index 0996ad7c8e8..6a236cee644 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/ServerCallUtil.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/ServerCallUtil.java
@@ -20,7 +20,8 @@
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Method;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.internal.server.grpc.AbstractServerCall;
import com.linecorp.armeria.server.ServiceRequestContext;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/StreamingServerCall.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/StreamingServerCall.java
index 5d5611be04a..ec9f57c793a 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/StreamingServerCall.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/StreamingServerCall.java
@@ -22,6 +22,7 @@
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
@@ -30,7 +31,6 @@
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcJsonMarshaller;
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
import com.linecorp.armeria.common.grpc.protocol.DeframedMessage;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnaryMessageDeframer.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnaryMessageDeframer.java
index 9d06bed152f..12ddb9595a5 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnaryMessageDeframer.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnaryMessageDeframer.java
@@ -18,9 +18,10 @@
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpData;
import com.linecorp.armeria.common.HttpObject;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.protocol.AbstractMessageDeframer;
import com.linecorp.armeria.common.grpc.protocol.Decompressor;
import com.linecorp.armeria.common.grpc.protocol.DeframedMessage;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnaryServerCall.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnaryServerCall.java
index 687e1692de4..68f8ccf31af 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnaryServerCall.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnaryServerCall.java
@@ -23,6 +23,8 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.AggregationOptions;
import com.linecorp.armeria.common.HttpData;
import com.linecorp.armeria.common.HttpHeaders;
@@ -33,7 +35,6 @@
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.ResponseHeadersBuilder;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcJsonMarshaller;
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
import com.linecorp.armeria.internal.common.grpc.GrpcLogUtil;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnframedGrpcErrorHandlerBuilder.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnframedGrpcErrorHandlerBuilder.java
index b184be0c042..efe642893ca 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnframedGrpcErrorHandlerBuilder.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnframedGrpcErrorHandlerBuilder.java
@@ -26,10 +26,10 @@
import java.util.Set;
import org.curioswitch.common.protobuf.json.MessageMarshaller;
+import org.jspecify.annotations.Nullable;
import com.google.protobuf.Message;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnframedGrpcErrorHandlerUtil.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnframedGrpcErrorHandlerUtil.java
index ff976d6d3be..cf260497529 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnframedGrpcErrorHandlerUtil.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnframedGrpcErrorHandlerUtil.java
@@ -18,7 +18,8 @@
import static java.util.Objects.requireNonNull;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.logging.RequestLogAccess;
import com.linecorp.armeria.common.logging.RequestLogProperty;
import com.linecorp.armeria.server.ServiceRequestContext;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnframedGrpcService.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnframedGrpcService.java
index aa69eff27bc..bfedeb7ed8c 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnframedGrpcService.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnframedGrpcService.java
@@ -22,6 +22,8 @@
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.AggregatedHttpResponse;
import com.linecorp.armeria.common.AggregationOptions;
import com.linecorp.armeria.common.HttpRequest;
@@ -32,7 +34,6 @@
import com.linecorp.armeria.common.RequestHeadersBuilder;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
import com.linecorp.armeria.common.grpc.protocol.GrpcHeaderNames;
import com.linecorp.armeria.common.logging.RequestLogProperty;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnframedGrpcStatusMappingFunction.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnframedGrpcStatusMappingFunction.java
index 72f94ae1c62..2c54fd0223b 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnframedGrpcStatusMappingFunction.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/UnframedGrpcStatusMappingFunction.java
@@ -18,8 +18,9 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpStatus;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.grpc.GrpcStatus;
import com.linecorp.armeria.server.ServiceRequestContext;
diff --git a/grpc/src/main/java/com/linecorp/armeria/server/grpc/package-info.java b/grpc/src/main/java/com/linecorp/armeria/server/grpc/package-info.java
index dd5d3203538..d054526250f 100644
--- a/grpc/src/main/java/com/linecorp/armeria/server/grpc/package-info.java
+++ b/grpc/src/main/java/com/linecorp/armeria/server/grpc/package-info.java
@@ -17,7 +17,7 @@
/**
* Allows an Armeria server to host a gRPC API using the gRPC wire protocol.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.grpc;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/grpc/src/main/java/com/linecorp/armeria/unsafe/grpc/package-info.java b/grpc/src/main/java/com/linecorp/armeria/unsafe/grpc/package-info.java
index 5ccc807bfb3..7fb32d8bc1a 100644
--- a/grpc/src/main/java/com/linecorp/armeria/unsafe/grpc/package-info.java
+++ b/grpc/src/main/java/com/linecorp/armeria/unsafe/grpc/package-info.java
@@ -19,9 +19,10 @@
* when dealing with large buffers but require careful memory management or there will be memory leaks. Only use
* these methods if you really know what you're doing.
*/
-@NonNullByDefault
+@NullMarked
@UnstableApi
package com.linecorp.armeria.unsafe.grpc;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/grpc/src/test/java/com/linecorp/armeria/client/grpc/GrpcClientBuilderTest.java b/grpc/src/test/java/com/linecorp/armeria/client/grpc/GrpcClientBuilderTest.java
index 338c3f503be..2410e0a7e44 100644
--- a/grpc/src/test/java/com/linecorp/armeria/client/grpc/GrpcClientBuilderTest.java
+++ b/grpc/src/test/java/com/linecorp/armeria/client/grpc/GrpcClientBuilderTest.java
@@ -23,6 +23,7 @@
import java.io.InputStream;
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.junit.jupiter.params.ParameterizedTest;
@@ -49,7 +50,6 @@
import com.linecorp.armeria.common.Scheme;
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcExceptionHandlerFunction;
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
import com.linecorp.armeria.internal.client.ClientBuilderParamsUtil;
diff --git a/grpc/src/test/java/com/linecorp/armeria/client/grpc/GrpcClientListenerTest.java b/grpc/src/test/java/com/linecorp/armeria/client/grpc/GrpcClientListenerTest.java
index beef1667df7..18e5ca36b2e 100644
--- a/grpc/src/test/java/com/linecorp/armeria/client/grpc/GrpcClientListenerTest.java
+++ b/grpc/src/test/java/com/linecorp/armeria/client/grpc/GrpcClientListenerTest.java
@@ -23,13 +23,13 @@
import java.util.concurrent.ScheduledExecutorService;
import org.hamcrest.Matchers;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import com.linecorp.armeria.common.HttpHeaderNames;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpStatus;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.protocol.GrpcHeaderNames;
import com.linecorp.armeria.internal.common.grpc.TestServiceImpl;
import com.linecorp.armeria.server.ServerBuilder;
diff --git a/grpc/src/test/java/com/linecorp/armeria/client/grpc/GrpcClientTest.java b/grpc/src/test/java/com/linecorp/armeria/client/grpc/GrpcClientTest.java
index 77453933a91..7a259b75b78 100644
--- a/grpc/src/test/java/com/linecorp/armeria/client/grpc/GrpcClientTest.java
+++ b/grpc/src/test/java/com/linecorp/armeria/client/grpc/GrpcClientTest.java
@@ -47,6 +47,7 @@
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.BiConsumer;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -77,7 +78,6 @@
import com.linecorp.armeria.common.RpcRequest;
import com.linecorp.armeria.common.RpcResponse;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcCallOptions;
import com.linecorp.armeria.common.grpc.GrpcExceptionHandlerFunction;
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
diff --git a/grpc/src/test/java/com/linecorp/armeria/client/grpc/LazyDynamicEndpointGroupTest.java b/grpc/src/test/java/com/linecorp/armeria/client/grpc/LazyDynamicEndpointGroupTest.java
index 1bafdd27d78..0f4dceb1830 100644
--- a/grpc/src/test/java/com/linecorp/armeria/client/grpc/LazyDynamicEndpointGroupTest.java
+++ b/grpc/src/test/java/com/linecorp/armeria/client/grpc/LazyDynamicEndpointGroupTest.java
@@ -27,6 +27,7 @@
import java.util.concurrent.atomic.AtomicReference;
import org.hamcrest.Matchers;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -43,7 +44,6 @@
import com.linecorp.armeria.client.logging.LoggingClient;
import com.linecorp.armeria.common.Scheme;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
import com.linecorp.armeria.internal.common.grpc.TestServiceImpl;
import com.linecorp.armeria.internal.testing.AnticipatedException;
diff --git a/grpc/src/test/java/com/linecorp/armeria/common/grpc/GrpcMeterIdPrefixFunctionTest.java b/grpc/src/test/java/com/linecorp/armeria/common/grpc/GrpcMeterIdPrefixFunctionTest.java
index 898090c1c99..4fa6840391a 100644
--- a/grpc/src/test/java/com/linecorp/armeria/common/grpc/GrpcMeterIdPrefixFunctionTest.java
+++ b/grpc/src/test/java/com/linecorp/armeria/common/grpc/GrpcMeterIdPrefixFunctionTest.java
@@ -25,6 +25,7 @@
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -43,7 +44,6 @@
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.protocol.GrpcHeaderNames;
import com.linecorp.armeria.common.logging.RequestLogAccess;
import com.linecorp.armeria.common.logging.RequestLogProperty;
diff --git a/grpc/src/test/java/com/linecorp/armeria/internal/common/grpc/StreamRecorder.java b/grpc/src/test/java/com/linecorp/armeria/internal/common/grpc/StreamRecorder.java
index 760bef5b251..80e7a00aaa8 100644
--- a/grpc/src/test/java/com/linecorp/armeria/internal/common/grpc/StreamRecorder.java
+++ b/grpc/src/test/java/com/linecorp/armeria/internal/common/grpc/StreamRecorder.java
@@ -52,11 +52,11 @@
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;
-import com.linecorp.armeria.common.annotation.Nullable;
-
import io.grpc.ExperimentalApi;
import io.grpc.stub.StreamObserver;
diff --git a/grpc/src/test/java/com/linecorp/armeria/it/grpc/GrpcMetricsIntegrationTest.java b/grpc/src/test/java/com/linecorp/armeria/it/grpc/GrpcMetricsIntegrationTest.java
index 44bac4f4586..297d7132d41 100644
--- a/grpc/src/test/java/com/linecorp/armeria/it/grpc/GrpcMetricsIntegrationTest.java
+++ b/grpc/src/test/java/com/linecorp/armeria/it/grpc/GrpcMetricsIntegrationTest.java
@@ -23,6 +23,7 @@
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
import org.junit.AfterClass;
import org.junit.ClassRule;
import org.junit.Rule;
@@ -40,7 +41,6 @@
import com.linecorp.armeria.client.metric.MetricCollectingClient;
import com.linecorp.armeria.common.HttpHeaderNames;
import com.linecorp.armeria.common.MediaType;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcMeterIdPrefixFunction;
import com.linecorp.armeria.common.metric.MeterIdPrefix;
import com.linecorp.armeria.common.metric.MoreMeters;
diff --git a/grpc/src/test/java/com/linecorp/armeria/server/grpc/DeferredListenerTest.java b/grpc/src/test/java/com/linecorp/armeria/server/grpc/DeferredListenerTest.java
index c7b0db4a2f6..0af7110fdad 100644
--- a/grpc/src/test/java/com/linecorp/armeria/server/grpc/DeferredListenerTest.java
+++ b/grpc/src/test/java/com/linecorp/armeria/server/grpc/DeferredListenerTest.java
@@ -26,6 +26,7 @@
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executor;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
@@ -37,7 +38,6 @@
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcExceptionHandlerFunction;
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
import com.linecorp.armeria.internal.common.grpc.InternalGrpcExceptionHandler;
diff --git a/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcExceptionHandlerAnnotationOnlyTest.java b/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcExceptionHandlerAnnotationOnlyTest.java
index fe6394647ec..b7ceb9e77d1 100644
--- a/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcExceptionHandlerAnnotationOnlyTest.java
+++ b/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcExceptionHandlerAnnotationOnlyTest.java
@@ -23,13 +23,13 @@
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import com.linecorp.armeria.client.grpc.GrpcClients;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcExceptionHandlerFunction;
import com.linecorp.armeria.server.ServerBuilder;
import com.linecorp.armeria.server.logging.LoggingService;
diff --git a/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcExceptionHandlerTest.java b/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcExceptionHandlerTest.java
index 18f85dbf5ed..22b80d66fc6 100644
--- a/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcExceptionHandlerTest.java
+++ b/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcExceptionHandlerTest.java
@@ -24,6 +24,7 @@
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -31,7 +32,6 @@
import com.linecorp.armeria.client.grpc.GrpcClients;
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcExceptionHandlerFunction;
import com.linecorp.armeria.server.ServerBuilder;
import com.linecorp.armeria.server.logging.LoggingService;
diff --git a/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcServiceBuilderTest.java b/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcServiceBuilderTest.java
index b7fcb56e455..e975c1cbf83 100644
--- a/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcServiceBuilderTest.java
+++ b/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcServiceBuilderTest.java
@@ -26,6 +26,7 @@
import java.util.List;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -39,7 +40,6 @@
import com.linecorp.armeria.common.CommonPools;
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
import com.linecorp.armeria.common.logging.LogLevel;
import com.linecorp.armeria.internal.common.grpc.TestServiceImpl;
diff --git a/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcServiceServerTest.java b/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcServiceServerTest.java
index 7535c1581ab..0aec46da224 100644
--- a/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcServiceServerTest.java
+++ b/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcServiceServerTest.java
@@ -34,6 +34,7 @@
import java.util.function.Function;
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
@@ -74,7 +75,6 @@
import com.linecorp.armeria.common.RpcRequest;
import com.linecorp.armeria.common.RpcResponse;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcJsonMarshaller;
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
import com.linecorp.armeria.common.grpc.protocol.GrpcHeaderNames;
diff --git a/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcStatusMappingTest.java b/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcStatusMappingTest.java
index 486183a4f6a..2a7a6c5f5e2 100644
--- a/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcStatusMappingTest.java
+++ b/grpc/src/test/java/com/linecorp/armeria/server/grpc/GrpcStatusMappingTest.java
@@ -24,6 +24,7 @@
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -35,7 +36,6 @@
import com.google.common.collect.ImmutableMap;
import com.linecorp.armeria.client.grpc.GrpcClients;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.ServerBuilder;
import com.linecorp.armeria.server.ServiceRequestContext;
import com.linecorp.armeria.testing.junit5.server.ServerExtension;
diff --git a/grpc/src/test/java/com/linecorp/armeria/server/grpc/ServerCallListenerCompatibilityTest.java b/grpc/src/test/java/com/linecorp/armeria/server/grpc/ServerCallListenerCompatibilityTest.java
index 97369c6bcd7..bc89d17a14d 100644
--- a/grpc/src/test/java/com/linecorp/armeria/server/grpc/ServerCallListenerCompatibilityTest.java
+++ b/grpc/src/test/java/com/linecorp/armeria/server/grpc/ServerCallListenerCompatibilityTest.java
@@ -28,6 +28,7 @@
import java.util.function.Supplier;
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.params.ParameterizedTest;
@@ -40,7 +41,6 @@
import com.google.protobuf.ByteString;
import com.linecorp.armeria.client.grpc.GrpcClients;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.common.util.ReleasableHolder;
import com.linecorp.armeria.server.Server;
diff --git a/it/context-propagation/src/test/java/com/linecorp/armeria/internal/common/MyThreadLocalAccessorProvider.java b/it/context-propagation/src/test/java/com/linecorp/armeria/internal/common/MyThreadLocalAccessorProvider.java
index 807412f8baa..5c958a1758f 100644
--- a/it/context-propagation/src/test/java/com/linecorp/armeria/internal/common/MyThreadLocalAccessorProvider.java
+++ b/it/context-propagation/src/test/java/com/linecorp/armeria/internal/common/MyThreadLocalAccessorProvider.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.internal.common;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.internal.common.context.ThreadLocalAccessorProvider;
import io.micrometer.context.ThreadLocalAccessor;
diff --git a/it/context-storage/src/test/java/com/linecorp/armeria/common/CustomRequestContextStorageProvider.java b/it/context-storage/src/test/java/com/linecorp/armeria/common/CustomRequestContextStorageProvider.java
index 0355b08369b..ad8b78ecbe5 100644
--- a/it/context-storage/src/test/java/com/linecorp/armeria/common/CustomRequestContextStorageProvider.java
+++ b/it/context-storage/src/test/java/com/linecorp/armeria/common/CustomRequestContextStorageProvider.java
@@ -20,7 +20,7 @@
import java.util.concurrent.atomic.AtomicInteger;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.netty.util.concurrent.FastThreadLocal;
import io.netty.util.internal.InternalThreadLocalMap;
diff --git a/it/context-storage/src/test/java/com/linecorp/armeria/common/RequestContextStorageCustomizingTest.java b/it/context-storage/src/test/java/com/linecorp/armeria/common/RequestContextStorageCustomizingTest.java
index 1bcf94c302b..1d26fd10842 100644
--- a/it/context-storage/src/test/java/com/linecorp/armeria/common/RequestContextStorageCustomizingTest.java
+++ b/it/context-storage/src/test/java/com/linecorp/armeria/common/RequestContextStorageCustomizingTest.java
@@ -21,11 +21,11 @@
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import com.linecorp.armeria.common.CustomRequestContextStorageProvider.CustomRequestContextStorage;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.SafeCloseable;
import com.linecorp.armeria.common.util.ThreadFactories;
import com.linecorp.armeria.server.ServiceRequestContext;
diff --git a/it/server-allow-semicolon/src/test/java/com/linecorp/armeria/common/AllowSemicolonInPathComponentTest.java b/it/server-allow-semicolon/src/test/java/com/linecorp/armeria/common/AllowSemicolonInPathComponentTest.java
index 03b04f7a31c..fe7cc01de41 100644
--- a/it/server-allow-semicolon/src/test/java/com/linecorp/armeria/common/AllowSemicolonInPathComponentTest.java
+++ b/it/server-allow-semicolon/src/test/java/com/linecorp/armeria/common/AllowSemicolonInPathComponentTest.java
@@ -18,11 +18,11 @@
import static org.assertj.core.api.Assertions.assertThat;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.junitpioneer.jupiter.SetSystemProperty;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.ServerBuilder;
import com.linecorp.armeria.testing.junit5.server.ServerExtension;
diff --git a/it/spring/boot3-jetty12/src/main/java/com/linecorp/armeria/spring/jetty/package-info.java b/it/spring/boot3-jetty12/src/main/java/com/linecorp/armeria/spring/jetty/package-info.java
index 8ccb0168cd6..87c215c5bf2 100644
--- a/it/spring/boot3-jetty12/src/main/java/com/linecorp/armeria/spring/jetty/package-info.java
+++ b/it/spring/boot3-jetty12/src/main/java/com/linecorp/armeria/spring/jetty/package-info.java
@@ -14,7 +14,7 @@
* under the License.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.spring.jetty;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/it/spring/boot4-mixed-tomcat10/src/main/java/com/linecorp/armeria/spring/mixed/tomcat/package-info.java b/it/spring/boot4-mixed-tomcat10/src/main/java/com/linecorp/armeria/spring/mixed/tomcat/package-info.java
index a765993aab2..8aea3a7ac50 100644
--- a/it/spring/boot4-mixed-tomcat10/src/main/java/com/linecorp/armeria/spring/mixed/tomcat/package-info.java
+++ b/it/spring/boot4-mixed-tomcat10/src/main/java/com/linecorp/armeria/spring/mixed/tomcat/package-info.java
@@ -14,7 +14,7 @@
* under the License.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.spring.mixed.tomcat;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/it/spring/boot4-mixed/src/main/java/com/linecorp/armeria/spring/mixed/package-info.java b/it/spring/boot4-mixed/src/main/java/com/linecorp/armeria/spring/mixed/package-info.java
index 64770670008..040ec27c1b7 100644
--- a/it/spring/boot4-mixed/src/main/java/com/linecorp/armeria/spring/mixed/package-info.java
+++ b/it/spring/boot4-mixed/src/main/java/com/linecorp/armeria/spring/mixed/package-info.java
@@ -14,7 +14,7 @@
* under the License.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.spring.mixed;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/it/spring/boot4-tomcat10/src/main/java/com/linecorp/armeria/spring/tomcat/package-info.java b/it/spring/boot4-tomcat10/src/main/java/com/linecorp/armeria/spring/tomcat/package-info.java
index 31a69fb7a84..c45abb2db72 100644
--- a/it/spring/boot4-tomcat10/src/main/java/com/linecorp/armeria/spring/tomcat/package-info.java
+++ b/it/spring/boot4-tomcat10/src/main/java/com/linecorp/armeria/spring/tomcat/package-info.java
@@ -14,7 +14,7 @@
* under the License.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.spring.tomcat;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/it/websocket/src/test/java/com/linecorp/armeria/it/websocket/WebSocketClientItTest.java b/it/websocket/src/test/java/com/linecorp/armeria/it/websocket/WebSocketClientItTest.java
index 7cb329be1fe..aa3a9d20c05 100644
--- a/it/websocket/src/test/java/com/linecorp/armeria/it/websocket/WebSocketClientItTest.java
+++ b/it/websocket/src/test/java/com/linecorp/armeria/it/websocket/WebSocketClientItTest.java
@@ -32,6 +32,7 @@
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.websocket.jakarta.server.config.JakartaWebSocketServletContainerInitializer;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
@@ -44,7 +45,6 @@
import com.linecorp.armeria.client.websocket.WebSocketSession;
import com.linecorp.armeria.common.ClosedSessionException;
import com.linecorp.armeria.common.HttpHeaderNames;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.websocket.CloseWebSocketFrame;
import com.linecorp.armeria.common.websocket.WebSocket;
import com.linecorp.armeria.common.websocket.WebSocketCloseStatus;
diff --git a/it/xds-client/src/test/java/com/linecorp/armeria/xds/it/VirtualHostRoutingTest.java b/it/xds-client/src/test/java/com/linecorp/armeria/xds/it/VirtualHostRoutingTest.java
index a3d9ce2cd41..f02675ec6bc 100644
--- a/it/xds-client/src/test/java/com/linecorp/armeria/xds/it/VirtualHostRoutingTest.java
+++ b/it/xds-client/src/test/java/com/linecorp/armeria/xds/it/VirtualHostRoutingTest.java
@@ -21,6 +21,7 @@
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
@@ -34,7 +35,6 @@
import com.linecorp.armeria.common.HttpMethod;
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.RequestHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.xds.XdsBootstrap;
import com.linecorp.armeria.xds.client.endpoint.XdsHttpPreprocessor;
diff --git a/jetty/jetty10/src/main/java/com/linecorp/armeria/server/jetty/package-info.java b/jetty/jetty10/src/main/java/com/linecorp/armeria/server/jetty/package-info.java
index 809365bb52f..516d96cb424 100644
--- a/jetty/jetty10/src/main/java/com/linecorp/armeria/server/jetty/package-info.java
+++ b/jetty/jetty10/src/main/java/com/linecorp/armeria/server/jetty/package-info.java
@@ -17,7 +17,7 @@
/**
* Embedded Jetty service.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.jetty;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/AbstractArmeriaEndPoint.java b/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/AbstractArmeriaEndPoint.java
index 349bb595f71..0458c7f3e9b 100644
--- a/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/AbstractArmeriaEndPoint.java
+++ b/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/AbstractArmeriaEndPoint.java
@@ -26,10 +26,10 @@
import org.eclipse.jetty.io.FillInterest;
import org.eclipse.jetty.io.WriteFlusher;
import org.eclipse.jetty.util.Callback;
+import org.jspecify.annotations.Nullable;
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.ServiceRequestContext;
abstract class AbstractArmeriaEndPoint implements EndPoint {
diff --git a/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/AbstractJettyServiceBuilder.java b/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/AbstractJettyServiceBuilder.java
index 26a0f3b50da..eea6b174690 100644
--- a/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/AbstractJettyServiceBuilder.java
+++ b/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/AbstractJettyServiceBuilder.java
@@ -24,12 +24,11 @@
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.RequestLog;
import org.eclipse.jetty.server.Server;
+import org.jspecify.annotations.Nullable;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* A skeletal builder implementation for {@link JettyServiceBuilder} in Jetty 9 and Jetty 10+ modules.
*/
diff --git a/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/ArmeriaEndPoint.java b/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/ArmeriaEndPoint.java
index 3ab60c6b57f..91c6dc08fec 100644
--- a/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/ArmeriaEndPoint.java
+++ b/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/ArmeriaEndPoint.java
@@ -15,7 +15,8 @@
*/
package com.linecorp.armeria.server.jetty;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.server.ServiceRequestContext;
final class ArmeriaEndPoint extends AbstractArmeriaEndPoint {
diff --git a/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/JettyService.java b/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/JettyService.java
index 8413b5b3aa3..29660f6ca68 100644
--- a/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/JettyService.java
+++ b/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/JettyService.java
@@ -44,6 +44,7 @@
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.Callback;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -64,7 +65,6 @@
import com.linecorp.armeria.common.RequestTarget;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.ResponseHeadersBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.BlockingTaskExecutor;
import com.linecorp.armeria.common.util.CompletionActions;
import com.linecorp.armeria.common.util.Exceptions;
diff --git a/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/JettyServiceBuilder.java b/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/JettyServiceBuilder.java
index a9210e91fa5..d58e9df66e1 100644
--- a/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/JettyServiceBuilder.java
+++ b/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/JettyServiceBuilder.java
@@ -30,10 +30,10 @@
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.SessionIdManager;
import org.eclipse.jetty.server.handler.HandlerWrapper;
+import org.jspecify.annotations.Nullable;
import com.google.common.collect.ImmutableList;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.BlockingTaskExecutor;
import com.linecorp.armeria.internal.common.util.ReentrantShortLock;
diff --git a/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/package-info.java b/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/package-info.java
index 809365bb52f..516d96cb424 100644
--- a/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/package-info.java
+++ b/jetty/jetty11/src/main/java/com/linecorp/armeria/server/jetty/package-info.java
@@ -17,7 +17,7 @@
/**
* Embedded Jetty service.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.jetty;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/jetty/jetty12/src/main/java/com/linecorp/armeria/server/jetty/JettyService.java b/jetty/jetty12/src/main/java/com/linecorp/armeria/server/jetty/JettyService.java
index 999090c42be..0fb7fe606bd 100644
--- a/jetty/jetty12/src/main/java/com/linecorp/armeria/server/jetty/JettyService.java
+++ b/jetty/jetty12/src/main/java/com/linecorp/armeria/server/jetty/JettyService.java
@@ -43,6 +43,7 @@
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.internal.HttpConnection;
import org.eclipse.jetty.util.Callback;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -63,7 +64,6 @@
import com.linecorp.armeria.common.RequestTarget;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.ResponseHeadersBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.BlockingTaskExecutor;
import com.linecorp.armeria.common.util.CompletionActions;
import com.linecorp.armeria.common.util.Exceptions;
diff --git a/jetty/jetty12/src/main/java/com/linecorp/armeria/server/jetty/JettyServiceBuilder.java b/jetty/jetty12/src/main/java/com/linecorp/armeria/server/jetty/JettyServiceBuilder.java
index e1f12a65f58..029783a0df7 100644
--- a/jetty/jetty12/src/main/java/com/linecorp/armeria/server/jetty/JettyServiceBuilder.java
+++ b/jetty/jetty12/src/main/java/com/linecorp/armeria/server/jetty/JettyServiceBuilder.java
@@ -29,10 +29,10 @@
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.RequestLog;
import org.eclipse.jetty.server.Server;
+import org.jspecify.annotations.Nullable;
import com.google.common.collect.ImmutableList;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.BlockingTaskExecutor;
import com.linecorp.armeria.internal.common.util.ReentrantShortLock;
diff --git a/jetty/jetty12/src/main/java/com/linecorp/armeria/server/jetty/package-info.java b/jetty/jetty12/src/main/java/com/linecorp/armeria/server/jetty/package-info.java
index b2651a83c97..76cb29326e5 100644
--- a/jetty/jetty12/src/main/java/com/linecorp/armeria/server/jetty/package-info.java
+++ b/jetty/jetty12/src/main/java/com/linecorp/armeria/server/jetty/package-info.java
@@ -17,7 +17,7 @@
/**
* Embedded Jetty service.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.jetty;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/jetty/jetty9/src/main/java/com/linecorp/armeria/server/jetty/ArmeriaEndPoint.java b/jetty/jetty9/src/main/java/com/linecorp/armeria/server/jetty/ArmeriaEndPoint.java
index b492fc8e498..d472a23391e 100644
--- a/jetty/jetty9/src/main/java/com/linecorp/armeria/server/jetty/ArmeriaEndPoint.java
+++ b/jetty/jetty9/src/main/java/com/linecorp/armeria/server/jetty/ArmeriaEndPoint.java
@@ -15,7 +15,8 @@
*/
package com.linecorp.armeria.server.jetty;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.server.ServiceRequestContext;
final class ArmeriaEndPoint extends AbstractArmeriaEndPoint {
diff --git a/jetty/jetty9/src/main/java/com/linecorp/armeria/server/jetty/JettyService.java b/jetty/jetty9/src/main/java/com/linecorp/armeria/server/jetty/JettyService.java
index ec38c96e23c..6bc694e1720 100644
--- a/jetty/jetty9/src/main/java/com/linecorp/armeria/server/jetty/JettyService.java
+++ b/jetty/jetty9/src/main/java/com/linecorp/armeria/server/jetty/JettyService.java
@@ -41,6 +41,7 @@
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.Callback;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -59,7 +60,6 @@
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.ResponseHeadersBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.BlockingTaskExecutor;
import com.linecorp.armeria.common.util.CompletionActions;
import com.linecorp.armeria.common.util.Exceptions;
diff --git a/jetty/jetty9/src/main/java/com/linecorp/armeria/server/jetty/JettyServiceBuilder.java b/jetty/jetty9/src/main/java/com/linecorp/armeria/server/jetty/JettyServiceBuilder.java
index 6a9e8776c8d..3e1bd18e3e0 100644
--- a/jetty/jetty9/src/main/java/com/linecorp/armeria/server/jetty/JettyServiceBuilder.java
+++ b/jetty/jetty9/src/main/java/com/linecorp/armeria/server/jetty/JettyServiceBuilder.java
@@ -31,10 +31,10 @@
import org.eclipse.jetty.server.handler.HandlerWrapper;
import org.eclipse.jetty.util.component.Container;
import org.eclipse.jetty.util.component.LifeCycle;
+import org.jspecify.annotations.Nullable;
import com.google.common.collect.ImmutableList;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.BlockingTaskExecutor;
/**
diff --git a/jetty/jetty9/src/main/java/com/linecorp/armeria/server/jetty/package-info.java b/jetty/jetty9/src/main/java/com/linecorp/armeria/server/jetty/package-info.java
index 809365bb52f..516d96cb424 100644
--- a/jetty/jetty9/src/main/java/com/linecorp/armeria/server/jetty/package-info.java
+++ b/jetty/jetty9/src/main/java/com/linecorp/armeria/server/jetty/package-info.java
@@ -17,7 +17,7 @@
/**
* Embedded Jetty service.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.jetty;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/jetty/jetty9/src/test/java/com/linecorp/armeria/server/jetty/JettyServiceTest.java b/jetty/jetty9/src/test/java/com/linecorp/armeria/server/jetty/JettyServiceTest.java
index ee4328c6efc..5d917386533 100644
--- a/jetty/jetty9/src/test/java/com/linecorp/armeria/server/jetty/JettyServiceTest.java
+++ b/jetty/jetty9/src/test/java/com/linecorp/armeria/server/jetty/JettyServiceTest.java
@@ -59,6 +59,7 @@
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.util.thread.ThreadPool;
import org.eclipse.jetty.webapp.WebAppContext;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.junit.jupiter.params.ParameterizedTest;
@@ -76,7 +77,6 @@
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.testing.webapp.WebAppContainerTest;
import com.linecorp.armeria.server.ServerBuilder;
import com.linecorp.armeria.server.ServiceRequestContext;
diff --git a/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/DefaultJsonRpcRequest.java b/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/DefaultJsonRpcRequest.java
index e73560f3e6a..d9967fea02f 100644
--- a/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/DefaultJsonRpcRequest.java
+++ b/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/DefaultJsonRpcRequest.java
@@ -21,12 +21,12 @@
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* Default {@link JsonRpcRequest} implementation.
*/
diff --git a/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/DefaultJsonRpcResponse.java b/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/DefaultJsonRpcResponse.java
index d0773b057e8..69c280f55c9 100644
--- a/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/DefaultJsonRpcResponse.java
+++ b/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/DefaultJsonRpcResponse.java
@@ -21,13 +21,13 @@
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
-
@JsonInclude(JsonInclude.Include.NON_NULL)
final class DefaultJsonRpcResponse implements JsonRpcResponse {
@Nullable
diff --git a/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/DefaultJsonRpcStreamableResponse.java b/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/DefaultJsonRpcStreamableResponse.java
index 324e7b7a480..70e256f0b94 100644
--- a/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/DefaultJsonRpcStreamableResponse.java
+++ b/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/DefaultJsonRpcStreamableResponse.java
@@ -18,7 +18,8 @@
import static java.util.Objects.requireNonNull;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.stream.ClosedStreamException;
import com.linecorp.armeria.common.stream.DefaultStreamMessage;
import com.linecorp.armeria.internal.common.jsonrpc.JsonRpcSseMessage;
diff --git a/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcError.java b/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcError.java
index eb95d218244..78ab8b96885 100644
--- a/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcError.java
+++ b/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcError.java
@@ -19,12 +19,13 @@
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcMessageUtil.java b/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcMessageUtil.java
index 96a865e1221..31af41bcdad 100644
--- a/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcMessageUtil.java
+++ b/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcMessageUtil.java
@@ -21,9 +21,10 @@
import java.util.List;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.JacksonUtil;
final class JsonRpcMessageUtil {
diff --git a/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcParameters.java b/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcParameters.java
index dc7d46c085a..b687a0578c7 100644
--- a/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcParameters.java
+++ b/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcParameters.java
@@ -25,11 +25,12 @@
import java.util.Map;
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.annotation.JsonValue;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcResponse.java b/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcResponse.java
index 956fca256fa..f3aefebec9a 100644
--- a/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcResponse.java
+++ b/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcResponse.java
@@ -19,6 +19,8 @@
import static com.linecorp.armeria.common.jsonrpc.JsonRpcMessageUtil.objectMapper;
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
@@ -26,7 +28,6 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.server.jsonrpc.JsonRpcParseException;
import com.linecorp.armeria.server.jsonrpc.JsonRpcService;
diff --git a/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcStreamableResponse.java b/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcStreamableResponse.java
index c70838eaaae..e34273cdb22 100644
--- a/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcStreamableResponse.java
+++ b/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/JsonRpcStreamableResponse.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.common.jsonrpc;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.sse.ServerSentEvent;
import com.linecorp.armeria.common.stream.ClosedStreamException;
diff --git a/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/package-info.java b/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/package-info.java
index 461e00ec1a7..8ef2a3f67a0 100644
--- a/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/package-info.java
+++ b/jsonrpc/src/main/java/com/linecorp/armeria/common/jsonrpc/package-info.java
@@ -18,8 +18,9 @@
* Common classes for the JSON-RPC.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.jsonrpc;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/jsonrpc/src/main/java/com/linecorp/armeria/internal/common/jsonrpc/JsonRpcSseMessage.java b/jsonrpc/src/main/java/com/linecorp/armeria/internal/common/jsonrpc/JsonRpcSseMessage.java
index 9fc1a3767c8..b28906a96ba 100644
--- a/jsonrpc/src/main/java/com/linecorp/armeria/internal/common/jsonrpc/JsonRpcSseMessage.java
+++ b/jsonrpc/src/main/java/com/linecorp/armeria/internal/common/jsonrpc/JsonRpcSseMessage.java
@@ -18,9 +18,10 @@
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.jsonrpc.JsonRpcMessage;
import com.linecorp.armeria.common.sse.ServerSentEventBuilder;
diff --git a/jsonrpc/src/main/java/com/linecorp/armeria/internal/common/jsonrpc/package-info.java b/jsonrpc/src/main/java/com/linecorp/armeria/internal/common/jsonrpc/package-info.java
index ebb0bf2e642..8a1638055bf 100644
--- a/jsonrpc/src/main/java/com/linecorp/armeria/internal/common/jsonrpc/package-info.java
+++ b/jsonrpc/src/main/java/com/linecorp/armeria/internal/common/jsonrpc/package-info.java
@@ -17,7 +17,7 @@
/**
* Internal classes for JSON-RPC implementation.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.common.jsonrpc;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/DefaultJsonRpcExceptionHandler.java b/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/DefaultJsonRpcExceptionHandler.java
index 3b7ebdca95c..d16769dbf10 100644
--- a/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/DefaultJsonRpcExceptionHandler.java
+++ b/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/DefaultJsonRpcExceptionHandler.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.server.jsonrpc;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.jsonrpc.JsonRpcError;
import com.linecorp.armeria.common.jsonrpc.JsonRpcMessage;
import com.linecorp.armeria.common.jsonrpc.JsonRpcResponse;
diff --git a/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcExceptionHandler.java b/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcExceptionHandler.java
index 713b3eb3aa2..c1b3d8d25eb 100644
--- a/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcExceptionHandler.java
+++ b/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcExceptionHandler.java
@@ -18,7 +18,8 @@
import static java.util.Objects.requireNonNull;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.jsonrpc.JsonRpcMessage;
import com.linecorp.armeria.common.jsonrpc.JsonRpcResponse;
diff --git a/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcHandler.java b/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcHandler.java
index 2b4b07c751a..2cf360f5479 100644
--- a/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcHandler.java
+++ b/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcHandler.java
@@ -18,7 +18,8 @@
import java.util.concurrent.CompletableFuture;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.jsonrpc.JsonRpcError;
import com.linecorp.armeria.common.jsonrpc.JsonRpcMessage;
diff --git a/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcService.java b/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcService.java
index 4fe1e0893c8..c7c50d24a85 100644
--- a/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcService.java
+++ b/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcService.java
@@ -23,6 +23,7 @@
import java.util.Map;
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -38,7 +39,6 @@
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.jsonrpc.JsonRpcError;
import com.linecorp.armeria.common.jsonrpc.JsonRpcMessage;
diff --git a/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcServiceBuilder.java b/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcServiceBuilder.java
index 82d46778676..af6b2aa2381 100644
--- a/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcServiceBuilder.java
+++ b/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcServiceBuilder.java
@@ -18,10 +18,11 @@
import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableMap;
import com.linecorp.armeria.common.HttpHeaderNames;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.server.HttpService;
diff --git a/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcStatusFunction.java b/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcStatusFunction.java
index c13ff64da43..7a116b70f18 100644
--- a/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcStatusFunction.java
+++ b/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/JsonRpcStatusFunction.java
@@ -18,8 +18,9 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpStatus;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.jsonrpc.JsonRpcError;
import com.linecorp.armeria.common.jsonrpc.JsonRpcRequest;
diff --git a/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/package-info.java b/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/package-info.java
index 92ccb5dd8ae..e5d803eea68 100644
--- a/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/package-info.java
+++ b/jsonrpc/src/main/java/com/linecorp/armeria/server/jsonrpc/package-info.java
@@ -18,8 +18,9 @@
* Server-side classes for the JSON-RPC.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.jsonrpc;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/jsonrpc/src/test/java/com/linecorp/armeria/server/jsonrpc/JsonRpcExceptionHandlerTest.java b/jsonrpc/src/test/java/com/linecorp/armeria/server/jsonrpc/JsonRpcExceptionHandlerTest.java
index 9f5ecddab7a..2a54f2841d2 100644
--- a/jsonrpc/src/test/java/com/linecorp/armeria/server/jsonrpc/JsonRpcExceptionHandlerTest.java
+++ b/jsonrpc/src/test/java/com/linecorp/armeria/server/jsonrpc/JsonRpcExceptionHandlerTest.java
@@ -20,13 +20,13 @@
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import com.linecorp.armeria.client.BlockingWebClient;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.ResponseEntity;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.jsonrpc.JsonRpcError;
import com.linecorp.armeria.common.jsonrpc.JsonRpcMessage;
import com.linecorp.armeria.common.jsonrpc.JsonRpcRequest;
diff --git a/jsonrpc/src/test/java/com/linecorp/armeria/server/jsonrpc/JsonRpcStatusFunctionTest.java b/jsonrpc/src/test/java/com/linecorp/armeria/server/jsonrpc/JsonRpcStatusFunctionTest.java
index 8b0cb7c5896..96f07ddbdf7 100644
--- a/jsonrpc/src/test/java/com/linecorp/armeria/server/jsonrpc/JsonRpcStatusFunctionTest.java
+++ b/jsonrpc/src/test/java/com/linecorp/armeria/server/jsonrpc/JsonRpcStatusFunctionTest.java
@@ -20,13 +20,13 @@
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import com.linecorp.armeria.client.BlockingWebClient;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.ResponseEntity;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.jsonrpc.JsonRpcError;
import com.linecorp.armeria.common.jsonrpc.JsonRpcMessage;
import com.linecorp.armeria.common.jsonrpc.JsonRpcRequest;
diff --git a/junit4/src/main/java/com/linecorp/armeria/testing/junit4/common/package-info.java b/junit4/src/main/java/com/linecorp/armeria/testing/junit4/common/package-info.java
index 217b4a9f572..74187cdde97 100644
--- a/junit4/src/main/java/com/linecorp/armeria/testing/junit4/common/package-info.java
+++ b/junit4/src/main/java/com/linecorp/armeria/testing/junit4/common/package-info.java
@@ -17,7 +17,7 @@
/**
* Common testing utilities.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.testing.junit4.common;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/junit4/src/main/java/com/linecorp/armeria/testing/junit4/server/SelfSignedCertificateRuleDelegate.java b/junit4/src/main/java/com/linecorp/armeria/testing/junit4/server/SelfSignedCertificateRuleDelegate.java
index c6ade250d8b..9f44f1631f0 100644
--- a/junit4/src/main/java/com/linecorp/armeria/testing/junit4/server/SelfSignedCertificateRuleDelegate.java
+++ b/junit4/src/main/java/com/linecorp/armeria/testing/junit4/server/SelfSignedCertificateRuleDelegate.java
@@ -28,8 +28,9 @@
import java.time.temporal.TemporalAccessor;
import java.util.Date;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.TlsKeyPair;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.util.SelfSignedCertificate;
/**
diff --git a/junit4/src/main/java/com/linecorp/armeria/testing/junit4/server/package-info.java b/junit4/src/main/java/com/linecorp/armeria/testing/junit4/server/package-info.java
index 9cb7c08c0ae..5c84d0e47e4 100644
--- a/junit4/src/main/java/com/linecorp/armeria/testing/junit4/server/package-info.java
+++ b/junit4/src/main/java/com/linecorp/armeria/testing/junit4/server/package-info.java
@@ -17,7 +17,7 @@
/**
* Server-side testing utilities.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.testing.junit4.server;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/junit5/src/main/java/com/linecorp/armeria/internal/testing/EventLoopGroupRuleDelegate.java b/junit5/src/main/java/com/linecorp/armeria/internal/testing/EventLoopGroupRuleDelegate.java
index 6e981465fec..a09cea054d7 100644
--- a/junit5/src/main/java/com/linecorp/armeria/internal/testing/EventLoopGroupRuleDelegate.java
+++ b/junit5/src/main/java/com/linecorp/armeria/internal/testing/EventLoopGroupRuleDelegate.java
@@ -18,7 +18,8 @@
import java.util.concurrent.ThreadFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.util.EventLoopGroups;
import io.netty.channel.EventLoopGroup;
diff --git a/junit5/src/main/java/com/linecorp/armeria/internal/testing/ServerRuleDelegate.java b/junit5/src/main/java/com/linecorp/armeria/internal/testing/ServerRuleDelegate.java
index f865b68c033..c220777c32a 100644
--- a/junit5/src/main/java/com/linecorp/armeria/internal/testing/ServerRuleDelegate.java
+++ b/junit5/src/main/java/com/linecorp/armeria/internal/testing/ServerRuleDelegate.java
@@ -26,6 +26,8 @@
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.BlockingWebClient;
import com.linecorp.armeria.client.ClientFactory;
import com.linecorp.armeria.client.Endpoint;
@@ -36,7 +38,6 @@
import com.linecorp.armeria.client.websocket.WebSocketClientBuilder;
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.UnmodifiableFuture;
import com.linecorp.armeria.server.Server;
diff --git a/junit5/src/main/java/com/linecorp/armeria/internal/testing/package-info.java b/junit5/src/main/java/com/linecorp/armeria/internal/testing/package-info.java
index 748c69d9ee6..8cd16f86717 100644
--- a/junit5/src/main/java/com/linecorp/armeria/internal/testing/package-info.java
+++ b/junit5/src/main/java/com/linecorp/armeria/internal/testing/package-info.java
@@ -17,7 +17,7 @@
/**
* Internal testing utilities.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.testing;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/junit5/src/main/java/com/linecorp/armeria/testing/junit5/common/package-info.java b/junit5/src/main/java/com/linecorp/armeria/testing/junit5/common/package-info.java
index be144769a6e..f1d50cc6011 100644
--- a/junit5/src/main/java/com/linecorp/armeria/testing/junit5/common/package-info.java
+++ b/junit5/src/main/java/com/linecorp/armeria/testing/junit5/common/package-info.java
@@ -17,7 +17,7 @@
/**
* Common testing utilities.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.testing.junit5.common;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/SignedCertificateExtension.java b/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/SignedCertificateExtension.java
index f8a0fb949fc..955ed9f5def 100644
--- a/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/SignedCertificateExtension.java
+++ b/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/SignedCertificateExtension.java
@@ -24,12 +24,12 @@
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.extension.Extension;
import org.junit.jupiter.api.extension.ExtensionContext;
import com.linecorp.armeria.common.TlsKeyPair;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.common.util.SignedCertificate;
import com.linecorp.armeria.testing.junit5.common.AbstractAllOrEachExtension;
diff --git a/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/mock/MockWebServerExtension.java b/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/mock/MockWebServerExtension.java
index 155f2843c89..27d540d332c 100644
--- a/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/mock/MockWebServerExtension.java
+++ b/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/mock/MockWebServerExtension.java
@@ -23,6 +23,7 @@
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.extension.BeforeTestExecutionCallback;
import org.junit.jupiter.api.extension.Extension;
import org.junit.jupiter.api.extension.ExtensionContext;
@@ -30,7 +31,6 @@
import com.linecorp.armeria.common.AggregatedHttpResponse;
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.HttpService;
import com.linecorp.armeria.server.Server;
import com.linecorp.armeria.server.ServerBuilder;
diff --git a/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/mock/RecordedRequest.java b/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/mock/RecordedRequest.java
index 681791b0d44..2b4a1fceef2 100644
--- a/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/mock/RecordedRequest.java
+++ b/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/mock/RecordedRequest.java
@@ -20,10 +20,11 @@
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.common.AggregatedHttpRequest;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.ServiceRequestContext;
/**
diff --git a/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/mock/package-info.java b/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/mock/package-info.java
index 4a05bccd579..c4fcb0a98f8 100644
--- a/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/mock/package-info.java
+++ b/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/mock/package-info.java
@@ -17,7 +17,7 @@
/**
* A mock server for use when testing clients.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.testing.junit5.server.mock;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/package-info.java b/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/package-info.java
index 8d25309723e..d94d894d9e5 100644
--- a/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/package-info.java
+++ b/junit5/src/main/java/com/linecorp/armeria/testing/junit5/server/package-info.java
@@ -17,7 +17,7 @@
/**
* Server-side testing utilities.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.testing.junit5.server;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/junit5/src/main/java/com/linecorp/armeria/testing/server/ServiceRequestContextCaptor.java b/junit5/src/main/java/com/linecorp/armeria/testing/server/ServiceRequestContextCaptor.java
index e31f449b19e..b688563bb7f 100644
--- a/junit5/src/main/java/com/linecorp/armeria/testing/server/ServiceRequestContextCaptor.java
+++ b/junit5/src/main/java/com/linecorp/armeria/testing/server/ServiceRequestContextCaptor.java
@@ -25,11 +25,12 @@
import java.util.function.Function;
import java.util.function.Predicate;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.server.HttpService;
import com.linecorp.armeria.server.ServiceRequestContext;
diff --git a/junit5/src/main/java/com/linecorp/armeria/testing/server/package-info.java b/junit5/src/main/java/com/linecorp/armeria/testing/server/package-info.java
index 67ece413e84..1f6d53e03eb 100644
--- a/junit5/src/main/java/com/linecorp/armeria/testing/server/package-info.java
+++ b/junit5/src/main/java/com/linecorp/armeria/testing/server/package-info.java
@@ -17,7 +17,7 @@
/**
* Testing utilities.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.testing.server;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/kafka/src/main/java/com/linecorp/armeria/server/logging/kafka/KafkaAccessLogWriter.java b/kafka/src/main/java/com/linecorp/armeria/server/logging/kafka/KafkaAccessLogWriter.java
index 41df35db113..9d74f3acca7 100644
--- a/kafka/src/main/java/com/linecorp/armeria/server/logging/kafka/KafkaAccessLogWriter.java
+++ b/kafka/src/main/java/com/linecorp/armeria/server/logging/kafka/KafkaAccessLogWriter.java
@@ -24,10 +24,10 @@
import org.apache.kafka.clients.producer.Callback;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.server.logging.AccessLogWriter;
diff --git a/kafka/src/main/java/com/linecorp/armeria/server/logging/kafka/package-info.java b/kafka/src/main/java/com/linecorp/armeria/server/logging/kafka/package-info.java
index 80f6b411890..65a7a092882 100644
--- a/kafka/src/main/java/com/linecorp/armeria/server/logging/kafka/package-info.java
+++ b/kafka/src/main/java/com/linecorp/armeria/server/logging/kafka/package-info.java
@@ -17,7 +17,7 @@
/**
* Kafka backend integration support for request/response logging.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.logging.kafka;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/kotlin/src/main/java/com/linecorp/armeria/common/kotlin/CoroutineContexts.java b/kotlin/src/main/java/com/linecorp/armeria/common/kotlin/CoroutineContexts.java
index 357f1f52f8a..7002377fcd5 100644
--- a/kotlin/src/main/java/com/linecorp/armeria/common/kotlin/CoroutineContexts.java
+++ b/kotlin/src/main/java/com/linecorp/armeria/common/kotlin/CoroutineContexts.java
@@ -18,8 +18,9 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.annotation.AnnotatedService;
import com.linecorp.armeria.server.kotlin.CoroutineContextService;
diff --git a/kotlin/src/main/java/com/linecorp/armeria/common/kotlin/package-info.java b/kotlin/src/main/java/com/linecorp/armeria/common/kotlin/package-info.java
index 95302b5a0e8..2aeee557723 100644
--- a/kotlin/src/main/java/com/linecorp/armeria/common/kotlin/package-info.java
+++ b/kotlin/src/main/java/com/linecorp/armeria/common/kotlin/package-info.java
@@ -17,7 +17,7 @@
/**
* Kotlin-related common classes.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.kotlin;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/kotlin/src/main/java/com/linecorp/armeria/server/kotlin/package-info.java b/kotlin/src/main/java/com/linecorp/armeria/server/kotlin/package-info.java
index 7625b59126d..66ccb3bcf8f 100644
--- a/kotlin/src/main/java/com/linecorp/armeria/server/kotlin/package-info.java
+++ b/kotlin/src/main/java/com/linecorp/armeria/server/kotlin/package-info.java
@@ -17,7 +17,7 @@
/**
* Decorators for Kotlin coroutines.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.kotlin;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/kotlin/src/main/kotlin/com/linecorp/armeria/internal/common/kotlin/FlowCollectingPublisher.kt b/kotlin/src/main/kotlin/com/linecorp/armeria/internal/common/kotlin/FlowCollectingPublisher.kt
index d648b06807b..6f59e61de4b 100644
--- a/kotlin/src/main/kotlin/com/linecorp/armeria/internal/common/kotlin/FlowCollectingPublisher.kt
+++ b/kotlin/src/main/kotlin/com/linecorp/armeria/internal/common/kotlin/FlowCollectingPublisher.kt
@@ -32,7 +32,7 @@ import kotlin.coroutines.EmptyCoroutineContext
* [Publisher] implementation which emits values collected from [Flow].
* Reactive streams back-pressure works on its backing [flow] too.
*/
-internal class FlowCollectingPublisher(
+internal class FlowCollectingPublisher(
private val flow: Flow,
private val executor: EventExecutor,
private val context: CoroutineContext = EmptyCoroutineContext,
@@ -44,7 +44,7 @@ internal class FlowCollectingPublisher(
GlobalScope.launch(context) {
try {
flow.collect {
- delegate.write(it!!)
+ delegate.write(it)
delegate.whenConsumed().await()
}
} catch (e: Throwable) {
diff --git a/kotlin/src/test/kotlin/com/linecorp/armeria/server/kotlin/FlowCollectingPublisherTest.kt b/kotlin/src/test/kotlin/com/linecorp/armeria/server/kotlin/FlowCollectingPublisherTest.kt
index 086f4d54ca7..6697bdac852 100644
--- a/kotlin/src/test/kotlin/com/linecorp/armeria/server/kotlin/FlowCollectingPublisherTest.kt
+++ b/kotlin/src/test/kotlin/com/linecorp/armeria/server/kotlin/FlowCollectingPublisherTest.kt
@@ -62,7 +62,7 @@ internal class FlowCollectingPublisherTest : PublisherVerification(TestEnv
val queue: BlockingQueue = LinkedTransferQueue()
lateinit var subscription: Subscription
- FlowCollectingPublisher(
+ FlowCollectingPublisher(
flow {
(0 until 3).forEach {
emit(it)
@@ -147,7 +147,7 @@ internal class FlowCollectingPublisherTest : PublisherVerification(TestEnv
val context = CoroutineName("custom-context")
val coroutineNameCaptor = AtomicReference()
- FlowCollectingPublisher(
+ FlowCollectingPublisher(
flow {
coroutineNameCaptor.set(currentCoroutineContext()[CoroutineName])
emit(1)
diff --git a/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/ArmeriaHttpClientBuilder.java b/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/ArmeriaHttpClientBuilder.java
index 3f3fb6f4521..e73b27b0d58 100644
--- a/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/ArmeriaHttpClientBuilder.java
+++ b/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/ArmeriaHttpClientBuilder.java
@@ -23,6 +23,7 @@
import javax.net.ssl.KeyManager;
import javax.net.ssl.TrustManager;
+import org.jspecify.annotations.Nullable;
import org.slf4j.LoggerFactory;
import com.linecorp.armeria.client.ClientFactory;
@@ -34,7 +35,6 @@
import com.linecorp.armeria.client.proxy.ProxyConfig;
import com.linecorp.armeria.common.HttpHeaderNames;
import com.linecorp.armeria.common.HttpHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.LogLevel;
import com.linecorp.armeria.common.logging.LogWriter;
diff --git a/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/ArmeriaHttpResponse.java b/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/ArmeriaHttpResponse.java
index 49f1fe38a6a..b7b3daf42f0 100644
--- a/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/ArmeriaHttpResponse.java
+++ b/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/ArmeriaHttpResponse.java
@@ -20,11 +20,12 @@
import java.util.Map;
import java.util.Optional;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableMap;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import io.fabric8.kubernetes.client.http.AsyncBody;
import io.fabric8.kubernetes.client.http.HttpRequest;
diff --git a/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/ArmeriaWebSocket.java b/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/ArmeriaWebSocket.java
index 49b5df31431..87ec079922d 100644
--- a/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/ArmeriaWebSocket.java
+++ b/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/ArmeriaWebSocket.java
@@ -19,12 +19,12 @@
import java.nio.ByteBuffer;
import java.util.concurrent.atomic.AtomicLong;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.websocket.CloseWebSocketFrame;
import com.linecorp.armeria.common.websocket.WebSocketCloseStatus;
import com.linecorp.armeria.common.websocket.WebSocketFrame;
diff --git a/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/ArmeriaWebSocketClient.java b/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/ArmeriaWebSocketClient.java
index 11a60e4bd10..ead3964f27f 100644
--- a/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/ArmeriaWebSocketClient.java
+++ b/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/ArmeriaWebSocketClient.java
@@ -25,6 +25,8 @@
import java.util.Map;
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.Strings;
import com.linecorp.armeria.client.RequestOptions;
@@ -36,7 +38,6 @@
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.HttpHeadersBuilder;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.common.util.SafeCloseable;
import com.linecorp.armeria.internal.common.util.ReentrantShortLock;
diff --git a/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/endpoints/KubernetesEndpointGroup.java b/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/endpoints/KubernetesEndpointGroup.java
index 75f91b116d9..3b14eb6d60f 100644
--- a/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/endpoints/KubernetesEndpointGroup.java
+++ b/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/endpoints/KubernetesEndpointGroup.java
@@ -30,6 +30,7 @@
import java.util.function.Predicate;
import org.jctools.maps.NonBlockingHashMap;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,7 +41,6 @@
import com.linecorp.armeria.client.endpoint.EndpointSelectionStrategy;
import com.linecorp.armeria.client.retry.Backoff;
import com.linecorp.armeria.common.CommonPools;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.ShutdownHooks;
import com.linecorp.armeria.internal.common.util.ReentrantShortLock;
diff --git a/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/endpoints/KubernetesEndpointGroupBuilder.java b/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/endpoints/KubernetesEndpointGroupBuilder.java
index 63817546afa..f10aaf826e0 100644
--- a/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/endpoints/KubernetesEndpointGroupBuilder.java
+++ b/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/endpoints/KubernetesEndpointGroupBuilder.java
@@ -23,13 +23,14 @@
import java.time.Duration;
import java.util.function.Predicate;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.Strings;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.client.endpoint.AbstractDynamicEndpointGroupBuilder;
import com.linecorp.armeria.client.endpoint.EndpointSelectionStrategy;
import com.linecorp.armeria.common.Flags;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.fabric8.kubernetes.api.model.NodeAddress;
diff --git a/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/endpoints/package-info.java b/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/endpoints/package-info.java
index f7efd8a03bb..27f55d56612 100644
--- a/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/endpoints/package-info.java
+++ b/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/endpoints/package-info.java
@@ -17,7 +17,7 @@
/**
* {@link com.linecorp.armeria.client.endpoint.EndpointGroup} for Kubernetes services.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.kubernetes.endpoints;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/package-info.java b/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/package-info.java
index 9472fe65e4a..1a4ffb01734 100644
--- a/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/package-info.java
+++ b/kubernetes/src/main/java/com/linecorp/armeria/client/kubernetes/package-info.java
@@ -17,7 +17,7 @@
/**
* Fabric8 Kubernetes client based on Armeria.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.kubernetes;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/kubernetes/src/test/java/com/linecorp/armeria/client/kubernetes/endpoints/KubernetesEndpointGroupMockServerTest.java b/kubernetes/src/test/java/com/linecorp/armeria/client/kubernetes/endpoints/KubernetesEndpointGroupMockServerTest.java
index 212b95db629..dba116b173e 100644
--- a/kubernetes/src/test/java/com/linecorp/armeria/client/kubernetes/endpoints/KubernetesEndpointGroupMockServerTest.java
+++ b/kubernetes/src/test/java/com/linecorp/armeria/client/kubernetes/endpoints/KubernetesEndpointGroupMockServerTest.java
@@ -22,6 +22,7 @@
import java.util.List;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
@@ -30,7 +31,6 @@
import com.google.common.collect.ImmutableMap;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import io.fabric8.kubernetes.api.model.Container;
import io.fabric8.kubernetes.api.model.ContainerBuilder;
diff --git a/logback/logback12/src/main/java/com/linecorp/armeria/common/logback/LoggingEventWrapper.java b/logback/logback12/src/main/java/com/linecorp/armeria/common/logback/LoggingEventWrapper.java
index d3d8a2d23fa..d5b362116f3 100644
--- a/logback/logback12/src/main/java/com/linecorp/armeria/common/logback/LoggingEventWrapper.java
+++ b/logback/logback12/src/main/java/com/linecorp/armeria/common/logback/LoggingEventWrapper.java
@@ -18,10 +18,9 @@
import java.time.Instant;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Marker;
-import com.linecorp.armeria.common.annotation.Nullable;
-
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
diff --git a/logback/logback12/src/main/java/com/linecorp/armeria/common/logback/RequestContextExportingAppender.java b/logback/logback12/src/main/java/com/linecorp/armeria/common/logback/RequestContextExportingAppender.java
index 04f20669e67..16408b663c1 100644
--- a/logback/logback12/src/main/java/com/linecorp/armeria/common/logback/RequestContextExportingAppender.java
+++ b/logback/logback12/src/main/java/com/linecorp/armeria/common/logback/RequestContextExportingAppender.java
@@ -25,13 +25,13 @@
import java.util.function.Consumer;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
import org.slf4j.MDC;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Splitter;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.BuiltInProperty;
import com.linecorp.armeria.common.logging.RequestContextExporter;
import com.linecorp.armeria.common.logging.RequestContextExporterBuilder;
diff --git a/logback/logback12/src/main/java/com/linecorp/armeria/common/logback/UnionMap.java b/logback/logback12/src/main/java/com/linecorp/armeria/common/logback/UnionMap.java
index 345e11e4bb5..3cdbb55d143 100644
--- a/logback/logback12/src/main/java/com/linecorp/armeria/common/logback/UnionMap.java
+++ b/logback/logback12/src/main/java/com/linecorp/armeria/common/logback/UnionMap.java
@@ -25,7 +25,7 @@
import java.util.Set;
import java.util.function.Predicate;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
final class UnionMap extends AbstractMap {
diff --git a/logback/logback12/src/main/java/com/linecorp/armeria/common/logback/package-info.java b/logback/logback12/src/main/java/com/linecorp/armeria/common/logback/package-info.java
index 3b597ca0812..750d9012cf0 100644
--- a/logback/logback12/src/main/java/com/linecorp/armeria/common/logback/package-info.java
+++ b/logback/logback12/src/main/java/com/linecorp/armeria/common/logback/package-info.java
@@ -20,7 +20,7 @@
* Read 'Logging contextual information'
* for more information.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.logback;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/logback/logback12/src/test/java/com/linecorp/armeria/common/logback/RequestContextExportingAppenderTest.java b/logback/logback12/src/test/java/com/linecorp/armeria/common/logback/RequestContextExportingAppenderTest.java
index 7935d1ff4fc..c49a492bc16 100644
--- a/logback/logback12/src/test/java/com/linecorp/armeria/common/logback/RequestContextExportingAppenderTest.java
+++ b/logback/logback12/src/test/java/com/linecorp/armeria/common/logback/RequestContextExportingAppenderTest.java
@@ -38,6 +38,7 @@
import org.apache.thrift.protocol.TMessage;
import org.apache.thrift.protocol.TMessageType;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
@@ -58,7 +59,6 @@
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.RpcRequest;
import com.linecorp.armeria.common.RpcResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.BuiltInProperty;
import com.linecorp.armeria.common.logging.RequestLogBuilder;
import com.linecorp.armeria.common.thrift.ThriftCall;
diff --git a/logback/logback13/src/main/java/com/linecorp/armeria/common/logback/LoggingEventWrapper.java b/logback/logback13/src/main/java/com/linecorp/armeria/common/logback/LoggingEventWrapper.java
index 6a04d20f928..0f0173ffddc 100644
--- a/logback/logback13/src/main/java/com/linecorp/armeria/common/logback/LoggingEventWrapper.java
+++ b/logback/logback13/src/main/java/com/linecorp/armeria/common/logback/LoggingEventWrapper.java
@@ -19,11 +19,10 @@
import java.util.List;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Marker;
import org.slf4j.event.KeyValuePair;
-import com.linecorp.armeria.common.annotation.Nullable;
-
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
diff --git a/logback/logback13/src/main/java/com/linecorp/armeria/common/logback/package-info.java b/logback/logback13/src/main/java/com/linecorp/armeria/common/logback/package-info.java
index 3b597ca0812..750d9012cf0 100644
--- a/logback/logback13/src/main/java/com/linecorp/armeria/common/logback/package-info.java
+++ b/logback/logback13/src/main/java/com/linecorp/armeria/common/logback/package-info.java
@@ -20,7 +20,7 @@
*
Read 'Logging contextual information'
* for more information.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.logback;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/micrometer-context/src/main/java/com/linecorp/armeria/common/micrometer/context/RequestContextThreadLocalAccessor.java b/micrometer-context/src/main/java/com/linecorp/armeria/common/micrometer/context/RequestContextThreadLocalAccessor.java
index 0844a677f10..e77a67c040f 100644
--- a/micrometer-context/src/main/java/com/linecorp/armeria/common/micrometer/context/RequestContextThreadLocalAccessor.java
+++ b/micrometer-context/src/main/java/com/linecorp/armeria/common/micrometer/context/RequestContextThreadLocalAccessor.java
@@ -15,11 +15,11 @@
*/
package com.linecorp.armeria.common.micrometer.context;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscription;
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.RequestContextStorage;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.common.RequestContextUtil;
diff --git a/micrometer-context/src/main/java/com/linecorp/armeria/common/micrometer/context/package-info.java b/micrometer-context/src/main/java/com/linecorp/armeria/common/micrometer/context/package-info.java
index 24f7d364c1f..0a021710913 100644
--- a/micrometer-context/src/main/java/com/linecorp/armeria/common/micrometer/context/package-info.java
+++ b/micrometer-context/src/main/java/com/linecorp/armeria/common/micrometer/context/package-info.java
@@ -19,8 +19,9 @@
* during Reactor operations.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.micrometer.context;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/nacos/src/main/java/com/linecorp/armeria/client/nacos/NacosEndpointGroup.java b/nacos/src/main/java/com/linecorp/armeria/client/nacos/NacosEndpointGroup.java
index 3901503a2d3..b0b6de3c638 100644
--- a/nacos/src/main/java/com/linecorp/armeria/client/nacos/NacosEndpointGroup.java
+++ b/nacos/src/main/java/com/linecorp/armeria/client/nacos/NacosEndpointGroup.java
@@ -22,6 +22,7 @@
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -32,7 +33,6 @@
import com.linecorp.armeria.client.endpoint.EndpointGroup;
import com.linecorp.armeria.client.endpoint.EndpointSelectionStrategy;
import com.linecorp.armeria.common.CommonPools;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.nacos.NacosClient;
diff --git a/nacos/src/main/java/com/linecorp/armeria/client/nacos/package-info.java b/nacos/src/main/java/com/linecorp/armeria/client/nacos/package-info.java
index da9a43a38f7..d57f76006eb 100644
--- a/nacos/src/main/java/com/linecorp/armeria/client/nacos/package-info.java
+++ b/nacos/src/main/java/com/linecorp/armeria/client/nacos/package-info.java
@@ -17,9 +17,10 @@
/**
* Nacos-based {@link com.linecorp.armeria.client.endpoint.EndpointGroup} implementation.
*/
-@NonNullByDefault
+@NullMarked
@UnstableApi
package com.linecorp.armeria.client.nacos;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/nacos/src/main/java/com/linecorp/armeria/common/nacos/package-info.java b/nacos/src/main/java/com/linecorp/armeria/common/nacos/package-info.java
index 28027bc31fd..e15e234eba2 100644
--- a/nacos/src/main/java/com/linecorp/armeria/common/nacos/package-info.java
+++ b/nacos/src/main/java/com/linecorp/armeria/common/nacos/package-info.java
@@ -17,9 +17,10 @@
/**
* Various classes used internally. Anything in this package can be changed or removed at any time.
*/
-@NonNullByDefault
+@NullMarked
@UnstableApi
package com.linecorp.armeria.common.nacos;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/nacos/src/main/java/com/linecorp/armeria/internal/nacos/LoginClient.java b/nacos/src/main/java/com/linecorp/armeria/internal/nacos/LoginClient.java
index 7e67208855a..aafa2c93e1c 100644
--- a/nacos/src/main/java/com/linecorp/armeria/internal/nacos/LoginClient.java
+++ b/nacos/src/main/java/com/linecorp/armeria/internal/nacos/LoginClient.java
@@ -21,6 +21,8 @@
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -36,7 +38,6 @@
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.QueryParams;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.auth.AuthToken;
import com.linecorp.armeria.common.util.AsyncLoader;
import com.linecorp.armeria.common.util.Exceptions;
diff --git a/nacos/src/main/java/com/linecorp/armeria/internal/nacos/NacosClient.java b/nacos/src/main/java/com/linecorp/armeria/internal/nacos/NacosClient.java
index 4f004b34977..e3ef10865b0 100644
--- a/nacos/src/main/java/com/linecorp/armeria/internal/nacos/NacosClient.java
+++ b/nacos/src/main/java/com/linecorp/armeria/internal/nacos/NacosClient.java
@@ -22,6 +22,8 @@
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.client.HttpClient;
import com.linecorp.armeria.client.WebClient;
@@ -30,7 +32,6 @@
import com.linecorp.armeria.client.retry.RetryRule;
import com.linecorp.armeria.client.retry.RetryingClient;
import com.linecorp.armeria.common.HttpResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
public final class NacosClient {
diff --git a/nacos/src/main/java/com/linecorp/armeria/internal/nacos/NacosClientBuilder.java b/nacos/src/main/java/com/linecorp/armeria/internal/nacos/NacosClientBuilder.java
index fba015b632d..266006aaf0b 100644
--- a/nacos/src/main/java/com/linecorp/armeria/internal/nacos/NacosClientBuilder.java
+++ b/nacos/src/main/java/com/linecorp/armeria/internal/nacos/NacosClientBuilder.java
@@ -21,7 +21,8 @@
import java.net.URI;
import java.util.regex.Pattern;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.nacos.NacosConfigSetters;
public final class NacosClientBuilder implements NacosConfigSetters {
diff --git a/nacos/src/main/java/com/linecorp/armeria/internal/nacos/NacosClientUtil.java b/nacos/src/main/java/com/linecorp/armeria/internal/nacos/NacosClientUtil.java
index 0039f399aaf..ce553c92e5d 100644
--- a/nacos/src/main/java/com/linecorp/armeria/internal/nacos/NacosClientUtil.java
+++ b/nacos/src/main/java/com/linecorp/armeria/internal/nacos/NacosClientUtil.java
@@ -15,9 +15,10 @@
*/
package com.linecorp.armeria.internal.nacos;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.QueryParams;
import com.linecorp.armeria.common.QueryParamsBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* Utility methods related to Nacos clients.
diff --git a/nacos/src/main/java/com/linecorp/armeria/internal/nacos/QueryInstancesClient.java b/nacos/src/main/java/com/linecorp/armeria/internal/nacos/QueryInstancesClient.java
index 0176925a101..2e7f7bd9e03 100644
--- a/nacos/src/main/java/com/linecorp/armeria/internal/nacos/QueryInstancesClient.java
+++ b/nacos/src/main/java/com/linecorp/armeria/internal/nacos/QueryInstancesClient.java
@@ -23,6 +23,8 @@
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -32,7 +34,6 @@
import com.linecorp.armeria.client.WebClient;
import com.linecorp.armeria.common.HttpEntity;
import com.linecorp.armeria.common.QueryParams;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* A Nacos client that is responsible for
diff --git a/nacos/src/main/java/com/linecorp/armeria/internal/nacos/RegisterInstanceClient.java b/nacos/src/main/java/com/linecorp/armeria/internal/nacos/RegisterInstanceClient.java
index 49d76449fd5..83c8c1bf62f 100644
--- a/nacos/src/main/java/com/linecorp/armeria/internal/nacos/RegisterInstanceClient.java
+++ b/nacos/src/main/java/com/linecorp/armeria/internal/nacos/RegisterInstanceClient.java
@@ -17,11 +17,12 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.WebClient;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.QueryParams;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* A Nacos client that is responsible for
diff --git a/nacos/src/main/java/com/linecorp/armeria/internal/nacos/package-info.java b/nacos/src/main/java/com/linecorp/armeria/internal/nacos/package-info.java
index 600661d3d7e..348d2bd5bbe 100644
--- a/nacos/src/main/java/com/linecorp/armeria/internal/nacos/package-info.java
+++ b/nacos/src/main/java/com/linecorp/armeria/internal/nacos/package-info.java
@@ -17,7 +17,7 @@
/**
* Various classes used internally. Anything in this package can be changed or removed at any time.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.nacos;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/nacos/src/main/java/com/linecorp/armeria/server/nacos/NacosUpdatingListener.java b/nacos/src/main/java/com/linecorp/armeria/server/nacos/NacosUpdatingListener.java
index fef61696c9f..cce07be5ba5 100644
--- a/nacos/src/main/java/com/linecorp/armeria/server/nacos/NacosUpdatingListener.java
+++ b/nacos/src/main/java/com/linecorp/armeria/server/nacos/NacosUpdatingListener.java
@@ -20,12 +20,12 @@
import java.net.Inet4Address;
import java.net.URI;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.common.HttpStatus;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.SystemInfo;
import com.linecorp.armeria.internal.nacos.NacosClient;
diff --git a/nacos/src/main/java/com/linecorp/armeria/server/nacos/NacosUpdatingListenerBuilder.java b/nacos/src/main/java/com/linecorp/armeria/server/nacos/NacosUpdatingListenerBuilder.java
index c378ec36736..c9b47cfbb54 100644
--- a/nacos/src/main/java/com/linecorp/armeria/server/nacos/NacosUpdatingListenerBuilder.java
+++ b/nacos/src/main/java/com/linecorp/armeria/server/nacos/NacosUpdatingListenerBuilder.java
@@ -20,8 +20,9 @@
import java.net.URI;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.nacos.NacosConfigSetters;
import com.linecorp.armeria.internal.nacos.NacosClient;
diff --git a/nacos/src/main/java/com/linecorp/armeria/server/nacos/package-info.java b/nacos/src/main/java/com/linecorp/armeria/server/nacos/package-info.java
index 0651abf2f9c..9fed426df97 100644
--- a/nacos/src/main/java/com/linecorp/armeria/server/nacos/package-info.java
+++ b/nacos/src/main/java/com/linecorp/armeria/server/nacos/package-info.java
@@ -17,9 +17,10 @@
/**
* Automatic service registration and discovery with Nacos.
**/
-@NonNullByDefault
+@NullMarked
@UnstableApi
package com.linecorp.armeria.server.nacos;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/nacos/src/test/java/com/linecorp/armeria/internal/nacos/NacosTestBase.java b/nacos/src/test/java/com/linecorp/armeria/internal/nacos/NacosTestBase.java
index edf4816b028..bce85f0d8db 100644
--- a/nacos/src/test/java/com/linecorp/armeria/internal/nacos/NacosTestBase.java
+++ b/nacos/src/test/java/com/linecorp/armeria/internal/nacos/NacosTestBase.java
@@ -25,6 +25,7 @@
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.BeforeAll;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.junit.jupiter.Container;
@@ -39,7 +40,6 @@
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.CompletionActions;
import com.linecorp.armeria.internal.testing.FlakyTest;
import com.linecorp.armeria.server.AbstractHttpService;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/AbstractAccessTokenRequest.java b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/AbstractAccessTokenRequest.java
index 95db7df7ce3..a8ae3ff8249 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/AbstractAccessTokenRequest.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/AbstractAccessTokenRequest.java
@@ -23,12 +23,13 @@
import java.util.List;
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.Joiner;
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
import com.linecorp.armeria.common.QueryParamsBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.auth.oauth2.ClientAuthentication;
import com.linecorp.armeria.internal.common.auth.oauth2.AbstractOAuth2Request;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/AbstractOAuth2AuthorizationGrantBuilder.java b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/AbstractOAuth2AuthorizationGrantBuilder.java
index 59435b85d2f..75ee858498b 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/AbstractOAuth2AuthorizationGrantBuilder.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/AbstractOAuth2AuthorizationGrantBuilder.java
@@ -24,8 +24,9 @@
import java.util.function.Consumer;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.WebClient;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.auth.oauth2.ClientAuthentication;
import com.linecorp.armeria.common.auth.oauth2.ClientAuthorization;
import com.linecorp.armeria.common.auth.oauth2.GrantedOAuth2AccessToken;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/AccessTokenRequest.java b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/AccessTokenRequest.java
index 563ed5dddc0..749e12d2f12 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/AccessTokenRequest.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/AccessTokenRequest.java
@@ -20,7 +20,8 @@
import java.util.List;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.auth.oauth2.ClientAuthentication;
import com.linecorp.armeria.common.auth.oauth2.OAuth2Request;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/ClientCredentialsAccessTokenRequest.java b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/ClientCredentialsAccessTokenRequest.java
index bb2839e56a9..617029f9e62 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/ClientCredentialsAccessTokenRequest.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/ClientCredentialsAccessTokenRequest.java
@@ -20,8 +20,9 @@
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.QueryParamsBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.auth.oauth2.ClientAuthentication;
final class ClientCredentialsAccessTokenRequest extends AbstractAccessTokenRequest {
diff --git a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/DefaultOAuth2AuthorizationGrant.java b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/DefaultOAuth2AuthorizationGrant.java
index f1f7fecd721..4f3a4a1007a 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/DefaultOAuth2AuthorizationGrant.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/DefaultOAuth2AuthorizationGrant.java
@@ -26,11 +26,11 @@
import java.util.function.Predicate;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.linecorp.armeria.client.WebClient;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.auth.oauth2.ClientAuthentication;
import com.linecorp.armeria.common.auth.oauth2.GrantedOAuth2AccessToken;
import com.linecorp.armeria.common.auth.oauth2.OAuth2Request;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/JsonWebTokenAccessTokenRequest.java b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/JsonWebTokenAccessTokenRequest.java
index 705a8735de4..bb342342192 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/JsonWebTokenAccessTokenRequest.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/JsonWebTokenAccessTokenRequest.java
@@ -21,8 +21,9 @@
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.QueryParamsBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.auth.oauth2.ClientAuthentication;
/**
diff --git a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/OAuth2AuthorizationGrantBuilder.java b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/OAuth2AuthorizationGrantBuilder.java
index 503d5a23cff..3d97e254346 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/OAuth2AuthorizationGrantBuilder.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/OAuth2AuthorizationGrantBuilder.java
@@ -26,8 +26,9 @@
import java.util.function.Predicate;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.WebClient;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.auth.oauth2.GrantedOAuth2AccessToken;
import com.linecorp.armeria.common.auth.oauth2.OAuth2ResponseHandler;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/OAuth2ResourceOwnerPasswordCredentialsGrantBuilder.java b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/OAuth2ResourceOwnerPasswordCredentialsGrantBuilder.java
index 8c349671145..cc05eb2942f 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/OAuth2ResourceOwnerPasswordCredentialsGrantBuilder.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/OAuth2ResourceOwnerPasswordCredentialsGrantBuilder.java
@@ -23,8 +23,9 @@
import java.util.Map.Entry;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.WebClient;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.auth.oauth2.ClientAuthentication;
/**
diff --git a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/RefreshAccessTokenRequest.java b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/RefreshAccessTokenRequest.java
index a1a664afc71..c8e1a672110 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/RefreshAccessTokenRequest.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/RefreshAccessTokenRequest.java
@@ -21,8 +21,9 @@
import java.util.List;
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.QueryParamsBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.auth.oauth2.ClientAuthentication;
/**
diff --git a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/ResourceOwnerPasswordAccessTokenRequest.java b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/ResourceOwnerPasswordAccessTokenRequest.java
index 69ec3ec14c1..f3b236b40d8 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/ResourceOwnerPasswordAccessTokenRequest.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/ResourceOwnerPasswordAccessTokenRequest.java
@@ -23,8 +23,9 @@
import java.util.List;
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.QueryParamsBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.auth.oauth2.ClientAuthentication;
final class ResourceOwnerPasswordAccessTokenRequest extends AbstractAccessTokenRequest {
diff --git a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/package-info.java b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/package-info.java
index cb9f96b60d9..91c8c0c795b 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/package-info.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/client/auth/oauth2/package-info.java
@@ -18,8 +18,9 @@
* Client-side OAuth 2.0 implementation artifacts.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.auth.oauth2;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/ClientAuthorization.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/ClientAuthorization.java
index 83fccc7573e..cca368b3dcf 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/ClientAuthorization.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/ClientAuthorization.java
@@ -23,13 +23,14 @@
import java.util.Map;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.common.HttpHeaderNames;
import com.linecorp.armeria.common.HttpHeadersBuilder;
import com.linecorp.armeria.common.QueryParams;
import com.linecorp.armeria.common.QueryParamsBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.auth.oauth2.CaseUtil;
/**
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/ClientPasswordClientAuthentication.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/ClientPasswordClientAuthentication.java
index 4c9cad3a9e2..325cddd8849 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/ClientPasswordClientAuthentication.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/ClientPasswordClientAuthentication.java
@@ -21,12 +21,13 @@
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.common.HttpHeaderNames;
import com.linecorp.armeria.common.HttpHeadersBuilder;
import com.linecorp.armeria.common.QueryParamsBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.auth.AuthToken;
final class ClientPasswordClientAuthentication implements ClientAuthentication {
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/DefaultTokenOperationRequest.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/DefaultTokenOperationRequest.java
index 996bf1e1aae..02deb161e3d 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/DefaultTokenOperationRequest.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/DefaultTokenOperationRequest.java
@@ -21,10 +21,11 @@
import java.util.Objects;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.common.QueryParamsBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.auth.oauth2.AbstractOAuth2Request;
final class DefaultTokenOperationRequest extends AbstractOAuth2Request implements TokenOperationRequest {
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/GrantedOAuth2AccessToken.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/GrantedOAuth2AccessToken.java
index b0202dcd7d7..ee4af7d8409 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/GrantedOAuth2AccessToken.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/GrantedOAuth2AccessToken.java
@@ -34,6 +34,8 @@
import java.util.Objects;
import java.util.Set;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.annotations.VisibleForTesting;
@@ -41,7 +43,6 @@
import com.google.common.collect.ImmutableSet;
import com.linecorp.armeria.common.HttpHeaderNames;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.common.auth.oauth2.CaseUtil;
import com.linecorp.armeria.internal.common.auth.oauth2.OAuth2Constants;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/GrantedOAuth2AccessTokenBuilder.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/GrantedOAuth2AccessTokenBuilder.java
index 6e5520b4d86..e873b1a91eb 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/GrantedOAuth2AccessTokenBuilder.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/GrantedOAuth2AccessTokenBuilder.java
@@ -32,12 +32,13 @@
import java.util.LinkedHashMap;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.common.auth.oauth2.OAuth2Constants;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidClientException.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidClientException.java
index e5af4f04c57..ce020bf3636 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidClientException.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidClientException.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.common.auth.oauth2;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidGrantException.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidGrantException.java
index eb3bcfc8921..f29b0e94638 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidGrantException.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidGrantException.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.common.auth.oauth2;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidRequestException.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidRequestException.java
index ae496906a5e..be3ccd38c44 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidRequestException.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidRequestException.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.common.auth.oauth2;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidResponseException.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidResponseException.java
index 306efde331d..a6c6fd05b47 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidResponseException.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidResponseException.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.common.auth.oauth2;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpStatus;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidScopeException.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidScopeException.java
index 66436bb3034..3afbad3f04a 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidScopeException.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/InvalidScopeException.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.common.auth.oauth2;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/OAuth2Request.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/OAuth2Request.java
index e884a80b67b..3404e1f453a 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/OAuth2Request.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/OAuth2Request.java
@@ -16,10 +16,11 @@
package com.linecorp.armeria.common.auth.oauth2;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.QueryParams;
import com.linecorp.armeria.common.QueryParamsBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/OAuth2TokenDescriptor.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/OAuth2TokenDescriptor.java
index d60ac38ce6b..5f89b316223 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/OAuth2TokenDescriptor.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/OAuth2TokenDescriptor.java
@@ -40,12 +40,13 @@
import java.util.Objects;
import java.util.Set;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.common.auth.oauth2.OAuth2Constants;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/OAuth2TokenDescriptorBuilder.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/OAuth2TokenDescriptorBuilder.java
index 8c5457a90e5..2833f8558e4 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/OAuth2TokenDescriptorBuilder.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/OAuth2TokenDescriptorBuilder.java
@@ -36,12 +36,13 @@
import java.util.LinkedHashMap;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/TokenOperationRequest.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/TokenOperationRequest.java
index 01bc9b47219..4e8e87bf34f 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/TokenOperationRequest.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/TokenOperationRequest.java
@@ -18,7 +18,8 @@
import static java.util.Objects.requireNonNull;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/TokenRequestException.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/TokenRequestException.java
index 053a171bea5..b995187c8a4 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/TokenRequestException.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/TokenRequestException.java
@@ -30,10 +30,11 @@
import java.util.LinkedHashMap;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/TokenRevocation.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/TokenRevocation.java
index 05c6523dc1d..9c05c825836 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/TokenRevocation.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/TokenRevocation.java
@@ -22,8 +22,9 @@
import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.WebClient;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.common.auth.oauth2.OAuth2Endpoint;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/TokenRevocationBuilder.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/TokenRevocationBuilder.java
index 3ee6f8dad95..0bddbead404 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/TokenRevocationBuilder.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/TokenRevocationBuilder.java
@@ -21,8 +21,9 @@
import java.util.Map;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.WebClient;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.common.auth.oauth2.OAuth2Endpoint;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnauthorizedClientException.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnauthorizedClientException.java
index 63498dbcc2c..b5b9640383f 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnauthorizedClientException.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnauthorizedClientException.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.common.auth.oauth2;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnsupportedGrantTypeException.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnsupportedGrantTypeException.java
index 20357354e02..c12bfcbf71e 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnsupportedGrantTypeException.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnsupportedGrantTypeException.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.common.auth.oauth2;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnsupportedMediaTypeException.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnsupportedMediaTypeException.java
index 5b8a4566b88..d019a4f580c 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnsupportedMediaTypeException.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnsupportedMediaTypeException.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.common.auth.oauth2;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpHeaderNames;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnsupportedResponseException.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnsupportedResponseException.java
index 09aa64628ba..0aa2f7f0ece 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnsupportedResponseException.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnsupportedResponseException.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.common.auth.oauth2;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpStatus;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnsupportedTokenTypeException.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnsupportedTokenTypeException.java
index 721430c20ea..2224f25b5bc 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnsupportedTokenTypeException.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/UnsupportedTokenTypeException.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.common.auth.oauth2;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/package-info.java b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/package-info.java
index 427feaa25c9..e294056737c 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/package-info.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/common/auth/oauth2/package-info.java
@@ -19,8 +19,9 @@
* implementation.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.auth.oauth2;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/internal/client/auth/oauth2/package-info.java b/oauth2/src/main/java/com/linecorp/armeria/internal/client/auth/oauth2/package-info.java
index 2c39b2b0c6e..28f603f7ec1 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/internal/client/auth/oauth2/package-info.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/internal/client/auth/oauth2/package-info.java
@@ -19,8 +19,9 @@
* OAuth 2.0 implementation artifacts.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.client.auth.oauth2;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/internal/common/auth/oauth2/AbstractOAuth2Request.java b/oauth2/src/main/java/com/linecorp/armeria/internal/common/auth/oauth2/AbstractOAuth2Request.java
index 4eda7787a81..5776a44454b 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/internal/common/auth/oauth2/AbstractOAuth2Request.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/internal/common/auth/oauth2/AbstractOAuth2Request.java
@@ -18,6 +18,8 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpData;
import com.linecorp.armeria.common.HttpMethod;
import com.linecorp.armeria.common.HttpRequest;
@@ -26,7 +28,6 @@
import com.linecorp.armeria.common.QueryParamsBuilder;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.RequestHeadersBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.auth.oauth2.ClientAuthentication;
import com.linecorp.armeria.common.auth.oauth2.OAuth2Request;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/internal/common/auth/oauth2/CaseUtil.java b/oauth2/src/main/java/com/linecorp/armeria/internal/common/auth/oauth2/CaseUtil.java
index a973e5933e7..2b8bda4e097 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/internal/common/auth/oauth2/CaseUtil.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/internal/common/auth/oauth2/CaseUtil.java
@@ -16,9 +16,9 @@
package com.linecorp.armeria.internal.common.auth.oauth2;
-import com.google.common.base.Ascii;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.google.common.base.Ascii;
public final class CaseUtil {
diff --git a/oauth2/src/main/java/com/linecorp/armeria/internal/common/auth/oauth2/package-info.java b/oauth2/src/main/java/com/linecorp/armeria/internal/common/auth/oauth2/package-info.java
index 560a31c62e7..17c1e4cb7ef 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/internal/common/auth/oauth2/package-info.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/internal/common/auth/oauth2/package-info.java
@@ -19,8 +19,9 @@
* OAuth 2.0 implementation artifacts.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.common.auth.oauth2;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2AuthorizationErrorReporter.java b/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2AuthorizationErrorReporter.java
index 6974dc0a267..fd568de06ac 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2AuthorizationErrorReporter.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2AuthorizationErrorReporter.java
@@ -25,12 +25,13 @@
import java.util.Map;
import java.util.stream.Collectors;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpHeaderNames;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
final class OAuth2AuthorizationErrorReporter {
diff --git a/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2AuthorizationFailureHandler.java b/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2AuthorizationFailureHandler.java
index 1887542c734..9e183edb032 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2AuthorizationFailureHandler.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2AuthorizationFailureHandler.java
@@ -22,6 +22,7 @@
import static com.linecorp.armeria.server.auth.oauth2.OAuth2TokenIntrospectionAuthorizer.ERROR_CODE;
import static com.linecorp.armeria.server.auth.oauth2.OAuth2TokenIntrospectionAuthorizer.ERROR_TYPE;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -29,7 +30,6 @@
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.MediaType;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.HttpService;
import com.linecorp.armeria.server.ServiceRequestContext;
import com.linecorp.armeria.server.auth.AuthFailureHandler;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2TokenIntrospectionAuthorizer.java b/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2TokenIntrospectionAuthorizer.java
index 3cf70219bd0..3cee9fd75d8 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2TokenIntrospectionAuthorizer.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2TokenIntrospectionAuthorizer.java
@@ -23,11 +23,12 @@
import java.util.Set;
import java.util.concurrent.CompletionStage;
+import org.jspecify.annotations.Nullable;
+
import com.github.benmanes.caffeine.cache.Cache;
import com.linecorp.armeria.client.WebClient;
import com.linecorp.armeria.common.HttpStatus;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.auth.OAuth2Token;
import com.linecorp.armeria.common.auth.oauth2.OAuth2TokenDescriptor;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2TokenIntrospectionAuthorizerBuilder.java b/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2TokenIntrospectionAuthorizerBuilder.java
index 0fc763662cc..d5bd265cbf2 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2TokenIntrospectionAuthorizerBuilder.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2TokenIntrospectionAuthorizerBuilder.java
@@ -21,13 +21,14 @@
import java.util.Map;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.CaffeineSpec;
import com.google.common.collect.ImmutableSet;
import com.linecorp.armeria.client.WebClient;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.auth.oauth2.ClientAuthentication;
import com.linecorp.armeria.common.auth.oauth2.ClientAuthorization;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2TokenScopeValidator.java b/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2TokenScopeValidator.java
index e0efaceef0d..11027ec89ad 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2TokenScopeValidator.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/OAuth2TokenScopeValidator.java
@@ -21,9 +21,10 @@
import java.util.Set;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpStatus;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.auth.oauth2.OAuth2TokenDescriptor;
import com.linecorp.armeria.server.ServiceRequestContext;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/TokenIntrospection.java b/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/TokenIntrospection.java
index 0564c8e3f3b..bc1eb48136d 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/TokenIntrospection.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/TokenIntrospection.java
@@ -22,7 +22,8 @@
import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.auth.oauth2.ClientAuthentication;
import com.linecorp.armeria.common.auth.oauth2.OAuth2TokenDescriptor;
import com.linecorp.armeria.common.auth.oauth2.TokenOperationRequest;
diff --git a/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/package-info.java b/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/package-info.java
index 53da52802d4..a643885dbed 100644
--- a/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/package-info.java
+++ b/oauth2/src/main/java/com/linecorp/armeria/server/auth/oauth2/package-info.java
@@ -18,8 +18,9 @@
* Server-side OAuth 2.0 implementation artifacts.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.auth.oauth2;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/oauth2/src/test/java/com/linecorp/armeria/common/auth/oauth2/GrantedOAuth2AccessTokenTest.java b/oauth2/src/test/java/com/linecorp/armeria/common/auth/oauth2/GrantedOAuth2AccessTokenTest.java
index 91627b48238..079e9440b4d 100644
--- a/oauth2/src/test/java/com/linecorp/armeria/common/auth/oauth2/GrantedOAuth2AccessTokenTest.java
+++ b/oauth2/src/test/java/com/linecorp/armeria/common/auth/oauth2/GrantedOAuth2AccessTokenTest.java
@@ -24,10 +24,9 @@
import java.util.Collections;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
-import com.linecorp.armeria.common.annotation.Nullable;
-
public class GrantedOAuth2AccessTokenTest {
@Test
diff --git a/oauth2/src/test/java/com/linecorp/armeria/common/auth/oauth2/MockOAuth2AccessToken.java b/oauth2/src/test/java/com/linecorp/armeria/common/auth/oauth2/MockOAuth2AccessToken.java
index 7535d1f027a..3542a3f07a3 100644
--- a/oauth2/src/test/java/com/linecorp/armeria/common/auth/oauth2/MockOAuth2AccessToken.java
+++ b/oauth2/src/test/java/com/linecorp/armeria/common/auth/oauth2/MockOAuth2AccessToken.java
@@ -23,7 +23,7 @@
import java.util.Map;
import java.util.UUID;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class MockOAuth2AccessToken {
diff --git a/oauth2/src/test/java/com/linecorp/armeria/common/auth/oauth2/OAuth2TokenDescriptorTest.java b/oauth2/src/test/java/com/linecorp/armeria/common/auth/oauth2/OAuth2TokenDescriptorTest.java
index 0d0f35bbed1..cfd192f98ee 100644
--- a/oauth2/src/test/java/com/linecorp/armeria/common/auth/oauth2/OAuth2TokenDescriptorTest.java
+++ b/oauth2/src/test/java/com/linecorp/armeria/common/auth/oauth2/OAuth2TokenDescriptorTest.java
@@ -25,10 +25,9 @@
import java.util.Collections;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
-import com.linecorp.armeria.common.annotation.Nullable;
-
public class OAuth2TokenDescriptorTest {
@Test
diff --git a/oauth2/src/test/java/com/linecorp/armeria/internal/common/auth/oauth2/MockOAuth2Service.java b/oauth2/src/test/java/com/linecorp/armeria/internal/common/auth/oauth2/MockOAuth2Service.java
index 0f268fa4c4a..c0667fc6930 100644
--- a/oauth2/src/test/java/com/linecorp/armeria/internal/common/auth/oauth2/MockOAuth2Service.java
+++ b/oauth2/src/test/java/com/linecorp/armeria/internal/common/auth/oauth2/MockOAuth2Service.java
@@ -30,12 +30,13 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpHeaderNames;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.auth.oauth2.MockOAuth2AccessToken;
public abstract class MockOAuth2Service {
@@ -53,8 +54,7 @@ public abstract class MockOAuth2Service {
"\\s*(?i)basic\\s+(?\\S+)\\s*");
private static final String WWW_AUTHENTICATE_RESPONSE = "Basic realm=\"%s\"";
- @Nullable
- private static Map.Entry decodeClientCredentials(String clientCredential) {
+ private static Map.@Nullable Entry decodeClientCredentials(String clientCredential) {
final String decodedCredential = new String(Base64.getDecoder().decode(clientCredential),
StandardCharsets.UTF_8);
final Matcher matcher = CREDENTIALS_PATTERN.matcher(decodedCredential);
@@ -136,7 +136,7 @@ protected boolean isAuthorizedClient(String clientId, String clientSecret) {
return clientSecret.equals(authorizedClients.get(clientId));
}
- protected boolean isAuthorizedClient(@Nullable Map.Entry clientCredential) {
+ protected boolean isAuthorizedClient(Map.@Nullable Entry clientCredential) {
return (clientCredential != null) &&
isAuthorizedClient(clientCredential.getKey(), clientCredential.getValue());
}
diff --git a/prometheus1/src/main/java/com/linecorp/armeria/common/prometheus/package-info.java b/prometheus1/src/main/java/com/linecorp/armeria/common/prometheus/package-info.java
index 71c0716891b..7b4460339e0 100644
--- a/prometheus1/src/main/java/com/linecorp/armeria/common/prometheus/package-info.java
+++ b/prometheus1/src/main/java/com/linecorp/armeria/common/prometheus/package-info.java
@@ -17,7 +17,7 @@
/**
* Prometheus version 1 metrics.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.prometheus;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/prometheus1/src/main/java/com/linecorp/armeria/server/prometheus/package-info.java b/prometheus1/src/main/java/com/linecorp/armeria/server/prometheus/package-info.java
index 631bae0d214..008db0243e4 100644
--- a/prometheus1/src/main/java/com/linecorp/armeria/server/prometheus/package-info.java
+++ b/prometheus1/src/main/java/com/linecorp/armeria/server/prometheus/package-info.java
@@ -17,7 +17,7 @@
/**
* Prometheus version 1 metrics.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.prometheus;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufDescriptiveTypeInfoProvider.java b/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufDescriptiveTypeInfoProvider.java
index 9d831be8782..24008fce690 100644
--- a/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufDescriptiveTypeInfoProvider.java
+++ b/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufDescriptiveTypeInfoProvider.java
@@ -23,13 +23,14 @@
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.protobuf.Descriptors.Descriptor;
import com.google.protobuf.Descriptors.EnumDescriptor;
import com.google.protobuf.Descriptors.FieldDescriptor;
import com.google.protobuf.Message;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.server.docs.DescriptiveTypeInfo;
import com.linecorp.armeria.server.docs.DescriptiveTypeInfoProvider;
diff --git a/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufRequestConverterFunction.java b/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufRequestConverterFunction.java
index 2f74452586a..01c24e49813 100644
--- a/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufRequestConverterFunction.java
+++ b/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufRequestConverterFunction.java
@@ -34,6 +34,8 @@
import java.util.Iterator;
import java.util.Map.Entry;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.ImmutableCollection;
@@ -48,7 +50,6 @@
import com.linecorp.armeria.common.AggregatedHttpRequest;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.RequestHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.server.ServiceRequestContext;
import com.linecorp.armeria.server.annotation.RequestConverterFunction;
diff --git a/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufRequestConverterFunctionProvider.java b/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufRequestConverterFunctionProvider.java
index 6ee397e7aca..8a42f8cc2c9 100644
--- a/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufRequestConverterFunctionProvider.java
+++ b/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufRequestConverterFunctionProvider.java
@@ -22,9 +22,10 @@
import java.util.Map;
import java.util.Set;
+import org.jspecify.annotations.Nullable;
+
import com.google.protobuf.Message;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.server.annotation.RequestConverterFunction;
import com.linecorp.armeria.server.annotation.RequestConverterFunctionProvider;
diff --git a/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufResponseConverterFunction.java b/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufResponseConverterFunction.java
index 2f36d45dec9..7602a14700a 100644
--- a/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufResponseConverterFunction.java
+++ b/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufResponseConverterFunction.java
@@ -36,6 +36,7 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import com.google.common.collect.Streams;
@@ -49,7 +50,6 @@
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.server.ServiceRequestContext;
diff --git a/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufResponseConverterFunctionProvider.java b/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufResponseConverterFunctionProvider.java
index fba79b3ac2e..f6ae4ab6e89 100644
--- a/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufResponseConverterFunctionProvider.java
+++ b/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/ProtobufResponseConverterFunctionProvider.java
@@ -22,12 +22,12 @@
import java.util.Map;
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import com.google.protobuf.Message;
import com.google.protobuf.MessageLite;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.server.annotation.ResponseConverterFunction;
import com.linecorp.armeria.server.annotation.ResponseConverterFunctionProvider;
diff --git a/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/package-info.java b/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/package-info.java
index 2346e423b86..335c276ced6 100644
--- a/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/package-info.java
+++ b/protobuf/src/main/java/com/linecorp/armeria/server/protobuf/package-info.java
@@ -22,7 +22,7 @@
* converts an {@link com.linecorp.armeria.common.AggregatedHttpRequest} into
* a {@link com.google.protobuf.Message}.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.protobuf;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/protobuf/src/test/java/com/linecorp/armeria/server/protobuf/ProtobufDescriptiveTypeInfoProviderTest.java b/protobuf/src/test/java/com/linecorp/armeria/server/protobuf/ProtobufDescriptiveTypeInfoProviderTest.java
index 070f8e9b6d1..c107a2badcb 100644
--- a/protobuf/src/test/java/com/linecorp/armeria/server/protobuf/ProtobufDescriptiveTypeInfoProviderTest.java
+++ b/protobuf/src/test/java/com/linecorp/armeria/server/protobuf/ProtobufDescriptiveTypeInfoProviderTest.java
@@ -37,6 +37,7 @@
import java.util.List;
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -46,7 +47,6 @@
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.client.BlockingWebClient;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.UnmodifiableFuture;
import com.linecorp.armeria.server.ServerBuilder;
import com.linecorp.armeria.server.annotation.ConsumesJson;
diff --git a/protobuf/src/test/java/com/linecorp/armeria/server/protobuf/ProtobufResponseAnnotatedServiceTest.java b/protobuf/src/test/java/com/linecorp/armeria/server/protobuf/ProtobufResponseAnnotatedServiceTest.java
index f3598a3117a..9fb5d0fa3e9 100644
--- a/protobuf/src/test/java/com/linecorp/armeria/server/protobuf/ProtobufResponseAnnotatedServiceTest.java
+++ b/protobuf/src/test/java/com/linecorp/armeria/server/protobuf/ProtobufResponseAnnotatedServiceTest.java
@@ -27,6 +27,7 @@
import java.util.concurrent.CompletableFuture;
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -48,7 +49,6 @@
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.MediaTypeNames;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.UnmodifiableFuture;
import com.linecorp.armeria.internal.testing.GenerateNativeImageTrace;
import com.linecorp.armeria.server.ServerBuilder;
diff --git a/reactor3/src/main/java/com/linecorp/armeria/common/reactor3/package-info.java b/reactor3/src/main/java/com/linecorp/armeria/common/reactor3/package-info.java
index fa4f50ca2a8..1d063a4a33b 100644
--- a/reactor3/src/main/java/com/linecorp/armeria/common/reactor3/package-info.java
+++ b/reactor3/src/main/java/com/linecorp/armeria/common/reactor3/package-info.java
@@ -17,7 +17,7 @@
/**
* Reactor plugins to help keep {@link com.linecorp.armeria.common.RequestContext} during Reactor operations.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.reactor3;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/Resilience4jCircuitBreakerFactory.java b/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/Resilience4jCircuitBreakerFactory.java
index 9d5c72e2c9f..287c7147080 100644
--- a/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/Resilience4jCircuitBreakerFactory.java
+++ b/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/Resilience4jCircuitBreakerFactory.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.resilience4j.circuitbreaker;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.circuitbreaker.CircuitBreakerClientHandler;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.github.resilience4j.circuitbreaker.CircuitBreaker;
diff --git a/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/client/Resilience4JCircuitBreakerCallback.java b/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/client/Resilience4JCircuitBreakerCallback.java
index 4e18f3d5520..4c41de7b755 100644
--- a/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/client/Resilience4JCircuitBreakerCallback.java
+++ b/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/client/Resilience4JCircuitBreakerCallback.java
@@ -18,8 +18,9 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.circuitbreaker.CircuitBreakerCallback;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.logging.RequestLogProperty;
diff --git a/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/client/Resilience4JCircuitBreakerClientHandler.java b/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/client/Resilience4JCircuitBreakerClientHandler.java
index a8c07a13410..8c9aedf881a 100644
--- a/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/client/Resilience4JCircuitBreakerClientHandler.java
+++ b/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/client/Resilience4JCircuitBreakerClientHandler.java
@@ -18,6 +18,7 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -27,7 +28,6 @@
import com.linecorp.armeria.client.circuitbreaker.CircuitBreakerMapping;
import com.linecorp.armeria.client.circuitbreaker.ClientCircuitBreakerGenerator;
import com.linecorp.armeria.common.Request;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.circuitbreaker.CircuitBreakerCallback;
diff --git a/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/client/package-info.java b/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/client/package-info.java
index efc3582bef9..2ed7e8a67e4 100644
--- a/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/client/package-info.java
+++ b/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/client/package-info.java
@@ -18,9 +18,10 @@
* {@code Resilience4j}'s {@link io.github.resilience4j.circuitbreaker.CircuitBreaker}
* integration with Armeria clients.
*/
-@NonNullByDefault
+@NullMarked
@UnstableApi
package com.linecorp.armeria.resilience4j.circuitbreaker.client;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/package-info.java b/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/package-info.java
index 49663964980..32b1b1e5796 100644
--- a/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/package-info.java
+++ b/resilience4j2/src/main/java/com/linecorp/armeria/resilience4j/circuitbreaker/package-info.java
@@ -18,9 +18,10 @@
* {@code Resilience4j}'s {@link io.github.resilience4j.circuitbreaker.CircuitBreaker}
* integration with Armeria.
*/
-@NonNullByDefault
+@NullMarked
@UnstableApi
package com.linecorp.armeria.resilience4j.circuitbreaker;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/resteasy/src/main/java/com/linecorp/armeria/client/resteasy/ArmeriaJaxrsClientEngine.java b/resteasy/src/main/java/com/linecorp/armeria/client/resteasy/ArmeriaJaxrsClientEngine.java
index 25c99e58bfb..71b0977fdf5 100644
--- a/resteasy/src/main/java/com/linecorp/armeria/client/resteasy/ArmeriaJaxrsClientEngine.java
+++ b/resteasy/src/main/java/com/linecorp/armeria/client/resteasy/ArmeriaJaxrsClientEngine.java
@@ -45,6 +45,7 @@
import org.jboss.resteasy.client.jaxrs.internal.ClientConfiguration;
import org.jboss.resteasy.client.jaxrs.internal.ClientInvocation;
import org.jboss.resteasy.client.jaxrs.internal.ClientResponse;
+import org.jspecify.annotations.Nullable;
import com.google.common.base.Strings;
@@ -57,7 +58,6 @@
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.RequestHeadersBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.common.util.UnmodifiableFuture;
diff --git a/resteasy/src/main/java/com/linecorp/armeria/client/resteasy/SslContextConfigurator.java b/resteasy/src/main/java/com/linecorp/armeria/client/resteasy/SslContextConfigurator.java
index eab853d1647..cbab950929f 100644
--- a/resteasy/src/main/java/com/linecorp/armeria/client/resteasy/SslContextConfigurator.java
+++ b/resteasy/src/main/java/com/linecorp/armeria/client/resteasy/SslContextConfigurator.java
@@ -29,7 +29,7 @@
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.ssl.util.SimpleTrustManagerFactory;
diff --git a/resteasy/src/main/java/com/linecorp/armeria/client/resteasy/package-info.java b/resteasy/src/main/java/com/linecorp/armeria/client/resteasy/package-info.java
index 692a1b65440..07426fbe43d 100644
--- a/resteasy/src/main/java/com/linecorp/armeria/client/resteasy/package-info.java
+++ b/resteasy/src/main/java/com/linecorp/armeria/client/resteasy/package-info.java
@@ -18,8 +18,9 @@
* Integration with RESTEasy client.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.resteasy;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/resteasy/src/main/java/com/linecorp/armeria/internal/common/resteasy/HttpMessageSubscriberAdapter.java b/resteasy/src/main/java/com/linecorp/armeria/internal/common/resteasy/HttpMessageSubscriberAdapter.java
index a5a523e3d13..1f63ef7bf73 100644
--- a/resteasy/src/main/java/com/linecorp/armeria/internal/common/resteasy/HttpMessageSubscriberAdapter.java
+++ b/resteasy/src/main/java/com/linecorp/armeria/internal/common/resteasy/HttpMessageSubscriberAdapter.java
@@ -16,13 +16,13 @@
package com.linecorp.armeria.internal.common.resteasy;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import com.linecorp.armeria.common.HttpData;
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.HttpObject;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.util.ReferenceCountUtil;
diff --git a/resteasy/src/main/java/com/linecorp/armeria/internal/common/resteasy/package-info.java b/resteasy/src/main/java/com/linecorp/armeria/internal/common/resteasy/package-info.java
index 14015f85ef8..1666624a80a 100644
--- a/resteasy/src/main/java/com/linecorp/armeria/internal/common/resteasy/package-info.java
+++ b/resteasy/src/main/java/com/linecorp/armeria/internal/common/resteasy/package-info.java
@@ -18,8 +18,9 @@
* Integration with RESTEasy server and client.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.common.resteasy;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/AbstractResteasyHttpRequest.java b/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/AbstractResteasyHttpRequest.java
index b730b7fbf46..eaef9a5d978 100644
--- a/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/AbstractResteasyHttpRequest.java
+++ b/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/AbstractResteasyHttpRequest.java
@@ -35,10 +35,10 @@
import org.jboss.resteasy.specimpl.ResteasyUriInfo;
import org.jboss.resteasy.spi.NotImplementedYetException;
import org.jboss.resteasy.spi.ResteasyAsynchronousContext;
+import org.jspecify.annotations.Nullable;
import com.linecorp.armeria.common.HttpHeaderNames;
import com.linecorp.armeria.common.RequestHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.resteasy.CookieConverter;
import com.linecorp.armeria.server.ServiceRequestContext;
diff --git a/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/ResteasyAsynchronousResponseImpl.java b/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/ResteasyAsynchronousResponseImpl.java
index 9a24fd5fc92..7e59852a161 100644
--- a/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/ResteasyAsynchronousResponseImpl.java
+++ b/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/ResteasyAsynchronousResponseImpl.java
@@ -27,9 +27,9 @@
import org.jboss.resteasy.core.AbstractAsynchronousResponse;
import org.jboss.resteasy.core.SynchronousDispatcher;
+import org.jspecify.annotations.Nullable;
import com.linecorp.armeria.common.TimeoutException;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.ServiceRequestContext;
/**
diff --git a/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/ResteasyHttpResponseImpl.java b/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/ResteasyHttpResponseImpl.java
index 781af21bd67..f10d86bc551 100644
--- a/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/ResteasyHttpResponseImpl.java
+++ b/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/ResteasyHttpResponseImpl.java
@@ -29,6 +29,7 @@
import javax.ws.rs.core.NewCookie;
import org.jboss.resteasy.specimpl.MultivaluedMapImpl;
+import org.jspecify.annotations.Nullable;
import com.linecorp.armeria.common.HttpData;
import com.linecorp.armeria.common.HttpResponse;
@@ -36,7 +37,6 @@
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.ResponseHeadersBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.resteasy.ByteBufferBackedOutputStream;
import io.netty.buffer.ByteBuf;
diff --git a/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/ResteasyService.java b/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/ResteasyService.java
index 1befce21b8d..38745da14ea 100644
--- a/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/ResteasyService.java
+++ b/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/ResteasyService.java
@@ -38,6 +38,7 @@
import org.jboss.resteasy.spi.ResteasyDeployment;
import org.jboss.resteasy.spi.ResteasyProviderFactory;
import org.jboss.resteasy.util.EmbeddedServerHelper;
+import org.jspecify.annotations.Nullable;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
@@ -49,7 +50,6 @@
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.RequestHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.auth.BasicToken;
import com.linecorp.armeria.server.HttpService;
diff --git a/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/ResteasyServiceBuilder.java b/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/ResteasyServiceBuilder.java
index 5b747584dc0..0caf71bed74 100644
--- a/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/ResteasyServiceBuilder.java
+++ b/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/ResteasyServiceBuilder.java
@@ -23,8 +23,8 @@
import org.jboss.resteasy.plugins.server.embedded.SecurityDomain;
import org.jboss.resteasy.spi.ResteasyDeployment;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.server.ServiceRequestContext;
diff --git a/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/SecurityContextImpl.java b/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/SecurityContextImpl.java
index f79a87a37b3..7339abb41f3 100644
--- a/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/SecurityContextImpl.java
+++ b/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/SecurityContextImpl.java
@@ -23,10 +23,10 @@
import javax.ws.rs.core.SecurityContext;
import org.jboss.resteasy.plugins.server.embedded.SecurityDomain;
+import org.jspecify.annotations.Nullable;
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/package-info.java b/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/package-info.java
index cb34d17fd20..f9fd90a5334 100644
--- a/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/package-info.java
+++ b/resteasy/src/main/java/com/linecorp/armeria/server/resteasy/package-info.java
@@ -18,8 +18,9 @@
* Integration with RESTEasy server.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.resteasy;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/resteasy/src/test/java/com/linecorp/armeria/server/resteasy/CalculatorServiceClientServerTest.java b/resteasy/src/test/java/com/linecorp/armeria/server/resteasy/CalculatorServiceClientServerTest.java
index 30d7273e442..6b5392bccdf 100644
--- a/resteasy/src/test/java/com/linecorp/armeria/server/resteasy/CalculatorServiceClientServerTest.java
+++ b/resteasy/src/test/java/com/linecorp/armeria/server/resteasy/CalculatorServiceClientServerTest.java
@@ -29,6 +29,7 @@
import org.jboss.resteasy.core.ResteasyDeploymentImpl;
import org.jboss.resteasy.spi.ResteasyDeployment;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -41,7 +42,6 @@
import com.linecorp.armeria.client.WebClientBuilder;
import com.linecorp.armeria.client.logging.LoggingClient;
import com.linecorp.armeria.client.resteasy.ArmeriaResteasyClientBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.LogLevel;
import com.linecorp.armeria.common.logging.LogWriter;
import com.linecorp.armeria.internal.testing.GenerateNativeImageTrace;
diff --git a/resteasy/src/test/java/testing/resteasy/jaxrs/samples/books/Books.java b/resteasy/src/test/java/testing/resteasy/jaxrs/samples/books/Books.java
index fee4ecb4dcd..6a7f81c5421 100644
--- a/resteasy/src/test/java/testing/resteasy/jaxrs/samples/books/Books.java
+++ b/resteasy/src/test/java/testing/resteasy/jaxrs/samples/books/Books.java
@@ -22,7 +22,7 @@
import java.util.concurrent.ConcurrentMap;
import java.util.stream.Collectors;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
public class Books {
diff --git a/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/AbstractSubscriber.java b/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/AbstractSubscriber.java
index 866dd329a5c..226c8c8befc 100644
--- a/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/AbstractSubscriber.java
+++ b/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/AbstractSubscriber.java
@@ -19,6 +19,7 @@
import java.io.IOException;
import java.util.concurrent.Executor;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
@@ -30,7 +31,6 @@
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.HttpObject;
import com.linecorp.armeria.common.HttpStatus;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.unsafe.PooledObjects;
import okhttp3.Callback;
diff --git a/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/ArmeriaCallFactory.java b/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/ArmeriaCallFactory.java
index 1746e2cf6db..cc366e67ad5 100644
--- a/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/ArmeriaCallFactory.java
+++ b/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/ArmeriaCallFactory.java
@@ -23,6 +23,8 @@
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
import java.util.function.BiFunction;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.client.WebClient;
import com.linecorp.armeria.common.HttpHeaderNames;
@@ -31,7 +33,6 @@
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.RequestHeadersBuilder;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.common.util.SafeCloseable;
diff --git a/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/ArmeriaRetrofitBuilder.java b/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/ArmeriaRetrofitBuilder.java
index 594a4fc553a..1eaafbe9082 100644
--- a/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/ArmeriaRetrofitBuilder.java
+++ b/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/ArmeriaRetrofitBuilder.java
@@ -28,6 +28,8 @@
import java.util.function.Function;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
+
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.google.common.base.MoreObjects;
@@ -55,7 +57,6 @@
import com.linecorp.armeria.common.RequestId;
import com.linecorp.armeria.common.SessionProtocol;
import com.linecorp.armeria.common.SuccessFunction;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.auth.AuthToken;
import com.linecorp.armeria.common.auth.BasicToken;
import com.linecorp.armeria.common.auth.OAuth1aToken;
diff --git a/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/InvocationUtil.java b/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/InvocationUtil.java
index f97300f1c2d..64d1e6ddcc6 100644
--- a/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/InvocationUtil.java
+++ b/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/InvocationUtil.java
@@ -15,8 +15,9 @@
*/
package com.linecorp.armeria.client.retrofit2;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.logging.RequestLogAccess;
import com.linecorp.armeria.common.logging.RequestLogProperty;
diff --git a/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/PipeBuffer.java b/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/PipeBuffer.java
index 939a2e439f0..c92177ce6b9 100644
--- a/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/PipeBuffer.java
+++ b/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/PipeBuffer.java
@@ -17,7 +17,7 @@
import java.io.IOException;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import okio.Buffer;
import okio.Source;
diff --git a/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/package-info.java b/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/package-info.java
index 3221c99e61f..c1e81f481e5 100644
--- a/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/package-info.java
+++ b/retrofit2/src/main/java/com/linecorp/armeria/client/retrofit2/package-info.java
@@ -17,7 +17,7 @@
/**
* Retrofit2 adapter for Armeria.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.retrofit2;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/retrofit2/src/test/java/com/linecorp/armeria/client/retrofit2/ArmeriaCallFactoryTest.java b/retrofit2/src/test/java/com/linecorp/armeria/client/retrofit2/ArmeriaCallFactoryTest.java
index ec09c05f04c..542abe41893 100644
--- a/retrofit2/src/test/java/com/linecorp/armeria/client/retrofit2/ArmeriaCallFactoryTest.java
+++ b/retrofit2/src/test/java/com/linecorp/armeria/client/retrofit2/ArmeriaCallFactoryTest.java
@@ -29,6 +29,7 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -55,7 +56,6 @@
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.QueryParams;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.internal.testing.GenerateNativeImageTrace;
diff --git a/retrofit2/src/test/java/com/linecorp/armeria/client/retrofit2/BlockingCallSubscriberTest.java b/retrofit2/src/test/java/com/linecorp/armeria/client/retrofit2/BlockingCallSubscriberTest.java
index 11c822c08db..994b0ebc403 100644
--- a/retrofit2/src/test/java/com/linecorp/armeria/client/retrofit2/BlockingCallSubscriberTest.java
+++ b/retrofit2/src/test/java/com/linecorp/armeria/client/retrofit2/BlockingCallSubscriberTest.java
@@ -21,6 +21,7 @@
import java.io.IOException;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.reactivestreams.Subscription;
@@ -30,7 +31,6 @@
import com.linecorp.armeria.common.HttpHeaderNames;
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import okhttp3.Call;
import okhttp3.Callback;
diff --git a/retrofit2/src/test/java/com/linecorp/armeria/client/retrofit2/StreamingCallSubscriberTest.java b/retrofit2/src/test/java/com/linecorp/armeria/client/retrofit2/StreamingCallSubscriberTest.java
index 633fc0e9a0d..77097e49108 100644
--- a/retrofit2/src/test/java/com/linecorp/armeria/client/retrofit2/StreamingCallSubscriberTest.java
+++ b/retrofit2/src/test/java/com/linecorp/armeria/client/retrofit2/StreamingCallSubscriberTest.java
@@ -26,6 +26,7 @@
import java.io.IOException;
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.reactivestreams.Subscription;
@@ -38,7 +39,6 @@
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import okhttp3.Call;
import okhttp3.Callback;
diff --git a/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/RequestContextAssembly.java b/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/RequestContextAssembly.java
index 46224738fc1..b89392d4e0f 100644
--- a/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/RequestContextAssembly.java
+++ b/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/RequestContextAssembly.java
@@ -18,10 +18,11 @@
import java.util.concurrent.Callable;
+import org.jspecify.annotations.Nullable;
+
import com.google.errorprone.annotations.concurrent.GuardedBy;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import io.reactivex.Completable;
import io.reactivex.Flowable;
diff --git a/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/RequestContextCompletableObserver.java b/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/RequestContextCompletableObserver.java
index b826c69611f..1ac69648106 100644
--- a/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/RequestContextCompletableObserver.java
+++ b/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/RequestContextCompletableObserver.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.common.rxjava2;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.SafeCloseable;
import io.reactivex.CompletableObserver;
diff --git a/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/RequestContextMaybeObserver.java b/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/RequestContextMaybeObserver.java
index 3014e971df7..98096c4485a 100644
--- a/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/RequestContextMaybeObserver.java
+++ b/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/RequestContextMaybeObserver.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.common.rxjava2;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.SafeCloseable;
import io.reactivex.MaybeObserver;
diff --git a/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/RequestContextSingleObserver.java b/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/RequestContextSingleObserver.java
index d98e3776feb..ef64dce1cd9 100644
--- a/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/RequestContextSingleObserver.java
+++ b/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/RequestContextSingleObserver.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.common.rxjava2;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.SafeCloseable;
import io.reactivex.SingleObserver;
diff --git a/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/package-info.java b/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/package-info.java
index ee7206f9706..bbebc270066 100644
--- a/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/package-info.java
+++ b/rxjava2/src/main/java/com/linecorp/armeria/common/rxjava2/package-info.java
@@ -17,7 +17,7 @@
/**
* RxJava2 plugins to help keep {@link com.linecorp.armeria.common.RequestContext} during RxJava2 Operations.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.rxjava2;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/rxjava2/src/main/java/com/linecorp/armeria/internal/server/rxjava2/ObservableResponseConverterFunctionProvider.java b/rxjava2/src/main/java/com/linecorp/armeria/internal/server/rxjava2/ObservableResponseConverterFunctionProvider.java
index 74490726bba..77f2d074235 100644
--- a/rxjava2/src/main/java/com/linecorp/armeria/internal/server/rxjava2/ObservableResponseConverterFunctionProvider.java
+++ b/rxjava2/src/main/java/com/linecorp/armeria/internal/server/rxjava2/ObservableResponseConverterFunctionProvider.java
@@ -20,7 +20,8 @@
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.server.annotation.DelegatingResponseConverterFunctionProvider;
import com.linecorp.armeria.server.annotation.ResponseConverterFunction;
diff --git a/rxjava2/src/main/java/com/linecorp/armeria/internal/server/rxjava2/package-info.java b/rxjava2/src/main/java/com/linecorp/armeria/internal/server/rxjava2/package-info.java
index 26941b9c383..0370d2e2ddf 100644
--- a/rxjava2/src/main/java/com/linecorp/armeria/internal/server/rxjava2/package-info.java
+++ b/rxjava2/src/main/java/com/linecorp/armeria/internal/server/rxjava2/package-info.java
@@ -14,7 +14,7 @@
* under the License.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.server.rxjava2;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/rxjava2/src/main/java/com/linecorp/armeria/server/rxjava2/ObservableResponseConverterFunction.java b/rxjava2/src/main/java/com/linecorp/armeria/server/rxjava2/ObservableResponseConverterFunction.java
index 780a77eb8d6..9e7d82cf26b 100644
--- a/rxjava2/src/main/java/com/linecorp/armeria/server/rxjava2/ObservableResponseConverterFunction.java
+++ b/rxjava2/src/main/java/com/linecorp/armeria/server/rxjava2/ObservableResponseConverterFunction.java
@@ -22,11 +22,12 @@
import java.lang.reflect.Type;
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.ServiceRequestContext;
import com.linecorp.armeria.server.annotation.ExceptionHandlerFunction;
import com.linecorp.armeria.server.annotation.ResponseConverterFunction;
diff --git a/rxjava2/src/main/java/com/linecorp/armeria/server/rxjava2/package-info.java b/rxjava2/src/main/java/com/linecorp/armeria/server/rxjava2/package-info.java
index 5da5769db52..d72346fde49 100644
--- a/rxjava2/src/main/java/com/linecorp/armeria/server/rxjava2/package-info.java
+++ b/rxjava2/src/main/java/com/linecorp/armeria/server/rxjava2/package-info.java
@@ -20,7 +20,7 @@
* {@link com.linecorp.armeria.common.HttpResponse} when the {@link io.reactivex.ObservableSource}
* is returned by an annotated HTTP service.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.rxjava2;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/rxjava2/src/test/java/com/linecorp/armeria/server/rxjava2/ObservableResponseConverterFunctionProviderTest.java b/rxjava2/src/test/java/com/linecorp/armeria/server/rxjava2/ObservableResponseConverterFunctionProviderTest.java
index b409299edf3..4583d1e3628 100644
--- a/rxjava2/src/test/java/com/linecorp/armeria/server/rxjava2/ObservableResponseConverterFunctionProviderTest.java
+++ b/rxjava2/src/test/java/com/linecorp/armeria/server/rxjava2/ObservableResponseConverterFunctionProviderTest.java
@@ -22,6 +22,7 @@
import java.util.Iterator;
import java.util.ServiceLoader;
+import org.jspecify.annotations.Nullable;
import org.junit.Test;
import com.linecorp.armeria.common.HttpHeaders;
@@ -29,7 +30,6 @@
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.server.rxjava2.ObservableResponseConverterFunctionProvider;
import com.linecorp.armeria.server.ServiceRequestContext;
import com.linecorp.armeria.server.annotation.DelegatingResponseConverterFunctionProvider;
diff --git a/rxjava2/src/test/java/com/linecorp/armeria/server/rxjava2/ObservableResponseConverterFunctionTest.java b/rxjava2/src/test/java/com/linecorp/armeria/server/rxjava2/ObservableResponseConverterFunctionTest.java
index 698511612cb..4b84a08605b 100644
--- a/rxjava2/src/test/java/com/linecorp/armeria/server/rxjava2/ObservableResponseConverterFunctionTest.java
+++ b/rxjava2/src/test/java/com/linecorp/armeria/server/rxjava2/ObservableResponseConverterFunctionTest.java
@@ -29,6 +29,7 @@
import java.util.Iterator;
import java.util.concurrent.atomic.AtomicBoolean;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.reactivestreams.Publisher;
@@ -47,7 +48,6 @@
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.ResponseEntity;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.testing.AnticipatedException;
import com.linecorp.armeria.internal.testing.GenerateNativeImageTrace;
import com.linecorp.armeria.server.ServerBuilder;
diff --git a/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/RequestContextAssembly.java b/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/RequestContextAssembly.java
index 92799f8617e..d75bc3b0381 100644
--- a/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/RequestContextAssembly.java
+++ b/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/RequestContextAssembly.java
@@ -16,10 +16,11 @@
package com.linecorp.armeria.common.rxjava3;
+import org.jspecify.annotations.Nullable;
+
import com.google.errorprone.annotations.concurrent.GuardedBy;
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import io.reactivex.rxjava3.core.Completable;
import io.reactivex.rxjava3.core.Flowable;
diff --git a/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/RequestContextCompletableObserver.java b/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/RequestContextCompletableObserver.java
index 09c0219f1c5..da8030c2e38 100644
--- a/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/RequestContextCompletableObserver.java
+++ b/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/RequestContextCompletableObserver.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.common.rxjava3;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.SafeCloseable;
import io.reactivex.rxjava3.core.CompletableObserver;
diff --git a/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/RequestContextMaybeObserver.java b/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/RequestContextMaybeObserver.java
index 2edfa55d1b7..5a35c42871b 100644
--- a/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/RequestContextMaybeObserver.java
+++ b/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/RequestContextMaybeObserver.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.common.rxjava3;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.SafeCloseable;
import io.reactivex.rxjava3.core.MaybeObserver;
diff --git a/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/RequestContextSingleObserver.java b/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/RequestContextSingleObserver.java
index 6bf9b3bd0ef..13582007fe7 100644
--- a/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/RequestContextSingleObserver.java
+++ b/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/RequestContextSingleObserver.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.common.rxjava3;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.SafeCloseable;
import io.reactivex.rxjava3.core.SingleObserver;
diff --git a/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/package-info.java b/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/package-info.java
index 7b6f0ef705d..c3ccb3b745e 100644
--- a/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/package-info.java
+++ b/rxjava3/src/main/java/com/linecorp/armeria/common/rxjava3/package-info.java
@@ -17,7 +17,7 @@
/**
* RxJava3 plugins to help keep {@link com.linecorp.armeria.common.RequestContext} during RxJava3 Operations.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.rxjava3;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/rxjava3/src/main/java/com/linecorp/armeria/internal/server/rxjava3/ObservableResponseConverterFunctionProvider.java b/rxjava3/src/main/java/com/linecorp/armeria/internal/server/rxjava3/ObservableResponseConverterFunctionProvider.java
index e71c7d313bd..207a0947179 100644
--- a/rxjava3/src/main/java/com/linecorp/armeria/internal/server/rxjava3/ObservableResponseConverterFunctionProvider.java
+++ b/rxjava3/src/main/java/com/linecorp/armeria/internal/server/rxjava3/ObservableResponseConverterFunctionProvider.java
@@ -18,7 +18,8 @@
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.server.annotation.DelegatingResponseConverterFunctionProvider;
import com.linecorp.armeria.server.annotation.ResponseConverterFunction;
diff --git a/rxjava3/src/main/java/com/linecorp/armeria/internal/server/rxjava3/package-info.java b/rxjava3/src/main/java/com/linecorp/armeria/internal/server/rxjava3/package-info.java
index 9cb049bd774..42e982479de 100644
--- a/rxjava3/src/main/java/com/linecorp/armeria/internal/server/rxjava3/package-info.java
+++ b/rxjava3/src/main/java/com/linecorp/armeria/internal/server/rxjava3/package-info.java
@@ -14,7 +14,7 @@
* under the License.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.server.rxjava3;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/rxjava3/src/main/java/com/linecorp/armeria/server/rxjava3/ObservableResponseConverterFunction.java b/rxjava3/src/main/java/com/linecorp/armeria/server/rxjava3/ObservableResponseConverterFunction.java
index c01f88c8692..17233dbee69 100644
--- a/rxjava3/src/main/java/com/linecorp/armeria/server/rxjava3/ObservableResponseConverterFunction.java
+++ b/rxjava3/src/main/java/com/linecorp/armeria/server/rxjava3/ObservableResponseConverterFunction.java
@@ -23,11 +23,12 @@
import java.util.concurrent.CompletionStage;
import java.util.function.BiFunction;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.ServiceRequestContext;
import com.linecorp.armeria.server.annotation.ExceptionHandlerFunction;
import com.linecorp.armeria.server.annotation.ResponseConverterFunction;
diff --git a/rxjava3/src/main/java/com/linecorp/armeria/server/rxjava3/package-info.java b/rxjava3/src/main/java/com/linecorp/armeria/server/rxjava3/package-info.java
index 16865ee7c12..34a274fb978 100644
--- a/rxjava3/src/main/java/com/linecorp/armeria/server/rxjava3/package-info.java
+++ b/rxjava3/src/main/java/com/linecorp/armeria/server/rxjava3/package-info.java
@@ -20,7 +20,7 @@
* {@link com.linecorp.armeria.common.HttpResponse} when the {@link io.reactivex.rxjava3.core.ObservableSource}
* is returned by an annotated HTTP service.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.rxjava3;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/rxjava3/src/test/java/com/linecorp/armeria/server/rxjava3/ObservableResponseConverterFunctionProviderTest.java b/rxjava3/src/test/java/com/linecorp/armeria/server/rxjava3/ObservableResponseConverterFunctionProviderTest.java
index fa4b1d419af..83512ed5351 100644
--- a/rxjava3/src/test/java/com/linecorp/armeria/server/rxjava3/ObservableResponseConverterFunctionProviderTest.java
+++ b/rxjava3/src/test/java/com/linecorp/armeria/server/rxjava3/ObservableResponseConverterFunctionProviderTest.java
@@ -22,6 +22,7 @@
import java.util.Iterator;
import java.util.ServiceLoader;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import com.linecorp.armeria.common.HttpHeaders;
@@ -29,7 +30,6 @@
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.server.rxjava3.ObservableResponseConverterFunctionProvider;
import com.linecorp.armeria.server.ServiceRequestContext;
import com.linecorp.armeria.server.annotation.DelegatingResponseConverterFunctionProvider;
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/HttpPostBindingUtil.java b/saml/src/main/java/com/linecorp/armeria/server/saml/HttpPostBindingUtil.java
index 8647217deaa..8a04a2538bd 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/HttpPostBindingUtil.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/HttpPostBindingUtil.java
@@ -25,6 +25,7 @@
import java.nio.charset.StandardCharsets;
import java.util.Base64;
+import org.jspecify.annotations.Nullable;
import org.opensaml.messaging.context.MessageContext;
import org.opensaml.saml.common.SAMLObject;
import org.opensaml.saml.common.SignableSAMLObject;
@@ -37,7 +38,6 @@
import com.linecorp.armeria.common.AggregatedHttpRequest;
import com.linecorp.armeria.common.HttpData;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.saml.SamlService.SamlParameters;
/**
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/HttpRedirectBindingUtil.java b/saml/src/main/java/com/linecorp/armeria/server/saml/HttpRedirectBindingUtil.java
index 4b8a610bd2e..609ac664305 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/HttpRedirectBindingUtil.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/HttpRedirectBindingUtil.java
@@ -31,6 +31,7 @@
import java.util.zip.Inflater;
import java.util.zip.InflaterOutputStream;
+import org.jspecify.annotations.Nullable;
import org.opensaml.core.xml.XMLObject;
import org.opensaml.core.xml.io.MarshallingException;
import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -53,7 +54,6 @@
import com.linecorp.armeria.common.QueryParams;
import com.linecorp.armeria.common.QueryParamsBuilder;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.saml.SamlService.SamlParameters;
import io.netty.handler.codec.http.HttpHeaderValues;
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/InvalidSamlRequestException.java b/saml/src/main/java/com/linecorp/armeria/server/saml/InvalidSamlRequestException.java
index 72ee62e89fa..16b5fcb8dd0 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/InvalidSamlRequestException.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/InvalidSamlRequestException.java
@@ -15,7 +15,7 @@
*/
package com.linecorp.armeria.server.saml;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Indicates that a SAML request is not valid.
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/KeyStoreCredentialResolverBuilder.java b/saml/src/main/java/com/linecorp/armeria/server/saml/KeyStoreCredentialResolverBuilder.java
index 2a06aa0702d..c132c54a19a 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/KeyStoreCredentialResolverBuilder.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/KeyStoreCredentialResolverBuilder.java
@@ -29,11 +29,10 @@
import java.util.HashMap;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
import org.opensaml.security.credential.CredentialResolver;
import org.opensaml.security.credential.impl.KeyStoreCredentialResolver;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* A builder class which creates a new {@link KeyStoreCredentialResolver} instance.
*/
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlAssertionConsumerConfigBuilder.java b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlAssertionConsumerConfigBuilder.java
index 141428ae726..8bf171e0322 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlAssertionConsumerConfigBuilder.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlAssertionConsumerConfigBuilder.java
@@ -18,7 +18,7 @@
import static com.google.common.base.Preconditions.checkState;
import static java.util.Objects.requireNonNull;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A builder which builds a {@link SamlAssertionConsumerConfig}.
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlAssertionConsumerFunction.java b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlAssertionConsumerFunction.java
index b8c3da9b8b9..19a10e795dc 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlAssertionConsumerFunction.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlAssertionConsumerFunction.java
@@ -25,6 +25,7 @@
import java.util.concurrent.TimeUnit;
import org.joda.time.DateTime;
+import org.jspecify.annotations.Nullable;
import org.opensaml.messaging.context.MessageContext;
import org.opensaml.saml.common.messaging.context.SAMLBindingContext;
import org.opensaml.saml.saml2.core.Assertion;
@@ -51,7 +52,6 @@
import com.linecorp.armeria.common.AggregatedHttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.RequestTarget;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.ServiceRequestContext;
/**
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlDecorator.java b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlDecorator.java
index e02baf91bb4..27de0ec92bf 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlDecorator.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlDecorator.java
@@ -27,6 +27,7 @@
import java.util.concurrent.CompletionStage;
import org.joda.time.DateTime;
+import org.jspecify.annotations.Nullable;
import org.opensaml.messaging.context.MessageContext;
import org.opensaml.saml.common.messaging.context.SAMLBindingContext;
import org.opensaml.saml.saml2.core.AuthnContext;
@@ -45,7 +46,6 @@
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.MediaType;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.server.HttpService;
import com.linecorp.armeria.server.Server;
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlEndpoint.java b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlEndpoint.java
index 7e1af0b2835..7cf1d8e9bc6 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlEndpoint.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlEndpoint.java
@@ -23,10 +23,11 @@
import java.net.URI;
import java.net.URISyntaxException;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
/**
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlException.java b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlException.java
index d0131f9f187..87960b57b9b 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlException.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlException.java
@@ -15,8 +15,9 @@
*/
package com.linecorp.armeria.server.saml;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.Flags;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* Indicates that an error occurred while processing a SAML request.
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlIdentityProviderConfig.java b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlIdentityProviderConfig.java
index 00a3e8da7ab..34169ef8b3f 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlIdentityProviderConfig.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlIdentityProviderConfig.java
@@ -17,13 +17,12 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
import org.opensaml.saml.saml2.core.NameIDPolicy;
import org.opensaml.security.credential.Credential;
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* A configuration for an identity provider.
*/
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlIdentityProviderConfigBuilder.java b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlIdentityProviderConfigBuilder.java
index 43b36adfa90..f506a9b73d9 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlIdentityProviderConfigBuilder.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlIdentityProviderConfigBuilder.java
@@ -19,10 +19,10 @@
import static com.google.common.base.Preconditions.checkState;
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
import org.opensaml.saml.saml2.core.AuthnRequest;
import org.opensaml.security.credential.Credential;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.saml.SamlServiceProviderBuilder.CredentialResolverAdapter;
/**
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlInitializer.java b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlInitializer.java
index 7809ddd8000..0aad5f67c0b 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlInitializer.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlInitializer.java
@@ -15,13 +15,12 @@
*/
package com.linecorp.armeria.server.saml;
+import org.jspecify.annotations.Nullable;
import org.opensaml.core.config.InitializationService;
import org.opensaml.xmlsec.config.impl.JavaCryptoValidationInitializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* A utility class which initializes the OpenSAML library.
* See OpenSAML 3 for more information.
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlMessageUtil.java b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlMessageUtil.java
index 5ac8d647883..3047ea02133 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlMessageUtil.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlMessageUtil.java
@@ -23,6 +23,7 @@
import javax.xml.namespace.QName;
+import org.jspecify.annotations.Nullable;
import org.opensaml.core.xml.XMLObject;
import org.opensaml.core.xml.XMLObjectBuilderFactory;
import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
@@ -48,8 +49,6 @@
import net.shibboleth.utilities.java.support.xml.ParserPool;
import net.shibboleth.utilities.java.support.xml.XMLParserException;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* A utility class for SAML messages.
*/
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlMetadataServiceFunction.java b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlMetadataServiceFunction.java
index 2c48254696a..d5635aeb1a4 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlMetadataServiceFunction.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlMetadataServiceFunction.java
@@ -26,6 +26,7 @@
import java.util.concurrent.ConcurrentMap;
import java.util.stream.Collectors;
+import org.jspecify.annotations.Nullable;
import org.opensaml.saml.common.SAMLObjectBuilder;
import org.opensaml.saml.common.xml.SAMLConstants;
import org.opensaml.saml.saml2.metadata.AssertionConsumerService;
@@ -54,7 +55,6 @@
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.ServiceRequestContext;
/**
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlPortConfigAutoFiller.java b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlPortConfigAutoFiller.java
index 9381cc7b37c..57f4cc01072 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlPortConfigAutoFiller.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlPortConfigAutoFiller.java
@@ -18,7 +18,8 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicBoolean;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.server.Server;
import com.linecorp.armeria.server.ServerListenerAdapter;
import com.linecorp.armeria.server.ServerPort;
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlPortConfigBuilder.java b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlPortConfigBuilder.java
index 68af63f9c9b..543c7ee33d8 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlPortConfigBuilder.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlPortConfigBuilder.java
@@ -19,10 +19,11 @@
import static com.linecorp.armeria.server.saml.SamlPortConfig.validatePort;
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.ServerPort;
/**
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlService.java b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlService.java
index f9ab8f3b44d..e0fd97cb038 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlService.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlService.java
@@ -24,6 +24,7 @@
import java.util.Set;
import java.util.concurrent.CompletionStage;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -39,7 +40,6 @@
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.QueryParams;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.server.HttpResponseException;
import com.linecorp.armeria.server.HttpService;
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlServiceProvider.java b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlServiceProvider.java
index b89ca9f2bb9..5fa9803c7dc 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlServiceProvider.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlServiceProvider.java
@@ -21,6 +21,7 @@
import java.util.Map;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
import org.opensaml.security.credential.Credential;
import org.opensaml.xmlsec.signature.support.SignatureConstants;
@@ -29,7 +30,6 @@
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.HttpService;
import com.linecorp.armeria.server.HttpServiceWithRoutes;
import com.linecorp.armeria.server.Route;
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlServiceProviderBuilder.java b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlServiceProviderBuilder.java
index ffb8570a164..02903bb2520 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlServiceProviderBuilder.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlServiceProviderBuilder.java
@@ -36,6 +36,7 @@
import java.util.concurrent.CompletionStage;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
import org.opensaml.core.criterion.EntityIdCriterion;
import org.opensaml.messaging.context.MessageContext;
import org.opensaml.saml.common.messaging.context.SAMLBindingContext;
@@ -58,7 +59,6 @@
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.common.util.UnmodifiableFuture;
import com.linecorp.armeria.server.Server;
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlSingleLogoutFunction.java b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlSingleLogoutFunction.java
index abdb516bc11..fe5e6226094 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlSingleLogoutFunction.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlSingleLogoutFunction.java
@@ -27,6 +27,7 @@
import java.util.Map;
import org.joda.time.DateTime;
+import org.jspecify.annotations.Nullable;
import org.opensaml.messaging.context.MessageContext;
import org.opensaml.saml.saml2.core.Issuer;
import org.opensaml.saml.saml2.core.LogoutRequest;
@@ -42,7 +43,6 @@
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.MediaType;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.ServiceRequestContext;
/**
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlSingleSignOnHandler.java b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlSingleSignOnHandler.java
index f40425a85e1..743e46444f8 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlSingleSignOnHandler.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlSingleSignOnHandler.java
@@ -17,6 +17,7 @@
import java.util.concurrent.CompletionStage;
+import org.jspecify.annotations.Nullable;
import org.opensaml.messaging.context.MessageContext;
import org.opensaml.saml.saml2.core.AuthnRequest;
import org.opensaml.saml.saml2.core.Response;
@@ -27,7 +28,6 @@
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.Request;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.UnmodifiableFuture;
import com.linecorp.armeria.server.ServiceRequestContext;
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlUtil.java b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlUtil.java
index dd42c885010..f8a44fe7d68 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/SamlUtil.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/SamlUtil.java
@@ -17,11 +17,10 @@
import java.util.function.Predicate;
+import org.jspecify.annotations.Nullable;
import org.opensaml.saml.saml2.core.NameID;
import org.opensaml.saml.saml2.core.Response;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* A utility class which helps a user to easily handle a SAML message.
*/
diff --git a/saml/src/main/java/com/linecorp/armeria/server/saml/package-info.java b/saml/src/main/java/com/linecorp/armeria/server/saml/package-info.java
index 6a6b26833ac..4b9ebf61215 100644
--- a/saml/src/main/java/com/linecorp/armeria/server/saml/package-info.java
+++ b/saml/src/main/java/com/linecorp/armeria/server/saml/package-info.java
@@ -18,7 +18,7 @@
* SAML-based single sign-on
* service.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.saml;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/saml/src/test/java/com/linecorp/armeria/server/saml/SamlServiceProviderTest.java b/saml/src/test/java/com/linecorp/armeria/server/saml/SamlServiceProviderTest.java
index fb68ce4e809..13f5fe5a40f 100644
--- a/saml/src/test/java/com/linecorp/armeria/server/saml/SamlServiceProviderTest.java
+++ b/saml/src/test/java/com/linecorp/armeria/server/saml/SamlServiceProviderTest.java
@@ -52,6 +52,7 @@
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -105,7 +106,6 @@
import com.linecorp.armeria.common.QueryParams;
import com.linecorp.armeria.common.QueryParamsBuilder;
import com.linecorp.armeria.common.RequestHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.UnmodifiableFuture;
import com.linecorp.armeria.internal.common.util.SelfSignedCertificate;
import com.linecorp.armeria.internal.testing.GenerateNativeImageTrace;
diff --git a/settings/checkstyle/checkstyle-suppressions.xml b/settings/checkstyle/checkstyle-suppressions.xml
index 2b32f251f0d..a679724de14 100644
--- a/settings/checkstyle/checkstyle-suppressions.xml
+++ b/settings/checkstyle/checkstyle-suppressions.xml
@@ -9,8 +9,8 @@
-
-
+
+
diff --git a/settings/checkstyle/checkstyle.xml b/settings/checkstyle/checkstyle.xml
index 473cb3182d5..a634f44c6be 100644
--- a/settings/checkstyle/checkstyle.xml
+++ b/settings/checkstyle/checkstyle.xml
@@ -42,13 +42,13 @@
-
+
-
-
+
+
-
+
diff --git a/site-new/src/content/docs/tutorials/grpc/05-implement-update.mdx b/site-new/src/content/docs/tutorials/grpc/05-implement-update.mdx
index e2230949922..958fa1b7342 100644
--- a/site-new/src/content/docs/tutorials/grpc/05-implement-update.mdx
+++ b/site-new/src/content/docs/tutorials/grpc/05-implement-update.mdx
@@ -51,8 +51,9 @@ final class BlogNotFoundException extends IllegalStateException {
```java title="GrpcExceptionHandler.java"
package example.armeria.server.blog.grpc;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.RequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcExceptionHandlerFunction;
import io.grpc.Metadata;
diff --git a/site-new/src/content/docs/tutorials/rest/04-implement-create.mdx b/site-new/src/content/docs/tutorials/rest/04-implement-create.mdx
index 1e004a96530..e4db1b9ea5a 100644
--- a/site-new/src/content/docs/tutorials/rest/04-implement-create.mdx
+++ b/site-new/src/content/docs/tutorials/rest/04-implement-create.mdx
@@ -92,9 +92,10 @@ final class BlogPostRequestConverter implements RequestConverterFunction {
3. Customize the default `convertRequest()` method as follows.
```java title="BlogPostRequestConverter.java" {10-22}
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.server.ServiceRequestContext;
import com.linecorp.armeria.common.AggregatedHttpRequest;
-import com.linecorp.armeria.common.annotation.Nullable;
import java.lang.reflect.ParameterizedType;
final class BlogPostRequestConverter implements RequestConverterFunction {
diff --git a/spring/boot2-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/AbstractServerHttpResponseVersionSpecific.java b/spring/boot2-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/AbstractServerHttpResponseVersionSpecific.java
index 293401a9040..ce6d1465b38 100644
--- a/spring/boot2-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/AbstractServerHttpResponseVersionSpecific.java
+++ b/spring/boot2-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/AbstractServerHttpResponseVersionSpecific.java
@@ -15,11 +15,10 @@
*/
package com.linecorp.armeria.spring.web.reactive;
+import org.jspecify.annotations.Nullable;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.http.HttpStatus;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* A version specific {@link AbstractServerHttpResponse} which implements the APIs that only exists in
* Spring 5.
diff --git a/spring/boot2-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/package-info.java b/spring/boot2-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/package-info.java
index 57de462a9b5..74156655e88 100644
--- a/spring/boot2-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/package-info.java
+++ b/spring/boot2-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/package-info.java
@@ -17,7 +17,7 @@
/**
* Spring Boot integration based on reactive server stack.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.spring.web.reactive;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/spring/boot3-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/HealthConfiguration.java b/spring/boot3-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/HealthConfiguration.java
index 4dccbc3b103..17f991dad2a 100644
--- a/spring/boot3-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/HealthConfiguration.java
+++ b/spring/boot3-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/HealthConfiguration.java
@@ -30,6 +30,7 @@
import java.util.Set;
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointProperties;
@@ -64,7 +65,6 @@
import com.google.common.collect.ImmutableMap;
import com.linecorp.armeria.common.HttpStatus;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.ServerBuilder;
import com.linecorp.armeria.server.cors.CorsServiceBuilder;
import com.linecorp.armeria.spring.ArmeriaServerConfigurator;
diff --git a/spring/boot3-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/package-info.java b/spring/boot3-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/package-info.java
index cd675af0879..7f85fe6a1af 100644
--- a/spring/boot3-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/package-info.java
+++ b/spring/boot3-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/package-info.java
@@ -17,7 +17,7 @@
/**
* Spring Boot actuator integration.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.spring.actuate;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/spring/boot3-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/package-info.java b/spring/boot3-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/package-info.java
index 3398656c390..ce285206bb1 100644
--- a/spring/boot3-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/package-info.java
+++ b/spring/boot3-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/package-info.java
@@ -17,7 +17,7 @@
/**
* Spring Boot integration.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.spring.web;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/spring/boot3-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/package-info.java b/spring/boot3-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/package-info.java
index 57de462a9b5..74156655e88 100644
--- a/spring/boot3-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/package-info.java
+++ b/spring/boot3-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/package-info.java
@@ -17,7 +17,7 @@
/**
* Spring Boot integration based on reactive server stack.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.spring.web.reactive;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/spring/boot4-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/ArmeriaSpringActuatorAutoConfiguration.java b/spring/boot4-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/ArmeriaSpringActuatorAutoConfiguration.java
index e971bb306e9..76d0a79e856 100644
--- a/spring/boot4-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/ArmeriaSpringActuatorAutoConfiguration.java
+++ b/spring/boot4-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/ArmeriaSpringActuatorAutoConfiguration.java
@@ -28,6 +28,7 @@
import java.util.Map;
import java.util.Set;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.BeanFactory;
@@ -67,7 +68,6 @@
import com.linecorp.armeria.common.HttpMethod;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.MediaType;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.HttpService;
import com.linecorp.armeria.server.Route;
import com.linecorp.armeria.server.ServerBuilder;
diff --git a/spring/boot4-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/CorsEndpointProperties.java b/spring/boot4-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/CorsEndpointProperties.java
index d23b4d3b0c1..f6fc0d113cc 100644
--- a/spring/boot4-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/CorsEndpointProperties.java
+++ b/spring/boot4-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/CorsEndpointProperties.java
@@ -36,11 +36,10 @@
import java.util.ArrayList;
import java.util.List;
+import org.jspecify.annotations.Nullable;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.convert.DurationUnit;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* Fork of MappingWebEndpointPathMapper.
* This class doesn't follow the Armeria code convention because maintenance is easier if you use the same code
diff --git a/spring/boot4-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/WebOperationService.java b/spring/boot4-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/WebOperationService.java
index ea910f4f04f..87cef5f9dbd 100644
--- a/spring/boot4-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/WebOperationService.java
+++ b/spring/boot4-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/WebOperationService.java
@@ -34,6 +34,7 @@
import java.util.function.Function;
import java.util.regex.Pattern;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.actuate.endpoint.InvocationContext;
@@ -62,7 +63,6 @@
import com.linecorp.armeria.common.QueryParams;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.ResponseHeadersBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.server.HttpService;
import com.linecorp.armeria.server.RoutingContext;
diff --git a/spring/boot4-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/package-info.java b/spring/boot4-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/package-info.java
index cd675af0879..7f85fe6a1af 100644
--- a/spring/boot4-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/package-info.java
+++ b/spring/boot4-actuator-autoconfigure/src/main/java/com/linecorp/armeria/spring/actuate/package-info.java
@@ -17,7 +17,7 @@
/**
* Spring Boot actuator integration.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.spring.actuate;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/ArmeriaConfigurationNetUtil.java b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/ArmeriaConfigurationNetUtil.java
index 958686f89b6..75a1ef24b69 100644
--- a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/ArmeriaConfigurationNetUtil.java
+++ b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/ArmeriaConfigurationNetUtil.java
@@ -26,10 +26,11 @@
import java.util.Enumeration;
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.util.PortUtil;
import com.linecorp.armeria.server.ServerBuilder;
import com.linecorp.armeria.server.ServerPort;
diff --git a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/ArmeriaConfigurationSettingsUtil.java b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/ArmeriaConfigurationSettingsUtil.java
index 039c8c484ac..ffdf9f8a992 100644
--- a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/ArmeriaConfigurationSettingsUtil.java
+++ b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/ArmeriaConfigurationSettingsUtil.java
@@ -21,9 +21,10 @@
import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.primitives.Ints;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.Server;
import com.linecorp.armeria.server.ServerBuilder;
import com.linecorp.armeria.server.logging.AccessLogWriter;
diff --git a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/ArmeriaConfigurationUtil.java b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/ArmeriaConfigurationUtil.java
index 76855564bb4..0ba7114ba02 100644
--- a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/ArmeriaConfigurationUtil.java
+++ b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/ArmeriaConfigurationUtil.java
@@ -41,6 +41,7 @@
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.TrustManagerFactory;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.BeanFactory;
@@ -60,7 +61,6 @@
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.metric.MeterIdPrefixFunction;
import com.linecorp.armeria.server.HttpService;
import com.linecorp.armeria.server.ServerBuilder;
@@ -434,7 +434,7 @@ private static KeyStore loadKeyStore(
* Configures a decorator for encoding the content of the HTTP responses sent from the server.
*/
public static Function super HttpService, EncodingService> contentEncodingDecorator(
- @Nullable String[] mimeTypes, @Nullable String[] excludedUserAgents,
+ String @Nullable [] mimeTypes, String @Nullable [] excludedUserAgents,
int minBytesToForceChunkedAndEncoding) {
final Predicate encodableContentTypePredicate;
if (mimeTypes == null || mimeTypes.length == 0) {
diff --git a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/AthenzSupport.java b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/AthenzSupport.java
index 7b0e749743c..f7643a051b8 100644
--- a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/AthenzSupport.java
+++ b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/AthenzSupport.java
@@ -24,8 +24,9 @@
import java.time.Duration;
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.DependencyInjector;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.ServerBuilder;
import com.linecorp.armeria.spring.AthenzConfig;
diff --git a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/ThriftServiceUtils.java b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/ThriftServiceUtils.java
index cdb043074fb..2f0f1a08772 100644
--- a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/ThriftServiceUtils.java
+++ b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/ThriftServiceUtils.java
@@ -25,9 +25,10 @@
import java.util.Map;
import java.util.Set;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableSet;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.HttpService;
import com.linecorp.armeria.server.Server;
import com.linecorp.armeria.server.thrift.THttpService;
diff --git a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/package-info.java b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/package-info.java
index 10436cbcbc4..241bc073779 100644
--- a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/package-info.java
+++ b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/internal/spring/package-info.java
@@ -17,7 +17,7 @@
/**
* Internal classes for Spring Boot integration.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.spring;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/AbstractArmeriaAutoConfiguration.java b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/AbstractArmeriaAutoConfiguration.java
index c576410fc5b..be49da1148d 100644
--- a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/AbstractArmeriaAutoConfiguration.java
+++ b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/AbstractArmeriaAutoConfiguration.java
@@ -25,6 +25,7 @@
import java.util.Optional;
import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Value;
@@ -36,7 +37,6 @@
import com.linecorp.armeria.common.DependencyInjector;
import com.linecorp.armeria.common.Flags;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.metric.MeterIdPrefixFunction;
import com.linecorp.armeria.server.Server;
import com.linecorp.armeria.server.ServerBuilder;
diff --git a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/AbstractArmeriaBeanPostProcessor.java b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/AbstractArmeriaBeanPostProcessor.java
index 93be6c0b808..fa8ef7481d4 100644
--- a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/AbstractArmeriaBeanPostProcessor.java
+++ b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/AbstractArmeriaBeanPostProcessor.java
@@ -29,6 +29,7 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
+import org.jspecify.annotations.Nullable;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.BeanFactory;
@@ -42,7 +43,6 @@
import com.google.common.collect.ImmutableList.Builder;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.Server;
/**
diff --git a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/ArmeriaSettings.java b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/ArmeriaSettings.java
index 974166aee27..0cac2fe56ad 100644
--- a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/ArmeriaSettings.java
+++ b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/ArmeriaSettings.java
@@ -20,6 +20,7 @@
import java.util.ArrayList;
import java.util.List;
+import org.jspecify.annotations.Nullable;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;
import org.springframework.validation.annotation.Validated;
@@ -29,7 +30,6 @@
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.HttpService;
import com.linecorp.armeria.server.Server;
import com.linecorp.armeria.server.ServerBuilder;
@@ -243,8 +243,7 @@ public static class Compression {
/**
* The {@code "user-agent"} header values which are not applicable for the HTTP content encoding.
*/
- @Nullable
- private String[] excludedUserAgents;
+ private String @Nullable [] excludedUserAgents;
/**
* The minimum bytes for encoding the content of an HTTP response.
@@ -283,8 +282,7 @@ public void setMimeTypes(String[] mimeTypes) {
* Returns the {@code "user-agent"} header values which are not applicable for the HTTP content
* encoding.
*/
- @Nullable
- public String[] getExcludedUserAgents() {
+ public String @Nullable [] getExcludedUserAgents() {
return excludedUserAgents;
}
diff --git a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/AthenzConfig.java b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/AthenzConfig.java
index b1ad8e7be02..6624032c21a 100644
--- a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/AthenzConfig.java
+++ b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/AthenzConfig.java
@@ -24,9 +24,10 @@
import java.util.ArrayList;
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/DropwizardSupport.java b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/DropwizardSupport.java
index 5b0f84452b0..01d42c1c7a1 100644
--- a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/DropwizardSupport.java
+++ b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/DropwizardSupport.java
@@ -17,13 +17,13 @@
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
+
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.json.MetricsModule;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
-import com.linecorp.armeria.common.annotation.Nullable;
-
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.dropwizard.DropwizardMeterRegistry;
diff --git a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/InternalServices.java b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/InternalServices.java
index 00b46fdecee..c6cb8db6955 100644
--- a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/InternalServices.java
+++ b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/InternalServices.java
@@ -21,6 +21,7 @@
import java.net.InetAddress;
import java.util.List;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
@@ -29,7 +30,6 @@
import com.google.common.base.Strings;
import com.linecorp.armeria.client.ClientFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.common.util.PortUtil;
import com.linecorp.armeria.internal.spring.ArmeriaConfigurationUtil;
diff --git a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/PrometheusLegacySupport.java b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/PrometheusLegacySupport.java
index 0f7b7187dc4..bd121b074c7 100644
--- a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/PrometheusLegacySupport.java
+++ b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/PrometheusLegacySupport.java
@@ -20,7 +20,8 @@
import java.util.Optional;
import java.util.Set;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.server.metric.PrometheusExpositionService;
import io.micrometer.core.instrument.MeterRegistry;
diff --git a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/PrometheusSupport.java b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/PrometheusSupport.java
index 463627d5dcc..c42efade41f 100644
--- a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/PrometheusSupport.java
+++ b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/PrometheusSupport.java
@@ -18,7 +18,8 @@
import java.util.Optional;
import java.util.Set;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.server.prometheus.PrometheusExpositionService;
import io.micrometer.core.instrument.MeterRegistry;
diff --git a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/Ssl.java b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/Ssl.java
index ac8aded4e29..cff4035d7a4 100644
--- a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/Ssl.java
+++ b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/Ssl.java
@@ -33,7 +33,7 @@
import java.util.List;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.netty.handler.ssl.ClientAuth;
import io.netty.handler.ssl.SslProvider;
diff --git a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/package-info.java b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/package-info.java
index 004048b4d6a..5d059dd3dbb 100644
--- a/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/package-info.java
+++ b/spring/boot4-autoconfigure/src/main/java/com/linecorp/armeria/spring/package-info.java
@@ -17,7 +17,7 @@
/**
* Spring Boot integration.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.spring;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaAutoConfigurationTest.java b/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaAutoConfigurationTest.java
index 8c922a29b94..9c2913fc5aa 100644
--- a/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaAutoConfigurationTest.java
+++ b/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaAutoConfigurationTest.java
@@ -21,6 +21,7 @@
import java.util.Collection;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -47,7 +48,6 @@
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.grpc.GrpcMeterIdPrefixFunction;
import com.linecorp.armeria.common.grpc.GrpcSerializationFormats;
import com.linecorp.armeria.common.metric.MeterIdPrefixFunction;
diff --git a/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaCompressionConfigurationTest.java b/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaCompressionConfigurationTest.java
index d3448c4ed52..073b48f2ecc 100644
--- a/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaCompressionConfigurationTest.java
+++ b/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaCompressionConfigurationTest.java
@@ -19,6 +19,7 @@
import java.util.Optional;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -36,7 +37,6 @@
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.RequestHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.Server;
import com.linecorp.armeria.server.annotation.Get;
import com.linecorp.armeria.server.annotation.Param;
diff --git a/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaGracefulShutdownConfigurationTest.java b/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaGracefulShutdownConfigurationTest.java
index 1e49e55d235..80c11e1d57a 100644
--- a/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaGracefulShutdownConfigurationTest.java
+++ b/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaGracefulShutdownConfigurationTest.java
@@ -19,6 +19,7 @@
import java.time.Duration;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -26,7 +27,6 @@
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ActiveProfiles;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.Server;
import com.linecorp.armeria.spring.ArmeriaGracefulShutdownConfigurationTest.TestConfiguration;
diff --git a/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaSettingsConfigurationPriorityTest.java b/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaSettingsConfigurationPriorityTest.java
index 2a7122d2621..1f701706d19 100644
--- a/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaSettingsConfigurationPriorityTest.java
+++ b/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaSettingsConfigurationPriorityTest.java
@@ -18,6 +18,7 @@
import static org.assertj.core.api.Assertions.assertThat;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.context.SpringBootTest;
@@ -25,7 +26,6 @@
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ActiveProfiles;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.Server;
import com.linecorp.armeria.server.ServerConfig;
import com.linecorp.armeria.spring.ArmeriaSettingsConfigurationPriorityTest.TestConfiguration;
diff --git a/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaSettingsConfigurationTest.java b/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaSettingsConfigurationTest.java
index fc1dc57848c..45252379244 100644
--- a/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaSettingsConfigurationTest.java
+++ b/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaSettingsConfigurationTest.java
@@ -18,6 +18,7 @@
import static org.assertj.core.api.Assertions.assertThat;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.context.SpringBootTest;
@@ -29,7 +30,6 @@
import com.linecorp.armeria.common.HttpMethod;
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.Server;
import com.linecorp.armeria.server.ServerConfig;
import com.linecorp.armeria.server.ServerErrorHandler;
diff --git a/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaSslConfigurationTest.java b/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaSslConfigurationTest.java
index 9e584b5db62..bbd2ff6d839 100644
--- a/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaSslConfigurationTest.java
+++ b/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/ArmeriaSslConfigurationTest.java
@@ -17,6 +17,7 @@
import static org.assertj.core.api.Assertions.assertThat;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;
@@ -30,7 +31,6 @@
import com.linecorp.armeria.common.AggregatedHttpResponse;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.testing.MockAddressResolverGroup;
import com.linecorp.armeria.server.Server;
import com.linecorp.armeria.spring.ArmeriaSslConfigurationTest.TestConfiguration;
diff --git a/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/CgLibServiceNameTest.java b/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/CgLibServiceNameTest.java
index e3285891830..b93275775e3 100644
--- a/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/CgLibServiceNameTest.java
+++ b/spring/boot4-autoconfigure/src/test/java/com/linecorp/armeria/spring/CgLibServiceNameTest.java
@@ -23,6 +23,7 @@
import org.aopalliance.intercept.Joinpoint;
import org.aopalliance.intercept.MethodInterceptor;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.springframework.aop.framework.ProxyFactoryBean;
import org.springframework.aop.support.AopUtils;
@@ -37,7 +38,6 @@
import com.linecorp.armeria.common.AggregatedHttpResponse;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpStatus;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.logging.RequestLogAccess;
import com.linecorp.armeria.server.Server;
diff --git a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/package-info.java b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/package-info.java
index 3398656c390..ce285206bb1 100644
--- a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/package-info.java
+++ b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/package-info.java
@@ -17,7 +17,7 @@
/**
* Spring Boot integration.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.spring.web;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/AbstractServerHttpRequestVersionSpecific.java b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/AbstractServerHttpRequestVersionSpecific.java
index 562366da167..e08df9c3f08 100644
--- a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/AbstractServerHttpRequestVersionSpecific.java
+++ b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/AbstractServerHttpRequestVersionSpecific.java
@@ -18,12 +18,11 @@
import java.net.URI;
+import org.jspecify.annotations.Nullable;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.server.reactive.AbstractServerHttpRequest;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* A version specific {@link AbstractServerHttpRequest} which implements the APIs that only exists in Spring 6.
*/
diff --git a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaHttpHandlerAdapter.java b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaHttpHandlerAdapter.java
index 0b5f4282277..9bcdaf7e330 100644
--- a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaHttpHandlerAdapter.java
+++ b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaHttpHandlerAdapter.java
@@ -20,6 +20,7 @@
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.server.reactive.HttpHandler;
@@ -28,7 +29,6 @@
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.MediaType;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.server.ServiceRequestContext;
import com.linecorp.armeria.spring.internal.common.DataBufferFactoryWrapper;
diff --git a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaHttpResponseBodyStream.java b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaHttpResponseBodyStream.java
index 78cfad54a47..3899756398a 100644
--- a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaHttpResponseBodyStream.java
+++ b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaHttpResponseBodyStream.java
@@ -18,12 +18,12 @@
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import org.reactivestreams.Subscriber;
import com.linecorp.armeria.common.HttpData;
import com.linecorp.armeria.common.HttpResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.stream.CancelledSubscriptionException;
import com.linecorp.armeria.internal.common.DefaultSplitHttpResponse;
diff --git a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaReactiveWebServerFactory.java b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaReactiveWebServerFactory.java
index 1aa58b2ee00..0d94aee9d11 100644
--- a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaReactiveWebServerFactory.java
+++ b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaReactiveWebServerFactory.java
@@ -30,6 +30,7 @@
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
@@ -52,7 +53,6 @@
import com.linecorp.armeria.common.HttpMethod;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.metric.MeterIdPrefixFunction;
import com.linecorp.armeria.server.Route;
import com.linecorp.armeria.server.Server;
diff --git a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaReactiveWebServerFactoryAutoConfiguration.java b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaReactiveWebServerFactoryAutoConfiguration.java
index 6c14dddc6d3..228c12b0616 100644
--- a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaReactiveWebServerFactoryAutoConfiguration.java
+++ b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaReactiveWebServerFactoryAutoConfiguration.java
@@ -20,6 +20,7 @@
import java.net.InetAddress;
import java.util.Optional;
+import org.jspecify.annotations.Nullable;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
@@ -36,7 +37,6 @@
import org.springframework.core.env.Environment;
import com.linecorp.armeria.common.Flags;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.Server;
import com.linecorp.armeria.server.docs.DocService;
import com.linecorp.armeria.server.healthcheck.HealthCheckService;
diff --git a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaServerHttpRequest.java b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaServerHttpRequest.java
index 6c2c8971459..f72cad91a52 100644
--- a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaServerHttpRequest.java
+++ b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaServerHttpRequest.java
@@ -25,6 +25,7 @@
import javax.net.ssl.SSLSession;
+import org.jspecify.annotations.Nullable;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpCookie;
import org.springframework.http.HttpHeaders;
@@ -41,7 +42,6 @@
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.RequestTarget;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.ServiceRequestContext;
import com.linecorp.armeria.spring.internal.common.DataBufferFactoryWrapper;
diff --git a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaServerHttpResponse.java b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaServerHttpResponse.java
index f45246b87f4..e533fc5e529 100644
--- a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaServerHttpResponse.java
+++ b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaServerHttpResponse.java
@@ -22,6 +22,7 @@
import java.util.List;
import java.util.concurrent.CompletableFuture;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -41,7 +42,6 @@
import com.linecorp.armeria.common.HttpResponseWriter;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.ResponseHeadersBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.stream.AbortedStreamException;
import com.linecorp.armeria.common.stream.CancelledSubscriptionException;
import com.linecorp.armeria.server.ServiceRequestContext;
diff --git a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaWebServer.java b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaWebServer.java
index 41c20858ef1..0a469d06208 100644
--- a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaWebServer.java
+++ b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/ArmeriaWebServer.java
@@ -22,13 +22,13 @@
import java.util.Arrays;
import java.util.Optional;
+import org.jspecify.annotations.Nullable;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.boot.web.server.WebServer;
import org.springframework.boot.web.server.WebServerException;
import org.springframework.http.server.reactive.HttpHandler;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.server.Server;
import com.linecorp.armeria.server.ServerPort;
diff --git a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/DefaultSslInfo.java b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/DefaultSslInfo.java
index 560406974ea..77be1044da1 100644
--- a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/DefaultSslInfo.java
+++ b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/DefaultSslInfo.java
@@ -37,11 +37,10 @@
import javax.net.ssl.SSLSession;
+import org.jspecify.annotations.Nullable;
import org.springframework.http.server.reactive.SslInfo;
import org.springframework.util.Assert;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* Default implementation of {@link SslInfo}.
*
@@ -55,8 +54,7 @@ final class DefaultSslInfo implements SslInfo {
@Nullable
private final String sessionId;
- @Nullable
- private final X509Certificate[] peerCertificates;
+ private final X509Certificate @Nullable [] peerCertificates;
DefaultSslInfo(SSLSession session) {
Assert.notNull(session, "SSLSession is required");
@@ -71,8 +69,7 @@ public String getSessionId() {
}
@Override
- @Nullable
- public X509Certificate[] getPeerCertificates() {
+ public X509Certificate @Nullable [] getPeerCertificates() {
return peerCertificates;
}
@@ -97,8 +94,7 @@ private static String initSessionId(SSLSession session) {
return sb.toString();
}
- @Nullable
- private static X509Certificate[] initCertificates(SSLSession session) {
+ private static X509Certificate @Nullable [] initCertificates(SSLSession session) {
final Certificate[] certificates;
try {
certificates = session.getPeerCertificates();
diff --git a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/package-info.java b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/package-info.java
index 57de462a9b5..74156655e88 100644
--- a/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/package-info.java
+++ b/spring/boot4-webflux-autoconfigure/src/main/java/com/linecorp/armeria/spring/web/reactive/package-info.java
@@ -17,7 +17,7 @@
/**
* Spring Boot integration based on reactive server stack.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.spring.web.reactive;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/spring/boot4-webflux-autoconfigure/src/test/java/com/linecorp/armeria/spring/web/reactive/ArmeriaServerSettingsTest.java b/spring/boot4-webflux-autoconfigure/src/test/java/com/linecorp/armeria/spring/web/reactive/ArmeriaServerSettingsTest.java
index a3912f2b2c8..e7a5f8bcbc5 100644
--- a/spring/boot4-webflux-autoconfigure/src/test/java/com/linecorp/armeria/spring/web/reactive/ArmeriaServerSettingsTest.java
+++ b/spring/boot4-webflux-autoconfigure/src/test/java/com/linecorp/armeria/spring/web/reactive/ArmeriaServerSettingsTest.java
@@ -18,13 +18,13 @@
import static org.assertj.core.api.Assertions.assertThat;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.test.context.ActiveProfiles;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.Server;
import com.linecorp.armeria.server.ServerConfig;
import com.linecorp.armeria.server.VirtualHost;
diff --git a/spring/boot4-webflux-autoconfigure/src/test/java/com/linecorp/armeria/spring/web/reactive/ArmeriaWebClientTest.java b/spring/boot4-webflux-autoconfigure/src/test/java/com/linecorp/armeria/spring/web/reactive/ArmeriaWebClientTest.java
index 4a3738324de..9a3c27af992 100644
--- a/spring/boot4-webflux-autoconfigure/src/test/java/com/linecorp/armeria/spring/web/reactive/ArmeriaWebClientTest.java
+++ b/spring/boot4-webflux-autoconfigure/src/test/java/com/linecorp/armeria/spring/web/reactive/ArmeriaWebClientTest.java
@@ -19,6 +19,7 @@
import java.time.Duration;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
@@ -44,7 +45,6 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.linecorp.armeria.client.ClientFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.testing.MockAddressResolverGroup;
import com.linecorp.armeria.server.ServiceRequestContext;
import com.linecorp.armeria.spring.ArmeriaServerConfigurator;
diff --git a/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/ArmeriaHttpExchangeAdapter.java b/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/ArmeriaHttpExchangeAdapter.java
index d38121f6200..e215c673427 100644
--- a/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/ArmeriaHttpExchangeAdapter.java
+++ b/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/ArmeriaHttpExchangeAdapter.java
@@ -22,6 +22,7 @@
import java.net.URI;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpHeaders;
@@ -49,7 +50,6 @@
import com.linecorp.armeria.common.HttpData;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.SplitHttpResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.spring.internal.client.ArmeriaClientHttpRequest;
import com.linecorp.armeria.spring.internal.client.ArmeriaClientHttpResponse;
diff --git a/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/ArmeriaHttpExchangeAdapterBuilder.java b/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/ArmeriaHttpExchangeAdapterBuilder.java
index caaeab32a99..66ff884af6d 100644
--- a/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/ArmeriaHttpExchangeAdapterBuilder.java
+++ b/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/ArmeriaHttpExchangeAdapterBuilder.java
@@ -19,11 +19,11 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
import org.springframework.web.reactive.function.client.ExchangeStrategies;
import com.linecorp.armeria.client.WebClient;
import com.linecorp.armeria.common.HttpStatus;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/RequestAttributeAccess.java b/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/RequestAttributeAccess.java
index 4a571fa24e9..6e6488d2b18 100644
--- a/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/RequestAttributeAccess.java
+++ b/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/RequestAttributeAccess.java
@@ -20,11 +20,11 @@
import java.util.Map;
+import org.jspecify.annotations.Nullable;
import org.springframework.web.bind.annotation.RequestAttribute;
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.RequestOptionsBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.netty.util.AttributeKey;
diff --git a/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/StatusHandler.java b/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/StatusHandler.java
index 9f4a4686342..1bc423bafd7 100644
--- a/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/StatusHandler.java
+++ b/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/StatusHandler.java
@@ -21,9 +21,10 @@
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.common.HttpStatus;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
diff --git a/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/package-info.java b/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/package-info.java
index 6535d480e07..aaa700b081e 100644
--- a/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/package-info.java
+++ b/spring/spring7/src/main/java/com/linecorp/armeria/spring/client/package-info.java
@@ -18,7 +18,7 @@
*
* Spring 6 HTTP interface integration.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.spring.client;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/spring/spring7/src/main/java/com/linecorp/armeria/spring/internal/client/ArmeriaClientHttpRequest.java b/spring/spring7/src/main/java/com/linecorp/armeria/spring/internal/client/ArmeriaClientHttpRequest.java
index fbb2eb89e79..0f665f3ffbb 100644
--- a/spring/spring7/src/main/java/com/linecorp/armeria/spring/internal/client/ArmeriaClientHttpRequest.java
+++ b/spring/spring7/src/main/java/com/linecorp/armeria/spring/internal/client/ArmeriaClientHttpRequest.java
@@ -24,6 +24,7 @@
import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;
+import org.jspecify.annotations.Nullable;
import org.reactivestreams.Publisher;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
@@ -46,7 +47,6 @@
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.RequestHeadersBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.spring.internal.common.DataBufferFactoryWrapper;
import reactor.core.publisher.Flux;
diff --git a/spring/spring7/src/main/java/com/linecorp/armeria/spring/internal/client/ArmeriaClientHttpResponse.java b/spring/spring7/src/main/java/com/linecorp/armeria/spring/internal/client/ArmeriaClientHttpResponse.java
index 6bbaf0d306e..d41dc584fff 100644
--- a/spring/spring7/src/main/java/com/linecorp/armeria/spring/internal/client/ArmeriaClientHttpResponse.java
+++ b/spring/spring7/src/main/java/com/linecorp/armeria/spring/internal/client/ArmeriaClientHttpResponse.java
@@ -18,6 +18,7 @@
import static com.linecorp.armeria.internal.common.ArmeriaHttpUtil.toHttp1Headers;
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
@@ -31,7 +32,6 @@
import com.linecorp.armeria.common.HttpHeaderNames;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.SplitHttpResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.spring.internal.common.DataBufferFactoryWrapper;
import io.netty.handler.codec.http.cookie.ClientCookieDecoder;
diff --git a/spring/spring7/src/main/java/com/linecorp/armeria/spring/internal/client/package-info.java b/spring/spring7/src/main/java/com/linecorp/armeria/spring/internal/client/package-info.java
index ba3539a8598..c66bdaca9e4 100644
--- a/spring/spring7/src/main/java/com/linecorp/armeria/spring/internal/client/package-info.java
+++ b/spring/spring7/src/main/java/com/linecorp/armeria/spring/internal/client/package-info.java
@@ -17,7 +17,7 @@
/**
* Various classes used internally. Anything in this package can be changed or removed at any time.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.spring.internal.client;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/spring/spring7/src/main/java/com/linecorp/armeria/spring/internal/common/package-info.java b/spring/spring7/src/main/java/com/linecorp/armeria/spring/internal/common/package-info.java
index f5f9f0a729f..b2509f67e42 100644
--- a/spring/spring7/src/main/java/com/linecorp/armeria/spring/internal/common/package-info.java
+++ b/spring/spring7/src/main/java/com/linecorp/armeria/spring/internal/common/package-info.java
@@ -17,7 +17,7 @@
/**
* Various classes used internally. Anything in this package can be changed or removed at any time.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.spring.internal.common;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/AnticipatedException.java b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/AnticipatedException.java
index 48925ec6627..4d726776fd2 100644
--- a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/AnticipatedException.java
+++ b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/AnticipatedException.java
@@ -16,7 +16,7 @@
package com.linecorp.armeria.internal.testing;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A {@link RuntimeException} which is expected to be raised during a test.
diff --git a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/CountDownEmptyEndpointStrategy.java b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/CountDownEmptyEndpointStrategy.java
index 53a69df92f6..d75ed331be7 100644
--- a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/CountDownEmptyEndpointStrategy.java
+++ b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/CountDownEmptyEndpointStrategy.java
@@ -21,13 +21,14 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.client.endpoint.DynamicEndpointGroup;
import com.linecorp.armeria.client.endpoint.EndpointGroup;
import com.linecorp.armeria.client.endpoint.EndpointSelectionStrategy;
import com.linecorp.armeria.client.endpoint.EndpointSelector;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* Counts down a user provided counter each time an endpoint is selected asynchronously.
diff --git a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/DocServiceExtension.java b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/DocServiceExtension.java
index 8483d16638c..3464c00bc20 100644
--- a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/DocServiceExtension.java
+++ b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/DocServiceExtension.java
@@ -15,6 +15,7 @@
*/
package com.linecorp.armeria.internal.testing;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Timeout;
import org.junit.jupiter.api.extension.AfterTestExecutionCallback;
import org.junit.jupiter.api.extension.BeforeTestExecutionCallback;
@@ -22,7 +23,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.docs.DocService;
/**
diff --git a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/NettyServerExtension.java b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/NettyServerExtension.java
index 183e74c4a94..93175be090d 100644
--- a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/NettyServerExtension.java
+++ b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/NettyServerExtension.java
@@ -21,10 +21,10 @@
import java.net.InetSocketAddress;
import java.net.URI;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.extension.ExtensionContext;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.testing.junit5.common.AbstractAllOrEachExtension;
import io.netty.bootstrap.ServerBootstrap;
diff --git a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/SimpleChannelHandler.java b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/SimpleChannelHandler.java
index 7a55694da4c..25a05c2165d 100644
--- a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/SimpleChannelHandler.java
+++ b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/SimpleChannelHandler.java
@@ -16,7 +16,7 @@
package com.linecorp.armeria.internal.testing;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandlerContext;
diff --git a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/SimpleChannelHandlerFactory.java b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/SimpleChannelHandlerFactory.java
index 91efd2703fe..d6a71f2cc2d 100644
--- a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/SimpleChannelHandlerFactory.java
+++ b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/SimpleChannelHandlerFactory.java
@@ -18,7 +18,8 @@
import static java.util.Objects.requireNonNull;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.internal.testing.SimpleChannelHandler.ThrowingBiConsumer;
import com.linecorp.armeria.internal.testing.SimpleChannelHandler.ThrowingTriConsumer;
diff --git a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/TemporaryFolder.java b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/TemporaryFolder.java
index 1c1717c8eae..aa9b269ba4b 100644
--- a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/TemporaryFolder.java
+++ b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/TemporaryFolder.java
@@ -21,7 +21,7 @@
import java.nio.file.Files;
import java.nio.file.Path;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A helper class to handle temporary folders in JUnit {@code Extension}s.
diff --git a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/netty/Http2ClientFrameInitializer.java b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/netty/Http2ClientFrameInitializer.java
index 2b8ad3d8114..38c077873c7 100644
--- a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/netty/Http2ClientFrameInitializer.java
+++ b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/netty/Http2ClientFrameInitializer.java
@@ -15,7 +15,7 @@
*/
package com.linecorp.armeria.internal.testing.netty;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
diff --git a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/netty/SimpleHttp2Connection.java b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/netty/SimpleHttp2Connection.java
index b87df789154..717cedd00fd 100644
--- a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/netty/SimpleHttp2Connection.java
+++ b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/netty/SimpleHttp2Connection.java
@@ -19,7 +19,8 @@
import javax.net.ssl.SSLException;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.util.SafeCloseable;
import io.netty.bootstrap.Bootstrap;
diff --git a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/netty/package-info.java b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/netty/package-info.java
index 1d7ba91d3ed..5bdb7152cb2 100644
--- a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/netty/package-info.java
+++ b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/netty/package-info.java
@@ -17,7 +17,7 @@
/**
* Common testing utilities.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.testing.netty;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/package-info.java b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/package-info.java
index 8b3894b7b4b..ae112a27af9 100644
--- a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/package-info.java
+++ b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/package-info.java
@@ -17,7 +17,7 @@
/**
* Common testing utilities.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.testing;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/webapp/package-info.java b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/webapp/package-info.java
index c46f5412526..23a6010a800 100644
--- a/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/webapp/package-info.java
+++ b/testing-internal/src/main/java/com/linecorp/armeria/internal/testing/webapp/package-info.java
@@ -17,7 +17,7 @@
/**
* Web application service testing utilities.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.testing.webapp;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/client/thrift/ThriftClientBuilder.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/client/thrift/ThriftClientBuilder.java
index eb14487a4a6..709bef435b3 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/client/thrift/ThriftClientBuilder.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/client/thrift/ThriftClientBuilder.java
@@ -31,6 +31,7 @@
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TCompactProtocol;
+import org.jspecify.annotations.Nullable;
import com.linecorp.armeria.client.AbstractClientOptionsBuilder;
import com.linecorp.armeria.client.ClientBuilderParams;
@@ -54,7 +55,6 @@
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SessionProtocol;
import com.linecorp.armeria.common.SuccessFunction;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.auth.AuthToken;
import com.linecorp.armeria.common.auth.BasicToken;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/client/thrift/package-info.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/client/thrift/package-info.java
index 2ea61fe571b..0652b22984b 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/client/thrift/package-info.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/client/thrift/package-info.java
@@ -17,7 +17,7 @@
/**
* Thrift client.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.thrift;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftCall.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftCall.java
index 62d9a64053a..8e256cb2ac2 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftCall.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftCall.java
@@ -20,11 +20,11 @@
import org.apache.thrift.TBase;
import org.apache.thrift.protocol.TMessage;
import org.apache.thrift.protocol.TMessageType;
+import org.jspecify.annotations.Nullable;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
/**
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftFuture.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftFuture.java
index f7bf80b6e1d..8fd21541e4b 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftFuture.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftFuture.java
@@ -21,8 +21,8 @@
import java.util.concurrent.CompletionException;
import org.apache.thrift.async.AsyncMethodCallback;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.EventLoopCheckingFuture;
/**
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftJacksonSerializers.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftJacksonSerializers.java
index bb1aacb0950..8e37c48b42a 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftJacksonSerializers.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftJacksonSerializers.java
@@ -26,6 +26,7 @@
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.protocol.TProtocolFactory;
import org.apache.thrift.transport.TMemoryBuffer;
+import org.jspecify.annotations.Nullable;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BeanDescription;
@@ -36,7 +37,6 @@
import com.fasterxml.jackson.databind.ser.Serializers;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
final class ThriftJacksonSerializers extends Serializers.Base implements Serializable {
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftListenableFuture.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftListenableFuture.java
index 5e7a834c6b8..6edb9f94380 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftListenableFuture.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftListenableFuture.java
@@ -21,12 +21,11 @@
import java.util.concurrent.CompletionException;
import org.apache.thrift.async.AsyncMethodCallback;
+import org.jspecify.annotations.Nullable;
import com.google.common.util.concurrent.AbstractFuture;
import com.google.common.util.concurrent.ListenableFuture;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* A {@link ListenableFuture} that can be passed in as an {@link AsyncMethodCallback}
* when making an asynchronous client-side Thrift RPC.
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftMessage.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftMessage.java
index 29ca1ff0b7e..40334716dc3 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftMessage.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftMessage.java
@@ -20,8 +20,7 @@
import org.apache.thrift.protocol.TMessage;
import org.apache.thrift.protocol.TMessageType;
-
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A container of a Thrift message produced by Apache Thrift.
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftProtocolFactoryProvider.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftProtocolFactoryProvider.java
index 89267ab0d44..1bc62229854 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftProtocolFactoryProvider.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftProtocolFactoryProvider.java
@@ -20,11 +20,11 @@
import java.util.Set;
import org.apache.thrift.protocol.TProtocolFactory;
+import org.jspecify.annotations.Nullable;
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* SPI Provider for links from {@link SerializationFormat} to {@link TProtocolFactory}.
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftReply.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftReply.java
index d6bb1eae583..5a1c13f896f 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftReply.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/ThriftReply.java
@@ -23,12 +23,12 @@
import org.apache.thrift.TBase;
import org.apache.thrift.protocol.TMessage;
import org.apache.thrift.protocol.TMessageType;
+import org.jspecify.annotations.Nullable;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
/**
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/logging/package-info.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/logging/package-info.java
index 1999f224d14..2153418e0dd 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/logging/package-info.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/logging/package-info.java
@@ -17,7 +17,7 @@
/**
* Thrift-related classes for logging.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.thrift.logging;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/package-info.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/package-info.java
index 2ba5859e510..3e6acba8ed0 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/package-info.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/package-info.java
@@ -17,7 +17,7 @@
/**
* Thrift-related common classes.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.thrift;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/AbstractThriftMessageClassFinder.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/AbstractThriftMessageClassFinder.java
index 84db1c7f98d..143be901496 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/AbstractThriftMessageClassFinder.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/AbstractThriftMessageClassFinder.java
@@ -36,10 +36,10 @@
import org.apache.thrift.TApplicationException;
import org.apache.thrift.TBase;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.thrift.TApplicationExceptions;
abstract class AbstractThriftMessageClassFinder implements Supplier> {
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/BaseContext.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/BaseContext.java
index 9ac9b1258ab..d53736c68a6 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/BaseContext.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/BaseContext.java
@@ -33,11 +33,10 @@
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TField;
+import org.jspecify.annotations.Nullable;
import com.fasterxml.jackson.databind.JsonNode;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* A base parsing context. Used as a root level parsing context for
* parsing Json Objects
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/DefaultThriftMessageClassFinder.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/DefaultThriftMessageClassFinder.java
index b4040fb631b..8b448061fde 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/DefaultThriftMessageClassFinder.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/DefaultThriftMessageClassFinder.java
@@ -30,7 +30,7 @@
// =================================================================================================
package com.linecorp.armeria.common.thrift.text;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
final class DefaultThriftMessageClassFinder extends AbstractThriftMessageClassFinder {
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/MapContext.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/MapContext.java
index ef69792021f..2a6b9786871 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/MapContext.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/MapContext.java
@@ -30,9 +30,9 @@
// =================================================================================================
package com.linecorp.armeria.common.thrift.text;
-import com.fasterxml.jackson.databind.JsonNode;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.fasterxml.jackson.databind.JsonNode;
/**
* A map parsing context. Just a PairContext that responds to isMapKey
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/PairContext.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/PairContext.java
index c6542b389dd..7097f774a5d 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/PairContext.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/PairContext.java
@@ -33,11 +33,11 @@
import java.util.Iterator;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.TextNode;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* A map parsing context that tracks if we are parsing a key, which
* is on the left hand side of the ":" operator, or a value.
@@ -58,8 +58,7 @@ class PairContext extends BaseContext {
@Nullable
private final Iterator> children;
private boolean lhs;
- @Nullable
- private Map.Entry currentChild;
+ private Map.@Nullable Entry currentChild;
/**
* Creates an iterator over this object's children.
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/SequenceContext.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/SequenceContext.java
index ac35a1dece2..85051cea576 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/SequenceContext.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/SequenceContext.java
@@ -32,9 +32,9 @@
import java.util.Iterator;
-import com.fasterxml.jackson.databind.JsonNode;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.fasterxml.jackson.databind.JsonNode;
/**
* A parsing context used for Sequences (lists & sets). Maintains its
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/StackWalkingThriftMessageClassFinder.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/StackWalkingThriftMessageClassFinder.java
index ec39797f51c..2ff24d47c96 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/StackWalkingThriftMessageClassFinder.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/StackWalkingThriftMessageClassFinder.java
@@ -39,11 +39,10 @@
import java.util.function.Function;
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
-
final class StackWalkingThriftMessageClassFinder extends AbstractThriftMessageClassFinder {
private static final Logger logger =
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/StructContext.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/StructContext.java
index 55a93c90d76..f63b8ab6184 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/StructContext.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/StructContext.java
@@ -50,13 +50,13 @@
import org.apache.thrift.meta_data.StructMetaData;
import org.apache.thrift.protocol.TField;
import org.apache.thrift.protocol.TType;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.databind.JsonNode;
import com.google.common.collect.MapMaker;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.SystemInfo;
import com.linecorp.armeria.internal.common.thrift.ThriftMetadataAccess;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/TTextProtocol.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/TTextProtocol.java
index f20ca6ab13e..457330724b8 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/TTextProtocol.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/TTextProtocol.java
@@ -55,6 +55,7 @@
import org.apache.thrift.scheme.StandardScheme;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
+import org.jspecify.annotations.Nullable;
import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonGenerator;
@@ -63,7 +64,6 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.primitives.Ints;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.util.TemporaryThreadLocals;
/**
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/package-info.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/package-info.java
index 9ac3a890ffa..4133860d341 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/package-info.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/common/thrift/text/package-info.java
@@ -44,7 +44,7 @@
* Miscellaneous style cleanups
*
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.thrift.text;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/client/thrift/DefaultTHttpClient.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/client/thrift/DefaultTHttpClient.java
index 762dd06c809..43e9bfae039 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/client/thrift/DefaultTHttpClient.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/client/thrift/DefaultTHttpClient.java
@@ -20,6 +20,7 @@
import static java.util.Objects.requireNonNull;
import org.apache.thrift.transport.TTransportException;
+import org.jspecify.annotations.Nullable;
import com.linecorp.armeria.client.ClientBuilderParams;
import com.linecorp.armeria.client.RequestOptions;
@@ -32,7 +33,6 @@
import com.linecorp.armeria.common.RequestTarget;
import com.linecorp.armeria.common.RpcRequest;
import com.linecorp.armeria.common.RpcResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.client.ClientUtil;
import com.linecorp.armeria.internal.client.DefaultClientRequestContext;
import com.linecorp.armeria.internal.client.TailPreClient;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/client/thrift/THttpClientDelegate.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/client/thrift/THttpClientDelegate.java
index 01c61540400..35b37d6c470 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/client/thrift/THttpClientDelegate.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/client/thrift/THttpClientDelegate.java
@@ -35,6 +35,7 @@
import org.apache.thrift.protocol.TProtocolFactory;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
+import org.jspecify.annotations.Nullable;
import com.google.common.base.Strings;
import com.google.common.primitives.Ints;
@@ -59,7 +60,6 @@
import com.linecorp.armeria.common.RpcRequest;
import com.linecorp.armeria.common.RpcResponse;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLogProperty;
import com.linecorp.armeria.common.thrift.ThriftCall;
import com.linecorp.armeria.common.thrift.ThriftReply;
@@ -320,7 +320,7 @@ private static void handlePreDecodeException(ClientRequestContext ctx, Completab
handleException(ctx, reply, null, decodedCause);
}
- static Exception decodeException(Throwable cause, @Nullable Class>[] declaredThrowableExceptions) {
+ static Exception decodeException(Throwable cause, Class> @Nullable [] declaredThrowableExceptions) {
if (cause instanceof TException ||
cause instanceof UnprocessedRequestException ||
cause instanceof FailFastException) {
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/client/thrift/THttpClientInvocationHandler.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/client/thrift/THttpClientInvocationHandler.java
index 7a21776483b..9f23cc65534 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/client/thrift/THttpClientInvocationHandler.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/client/thrift/THttpClientInvocationHandler.java
@@ -25,6 +25,7 @@
import java.util.concurrent.ExecutionException;
import org.apache.thrift.async.AsyncMethodCallback;
+import org.jspecify.annotations.Nullable;
import com.linecorp.armeria.client.ClientBuilderParams;
import com.linecorp.armeria.client.ClientOptions;
@@ -35,7 +36,6 @@
import com.linecorp.armeria.client.thrift.THttpClient;
import com.linecorp.armeria.common.RpcResponse;
import com.linecorp.armeria.common.Scheme;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.AbstractUnwrappable;
import com.linecorp.armeria.common.util.CompletionActions;
import com.linecorp.armeria.common.util.Exceptions;
@@ -113,7 +113,7 @@ private Object invokeObjectMethod(Object proxy, Method method, Object[] args) {
}
@Nullable
- private Object invokeClientMethod(Method method, @Nullable Object[] args) throws Throwable {
+ private Object invokeClientMethod(Method method, Object @Nullable [] args) throws Throwable {
final AsyncMethodCallback callback;
if (args == null) {
args = NO_ARGS;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/client/thrift/package-info.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/client/thrift/package-info.java
index bb28bf314a8..318f5d97d21 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/client/thrift/package-info.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/client/thrift/package-info.java
@@ -17,7 +17,7 @@
/**
* Various classes used internally. Anything in this package can be changed or removed at any time.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.client.thrift;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/AbstractTByteBufTransport.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/AbstractTByteBufTransport.java
index f89379cd2f3..8c7c2baa7a4 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/AbstractTByteBufTransport.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/AbstractTByteBufTransport.java
@@ -20,8 +20,7 @@
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
-
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.netty.buffer.ByteBuf;
@@ -70,9 +69,8 @@ public void write(byte[] buf, int off, int len) {
this.buf.writeBytes(buf, off, len);
}
- @Nullable
@Override
- public byte[] getBuffer() {
+ public byte @Nullable [] getBuffer() {
final ByteBuf buf = this.buf;
if (!buf.hasArray()) {
return null;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/DefaultThriftProtocolFactoryProvider.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/DefaultThriftProtocolFactoryProvider.java
index 18b845a5dea..b6dd240409c 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/DefaultThriftProtocolFactoryProvider.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/DefaultThriftProtocolFactoryProvider.java
@@ -20,11 +20,11 @@
import java.util.Set;
import org.apache.thrift.protocol.TProtocolFactory;
+import org.jspecify.annotations.Nullable;
import com.google.common.collect.ImmutableSet;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.thrift.ThriftProtocolFactories;
import com.linecorp.armeria.common.thrift.ThriftProtocolFactoryProvider;
import com.linecorp.armeria.common.thrift.ThriftSerializationFormats;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/ThriftFunction.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/ThriftFunction.java
index 4898eaa6598..9d559c976a9 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/ThriftFunction.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/ThriftFunction.java
@@ -32,11 +32,11 @@
import org.apache.thrift.TFieldIdEnum;
import org.apache.thrift.meta_data.FieldMetaData;
import org.apache.thrift.protocol.TMessageType;
+import org.jspecify.annotations.Nullable;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.server.annotation.DecoratorAnnotationUtil;
import com.linecorp.armeria.internal.server.annotation.DecoratorAnnotationUtil.DecoratorAndOrder;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/ThriftServiceMetadata.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/ThriftServiceMetadata.java
index fea1fe30cbe..7e5238a21fc 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/ThriftServiceMetadata.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/ThriftServiceMetadata.java
@@ -30,13 +30,13 @@
import org.apache.thrift.ProcessFunction;
import org.apache.thrift.TBaseAsyncProcessor;
import org.apache.thrift.TBaseProcessor;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.util.Types;
/**
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/logging/package-info.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/logging/package-info.java
index b6333dffebb..98e1e153993 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/logging/package-info.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/logging/package-info.java
@@ -17,7 +17,7 @@
/**
* Various classes used internally. Anything in this package can be changed or removed at any time.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.common.thrift.logging;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/package-info.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/package-info.java
index d1f614e1b20..18d551d481f 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/package-info.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/common/thrift/package-info.java
@@ -17,7 +17,7 @@
/**
* Various classes used internally. Anything in this package can be changed or removed at any time.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.common.thrift;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/server/thrift/ThriftDescriptiveTypeInfoProvider.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/server/thrift/ThriftDescriptiveTypeInfoProvider.java
index a76e39989b6..20201dbcf3e 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/server/thrift/ThriftDescriptiveTypeInfoProvider.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/server/thrift/ThriftDescriptiveTypeInfoProvider.java
@@ -44,10 +44,10 @@
import org.apache.thrift.meta_data.SetMetaData;
import org.apache.thrift.meta_data.StructMetaData;
import org.apache.thrift.protocol.TType;
+import org.jspecify.annotations.Nullable;
import com.google.common.annotations.VisibleForTesting;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.thrift.ThriftMetadataAccess;
import com.linecorp.armeria.server.docs.DescriptiveTypeInfo;
import com.linecorp.armeria.server.docs.DescriptiveTypeInfoProvider;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/server/thrift/ThriftDocServicePlugin.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/server/thrift/ThriftDocServicePlugin.java
index 8a06435d717..91e5d8654dd 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/server/thrift/ThriftDocServicePlugin.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/server/thrift/ThriftDocServicePlugin.java
@@ -42,13 +42,13 @@
import org.apache.thrift.TFieldIdEnum;
import org.apache.thrift.TSerializer;
import org.apache.thrift.meta_data.FieldMetaData;
+import org.jspecify.annotations.Nullable;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.linecorp.armeria.common.HttpMethod;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.thrift.ThriftProtocolFactories;
import com.linecorp.armeria.internal.common.thrift.ThriftMetadataAccess;
import com.linecorp.armeria.server.Route;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/server/thrift/package-info.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/server/thrift/package-info.java
index 841e0410a8c..f7419ccb9dd 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/server/thrift/package-info.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/internal/server/thrift/package-info.java
@@ -17,7 +17,7 @@
/**
* Various classes used internally. Anything in this package can be changed or removed at any time.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.server.thrift;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/server/thrift/THttpService.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/server/thrift/THttpService.java
index a41eaa945ae..e3043597e48 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/server/thrift/THttpService.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/server/thrift/THttpService.java
@@ -41,6 +41,7 @@
import org.apache.thrift.protocol.TProtocolException;
import org.apache.thrift.protocol.TProtocolFactory;
import org.apache.thrift.transport.TTransport;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -62,7 +63,6 @@
import com.linecorp.armeria.common.RpcRequest;
import com.linecorp.armeria.common.RpcResponse;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLogProperty;
import com.linecorp.armeria.common.thrift.ThriftCall;
import com.linecorp.armeria.common.thrift.ThriftProtocolFactories;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/server/thrift/THttpServiceBuilder.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/server/thrift/THttpServiceBuilder.java
index 39f3acf156d..ddc7947d021 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/server/thrift/THttpServiceBuilder.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/server/thrift/THttpServiceBuilder.java
@@ -29,6 +29,7 @@
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TCompactProtocol;
+import org.jspecify.annotations.Nullable;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
@@ -37,7 +38,6 @@
import com.linecorp.armeria.common.RpcResponse;
import com.linecorp.armeria.common.SerializationFormat;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.thrift.ThriftProtocolFactoryProvider;
import com.linecorp.armeria.common.thrift.ThriftSerializationFormats;
import com.linecorp.armeria.server.RpcService;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/server/thrift/ThriftCallService.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/server/thrift/ThriftCallService.java
index 76241c09f17..b81f7891984 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/server/thrift/ThriftCallService.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/server/thrift/ThriftCallService.java
@@ -28,6 +28,7 @@
import org.apache.thrift.TBase;
import org.apache.thrift.TException;
import org.apache.thrift.async.AsyncMethodCallback;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -35,7 +36,6 @@
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.RpcRequest;
import com.linecorp.armeria.common.RpcResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.common.thrift.ThriftFunction;
import com.linecorp.armeria.server.RpcService;
diff --git a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/server/thrift/package-info.java b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/server/thrift/package-info.java
index c2880666d5e..b2a8e2be0ee 100644
--- a/thrift/thrift0.13/src/main/java/com/linecorp/armeria/server/thrift/package-info.java
+++ b/thrift/thrift0.13/src/main/java/com/linecorp/armeria/server/thrift/package-info.java
@@ -17,7 +17,7 @@
/**
* Thrift service.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.thrift;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/thrift/thrift0.13/src/test/java/com/linecorp/armeria/client/thrift/ThriftOverHttpClientTest.java b/thrift/thrift0.13/src/test/java/com/linecorp/armeria/client/thrift/ThriftOverHttpClientTest.java
index a2755945f29..e5d9ee5db29 100644
--- a/thrift/thrift0.13/src/test/java/com/linecorp/armeria/client/thrift/ThriftOverHttpClientTest.java
+++ b/thrift/thrift0.13/src/test/java/com/linecorp/armeria/client/thrift/ThriftOverHttpClientTest.java
@@ -38,6 +38,7 @@
import org.apache.thrift.protocol.TProtocolFactory;
import org.apache.thrift.protocol.TTupleProtocol;
import org.apache.thrift.transport.TTransportException;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
@@ -72,7 +73,6 @@
import com.linecorp.armeria.common.SerializationFormat;
import com.linecorp.armeria.common.SerializationFormatProvider;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.thrift.ThriftCall;
import com.linecorp.armeria.common.thrift.ThriftFuture;
diff --git a/thrift/thrift0.13/src/test/java/com/linecorp/armeria/server/thrift/AbstractTHttp2Client.java b/thrift/thrift0.13/src/test/java/com/linecorp/armeria/server/thrift/AbstractTHttp2Client.java
index cc9a142ed00..bf4b753e75d 100644
--- a/thrift/thrift0.13/src/test/java/com/linecorp/armeria/server/thrift/AbstractTHttp2Client.java
+++ b/thrift/thrift0.13/src/test/java/com/linecorp/armeria/server/thrift/AbstractTHttp2Client.java
@@ -28,8 +28,7 @@
import org.apache.thrift.transport.TMemoryInputTransport;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
-
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.ByteBuf;
diff --git a/thrift/thrift0.14/src/main/java/com/linecorp/armeria/internal/common/thrift/TByteBufTransport.java b/thrift/thrift0.14/src/main/java/com/linecorp/armeria/internal/common/thrift/TByteBufTransport.java
index 7739cbe49b4..9105ffbe3c8 100644
--- a/thrift/thrift0.14/src/main/java/com/linecorp/armeria/internal/common/thrift/TByteBufTransport.java
+++ b/thrift/thrift0.14/src/main/java/com/linecorp/armeria/internal/common/thrift/TByteBufTransport.java
@@ -17,8 +17,7 @@
import org.apache.thrift.TConfiguration;
import org.apache.thrift.transport.TTransportException;
-
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.netty.buffer.ByteBuf;
diff --git a/thrift/thrift0.14/src/main/java/com/linecorp/armeria/internal/common/thrift/package-info.java b/thrift/thrift0.14/src/main/java/com/linecorp/armeria/internal/common/thrift/package-info.java
index 79e5453bd37..59042504a2a 100644
--- a/thrift/thrift0.14/src/main/java/com/linecorp/armeria/internal/common/thrift/package-info.java
+++ b/thrift/thrift0.14/src/main/java/com/linecorp/armeria/internal/common/thrift/package-info.java
@@ -17,7 +17,7 @@
/**
* Various classes used internally. Anything in this package can be changed or removed at any time.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.common.thrift;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/thrift/thrift0.18/src/main/java/com/linecorp/armeria/internal/common/thrift/logging/package-info.java b/thrift/thrift0.18/src/main/java/com/linecorp/armeria/internal/common/thrift/logging/package-info.java
index b6333dffebb..98e1e153993 100644
--- a/thrift/thrift0.18/src/main/java/com/linecorp/armeria/internal/common/thrift/logging/package-info.java
+++ b/thrift/thrift0.18/src/main/java/com/linecorp/armeria/internal/common/thrift/logging/package-info.java
@@ -17,7 +17,7 @@
/**
* Various classes used internally. Anything in this package can be changed or removed at any time.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.common.thrift.logging;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/thrift/thrift0.19/src/main/java/com/linecorp/armeria/common/thrift/logging/ThriftFieldMaskerSelectorBuilder.java b/thrift/thrift0.19/src/main/java/com/linecorp/armeria/common/thrift/logging/ThriftFieldMaskerSelectorBuilder.java
index 7ea5924f785..7d14b56b05b 100644
--- a/thrift/thrift0.19/src/main/java/com/linecorp/armeria/common/thrift/logging/ThriftFieldMaskerSelectorBuilder.java
+++ b/thrift/thrift0.19/src/main/java/com/linecorp/armeria/common/thrift/logging/ThriftFieldMaskerSelectorBuilder.java
@@ -21,9 +21,10 @@
import java.util.List;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.logging.FieldMasker;
diff --git a/thrift/thrift0.19/src/main/java/com/linecorp/armeria/common/thrift/logging/package-info.java b/thrift/thrift0.19/src/main/java/com/linecorp/armeria/common/thrift/logging/package-info.java
index 1999f224d14..2153418e0dd 100644
--- a/thrift/thrift0.19/src/main/java/com/linecorp/armeria/common/thrift/logging/package-info.java
+++ b/thrift/thrift0.19/src/main/java/com/linecorp/armeria/common/thrift/logging/package-info.java
@@ -17,7 +17,7 @@
/**
* Thrift-related classes for logging.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.thrift.logging;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/thrift/thrift0.21/src/main/java/com/linecorp/armeria/internal/common/thrift/ThriftFunction.java b/thrift/thrift0.21/src/main/java/com/linecorp/armeria/internal/common/thrift/ThriftFunction.java
index 3156649536f..a99661fa278 100644
--- a/thrift/thrift0.21/src/main/java/com/linecorp/armeria/internal/common/thrift/ThriftFunction.java
+++ b/thrift/thrift0.21/src/main/java/com/linecorp/armeria/internal/common/thrift/ThriftFunction.java
@@ -32,11 +32,11 @@
import org.apache.thrift.TFieldIdEnum;
import org.apache.thrift.meta_data.FieldMetaData;
import org.apache.thrift.protocol.TMessageType;
+import org.jspecify.annotations.Nullable;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.server.annotation.DecoratorAnnotationUtil;
import com.linecorp.armeria.internal.server.annotation.DecoratorAnnotationUtil.DecoratorAndOrder;
diff --git a/thrift/thrift0.21/src/main/java/com/linecorp/armeria/internal/common/thrift/ThriftServiceMetadata.java b/thrift/thrift0.21/src/main/java/com/linecorp/armeria/internal/common/thrift/ThriftServiceMetadata.java
index 28b85584f18..3fa615ddfa1 100644
--- a/thrift/thrift0.21/src/main/java/com/linecorp/armeria/internal/common/thrift/ThriftServiceMetadata.java
+++ b/thrift/thrift0.21/src/main/java/com/linecorp/armeria/internal/common/thrift/ThriftServiceMetadata.java
@@ -30,13 +30,13 @@
import org.apache.thrift.ProcessFunction;
import org.apache.thrift.TBaseAsyncProcessor;
import org.apache.thrift.TBaseProcessor;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.util.Types;
/**
diff --git a/thrift/thrift0.21/src/main/java/com/linecorp/armeria/internal/common/thrift/package-info.java b/thrift/thrift0.21/src/main/java/com/linecorp/armeria/internal/common/thrift/package-info.java
index 40bf862dac7..db98ef03150 100644
--- a/thrift/thrift0.21/src/main/java/com/linecorp/armeria/internal/common/thrift/package-info.java
+++ b/thrift/thrift0.21/src/main/java/com/linecorp/armeria/internal/common/thrift/package-info.java
@@ -17,7 +17,7 @@
/**
* Various classes used internally. Anything in this package can be changed or removed at any time.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.common.thrift;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/thrift/thrift0.21/src/main/java/com/linecorp/armeria/server/thrift/ThriftCallService.java b/thrift/thrift0.21/src/main/java/com/linecorp/armeria/server/thrift/ThriftCallService.java
index 88e2f389eb5..266efbd4360 100644
--- a/thrift/thrift0.21/src/main/java/com/linecorp/armeria/server/thrift/ThriftCallService.java
+++ b/thrift/thrift0.21/src/main/java/com/linecorp/armeria/server/thrift/ThriftCallService.java
@@ -28,6 +28,7 @@
import org.apache.thrift.TBase;
import org.apache.thrift.TException;
import org.apache.thrift.async.AsyncMethodCallback;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -35,7 +36,6 @@
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.RpcRequest;
import com.linecorp.armeria.common.RpcResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.common.thrift.ThriftFunction;
import com.linecorp.armeria.server.RpcService;
diff --git a/thrift/thrift0.21/src/main/java/com/linecorp/armeria/server/thrift/package-info.java b/thrift/thrift0.21/src/main/java/com/linecorp/armeria/server/thrift/package-info.java
index 6d784afb284..6634ca0e115 100644
--- a/thrift/thrift0.21/src/main/java/com/linecorp/armeria/server/thrift/package-info.java
+++ b/thrift/thrift0.21/src/main/java/com/linecorp/armeria/server/thrift/package-info.java
@@ -17,7 +17,7 @@
/**
* Thrift service.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.thrift;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/tomcat10/src/main/java/com/linecorp/armeria/internal/server/tomcat/Tomcat90ProtocolHandler.java b/tomcat10/src/main/java/com/linecorp/armeria/internal/server/tomcat/Tomcat90ProtocolHandler.java
index 5c1f72552f0..6d1f8af08cf 100644
--- a/tomcat10/src/main/java/com/linecorp/armeria/internal/server/tomcat/Tomcat90ProtocolHandler.java
+++ b/tomcat10/src/main/java/com/linecorp/armeria/internal/server/tomcat/Tomcat90ProtocolHandler.java
@@ -25,8 +25,7 @@
import org.apache.coyote.ProtocolHandler;
import org.apache.coyote.UpgradeProtocol;
import org.apache.tomcat.util.net.SSLHostConfig;
-
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A {@link ProtocolHandler} for Tomcat 8.5 and above.
diff --git a/tomcat10/src/main/java/com/linecorp/armeria/internal/server/tomcat/package-info.java b/tomcat10/src/main/java/com/linecorp/armeria/internal/server/tomcat/package-info.java
index 32b31ff7ee8..bdf0edfbd91 100644
--- a/tomcat10/src/main/java/com/linecorp/armeria/internal/server/tomcat/package-info.java
+++ b/tomcat10/src/main/java/com/linecorp/armeria/internal/server/tomcat/package-info.java
@@ -17,7 +17,7 @@
/**
* Internal classes for embedded Tomcat service.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.server.tomcat;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/ArmeriaProcessor.java b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/ArmeriaProcessor.java
index 9061aa03f2d..d7cbaeeca60 100644
--- a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/ArmeriaProcessor.java
+++ b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/ArmeriaProcessor.java
@@ -26,8 +26,7 @@
import org.apache.tomcat.util.buf.ByteChunk;
import org.apache.tomcat.util.net.AbstractEndpoint;
import org.apache.tomcat.util.net.SocketWrapperBase;
-
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import jakarta.servlet.ServletConnection;
@@ -108,9 +107,8 @@ protected AbstractEndpoint.Handler.SocketState dispatchEndRequest() throws IOExc
throw new UnsupportedOperationException();
}
- @Nullable
@Override
- protected AbstractEndpoint.Handler.SocketState service(SocketWrapperBase> socketWrapper)
+ protected AbstractEndpoint.Handler.@Nullable SocketState service(SocketWrapperBase> socketWrapper)
throws IOException {
// Doesn't seem to be used.
return null;
diff --git a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/JarSubsetResourceSet.java b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/JarSubsetResourceSet.java
index 7ac75ad4325..381a9343573 100644
--- a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/JarSubsetResourceSet.java
+++ b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/JarSubsetResourceSet.java
@@ -44,8 +44,8 @@
import org.apache.catalina.WebResourceRoot;
import org.apache.catalina.webresources.AbstractArchiveResourceSet;
import org.apache.catalina.webresources.JarResourceSet;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
final class JarSubsetResourceSet extends JarResourceSet {
diff --git a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/ManagedTomcatService.java b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/ManagedTomcatService.java
index aec032492eb..697252a15a6 100644
--- a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/ManagedTomcatService.java
+++ b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/ManagedTomcatService.java
@@ -25,12 +25,12 @@
import org.apache.catalina.LifecycleState;
import org.apache.catalina.Service;
import org.apache.catalina.connector.Connector;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Sets;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.server.Server;
import com.linecorp.armeria.server.ServerListener;
import com.linecorp.armeria.server.ServerListenerAdapter;
diff --git a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatService.java b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatService.java
index 13d3c159d61..5f4c0a48e5d 100644
--- a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatService.java
+++ b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatService.java
@@ -46,6 +46,7 @@
import org.apache.tomcat.util.buf.CharChunk;
import org.apache.tomcat.util.buf.MessageBytes;
import org.apache.tomcat.util.http.MimeHeaders;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -62,7 +63,6 @@
import com.linecorp.armeria.common.MediaType;
import com.linecorp.armeria.common.ResponseHeaders;
import com.linecorp.armeria.common.ResponseHeadersBuilder;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLogProperty;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.internal.server.servlet.ServletTlsAttributes;
diff --git a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatServiceBuilder.java b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatServiceBuilder.java
index 1ea68b32bdc..f51d5204dc6 100644
--- a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatServiceBuilder.java
+++ b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatServiceBuilder.java
@@ -36,8 +36,7 @@
import org.apache.catalina.core.StandardService;
import org.apache.catalina.realm.NullRealm;
import org.apache.catalina.startup.Tomcat;
-
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Builds a {@link TomcatService}. Use the factory methods in {@link TomcatService} if you do not override
diff --git a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatServiceConfig.java b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatServiceConfig.java
index 6b1e07e12c0..a888e3cd6d7 100644
--- a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatServiceConfig.java
+++ b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatServiceConfig.java
@@ -24,11 +24,10 @@
import org.apache.catalina.core.StandardEngine;
import org.apache.catalina.core.StandardServer;
import org.apache.catalina.core.StandardService;
+import org.jspecify.annotations.Nullable;
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
-
/**
* {@link TomcatService} configuration.
*/
diff --git a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatServiceException.java b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatServiceException.java
index 5cd88a4a73d..0f7423fa625 100644
--- a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatServiceException.java
+++ b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatServiceException.java
@@ -16,7 +16,7 @@
package com.linecorp.armeria.server.tomcat;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A {@link RuntimeException} that is raised when configuring or starting an embedded Tomcat fails.
diff --git a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatUtil.java b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatUtil.java
index d594c4decc4..90a17ed3cb4 100644
--- a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatUtil.java
+++ b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/TomcatUtil.java
@@ -33,8 +33,7 @@
import org.apache.catalina.startup.Constants;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.startup.Tomcat.DefaultWebXmlListener;
-
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
final class TomcatUtil {
diff --git a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/UnmanagedTomcatService.java b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/UnmanagedTomcatService.java
index 60f74b36578..a31e11ea706 100644
--- a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/UnmanagedTomcatService.java
+++ b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/UnmanagedTomcatService.java
@@ -20,8 +20,7 @@
import org.apache.catalina.connector.Connector;
import org.apache.catalina.startup.Tomcat;
-
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
final class UnmanagedTomcatService extends TomcatService {
diff --git a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/package-info.java b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/package-info.java
index 8c22ba2a294..8cdb2d70ec1 100644
--- a/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/package-info.java
+++ b/tomcat10/src/main/java/com/linecorp/armeria/server/tomcat/package-info.java
@@ -17,7 +17,7 @@
/**
* Embedded Tomcat service.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.tomcat;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/tomcat10/src/test/java/com/linecorp/armeria/server/tomcat/TomcatServiceAccessLogTest.java b/tomcat10/src/test/java/com/linecorp/armeria/server/tomcat/TomcatServiceAccessLogTest.java
index db9807e3685..5cc8192c94e 100644
--- a/tomcat10/src/test/java/com/linecorp/armeria/server/tomcat/TomcatServiceAccessLogTest.java
+++ b/tomcat10/src/test/java/com/linecorp/armeria/server/tomcat/TomcatServiceAccessLogTest.java
@@ -27,6 +27,7 @@
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.valves.AbstractAccessLogValve;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -34,7 +35,6 @@
import com.linecorp.armeria.client.BlockingWebClient;
import com.linecorp.armeria.client.WebClient;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.server.tomcat.TomcatVersion;
import com.linecorp.armeria.server.ServerBuilder;
import com.linecorp.armeria.testing.junit5.server.ServerExtension;
diff --git a/tomcat8/src/main/java/com/linecorp/armeria/server/tomcat/ArmeriaEndpoint.java b/tomcat8/src/main/java/com/linecorp/armeria/server/tomcat/ArmeriaEndpoint.java
index e25a2d98420..b7e9ea5366c 100644
--- a/tomcat8/src/main/java/com/linecorp/armeria/server/tomcat/ArmeriaEndpoint.java
+++ b/tomcat8/src/main/java/com/linecorp/armeria/server/tomcat/ArmeriaEndpoint.java
@@ -25,8 +25,7 @@
import org.apache.tomcat.util.net.SocketEvent;
import org.apache.tomcat.util.net.SocketProcessorBase;
import org.apache.tomcat.util.net.SocketWrapperBase;
-
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* A fake {@link AbstractEndpoint}.
diff --git a/tomcat8/src/main/java/com/linecorp/armeria/server/tomcat/ArmeriaProcessor.java b/tomcat8/src/main/java/com/linecorp/armeria/server/tomcat/ArmeriaProcessor.java
index 53ebd129599..9a644a818d6 100644
--- a/tomcat8/src/main/java/com/linecorp/armeria/server/tomcat/ArmeriaProcessor.java
+++ b/tomcat8/src/main/java/com/linecorp/armeria/server/tomcat/ArmeriaProcessor.java
@@ -25,8 +25,7 @@
import org.apache.tomcat.util.buf.ByteChunk;
import org.apache.tomcat.util.net.AbstractEndpoint;
import org.apache.tomcat.util.net.SocketWrapperBase;
-
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Provides a fake Processor to provide {@link ActionHook} to request/response.
@@ -91,9 +90,8 @@ protected AbstractEndpoint.Handler.SocketState dispatchEndRequest() throws IOExc
throw new UnsupportedOperationException();
}
- @Nullable
@Override
- protected AbstractEndpoint.Handler.SocketState service(SocketWrapperBase> socketWrapper)
+ protected AbstractEndpoint.Handler.@Nullable SocketState service(SocketWrapperBase> socketWrapper)
throws IOException {
// Doesn't seem to be used.
return null;
diff --git a/tomcat8/src/main/java/com/linecorp/armeria/server/tomcat/package-info.java b/tomcat8/src/main/java/com/linecorp/armeria/server/tomcat/package-info.java
index 40575affbf6..a79a07d78b4 100644
--- a/tomcat8/src/main/java/com/linecorp/armeria/server/tomcat/package-info.java
+++ b/tomcat8/src/main/java/com/linecorp/armeria/server/tomcat/package-info.java
@@ -17,7 +17,7 @@
/**
* Internal classes for embedded Tomcat service.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.tomcat;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/tomcat9/src/main/java/com/linecorp/armeria/server/tomcat/ArmeriaProcessor.java b/tomcat9/src/main/java/com/linecorp/armeria/server/tomcat/ArmeriaProcessor.java
index 5452b1cfca9..39256807470 100644
--- a/tomcat9/src/main/java/com/linecorp/armeria/server/tomcat/ArmeriaProcessor.java
+++ b/tomcat9/src/main/java/com/linecorp/armeria/server/tomcat/ArmeriaProcessor.java
@@ -25,8 +25,7 @@
import org.apache.tomcat.util.buf.ByteChunk;
import org.apache.tomcat.util.net.AbstractEndpoint;
import org.apache.tomcat.util.net.SocketWrapperBase;
-
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Provides a fake Processor to provide {@code ActionHook} to request/response.
@@ -99,9 +98,8 @@ protected AbstractEndpoint.Handler.SocketState dispatchEndRequest() throws IOExc
throw new UnsupportedOperationException();
}
- @Nullable
@Override
- protected AbstractEndpoint.Handler.SocketState service(SocketWrapperBase> socketWrapper)
+ protected AbstractEndpoint.Handler.@Nullable SocketState service(SocketWrapperBase> socketWrapper)
throws IOException {
// Doesn't seem to be used.
return null;
diff --git a/xds-api/src/main/java/com/linecorp/armeria/xds/api/package-info.java b/xds-api/src/main/java/com/linecorp/armeria/xds/api/package-info.java
index fb209b63856..7776eb1f401 100644
--- a/xds-api/src/main/java/com/linecorp/armeria/xds/api/package-info.java
+++ b/xds-api/src/main/java/com/linecorp/armeria/xds/api/package-info.java
@@ -18,9 +18,10 @@
* Provides integrations with the
* v3 gRPC-xDS protocol.
*/
-@NonNullByDefault
+@NullMarked
@UnstableApi
package com.linecorp.armeria.xds.api;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/xds-validator/src/main/java/com/linecorp/armeria/xds/validator/package-info.java b/xds-validator/src/main/java/com/linecorp/armeria/xds/validator/package-info.java
index a1fa4df15d4..40b66618843 100644
--- a/xds-validator/src/main/java/com/linecorp/armeria/xds/validator/package-info.java
+++ b/xds-validator/src/main/java/com/linecorp/armeria/xds/validator/package-info.java
@@ -19,8 +19,9 @@
* v3 gRPC-xDS protocol.
*/
@UnstableApi
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.xds.validator;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/AbstractResourceNode.java b/xds/src/main/java/com/linecorp/armeria/xds/AbstractResourceNode.java
index 67a24b959e5..c83bf3e7a28 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/AbstractResourceNode.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/AbstractResourceNode.java
@@ -21,13 +21,12 @@
import java.util.HashSet;
import java.util.Set;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
-import com.linecorp.armeria.common.annotation.Nullable;
-
import io.envoyproxy.envoy.config.core.v3.ConfigSource;
import io.grpc.Status;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/AbstractRoot.java b/xds/src/main/java/com/linecorp/armeria/xds/AbstractRoot.java
index 0cb33eb53db..72fd35d5701 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/AbstractRoot.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/AbstractRoot.java
@@ -23,12 +23,12 @@
import java.util.Set;
import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.annotations.VisibleForTesting;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.SafeCloseable;
import io.grpc.Status;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/BootstrapClusters.java b/xds/src/main/java/com/linecorp/armeria/xds/BootstrapClusters.java
index 6173afd5553..328db61d104 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/BootstrapClusters.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/BootstrapClusters.java
@@ -20,10 +20,11 @@
import java.util.List;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.metric.MeterIdPrefix;
import com.linecorp.armeria.xds.client.endpoint.XdsLoadBalancer;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/ClusterResourceNode.java b/xds/src/main/java/com/linecorp/armeria/xds/ClusterResourceNode.java
index c0da5d8d9a9..239b39cbbb6 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/ClusterResourceNode.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/ClusterResourceNode.java
@@ -19,7 +19,8 @@
import static com.google.common.base.Strings.isNullOrEmpty;
import static com.linecorp.armeria.xds.XdsType.CLUSTER;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.xds.client.endpoint.UpdatableXdsLoadBalancer;
import io.envoyproxy.envoy.config.cluster.v3.Cluster;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/ClusterSnapshot.java b/xds/src/main/java/com/linecorp/armeria/xds/ClusterSnapshot.java
index 8ab4ce1fcf8..c7a2997dc71 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/ClusterSnapshot.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/ClusterSnapshot.java
@@ -16,12 +16,13 @@
package com.linecorp.armeria.xds;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.xds.client.endpoint.UpdatableXdsLoadBalancer;
import com.linecorp.armeria.xds.client.endpoint.XdsLoadBalancer;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/ClusterXdsResource.java b/xds/src/main/java/com/linecorp/armeria/xds/ClusterXdsResource.java
index ac29ed6567f..52dd4f6ce90 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/ClusterXdsResource.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/ClusterXdsResource.java
@@ -18,7 +18,8 @@
import static com.google.common.base.Preconditions.checkArgument;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.envoyproxy.envoy.config.cluster.v3.Cluster;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/ConfigSourceMapper.java b/xds/src/main/java/com/linecorp/armeria/xds/ConfigSourceMapper.java
index a114ccb7955..66ce30a566c 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/ConfigSourceMapper.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/ConfigSourceMapper.java
@@ -18,7 +18,7 @@
import static com.google.common.base.Preconditions.checkArgument;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.envoyproxy.envoy.config.bootstrap.v3.Bootstrap;
import io.envoyproxy.envoy.config.core.v3.ApiConfigSource;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/EndpointResourceNode.java b/xds/src/main/java/com/linecorp/armeria/xds/EndpointResourceNode.java
index e7bc36c1c12..70b7343f84b 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/EndpointResourceNode.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/EndpointResourceNode.java
@@ -18,7 +18,7 @@
import static com.linecorp.armeria.xds.XdsType.ENDPOINT;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.envoyproxy.envoy.config.core.v3.ConfigSource;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/FilterUtil.java b/xds/src/main/java/com/linecorp/armeria/xds/FilterUtil.java
index ba3b536395c..8eae5134766 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/FilterUtil.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/FilterUtil.java
@@ -23,6 +23,8 @@
import java.util.Map.Entry;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableMap;
import com.google.protobuf.Any;
import com.google.protobuf.Message;
@@ -37,7 +39,6 @@
import com.linecorp.armeria.client.HttpPreprocessor;
import com.linecorp.armeria.client.RpcPreprocessor;
import com.linecorp.armeria.client.retry.RetryingClient;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.xds.filter.HttpFilterFactory;
import com.linecorp.armeria.xds.filter.HttpFilterFactoryRegistry;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/ListenerResourceNode.java b/xds/src/main/java/com/linecorp/armeria/xds/ListenerResourceNode.java
index b505a51911d..e26f33c6659 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/ListenerResourceNode.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/ListenerResourceNode.java
@@ -18,7 +18,7 @@
import static com.linecorp.armeria.xds.XdsType.LISTENER;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.envoyproxy.envoy.config.core.v3.ConfigSource;
import io.envoyproxy.envoy.config.route.v3.RouteConfiguration;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/ListenerSnapshot.java b/xds/src/main/java/com/linecorp/armeria/xds/ListenerSnapshot.java
index 45dd7bb0162..af4964f2395 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/ListenerSnapshot.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/ListenerSnapshot.java
@@ -16,11 +16,12 @@
package com.linecorp.armeria.xds;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
import com.linecorp.armeria.client.ClientPreprocessors;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.envoyproxy.envoy.config.listener.v3.Listener;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/ListenerXdsResource.java b/xds/src/main/java/com/linecorp/armeria/xds/ListenerXdsResource.java
index 339dac11dd4..00df0243eb3 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/ListenerXdsResource.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/ListenerXdsResource.java
@@ -20,9 +20,10 @@
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.google.protobuf.Any;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.envoyproxy.envoy.config.listener.v3.Listener;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/ParsedFilterConfig.java b/xds/src/main/java/com/linecorp/armeria/xds/ParsedFilterConfig.java
index 3b06e1cc58f..6171eda7478 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/ParsedFilterConfig.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/ParsedFilterConfig.java
@@ -18,10 +18,11 @@
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
+
import com.google.protobuf.Any;
import com.google.protobuf.Message;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.xds.filter.HttpFilterFactory;
import com.linecorp.armeria.xds.filter.HttpFilterFactoryRegistry;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/ResourceNode.java b/xds/src/main/java/com/linecorp/armeria/xds/ResourceNode.java
index 2a6c3ff6a55..c74ae738017 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/ResourceNode.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/ResourceNode.java
@@ -16,7 +16,8 @@
package com.linecorp.armeria.xds;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.common.util.SafeCloseable;
import io.envoyproxy.envoy.config.core.v3.ConfigSource;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/RetryStateFactory.java b/xds/src/main/java/com/linecorp/armeria/xds/RetryStateFactory.java
index f18cde2f4e9..21a9b6a0a9c 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/RetryStateFactory.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/RetryStateFactory.java
@@ -24,6 +24,7 @@
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -49,7 +50,6 @@
import com.linecorp.armeria.common.HttpStatus;
import com.linecorp.armeria.common.RequestHeaders;
import com.linecorp.armeria.common.ResponseHeaders;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.logging.RequestLogProperty;
import com.linecorp.armeria.common.util.UnmodifiableFuture;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/RouteEntry.java b/xds/src/main/java/com/linecorp/armeria/xds/RouteEntry.java
index 20a08f395c8..cf7218b0767 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/RouteEntry.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/RouteEntry.java
@@ -23,6 +23,8 @@
import java.util.Objects;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.client.ClientDecoration;
@@ -30,7 +32,6 @@
import com.linecorp.armeria.client.HttpClient;
import com.linecorp.armeria.client.RpcClient;
import com.linecorp.armeria.client.retry.RetryingClient;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.internal.client.ClientRequestContextExtension;
import com.linecorp.armeria.xds.internal.DelegatingHttpClient;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/RouteEntryMatcher.java b/xds/src/main/java/com/linecorp/armeria/xds/RouteEntryMatcher.java
index 4b8d2d2d685..1008dda501b 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/RouteEntryMatcher.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/RouteEntryMatcher.java
@@ -18,6 +18,8 @@
import java.util.List;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Ascii;
import com.google.common.base.Joiner;
@@ -30,7 +32,6 @@
import com.linecorp.armeria.common.HttpMethod;
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.QueryParams;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.xds.internal.XdsCommonUtil;
import io.envoyproxy.envoy.config.route.v3.HeaderMatcher;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/RouteResourceNode.java b/xds/src/main/java/com/linecorp/armeria/xds/RouteResourceNode.java
index 5a00c252b80..2ee239c87a9 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/RouteResourceNode.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/RouteResourceNode.java
@@ -24,9 +24,9 @@
import java.util.List;
import java.util.Set;
-import com.google.common.collect.ImmutableList;
+import org.jspecify.annotations.Nullable;
-import com.linecorp.armeria.common.annotation.Nullable;
+import com.google.common.collect.ImmutableList;
import io.envoyproxy.envoy.config.core.v3.ConfigSource;
import io.envoyproxy.envoy.config.route.v3.RouteConfiguration;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/SotwXdsStream.java b/xds/src/main/java/com/linecorp/armeria/xds/SotwXdsStream.java
index e1046310c61..32026a28c4a 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/SotwXdsStream.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/SotwXdsStream.java
@@ -25,6 +25,7 @@
import java.util.Set;
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -34,7 +35,6 @@
import com.google.rpc.Code;
import com.linecorp.armeria.client.retry.Backoff;
-import com.linecorp.armeria.common.annotation.Nullable;
import io.envoyproxy.envoy.config.core.v3.Node;
import io.envoyproxy.envoy.service.discovery.v3.DiscoveryRequest;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/SubscriberStorage.java b/xds/src/main/java/com/linecorp/armeria/xds/SubscriberStorage.java
index 2bc465f2e0b..e8fdb3b11f7 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/SubscriberStorage.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/SubscriberStorage.java
@@ -22,9 +22,10 @@
import java.util.Map;
import java.util.Set;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableMap;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.SafeCloseable;
import io.netty.util.concurrent.EventExecutor;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/VirtualHostResourceNode.java b/xds/src/main/java/com/linecorp/armeria/xds/VirtualHostResourceNode.java
index bd42c0293a0..735382561c4 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/VirtualHostResourceNode.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/VirtualHostResourceNode.java
@@ -20,11 +20,11 @@
import java.util.Map;
import java.util.Set;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
-import com.linecorp.armeria.common.annotation.Nullable;
-
import io.envoyproxy.envoy.config.core.v3.ConfigSource;
import io.envoyproxy.envoy.config.route.v3.Route;
import io.envoyproxy.envoy.config.route.v3.RouteAction;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/XdsBootstrapBuilder.java b/xds/src/main/java/com/linecorp/armeria/xds/XdsBootstrapBuilder.java
index fc7864f7412..bd861fdd5ab 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/XdsBootstrapBuilder.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/XdsBootstrapBuilder.java
@@ -19,11 +19,11 @@
import static com.google.common.base.MoreObjects.firstNonNull;
import static java.util.Objects.requireNonNull;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.linecorp.armeria.common.Flags;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.metric.MeterIdPrefix;
import com.linecorp.armeria.common.util.EventLoopGroups;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/XdsClusterManager.java b/xds/src/main/java/com/linecorp/armeria/xds/XdsClusterManager.java
index d4cc49e5375..9629f2156e8 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/XdsClusterManager.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/XdsClusterManager.java
@@ -22,9 +22,10 @@
import java.util.HashMap;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.Strings;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.metric.MeterIdPrefix;
import com.linecorp.armeria.common.util.SafeCloseable;
import com.linecorp.armeria.xds.client.endpoint.UpdatableXdsLoadBalancer;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/XdsConverterUtil.java b/xds/src/main/java/com/linecorp/armeria/xds/XdsConverterUtil.java
index 28d71f69792..5ba6d4e57ee 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/XdsConverterUtil.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/XdsConverterUtil.java
@@ -18,7 +18,7 @@
import static com.google.common.base.Preconditions.checkArgument;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
import io.envoyproxy.envoy.config.core.v3.ApiConfigSource;
import io.envoyproxy.envoy.config.core.v3.ApiConfigSource.ApiType;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/XdsResourceParserUtil.java b/xds/src/main/java/com/linecorp/armeria/xds/XdsResourceParserUtil.java
index 5da380d02d0..0561fa00a1b 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/XdsResourceParserUtil.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/XdsResourceParserUtil.java
@@ -20,7 +20,7 @@
import java.util.HashMap;
import java.util.Map;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
final class XdsResourceParserUtil {
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/XdsStreamSubscriber.java b/xds/src/main/java/com/linecorp/armeria/xds/XdsStreamSubscriber.java
index e347f00cb9d..e81bbe59e1c 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/XdsStreamSubscriber.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/XdsStreamSubscriber.java
@@ -21,10 +21,10 @@
import java.util.Set;
import java.util.concurrent.TimeUnit;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.SafeCloseable;
import com.linecorp.armeria.xds.SubscriberStorage.ResourceCache;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/DefaultLbStateFactory.java b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/DefaultLbStateFactory.java
index 80e53adad40..684a9bb89b4 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/DefaultLbStateFactory.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/DefaultLbStateFactory.java
@@ -20,6 +20,7 @@
import java.util.Map;
import java.util.SortedSet;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -30,7 +31,6 @@
import com.google.common.math.LongMath;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.xds.client.endpoint.DefaultLoadBalancer.DistributeLoadState;
import com.linecorp.armeria.xds.client.endpoint.DefaultLoadBalancer.HostAvailability;
import com.linecorp.armeria.xds.client.endpoint.DefaultLoadBalancer.PriorityAndAvailability;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/DefaultLoadBalancer.java b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/DefaultLoadBalancer.java
index 3beede04848..7d51e0ae29f 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/DefaultLoadBalancer.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/DefaultLoadBalancer.java
@@ -22,6 +22,8 @@
import java.util.Map;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableMap;
import com.google.protobuf.Struct;
@@ -29,7 +31,6 @@
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.client.endpoint.EndpointGroup;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.xds.client.endpoint.DefaultLbStateFactory.DefaultLbState;
import com.linecorp.armeria.xds.client.endpoint.LocalityRoutingStateFactory.LocalityRoutingState;
import com.linecorp.armeria.xds.client.endpoint.LocalityRoutingStateFactory.State;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/DefaultXdsLoadBalancer.java b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/DefaultXdsLoadBalancer.java
index 1eb1536779a..ae331583c66 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/DefaultXdsLoadBalancer.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/DefaultXdsLoadBalancer.java
@@ -23,11 +23,12 @@
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.client.endpoint.EndpointGroup;
import com.linecorp.armeria.common.TimeoutException;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.AbstractListenable;
import com.linecorp.armeria.internal.client.AbstractAsyncSelector;
import com.linecorp.armeria.xds.ClusterSnapshot;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/EndpointUtil.java b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/EndpointUtil.java
index c26a9d22924..29ed1057555 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/EndpointUtil.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/EndpointUtil.java
@@ -18,6 +18,7 @@
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -27,7 +28,6 @@
import com.linecorp.armeria.client.endpoint.EndpointSelectionStrategy;
import com.linecorp.armeria.client.endpoint.WeightRampingUpStrategyBuilder;
import com.linecorp.armeria.common.HttpMethod;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.loadbalancer.WeightTransition;
import com.linecorp.armeria.internal.client.endpoint.EndpointAttributeKeys;
import com.linecorp.armeria.xds.ClusterSnapshot;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/LoadBalancer.java b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/LoadBalancer.java
index 687d10c269b..ef02c25ddbf 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/LoadBalancer.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/LoadBalancer.java
@@ -16,9 +16,10 @@
package com.linecorp.armeria.xds.client.endpoint;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
interface LoadBalancer extends LoadBalancerState {
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/LocalityRoutingStateFactory.java b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/LocalityRoutingStateFactory.java
index 9e36377822e..fd72fd72972 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/LocalityRoutingStateFactory.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/LocalityRoutingStateFactory.java
@@ -22,13 +22,14 @@
import java.util.Map.Entry;
import java.util.stream.Collectors;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.protobuf.AbstractMessage;
import com.linecorp.armeria.client.endpoint.EndpointGroup;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.xds.client.endpoint.XdsRandom.RandomHint;
import io.envoyproxy.envoy.config.core.v3.Locality;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/PrioritySet.java b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/PrioritySet.java
index cedfe4ada52..d81c08d40d0 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/PrioritySet.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/PrioritySet.java
@@ -21,11 +21,12 @@
import java.util.SortedSet;
import java.util.TreeSet;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableMap;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.xds.ClusterSnapshot;
import com.linecorp.armeria.xds.EndpointSnapshot;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/RouteConfig.java b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/RouteConfig.java
index 3c8177c7d0f..a8f7467447a 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/RouteConfig.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/RouteConfig.java
@@ -16,10 +16,11 @@
package com.linecorp.armeria.xds.client.endpoint;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.HttpPreClient;
import com.linecorp.armeria.client.PreClientRequestContext;
import com.linecorp.armeria.client.RpcPreClient;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.xds.ListenerSnapshot;
import com.linecorp.armeria.xds.RouteEntry;
import com.linecorp.armeria.xds.RouteSnapshot;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/RouteConfigSelector.java b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/RouteConfigSelector.java
index 14405aa87f8..a6dc98b5ecd 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/RouteConfigSelector.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/RouteConfigSelector.java
@@ -16,8 +16,9 @@
package com.linecorp.armeria.xds.client.endpoint;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.client.AbstractAsyncSelector;
import com.linecorp.armeria.xds.ListenerRoot;
import com.linecorp.armeria.xds.ListenerSnapshot;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/RouterFilter.java b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/RouterFilter.java
index 3b85a309de2..225f5cabba8 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/RouterFilter.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/RouterFilter.java
@@ -21,6 +21,8 @@
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.client.PreClient;
@@ -31,7 +33,6 @@
import com.linecorp.armeria.common.Response;
import com.linecorp.armeria.common.SessionProtocol;
import com.linecorp.armeria.common.TimeoutException;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.xds.ClusterSnapshot;
import com.linecorp.armeria.xds.RouteEntry;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/SubsetLoadBalancer.java b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/SubsetLoadBalancer.java
index 50be777d403..8ac81762224 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/SubsetLoadBalancer.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/SubsetLoadBalancer.java
@@ -25,6 +25,7 @@
import java.util.Map;
import java.util.Map.Entry;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -35,7 +36,6 @@
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.xds.ClusterSnapshot;
import io.envoyproxy.envoy.config.cluster.v3.Cluster;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/VirtualHostMatcher.java b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/VirtualHostMatcher.java
index c062ec16f3f..34e0b2e45b1 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/VirtualHostMatcher.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/VirtualHostMatcher.java
@@ -25,11 +25,12 @@
import java.util.Map;
import java.util.Map.Entry;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.Ascii;
import com.google.common.collect.ImmutableList;
import com.linecorp.armeria.client.PreClientRequestContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.xds.ListenerSnapshot;
import com.linecorp.armeria.xds.RouteSnapshot;
import com.linecorp.armeria.xds.VirtualHostSnapshot;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/XdsEndpointGroup.java b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/XdsEndpointGroup.java
index e6db955f2fd..be874d6f4a8 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/XdsEndpointGroup.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/XdsEndpointGroup.java
@@ -24,6 +24,8 @@
import java.util.concurrent.locks.Lock;
import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.client.ClientRequestContext;
@@ -33,7 +35,6 @@
import com.linecorp.armeria.client.endpoint.EndpointSelectionStrategy;
import com.linecorp.armeria.client.endpoint.EndpointSelector;
import com.linecorp.armeria.common.Flags;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.common.util.AbstractListenable;
import com.linecorp.armeria.common.util.UnmodifiableFuture;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/XdsLoadBalancer.java b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/XdsLoadBalancer.java
index a057e88a4ba..8e56a9935fa 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/XdsLoadBalancer.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/XdsLoadBalancer.java
@@ -21,10 +21,11 @@
import java.util.concurrent.ScheduledExecutorService;
import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.client.endpoint.EndpointSelector;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import com.linecorp.armeria.xds.ClusterSnapshot;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/XdsPreprocessor.java b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/XdsPreprocessor.java
index aedfef8f059..d08fd972ea8 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/XdsPreprocessor.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/XdsPreprocessor.java
@@ -22,6 +22,8 @@
import java.util.function.BiFunction;
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.ClientPreprocessors;
import com.linecorp.armeria.client.PreClient;
import com.linecorp.armeria.client.PreClientRequestContext;
@@ -30,7 +32,6 @@
import com.linecorp.armeria.common.Request;
import com.linecorp.armeria.common.Response;
import com.linecorp.armeria.common.TimeoutException;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.xds.ListenerRoot;
import com.linecorp.armeria.xds.XdsBootstrap;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/package-info.java b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/package-info.java
index 35829bd9878..a3d1810ccbe 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/package-info.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/client/endpoint/package-info.java
@@ -17,9 +17,10 @@
/**
* Provides client-side {@link com.linecorp.armeria.client.Endpoint} related integrations with xDS.
*/
-@NonNullByDefault
+@NullMarked
@UnstableApi
package com.linecorp.armeria.xds.client.endpoint;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/filter/HttpFilterFactoryRegistry.java b/xds/src/main/java/com/linecorp/armeria/xds/filter/HttpFilterFactoryRegistry.java
index bee729470a6..b534c7ee1c3 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/filter/HttpFilterFactoryRegistry.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/filter/HttpFilterFactoryRegistry.java
@@ -19,9 +19,10 @@
import java.util.Map;
import java.util.ServiceLoader;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableMap;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
import io.envoyproxy.envoy.extensions.filters.network.http_connection_manager.v3.HttpFilter;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/filter/package-info.java b/xds/src/main/java/com/linecorp/armeria/xds/filter/package-info.java
index 3e45a29127a..a3efda8f82c 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/filter/package-info.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/filter/package-info.java
@@ -17,9 +17,10 @@
/**
* Provides filter related integrations with xDS.
*/
-@NonNullByDefault
+@NullMarked
@UnstableApi
package com.linecorp.armeria.xds.filter;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
+
import com.linecorp.armeria.common.annotation.UnstableApi;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/internal/XdsCommonUtil.java b/xds/src/main/java/com/linecorp/armeria/xds/internal/XdsCommonUtil.java
index 4ce1c2c5fe5..9cc733e7029 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/internal/XdsCommonUtil.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/internal/XdsCommonUtil.java
@@ -16,13 +16,14 @@
package com.linecorp.armeria.xds.internal;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.primitives.Ints;
import com.google.protobuf.Duration;
import com.google.protobuf.UInt32Value;
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.MediaType;
-import com.linecorp.armeria.common.annotation.Nullable;
public final class XdsCommonUtil {
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/internal/package-info.java b/xds/src/main/java/com/linecorp/armeria/xds/internal/package-info.java
index c9af6d38e4c..b3b788384ac 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/internal/package-info.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/internal/package-info.java
@@ -17,7 +17,7 @@
/**
* Various classes used internally. Anything in this package can be changed or removed at any time.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.xds.internal;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/xds/src/main/java/com/linecorp/armeria/xds/package-info.java b/xds/src/main/java/com/linecorp/armeria/xds/package-info.java
index 2e2e8690423..a2e9558bfab 100644
--- a/xds/src/main/java/com/linecorp/armeria/xds/package-info.java
+++ b/xds/src/main/java/com/linecorp/armeria/xds/package-info.java
@@ -18,7 +18,7 @@
* Provides integrations with the
* v3 gRPC-xDS protocol.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.xds;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/xds/src/test/java/com/linecorp/armeria/xds/XdsTestResources.java b/xds/src/test/java/com/linecorp/armeria/xds/XdsTestResources.java
index 0de39ba5037..19d675e19bd 100644
--- a/xds/src/test/java/com/linecorp/armeria/xds/XdsTestResources.java
+++ b/xds/src/test/java/com/linecorp/armeria/xds/XdsTestResources.java
@@ -21,6 +21,8 @@
import java.util.Arrays;
import java.util.Collection;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.protobuf.Any;
@@ -28,8 +30,6 @@
import com.google.protobuf.Value;
import com.google.protobuf.util.Durations;
-import com.linecorp.armeria.common.annotation.Nullable;
-
import io.envoyproxy.envoy.config.bootstrap.v3.Bootstrap;
import io.envoyproxy.envoy.config.bootstrap.v3.Bootstrap.DynamicResources;
import io.envoyproxy.envoy.config.bootstrap.v3.Bootstrap.StaticResources;
diff --git a/xds/src/test/java/com/linecorp/armeria/xds/XdsTestUtil.java b/xds/src/test/java/com/linecorp/armeria/xds/XdsTestUtil.java
index 88b34792a86..cb7607b8f90 100644
--- a/xds/src/test/java/com/linecorp/armeria/xds/XdsTestUtil.java
+++ b/xds/src/test/java/com/linecorp/armeria/xds/XdsTestUtil.java
@@ -21,7 +21,8 @@
import java.util.List;
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.xds.client.endpoint.XdsLoadBalancer;
import io.envoyproxy.envoy.config.cluster.v3.Cluster;
diff --git a/xds/src/test/java/com/linecorp/armeria/xds/client/endpoint/PriorityTest.java b/xds/src/test/java/com/linecorp/armeria/xds/client/endpoint/PriorityTest.java
index caaf5119364..43e75a210ac 100644
--- a/xds/src/test/java/com/linecorp/armeria/xds/client/endpoint/PriorityTest.java
+++ b/xds/src/test/java/com/linecorp/armeria/xds/client/endpoint/PriorityTest.java
@@ -30,6 +30,7 @@
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
@@ -42,7 +43,6 @@
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.common.HttpMethod;
import com.linecorp.armeria.common.HttpRequest;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.xds.ListenerRoot;
import com.linecorp.armeria.xds.XdsBootstrap;
import com.linecorp.armeria.xds.client.endpoint.XdsRandom.RandomHint;
diff --git a/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/CuratorDiscoverySpec.java b/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/CuratorDiscoverySpec.java
index b2dc29b31e1..cb03e667efe 100644
--- a/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/CuratorDiscoverySpec.java
+++ b/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/CuratorDiscoverySpec.java
@@ -18,13 +18,13 @@
import java.util.function.Function;
import org.apache.curator.x.discovery.ServiceInstance;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.zookeeper.CuratorXNodeValueCodec;
final class CuratorDiscoverySpec implements ZooKeeperDiscoverySpec {
diff --git a/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/CuratorDiscoverySpecBuilder.java b/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/CuratorDiscoverySpecBuilder.java
index 356339b78da..cf56dfa6de4 100644
--- a/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/CuratorDiscoverySpecBuilder.java
+++ b/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/CuratorDiscoverySpecBuilder.java
@@ -22,9 +22,9 @@
import java.util.function.Function;
import org.apache.curator.x.discovery.ServiceInstance;
+import org.jspecify.annotations.Nullable;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
/**
* Builds a {@link ZooKeeperDiscoverySpec} for
diff --git a/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/LegacyZooKeeperDiscoverySpec.java b/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/LegacyZooKeeperDiscoverySpec.java
index 9446e9bcf7e..7691429fe6b 100644
--- a/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/LegacyZooKeeperDiscoverySpec.java
+++ b/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/LegacyZooKeeperDiscoverySpec.java
@@ -17,8 +17,9 @@
import javax.annotation.Nonnull;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.zookeeper.LegacyNodeValueCodec;
enum LegacyZooKeeperDiscoverySpec implements ZooKeeperDiscoverySpec {
diff --git a/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/ServerSetsDiscoverySpec.java b/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/ServerSetsDiscoverySpec.java
index 3ba695f44e1..f70df31b6a2 100644
--- a/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/ServerSetsDiscoverySpec.java
+++ b/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/ServerSetsDiscoverySpec.java
@@ -17,11 +17,11 @@
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.zookeeper.ServerSetsInstance;
import com.linecorp.armeria.internal.common.zookeeper.ServerSetsNodeValueCodec;
diff --git a/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/ZooKeeperDiscoverySpec.java b/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/ZooKeeperDiscoverySpec.java
index e4c97edd3a1..7285e4c6ac0 100644
--- a/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/ZooKeeperDiscoverySpec.java
+++ b/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/ZooKeeperDiscoverySpec.java
@@ -19,8 +19,9 @@
import java.util.function.Function;
+import org.jspecify.annotations.Nullable;
+
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.zookeeper.ServerSetsInstance;
import com.linecorp.armeria.server.zookeeper.ZooKeeperRegistrationSpec;
diff --git a/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/ZooKeeperEndpointGroup.java b/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/ZooKeeperEndpointGroup.java
index 7de3b4dad1c..a01d0d4a3e3 100644
--- a/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/ZooKeeperEndpointGroup.java
+++ b/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/ZooKeeperEndpointGroup.java
@@ -26,6 +26,7 @@
import org.apache.curator.framework.imps.CuratorFrameworkState;
import org.apache.curator.framework.recipes.cache.PathChildrenCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -33,7 +34,6 @@
import com.linecorp.armeria.client.endpoint.DynamicEndpointGroup;
import com.linecorp.armeria.client.endpoint.EndpointGroup;
import com.linecorp.armeria.client.endpoint.EndpointSelectionStrategy;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.ThreadFactories;
import com.linecorp.armeria.server.zookeeper.ZooKeeperUpdatingListener;
diff --git a/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/package-info.java b/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/package-info.java
index a76d592cfd1..018cc2cf32a 100644
--- a/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/package-info.java
+++ b/zookeeper3/src/main/java/com/linecorp/armeria/client/zookeeper/package-info.java
@@ -16,7 +16,7 @@
/**
* ZooKeeper-based {@link com.linecorp.armeria.client.endpoint.EndpointGroup} for automatic service discovery.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.client.zookeeper;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/zookeeper3/src/main/java/com/linecorp/armeria/common/zookeeper/AbstractCuratorFrameworkBuilder.java b/zookeeper3/src/main/java/com/linecorp/armeria/common/zookeeper/AbstractCuratorFrameworkBuilder.java
index 4721f5ee760..5272d7ab64e 100644
--- a/zookeeper3/src/main/java/com/linecorp/armeria/common/zookeeper/AbstractCuratorFrameworkBuilder.java
+++ b/zookeeper3/src/main/java/com/linecorp/armeria/common/zookeeper/AbstractCuratorFrameworkBuilder.java
@@ -28,11 +28,11 @@
import org.apache.curator.framework.CuratorFrameworkFactory.Builder;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.common.PathUtils;
+import org.jspecify.annotations.Nullable;
import com.google.common.collect.ImmutableList;
import com.google.common.primitives.Ints;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.annotation.UnstableApi;
/**
@@ -50,10 +50,8 @@ public class AbstractCuratorFrameworkBuilder> customizers;
+ private final CuratorFrameworkFactory.@Nullable Builder clientBuilder;
+ private final ImmutableList.@Nullable Builder> customizers;
/**
* Creates a new instance with the specified {@code zkConnectionStr}.
diff --git a/zookeeper3/src/main/java/com/linecorp/armeria/common/zookeeper/ServerSetsInstance.java b/zookeeper3/src/main/java/com/linecorp/armeria/common/zookeeper/ServerSetsInstance.java
index 2267f056fe9..aac74698745 100644
--- a/zookeeper3/src/main/java/com/linecorp/armeria/common/zookeeper/ServerSetsInstance.java
+++ b/zookeeper3/src/main/java/com/linecorp/armeria/common/zookeeper/ServerSetsInstance.java
@@ -34,6 +34,8 @@
import java.util.Map;
+import org.jspecify.annotations.Nullable;
+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.google.common.base.MoreObjects;
@@ -41,7 +43,6 @@
import com.google.common.collect.ImmutableMap;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.zookeeper.ServerSetsInstanceConverter.FinagleServiceInstanceDeserializer;
import com.linecorp.armeria.common.zookeeper.ServerSetsInstanceConverter.FinagleServiceInstanceSerializer;
diff --git a/zookeeper3/src/main/java/com/linecorp/armeria/common/zookeeper/package-info.java b/zookeeper3/src/main/java/com/linecorp/armeria/common/zookeeper/package-info.java
index 20bdcba01c2..175cd37a5d5 100644
--- a/zookeeper3/src/main/java/com/linecorp/armeria/common/zookeeper/package-info.java
+++ b/zookeeper3/src/main/java/com/linecorp/armeria/common/zookeeper/package-info.java
@@ -16,7 +16,7 @@
/**
* ZooKeeper-related common classes.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.common.zookeeper;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/zookeeper3/src/main/java/com/linecorp/armeria/internal/common/zookeeper/package-info.java b/zookeeper3/src/main/java/com/linecorp/armeria/internal/common/zookeeper/package-info.java
index a481210d726..7bc8800e633 100644
--- a/zookeeper3/src/main/java/com/linecorp/armeria/internal/common/zookeeper/package-info.java
+++ b/zookeeper3/src/main/java/com/linecorp/armeria/internal/common/zookeeper/package-info.java
@@ -16,7 +16,7 @@
/**
* ZooKeeper-related internal common classes.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.internal.common.zookeeper;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/CuratorRegistrationSpecBuilder.java b/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/CuratorRegistrationSpecBuilder.java
index b47cc716ed2..e1fc039d44f 100644
--- a/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/CuratorRegistrationSpecBuilder.java
+++ b/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/CuratorRegistrationSpecBuilder.java
@@ -24,8 +24,7 @@
import org.apache.curator.x.discovery.ServiceInstance;
import org.apache.curator.x.discovery.ServiceType;
import org.apache.curator.x.discovery.UriSpec;
-
-import com.linecorp.armeria.common.annotation.Nullable;
+import org.jspecify.annotations.Nullable;
/**
* Builds a {@link ZooKeeperRegistrationSpec} for
diff --git a/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/LegacyZooKeeperRegistrationSpec.java b/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/LegacyZooKeeperRegistrationSpec.java
index b8ea8857ca3..149302bbf2c 100644
--- a/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/LegacyZooKeeperRegistrationSpec.java
+++ b/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/LegacyZooKeeperRegistrationSpec.java
@@ -17,10 +17,11 @@
import static com.linecorp.armeria.internal.common.zookeeper.ZooKeeperPathUtil.validatePath;
+import org.jspecify.annotations.Nullable;
+
import com.google.common.base.MoreObjects;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.internal.common.zookeeper.LegacyNodeValueCodec;
final class LegacyZooKeeperRegistrationSpec implements ZooKeeperRegistrationSpec {
diff --git a/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/ServerSetsRegistrationSpecBuilder.java b/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/ServerSetsRegistrationSpecBuilder.java
index f2a9dc36e4e..54ce8662938 100644
--- a/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/ServerSetsRegistrationSpecBuilder.java
+++ b/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/ServerSetsRegistrationSpecBuilder.java
@@ -21,11 +21,11 @@
import java.util.Map;
import org.apache.zookeeper.CreateMode;
+import org.jspecify.annotations.Nullable;
import com.google.common.collect.ImmutableMap;
import com.linecorp.armeria.client.Endpoint;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.zookeeper.ServerSetsInstance;
/**
diff --git a/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/ZooKeeperUpdatingListener.java b/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/ZooKeeperUpdatingListener.java
index 68be2e5fef2..f59e0532ef1 100644
--- a/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/ZooKeeperUpdatingListener.java
+++ b/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/ZooKeeperUpdatingListener.java
@@ -23,13 +23,13 @@
import org.apache.curator.framework.imps.CuratorFrameworkState;
import org.apache.curator.x.discovery.ServiceInstance;
import org.apache.zookeeper.CreateMode;
+import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.client.zookeeper.ZooKeeperEndpointGroup;
import com.linecorp.armeria.common.SessionProtocol;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.SystemInfo;
import com.linecorp.armeria.common.zookeeper.ServerSetsInstance;
import com.linecorp.armeria.server.Server;
diff --git a/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/package-info.java b/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/package-info.java
index d92b51a1351..1f77cfa475f 100644
--- a/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/package-info.java
+++ b/zookeeper3/src/main/java/com/linecorp/armeria/server/zookeeper/package-info.java
@@ -16,7 +16,7 @@
/**
* ZooKeeper-based automatic service registration.
*/
-@NonNullByDefault
+@NullMarked
package com.linecorp.armeria.server.zookeeper;
-import com.linecorp.armeria.common.annotation.NonNullByDefault;
+import org.jspecify.annotations.NullMarked;
diff --git a/zookeeper3/src/test/java/com/linecorp/armeria/common/zookeeper/ZooKeeperExtension.java b/zookeeper3/src/test/java/com/linecorp/armeria/common/zookeeper/ZooKeeperExtension.java
index a0535ceb371..557c1616447 100644
--- a/zookeeper3/src/test/java/com/linecorp/armeria/common/zookeeper/ZooKeeperExtension.java
+++ b/zookeeper3/src/test/java/com/linecorp/armeria/common/zookeeper/ZooKeeperExtension.java
@@ -19,9 +19,9 @@
import java.time.Duration;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.extension.ExtensionContext;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.util.Exceptions;
import com.linecorp.armeria.internal.testing.TemporaryFolder;
import com.linecorp.armeria.testing.junit5.common.AbstractAllOrEachExtension;
diff --git a/zookeeper3/src/test/java/com/linecorp/armeria/server/zookeeper/ZooKeeperRegistrationTest.java b/zookeeper3/src/test/java/com/linecorp/armeria/server/zookeeper/ZooKeeperRegistrationTest.java
index 0ced3f131b4..08939987f91 100644
--- a/zookeeper3/src/test/java/com/linecorp/armeria/server/zookeeper/ZooKeeperRegistrationTest.java
+++ b/zookeeper3/src/test/java/com/linecorp/armeria/server/zookeeper/ZooKeeperRegistrationTest.java
@@ -28,13 +28,13 @@
import org.apache.curator.x.discovery.ServiceInstance;
import org.apache.curator.x.discovery.ServiceType;
import org.apache.curator.x.discovery.UriSpec;
+import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import com.linecorp.armeria.client.Endpoint;
import com.linecorp.armeria.client.zookeeper.ZooKeeperDiscoverySpec;
import com.linecorp.armeria.common.HttpResponse;
-import com.linecorp.armeria.common.annotation.Nullable;
import com.linecorp.armeria.common.zookeeper.ZooKeeperExtension;
import com.linecorp.armeria.common.zookeeper.ZooKeeperTestUtil;
import com.linecorp.armeria.internal.testing.FlakyTest;