This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch docs
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/docs by this push:
new 6a041405e5 docs: document TODO-38 REST client + HTTP stack promotion
and classic module split
6a041405e5 is described below
commit 6a041405e53131847e417326b066ec283e0bb422
Author: James Bognar <[email protected]>
AuthorDate: Tue May 19 09:15:44 2026 -0400
docs: document TODO-38 REST client + HTTP stack promotion and classic
module split
Co-authored-by: Cursor <[email protected]>
---
pages/release-notes/9.5.0.md | 86 +++++++++++++++-------
pages/topics/01.05.RestClient.md | 10 ++-
pages/topics/12.15.NextGenRestClient.md | 103 ++++++++++++++++-----------
pages/topics/13.02.MockRestClientOverview.md | 19 +++--
pages/topics/20.03.JuneauShadedRestClient.md | 9 +--
pages/topics/20.06.JuneauShadedAll.md | 6 +-
pages/topics/23.01.V9.5-migration-guide.md | 64 +++++++++++++++++
7 files changed, 212 insertions(+), 85 deletions(-)
diff --git a/pages/release-notes/9.5.0.md b/pages/release-notes/9.5.0.md
index 3fc09ddb7c..03ecc69d96 100644
--- a/pages/release-notes/9.5.0.md
+++ b/pages/release-notes/9.5.0.md
@@ -2067,53 +2067,87 @@ same path. This covers all sources: `Jetty/servlets`,
`Jetty/servletMap`, and `@
> exact-type, so a bean registered under `MyRestServlet.class` would not be
> visible to the
> auto-mount logic which queries for `Servlet.class`.
-### Next-Generation REST Client and HTTP Stack (Beta)
+### Transport-Agnostic REST Client and HTTP Stack (TODO-38)
-Juneau 9.5.0 introduces a new REST client and HTTP type stack under
`org.apache.juneau.ng.*` that decouples Juneau from Apache HttpClient 4.5. The
new stack is shipped **alongside** the existing `juneau-rest-client` /
`juneau-rest-common` APIs — both continue to work unchanged.
+Juneau 9.5.0 introduces a new REST client and HTTP type stack that **decouples
Juneau from Apache HttpClient 4.5** and promotes it to the canonical names. The
pre-existing HC4.5-based stack continues to ship under explicit `.classic`
packages and a new `juneau-rest-client-classic` module, so existing callers
keep working without source changes other than adding a Maven dependency and
importing from the new package.
-**Beta API**: All public types under `org.apache.juneau.ng.*` are beta and may
change incompatibly in the next major release. For production deployments that
require strict binary stability, continue using the classic `RestClient` /
`juneau-rest-common` APIs until the NG stack is declared stable.
+**Beta API**: The non-classic types in `org.apache.juneau.rest.client.*`,
`org.apache.juneau.rest.mock.*`, and `org.apache.juneau.http.*` are beta and
may change incompatibly in the next major release. The classic stack remains
the binary-stable choice for the 9.x line.
-#### `org.apache.juneau.ng.http` (in `juneau-rest-common`)
+#### Canonical names (was `org.apache.juneau.ng.*`)
-A JDK-native replacement for the Apache HttpCore-based types in
`juneau-rest-common`. No `httpcore` dependency in this package — all interfaces
(`HttpHeader`, `HttpPart`, `HttpBody`, `HttpStatusLine`, `HttpResponseMessage`)
use JDK types only.
+The 9.5 cut moves the canonical names off the `org.apache.juneau.ng.*`
placeholder and frees up the historical `org.apache.juneau.*` namespace:
+
+| 9.5 early-snapshot (pre-rename) | 9.5 GA (canonical) |
+|---|---|
+| `org.apache.juneau.ng.http.*` (in `juneau-rest-common`) |
`org.apache.juneau.http.*` (canonical, in `juneau-rest-common`) |
+| `org.apache.juneau.ng.rest.client.*` (in `juneau-rest-client`) |
`org.apache.juneau.rest.client.*` (canonical, in `juneau-rest-client`) |
+| `org.apache.juneau.ng.rest.mock.*` (in `juneau-rest-mock`) |
`org.apache.juneau.rest.mock.*` (canonical, in `juneau-rest-mock`) |
+| `NgRestClient` / `NgRestRequest` / `NgRestResponse` | `RestClient` /
`RestRequest` / `RestResponse` |
+| `NgMockRestClient` | `MockRestClient` |
+| `juneau-ng-rest-client-apache-httpclient-45` (etc.) |
`juneau-rest-client-apache-httpclient-45` (etc.) |
+
+The pre-existing `org.apache.juneau.http.*` types (Apache HttpCore-based) and
the legacy `RestClient` (Apache HttpClient 4.5-based) moved under `.classic`
packages in their respective modules — see the next section.
+
+#### `org.apache.juneau.http` (in `juneau-rest-common`)
+
+A JDK-native replacement for the Apache HttpCore-based types previously in
this package. No `httpcore` dependency in the canonical types — all interfaces
(`HttpHeader`, `HttpPart`, `HttpBody`, `HttpStatusLine`, `HttpResponseMessage`)
use JDK types only.
- Typed header hierarchy (`HttpStringHeader`, `HttpMediaTypeHeader`,
`HttpMediaRangesHeader`, `HttpStringRangesHeader`, `HttpCsvHeader`,
`HttpDateHeader`, `HttpUriHeader`, `HttpIntegerHeader`, `HttpLongHeader`,
`HttpBooleanHeader`, `HttpEntityTagHeader`, `HttpEntityTagsHeader`) with ~73
RFC-named header classes (`Accept`, `ContentType`, `Authorization`, …).
- Entity / body types: `HttpBodyBean`, `StringBody`, `ByteArrayBody`,
`StreamBody`, `FileBody`, `MultipartBody` (RFC 7578 streaming).
- Status / response types: `HttpStatusLineBean`, `BasicHttpResponse`,
`BasicHttpException`, ~50 named status classes (`Ok`, `Created`, `NotFound`,
`InternalServerError`, …).
-- Remote-proxy annotations re-homed under `org.apache.juneau.ng.http.remote`
(`@Remote`, `@RemoteGet`, `@RemotePost`, `@RemotePut`, `@RemotePatch`,
`@RemoteDelete`, `@RemoteOp`, `@RemoteReturn`).
+- Remote-proxy annotations stay under `org.apache.juneau.http.remote`
(`@Remote`, `@RemoteGet`, `@RemotePost`, `@RemotePut`, `@RemotePatch`,
`@RemoteDelete`, `@RemoteOp`, `@RemoteReturn`).
+
+The Apache HttpCore-based legacy types (~170 classes) moved to
`org.apache.juneau.http.classic.*` in the same module, so existing
`juneau-rest-common` consumers only need an `import
org.apache.juneau.http.classic.*;` adjustment.
-#### `org.apache.juneau.ng.rest.client` (in `juneau-rest-client`)
+#### `org.apache.juneau.rest.client` (in `juneau-rest-client`)
-The transport abstraction and the new `NgRestClient` / `NgRestRequest` /
`NgRestResponse`.
+The transport abstraction and the new canonical `RestClient` / `RestRequest` /
`RestResponse`. No `org.apache.http.*` dependency.
- `HttpTransport` — single integration point replacing
`org.apache.http.client.HttpClient`. Provides synchronous
`send(TransportRequest)` and a `sendAsync(...)` default that transports can
override for native async.
- `TransportRequest`, `TransportResponse` (`Closeable` — owns
connection-release hook), `TransportHeader`, `TransportBody`,
`TransportException` — transport-layer DTOs using JDK types only.
- `HttpTransportBuilder` / `HttpTransportProvider` SPI — `ServiceLoader`-based
auto-discovery; passing a fully-built transport or transport builder is also
supported.
-- `NgRestClient` — composes an `HttpTransport`; one
serializer/parser/marshaller per client (no multi-language mode); fluent
`get/post/put/patch/delete/head/options/formPost/multipartPost` API; remote
proxies via `getRemote(Class)`; explicit `shutdown()` (not `Closeable`).
-- `NgRestRequest` — the single `Closeable` in the user-facing API; resolves
URI + path data + query, runs interceptors, serializes the body, calls the
transport.
+- `RestClient` — composes an `HttpTransport`; one serializer/parser/marshaller
per client (no multi-language mode); fluent
`get/post/put/patch/delete/head/options/formPost/multipartPost` API; remote
proxies via `getRemote(Class)`; explicit `shutdown()` (not `Closeable`).
+- `RestRequest` — the single `Closeable` in the user-facing API; resolves URI
+ path data + query, runs interceptors, serializes the body, calls the
transport.
- `CollectionFormat` enum (`COMMA`, `PIPE`, `SPACE`, `TAB`, `REPEATED`) for
`Iterable` / array-valued params.
- `BodyConverter` — pluggable request-body conversion; default chain handles
`HttpBody`, `MultipartBody`, `InputStream`, `byte[]`, `Reader`, `File`,
`PartList`, and falls back to a `SerializedBody` that streams through the
client's serializer.
- `RestCallInterceptor` — `onInit` / `onConnect` / `onClose` lifecycle hooks
(no Apache types).
- `RestLogger` / `RestLogEntry` / `RestLogLevelResolver` / `BasicRestLogger` —
framework-agnostic logging via `java.lang.System.Logger`, with named-template
formatting (`{method}`, `{uri}`, `{status}`, `{reason}`, `{elapsed}`,
`{req.headers}`, `{req.body}`, `{res.headers}`, `{res.body}`, `{error}`) and
configurable per-level templates.
-#### Transport Implementations (new modules)
+The legacy Apache HttpClient 4.5–based client moved to
`org.apache.juneau.rest.client.classic.*` in the new
`juneau-rest-client-classic` module — see "Classic Module Split" below.
+
+#### Transport Implementations
-Each new module is independent and pulls in only its own native client. The
`HttpTransportProvider` `ServiceLoader` entries let
`NgRestClient.create().build()` auto-discover the highest-priority transport on
the classpath.
+Each transport is an independent module pulling in only its native client. The
`HttpTransportProvider` `ServiceLoader` entries let
`RestClient.create().build()` auto-discover the highest-priority transport on
the classpath.
| Module | Artifact ID | Native client |
|---|---|---|
-| Apache HttpClient 4.5 | `juneau-ng-rest-client-apache-httpclient-45` |
`org.apache.httpcomponents:httpclient:4.5.x` |
-| Apache HttpClient 5 | `juneau-ng-rest-client-apache-httpclient-50` |
`org.apache.httpcomponents.client5:httpclient5` |
-| JDK `HttpClient` | `juneau-ng-rest-client-java-httpclient` |
`java.net.http.HttpClient` (Java 11+) — zero third-party deps |
-| OkHttp | `juneau-ng-rest-client-okhttp` | `com.squareup.okhttp3:okhttp` |
-| Eclipse Jetty client | `juneau-ng-rest-client-jetty` |
`org.eclipse.jetty:jetty-client` |
+| Apache HttpClient 4.5 | `juneau-rest-client-apache-httpclient-45` |
`org.apache.httpcomponents:httpclient:4.5.x` |
+| Apache HttpClient 5 | `juneau-rest-client-apache-httpclient-50` |
`org.apache.httpcomponents.client5:httpclient5` |
+| JDK `HttpClient` | `juneau-rest-client-java-httpclient` |
`java.net.http.HttpClient` (Java 11+) — zero third-party deps |
+| OkHttp | `juneau-rest-client-okhttp` | `com.squareup.okhttp3:okhttp` |
+| Eclipse Jetty client | `juneau-rest-client-jetty` |
`org.eclipse.jetty:jetty-client` |
Each transport module ships `*Transport`, `*TransportBuilder` (with native
client–specific configuration accessible via cast), and `*TransportProvider`.
Common transport-builder configuration (`connectTimeout`, `readTimeout`,
`sslContext`, `hostnameVerifier`, `proxy`, `maxConnections`,
`maxConnectionsPerRoute`, `followRedirects`, …) lives on `HttpTransportBuilder`
so most callers don't need to cast.
-#### `juneau-rest-mock` — `org.apache.juneau.ng.rest.mock`
+#### `juneau-rest-mock` — `org.apache.juneau.rest.mock`
+
+The canonical mock client now matches the new `RestClient`:
- `MockHttpTransport` — routes `TransportRequest` directly to a Juneau
`RestContext` without network I/O.
-- `NgMockRestClient` — extends `NgRestClient` and wires it to
`MockHttpTransport`. Replaces the classic
`MockRestClient`-implements-`HttpClientConnection` shim with a plain
`HttpTransport` implementation.
+- `MockRestClient` — composes `MockHttpTransport` and exposes the standard
`RestClient` builder surface. Use
`MockRestClient.create(MyRestResource.class).marshaller(Json5.DEFAULT).build()`
for serverless integration tests.
+
+The Apache HttpClient 4.5–implementing legacy `MockRestClient` moved to
`org.apache.juneau.rest.mock.classic.*` alongside its `MockRestRequest`,
`MockRestResponse`, `MockHttpClientConnectionManager`, `MockLogger`, and
`MockConsole` helpers. The shared servlet-mock plumbing (`MockServletRequest`,
`MockServletResponse`, `MockHttpSession`, `MockPathResolver`) stays at
`org.apache.juneau.rest.mock.*` and is reused by both client flavors.
+
+#### Classic Module Split
+
+The pre-existing Apache HttpClient 4.5–based REST client moved into a new
sibling Maven module:
+
+| Artifact | Contents |
+|---|---|
+| `juneau-rest-client` (canonical) | Transport-agnostic NG `RestClient`. No
`org.apache.http.*` dependency. |
+| `juneau-rest-client-classic` (new) | Legacy `RestClient` (extends
`org.apache.http.client.HttpClient`); types live under
`org.apache.juneau.rest.client.classic.*`. Depends on
`org.apache.httpcomponents:httpclient:4.5.14`. |
+
+Both modules can be on the classpath simultaneously — they share
`juneau-rest-common` but expose disjoint packages. The aggregator artifacts
(`juneau-shaded-rest-client`, `juneau-shaded-all`, `juneau-microservice`,
`juneau-rest-mock`, `juneau-distrib`) pull in both flavors so existing
assemblies see no behavioral change.
#### Usage Examples
@@ -2123,7 +2157,7 @@ var serializer = Json5Serializer.create().build();
var parser = Json5Parser.create().build();
// Pick a transport explicitly
-NgRestClient client = NgRestClient.create()
+RestClient client = RestClient.create()
.transportBuilder(ApacheHc45Transport.create()
.connectTimeout(Duration.ofSeconds(10))
.sslContext(mySSLContext)
@@ -2134,7 +2168,7 @@ NgRestClient client = NgRestClient.create()
.build();
// Or let the SPI auto-discover the best transport on the classpath
-NgRestClient zeroConfig = NgRestClient.create()
+RestClient zeroConfig = RestClient.create()
.marshaller(Json5.DEFAULT)
.rootUrl("https://api.example.com")
.build();
@@ -2157,13 +2191,13 @@ client.shutdown();
#### Migration Path
-The classic `RestClient` / `juneau-rest-common` APIs remain fully supported
with no behavior change. Migration is **opt-in**:
+The classic `RestClient` / `juneau-rest-common` APIs remain fully supported.
Migration is **opt-in** and incremental:
-1. Add the NG transport module for your preferred HTTP stack to your build.
-2. Replace `RestClient.create()` with `NgRestClient.create()` and adapt
builder calls — most configuration (`rootUrl`, default headers/query/form/path,
interceptors, marshaller) maps 1:1.
-3. Use try-with-resources around `NgRestRequest`; call `shutdown()` on the
client at application shutdown.
+1. **Stay on classic** — add a `juneau-rest-client-classic` dependency and
replace `import org.apache.juneau.rest.client.*;` with `import
org.apache.juneau.rest.client.classic.*;` (similar for
`org.apache.juneau.http.*` → `org.apache.juneau.http.classic.*`). No behavior
change.
+2. **Migrate to the new stack** — add a transport module (e.g.
`juneau-rest-client-apache-httpclient-45`), keep `import
org.apache.juneau.rest.client.*;`, and adapt builder calls. Most configuration
(`rootUrl`, default headers/query/form/path, interceptors, marshaller) maps
1:1; per-Apache-HttpClient options (`httpClientBuilder()`,
`connectionManager()`, `defaultRequestConfig()`) move onto the transport
builder.
+3. **Update tests** — use `org.apache.juneau.rest.mock.MockRestClient`
(canonical) for new tests; keep
`org.apache.juneau.rest.mock.classic.MockRestClient` for the legacy fluent
surface (`.json5()`, `.plainText()`, deprecated builder methods).
-The classic stack is **not** deprecated in 9.5; the NG stack will graduate to
stable in a future release, at which point the classic stack may be deprecated
and eventually removed.
+The classic stack is **not** deprecated in 9.5; the canonical stack will
graduate to stable in a future release, at which point the classic stack may be
deprecated and eventually removed.
### juneau-bean-mcp (new module)
diff --git a/pages/topics/01.05.RestClient.md b/pages/topics/01.05.RestClient.md
index 1428cc7ac3..cb19dc70d5 100644
--- a/pages/topics/01.05.RestClient.md
+++ b/pages/topics/01.05.RestClient.md
@@ -3,8 +3,12 @@ title: "REST Client"
slug: RestClient
---
-Built upon the feature-rich Apache HttpClient library, the Juneau RestClient
API adds support for fluent-style REST
-calls and the ability to perform marshalling of POJOs to and from HTTP parts.
+Juneau ships two REST client stacks:
+
+- The classic `org.apache.juneau.rest.client.classic.RestClient` (HC4.5-based,
supports the rich fluent surface shown below) in the
`juneau-rest-client-classic` Maven module.
+- The next-generation `org.apache.juneau.rest.client.RestClient`
(transport-agnostic, no Apache HttpClient dependency) in the
`juneau-rest-client` Maven module — see [Next-Generation REST
Client](/docs/topics/NextGenRestClient).
+
+The remainder of this page shows the classic client. Both clients share the
same fluent style for marshalling POJOs to and from HTTP parts.
:::tip Example
```java
@@ -22,7 +26,7 @@ MyBean bean = RestClient.create()
#### REST Testing Framework
-The <a href="/site/apidocs/org/apache/juneau/rest/mock/MockRestClient.html"
target="_blank">MockRestClient</a> class is used for performing
+The <a
href="/site/apidocs/org/apache/juneau/rest/mock/classic/MockRestClient.html"
target="_blank">MockRestClient</a> class is used for performing
serverless unit testing of <a
href="/site/apidocs/org/apache/juneau/rest/annotation/Rest.html"
target="_blank">@Rest</a>-annotated and <a
href="/site/apidocs/org/apache/juneau/http/remote/Remote.html"
target="_blank">@Remote</a>-annotated classes.
It perform full serialization and parsing of the HTTP request and responses,
but bypasses the network layer to
significantly improve speed while still performing real testing.
diff --git a/pages/topics/12.15.NextGenRestClient.md
b/pages/topics/12.15.NextGenRestClient.md
index 0a4ecd2d48..c6d3a814ac 100644
--- a/pages/topics/12.15.NextGenRestClient.md
+++ b/pages/topics/12.15.NextGenRestClient.md
@@ -4,21 +4,23 @@ slug: NextGenRestClient
---
:::warning Beta API
-All public types under `org.apache.juneau.ng.*` are **beta**. Source- and
binary-incompatible changes
-may appear in the next major Juneau release. For production deployments that
require strict
-binary stability, continue using the classic `RestClient` /
`juneau-rest-common` APIs until the
-NG stack is declared stable in a future release.
+The canonical types in `org.apache.juneau.rest.client.*`,
`org.apache.juneau.rest.mock.*`, and
+`org.apache.juneau.http.*` are **beta**. Source- and binary-incompatible
changes may appear in the
+next major Juneau release. For production deployments that require strict
binary stability, use the
+classic stack in `juneau-rest-client-classic`
(`org.apache.juneau.rest.client.classic.*`) — it
+remains the supported, HC4.5-based `RestClient` for the 9.x line.
:::
-Juneau 9.5.0 introduces a next-generation REST client and HTTP type stack under
-`org.apache.juneau.ng.*` that **decouples Juneau from Apache HttpClient 4.5**.
The new stack
-ships alongside the existing `juneau-rest-client` / `juneau-rest-common` APIs
— both continue
-to work unchanged.
+Juneau 9.5.0 promotes the next-generation REST client and HTTP type stack to
the **canonical names**
+under `org.apache.juneau.rest.client.*`, `org.apache.juneau.rest.mock.*`, and
+`org.apache.juneau.http.*`. The pre-existing Apache HttpClient 4.5–based stack
ships unchanged under
+`.classic` packages and the new `juneau-rest-client-classic` Maven module — see
+[v9.5 Migration Guide](/docs/topics/V9.5-migration-guide) for the
import-rename table.
The next-generation stack:
-- Uses **only JDK types** in its API surface (`org.apache.juneau.ng.http`). No
`org.apache.http.*`
- on any signature.
+- Uses **only JDK types** in its API surface (`org.apache.juneau.http`). No
`org.apache.http.*` on
+ any signature.
- Introduces an `HttpTransport` abstraction so you can plug in **any HTTP
client**
(Apache HC 4.5, Apache HC 5, JDK `HttpClient`, OkHttp, Jetty, or a custom
transport)
without changing user code.
@@ -32,9 +34,12 @@ The next-generation stack:
| Package | Module | Role |
|---|---|---|
-| `org.apache.juneau.ng.http` | `juneau-rest-common` | JDK-native HTTP types
(`HttpHeader`, `HttpPart`, `HttpBody`, status types, ~73 RFC-named headers, ~50
named response types, multipart, remote-proxy annotations). No `httpcore`
dependency. |
-| `org.apache.juneau.ng.rest.client` | `juneau-rest-client` | `HttpTransport`
abstraction, `NgRestClient` / `NgRestRequest` / `NgRestResponse`, interceptors,
body converters, `RestLogger`. No `httpcore` dependency. |
-| `org.apache.juneau.ng.rest.mock` | `juneau-rest-mock` | `MockHttpTransport`
and `NgMockRestClient` for in-process testing against a Juneau `RestContext`. |
+| `org.apache.juneau.http` | `juneau-rest-common` | JDK-native HTTP types
(`HttpHeader`, `HttpPart`, `HttpBody`, status types, ~73 RFC-named headers, ~50
named response types, multipart, remote-proxy annotations). No `httpcore`
dependency. |
+| `org.apache.juneau.rest.client` | `juneau-rest-client` | `HttpTransport`
abstraction, canonical `RestClient` / `RestRequest` / `RestResponse`,
interceptors, body converters, `RestLogger`. No `httpcore` dependency. |
+| `org.apache.juneau.rest.mock` | `juneau-rest-mock` | `MockHttpTransport` and
the canonical `MockRestClient` for in-process testing against a Juneau
`RestContext`. |
+| `org.apache.juneau.http.classic` | `juneau-rest-common` | Pre-existing
Apache HttpCore-based types (~170 classes). Kept for the classic stack. |
+| `org.apache.juneau.rest.client.classic` | `juneau-rest-client-classic` (new)
| Pre-existing `RestClient` that implements
`org.apache.http.client.HttpClient`. Apache HttpClient 4.5–based. |
+| `org.apache.juneau.rest.mock.classic` | `juneau-rest-mock` | Pre-existing
`MockRestClient` (extends classic `RestClient` and implements
`HttpClientConnection`) plus its `MockRestRequest` / `MockRestResponse` /
`MockLogger` / `MockConsole` / `MockHttpClientConnectionManager` helpers. |
---
@@ -46,11 +51,11 @@ on the classpath at `build()` time when no explicit
transport is passed.
| Module | Artifact ID | Native client |
|---|---|---|
-| Apache HttpClient 4.5 | `juneau-ng-rest-client-apache-httpclient-45` |
`org.apache.httpcomponents:httpclient:4.5.x` |
-| Apache HttpClient 5 | `juneau-ng-rest-client-apache-httpclient-50` |
`org.apache.httpcomponents.client5:httpclient5` |
-| JDK `HttpClient` | `juneau-ng-rest-client-java-httpclient` |
`java.net.http.HttpClient` (Java 11+) — zero third-party deps |
-| OkHttp | `juneau-ng-rest-client-okhttp` | `com.squareup.okhttp3:okhttp` |
-| Eclipse Jetty client | `juneau-ng-rest-client-jetty` |
`org.eclipse.jetty:jetty-client` |
+| Apache HttpClient 4.5 | `juneau-rest-client-apache-httpclient-45` |
`org.apache.httpcomponents:httpclient:4.5.x` |
+| Apache HttpClient 5 | `juneau-rest-client-apache-httpclient-50` |
`org.apache.httpcomponents.client5:httpclient5` |
+| JDK `HttpClient` | `juneau-rest-client-java-httpclient` |
`java.net.http.HttpClient` (Java 11+) — zero third-party deps |
+| OkHttp | `juneau-rest-client-okhttp` | `com.squareup.okhttp3:okhttp` |
+| Eclipse Jetty client | `juneau-rest-client-jetty` |
`org.eclipse.jetty:jetty-client` |
Each module ships three classes:
@@ -65,8 +70,8 @@ Each module ships three classes:
```java
import org.apache.juneau.json5.*;
-import org.apache.juneau.ng.rest.client.*;
-import org.apache.juneau.ng.rest.client.apachehttpclient45.*;
+import org.apache.juneau.rest.client.*;
+import org.apache.juneau.rest.client.apachehttpclient45.*;
import java.time.*;
// Pre-build the serializer/parser — configure marshalling externally
@@ -74,7 +79,7 @@ var serializer = Json5Serializer.create().build();
var parser = Json5Parser.create().build();
// Choose a transport explicitly and configure it
-NgRestClient client = NgRestClient.create()
+RestClient client = RestClient.create()
.transportBuilder(ApacheHc45Transport.create()
.connectTimeout(Duration.ofSeconds(10))
.maxConnections(50))
@@ -94,11 +99,11 @@ client.shutdown();
### Auto-Discovery
-If you don't pass an explicit transport, `NgRestClient` uses `ServiceLoader`
to pick the
+If you don't pass an explicit transport, `RestClient` uses `ServiceLoader` to
pick the
highest-priority `HttpTransportProvider` on the classpath:
```java
-NgRestClient zeroConfig = NgRestClient.create()
+RestClient zeroConfig = RestClient.create()
.marshaller(Json5.DEFAULT)
.rootUrl("https://api.example.com")
.build();
@@ -108,13 +113,13 @@ NgRestClient zeroConfig = NgRestClient.create()
## Key Design Differences from the Classic `RestClient`
-| Concern | Classic `RestClient` | `NgRestClient` |
+| Concern | Classic `RestClient` (`...client.classic`) | Canonical
`RestClient` (`...client`) |
|---|---|---|
| HTTP integration | Implements `org.apache.http.client.HttpClient`; bound to
Apache HC 4.5 | Composes an `HttpTransport`; transport-agnostic |
| Serialization model | Multi-language marshallers / format shortcuts
(`json()`, `xml()`, …) | **One pre-built serializer/parser/marshaller per
client**; no multi-language mode |
| Builder surface | 40+ Apache HC passthrough methods | Small builder with
only Juneau-specific concerns |
| Lifecycle | `RestClient.close()` | Explicit `shutdown()` (not `Closeable`) —
signalling app-lifecycle vs per-call |
-| Per-request lifecycle | `RestClient` and `RestResponse` were `Closeable` |
**Only `NgRestRequest` is `Closeable`**; `close()` releases the connection |
+| Per-request lifecycle | `RestClient` and `RestResponse` were `Closeable` |
**Only `RestRequest` is `Closeable`**; `close()` releases the connection |
| Header/part types | Implement `org.apache.http.Header` / `NameValuePair` |
Implement JDK-only `HttpHeader` / `HttpPart` interfaces |
| Schema validation on `@Query`/`@Header`/`@FormData`/`@Path` | Supported |
**Not supported** — `toString()` + `CollectionFormat` only |
@@ -122,7 +127,7 @@ NgRestClient zeroConfig = NgRestClient.create()
## Resource Lifecycle
-`NgRestRequest` is the single `Closeable` in the user-facing API. Close it to
release the
+`RestRequest` is the single `Closeable` in the user-facing API. Close it to
release the
underlying connection and stream:
```java
@@ -135,7 +140,7 @@ try (var req = client.get("/users")) {
client.shutdown();
```
-`NgRestResponse` does **not** implement `Closeable` — its lifecycle is owned
by the request.
+`RestResponse` does **not** implement `Closeable` — its lifecycle is owned by
the request.
---
@@ -171,7 +176,7 @@ and should **not** be used for binary uploads.
Logging is framework-agnostic via `java.lang.System.Logger`:
```java
-NgRestClient client = NgRestClient.create()
+RestClient client = RestClient.create()
.transportBuilder(JavaHttpTransport.create())
.marshaller(Json5.DEFAULT)
.logger(BasicRestLogger.of(System.getLogger("myapp.http")))
@@ -192,11 +197,13 @@ Custom log entries can be built using named templates
## Mock Transport (Serverless Testing)
`MockHttpTransport` routes `TransportRequest` directly to a Juneau
`RestContext` without
-network I/O. Use `NgMockRestClient` for unit tests that exercise
serialization, remote proxies,
-interceptors, and assertions:
+network I/O. Use `org.apache.juneau.rest.mock.MockRestClient` for unit tests
that exercise
+serialization, remote proxies, interceptors, and assertions:
```java
-NgRestClient mock = NgMockRestClient.create(MyRestResource.class)
+import org.apache.juneau.rest.mock.MockRestClient;
+
+RestClient mock = MockRestClient.create(MyRestResource.class)
.marshaller(Json5.DEFAULT)
.pathData("tenantId", "acme")
.build();
@@ -206,32 +213,42 @@ try (var req = mock.get("/users/123")) {
}
```
+For the legacy fluent surface (`.json5()`, `.plainText()`,
`.disableRedirectHandling()`, etc.)
+use `org.apache.juneau.rest.mock.classic.MockRestClient` — see
+[Mock REST Client Overview](/docs/topics/MockRestClientOverview).
+
---
## Migration Path
-The classic `RestClient` and `juneau-rest-common` APIs are **not deprecated**
in 9.5.
-Migration is opt-in and incremental:
-
-1. Add the NG transport module for your preferred HTTP stack as a Maven
dependency.
-2. Replace `RestClient.create()` with `NgRestClient.create()` and adapt
builder calls —
- most builder methods map 1:1 (`rootUrl`, default headers/query/form/path,
interceptors,
- marshaller, `errorCodes`, `executorService`).
+The classic `RestClient` and its supporting `juneau-rest-common` Apache
HttpCore types are
+**not deprecated** in 9.5; they moved to `.classic` packages and the new
+`juneau-rest-client-classic` module. Migration is opt-in and incremental:
+
+1. **Stay on classic** — keep using the same `RestClient` / `MockRestClient`
types you have
+ today; just adjust imports as described in
+ [v9.5 Migration Guide](/docs/topics/V9.5-migration-guide) and add a Maven
dependency on
+ `juneau-rest-client-classic`. No behavioral change.
+2. **Adopt the canonical stack** — add the NG transport module for your
preferred HTTP stack
+ as a Maven dependency. Replace `RestClient.create()` with the canonical
+ `org.apache.juneau.rest.client.RestClient.create()` and adapt builder calls
— most builder
+ methods map 1:1 (`rootUrl`, default headers/query/form/path, interceptors,
marshaller,
+ `errorCodes`, `executorService`).
3. Wrap each request in **try-with-resources**. Call `shutdown()` on the
client at
application shutdown.
4. If you customized Apache HttpClient through `httpClientBuilder()` /
`connectionManager()` /
`defaultRequestConfig()`, move those calls onto the **transport builder**
(e.g. `ApacheHc45TransportBuilder`).
5. If you relied on multi-language marshallers or per-request language
overrides, create
- one `NgRestClient` per language.
+ one `RestClient` per language.
-The NG stack will graduate to stable in a future release, at which point the
classic stack
-may be deprecated and eventually removed.
+The canonical stack will graduate to stable in a future release, at which
point the classic
+stack may be deprecated and eventually removed.
---
## See Also
- [juneau-rest-client Basics](/docs/topics/JuneauRestClientBasics) — the
classic stack
-- [juneau-rest-mock Basics](/docs/topics/JuneauRestMockBasics) — classic mock
client
-- Release notes: [9.5.0](/docs/release-notes/9.5.0) — Next-Generation REST
Client and HTTP Stack
+- [Mock REST Client Overview](/docs/topics/MockRestClientOverview) — both
flavors of mock client
+- Release notes: [9.5.0](/docs/release-notes/9.5.0) — Transport-Agnostic REST
Client and HTTP Stack
diff --git a/pages/topics/13.02.MockRestClientOverview.md
b/pages/topics/13.02.MockRestClientOverview.md
index 8c819edd22..62fbbc982a 100644
--- a/pages/topics/13.02.MockRestClientOverview.md
+++ b/pages/topics/13.02.MockRestClientOverview.md
@@ -3,10 +3,17 @@ title: "Mock REST Client Overview"
slug: MockRestClientOverview
---
-The <a href="/site/apidocs/org/apache/juneau/rest/mock/MockRestClient.html"
target="_blank">MockRestClient</a> class is used for performing
+The <a
href="/site/apidocs/org/apache/juneau/rest/mock/classic/MockRestClient.html"
target="_blank">MockRestClient</a> class is used for performing
serverless unit testing of <a
href="/site/apidocs/org/apache/juneau/rest/annotation/Rest.html"
target="_blank">@Rest</a>-annotated and <a
href="/site/apidocs/org/apache/juneau/http/remote/Remote.html"
target="_blank">@Remote</a>-annotated classes.
-The <a href="/site/apidocs/org/apache/juneau/rest/mock/MockRestClient.html"
target="_blank">MockRestClient</a> itself extends from <a
href="/site/apidocs/org/apache/juneau/rest/client/RestClient.html"
target="_blank">RestClient</a> providing it with the rich feature set of that
API.
+:::info Two flavors of `MockRestClient`
+- `org.apache.juneau.rest.mock.classic.MockRestClient` — the legacy mock
client documented on this page. Extends the classic <a
href="/site/apidocs/org/apache/juneau/rest/client/classic/RestClient.html"
target="_blank">RestClient</a> (Apache HttpClient 4.5–based) and exposes the
full fluent surface (`.json5()`, `.plainText()`, deprecated builder methods).
+- `org.apache.juneau.rest.mock.MockRestClient` — the canonical NG mock client,
paired with the transport-agnostic <a
href="/site/apidocs/org/apache/juneau/rest/client/RestClient.html"
target="_blank">RestClient</a>. Use this for new tests that target the new
stack. See [Next-Generation REST Client](/docs/topics/NextGenRestClient) for
examples.
+
+Both classes live in the `juneau-rest-mock` Maven module and can be used in
the same project.
+:::
+
+The classic <a
href="/site/apidocs/org/apache/juneau/rest/mock/classic/MockRestClient.html"
target="_blank">MockRestClient</a> itself extends from <a
href="/site/apidocs/org/apache/juneau/rest/client/classic/RestClient.html"
target="_blank">RestClient</a> providing it with the rich feature set of that
API.
The following shows a simple example of invoking a PUT method on a simple REST
interface and asserting the correct
status code and response body:
@@ -79,7 +86,7 @@ public void testEcho() throws Exception {
```
The concept of the design is simple.
-The <a href="/site/apidocs/org/apache/juneau/rest/mock/MockRestClient.html"
target="_blank">MockRestClient</a> class is used to create instances of <a
href="/site/apidocs/org/apache/juneau/rest/mock/MockServletRequest.html"
target="_blank">MockServletRequest</a> and <a
href="/site/apidocs/org/apache/juneau/rest/mock/MockServletResponse.html"
target="_blank">MockServletResponse</a> which are passed directly to the call
handler on the resource class <a href="/site/apidocs/org/apache/juneau [...]
+The <a
href="/site/apidocs/org/apache/juneau/rest/mock/classic/MockRestClient.html"
target="_blank">MockRestClient</a> class is used to create instances of <a
href="/site/apidocs/org/apache/juneau/rest/mock/MockServletRequest.html"
target="_blank">MockServletRequest</a> and <a
href="/site/apidocs/org/apache/juneau/rest/mock/MockServletResponse.html"
target="_blank">MockServletResponse</a> which are passed directly to the call
handler on the resource class <a href="/site/apidocs/org/apach [...]
In effect, you're fully testing your REST API as if it were running in a live
servlet container, yet not actually having
to run in a servlet container.
All aspects of the client and server side code are tested, yet no servlet
container is required.
@@ -126,7 +133,7 @@ public class MockTest {
}
```
-The <a href="/site/apidocs/org/apache/juneau/rest/mock/MockRestRequest.html"
target="_blank">MockRestRequest</a> object has convenience methods
+The <a
href="/site/apidocs/org/apache/juneau/rest/mock/classic/MockRestRequest.html"
target="_blank">MockRestRequest</a> object has convenience methods
provided to allow you to set properties directly on the underlying <a
href="https://jakarta.ee/specifications/servlet/6.0/apidocs/jakarta/servlet/http/HttpServletRequest.html"
target="_blank">HttpServletRequest</a> object.
The following example shows how this can be used to directly set roles on the
request object to perform security
testing.
@@ -152,7 +159,7 @@ public void mytest() throws Exception {
```
:::
-The <a href="/site/apidocs/org/apache/juneau/rest/mock/MockRestClient.html"
target="_blank">MockRestClient</a> class has a debug mode that will
+The <a
href="/site/apidocs/org/apache/juneau/rest/mock/classic/MockRestClient.html"
target="_blank">MockRestClient</a> class has a debug mode that will
cause your HTTP requests and responses to
be sent to the console:
@@ -164,7 +171,7 @@ MockRestClient client = MockRestClient
.build();
```
-The <a href="/site/apidocs/org/apache/juneau/rest/mock/MockRestClient.html"
target="_blank">MockRestClient</a> class can also be used for testing of <a
href="/site/apidocs/org/apache/juneau/http/remote/Remote.html"
target="_blank">Remote</a>-annotated interfaces against <a
href="/site/apidocs/org/apache/juneau/rest/annotation/Rest.html"
target="_blank">@Rest</a>-annotated resources.
+The <a
href="/site/apidocs/org/apache/juneau/rest/mock/classic/MockRestClient.html"
target="_blank">MockRestClient</a> class can also be used for testing of <a
href="/site/apidocs/org/apache/juneau/http/remote/Remote.html"
target="_blank">Remote</a>-annotated interfaces against <a
href="/site/apidocs/org/apache/juneau/rest/annotation/Rest.html"
target="_blank">@Rest</a>-annotated resources.
:::tip Example
```java
diff --git a/pages/topics/20.03.JuneauShadedRestClient.md
b/pages/topics/20.03.JuneauShadedRestClient.md
index 0b7f14b0e3..32e1593f8e 100644
--- a/pages/topics/20.03.JuneauShadedRestClient.md
+++ b/pages/topics/20.03.JuneauShadedRestClient.md
@@ -11,8 +11,9 @@ This artifact includes:
- **All modules from [juneau-shaded-core](/docs/topics/JuneauShadedCore)**
(marshalling, config, testing)
- **juneau-rest-common** - REST APIs common to client and server
-- **juneau-rest-client** - Full-featured REST client API
-- **juneau-rest-mock** - REST testing utilities
+- **juneau-rest-client** - Transport-agnostic REST client (no Apache
HttpClient dependency)
+- **juneau-rest-client-classic** - Legacy REST client built on Apache
HttpClient 4.5
+- **juneau-rest-mock** - REST testing utilities (canonical and classic flavors)
## Use Cases
@@ -69,10 +70,10 @@ java_binary(
`juneau-shaded-rest-client` requires:
### Required
-- **Apache HttpClient 5.2+** - HTTP client implementation
-- **Apache HttpCore 5.2+** - HTTP core functionality
+- **Apache HttpClient 4.5.x** - bundled via `juneau-rest-client-classic` for
the legacy client. The canonical `juneau-rest-client` artifact itself has **no
Apache HttpClient dependency** — it composes any `HttpTransport` implementation
you put on the classpath (HC 4.5, HC 5, JDK `HttpClient`, OkHttp, Jetty client,
or a custom transport).
### Optional
+- **Apache HttpClient 5.x** / **`java.net.http.HttpClient`** / **OkHttp** /
**Jetty client** - pick one of the `juneau-rest-client-apache-httpclient-50` /
`juneau-rest-client-java-httpclient` / `juneau-rest-client-okhttp` /
`juneau-rest-client-jetty` transport modules to drive the canonical
`RestClient` over a non-HC-4.5 transport.
- **Jakarta XML Bind API 3.0+** - For XML serialization
- **Apache Jena** - For RDF support
diff --git a/pages/topics/20.06.JuneauShadedAll.md
b/pages/topics/20.06.JuneauShadedAll.md
index e54fab28e3..ec8be18572 100644
--- a/pages/topics/20.06.JuneauShadedAll.md
+++ b/pages/topics/20.06.JuneauShadedAll.md
@@ -18,7 +18,8 @@ This artifact includes **everything**:
### REST Modules
- **juneau-rest-common** - Common REST APIs
-- **juneau-rest-client** - REST client API
+- **juneau-rest-client** - REST client API (transport-agnostic, no Apache
HttpClient dependency)
+- **juneau-rest-client-classic** - Legacy REST client built on Apache
HttpClient 4.5
- **juneau-rest-server** - REST server API
- **juneau-rest-server-rdf** - RDF support for servers
- **juneau-rest-server-springboot** - Spring Boot integration
@@ -93,8 +94,7 @@ java_binary(
`juneau-shaded-all` requires the following external dependencies:
### For REST Client
-- **Apache HttpClient 5.2+**
-- **Apache HttpCore 5.2+**
+- **Apache HttpClient 4.5.x** — bundled via `juneau-rest-client-classic` for
the legacy client. The canonical NG `juneau-rest-client` artifact composes any
`HttpTransport` (HC 4.5, HC 5, JDK `HttpClient`, OkHttp, Jetty client) — add
the appropriate transport module separately if you target a non-HC-4.5 backend.
### For REST Server
- **Jakarta Servlet API 6.1+**
diff --git a/pages/topics/23.01.V9.5-migration-guide.md
b/pages/topics/23.01.V9.5-migration-guide.md
index c3da890cd0..003f51ff4b 100644
--- a/pages/topics/23.01.V9.5-migration-guide.md
+++ b/pages/topics/23.01.V9.5-migration-guide.md
@@ -275,5 +275,69 @@ the user adds to
`Microservice.Builder.configurations(...)`. The Java package
| `JettyMicroservice.getInstance().getServer()` |
`Microservice.getInstance().getBeanStore().getBean(JettyServerComponent.class).orElseThrow().getServer()`
| Same for `.getPort()`, `.getURI()`, `.getContextPath()`,
`.getServletContextHandler()`. |
| `JettyMicroservice.Builder.listener(JettyMicroserviceListener)` |
`Microservice.Builder.listener(MicroserviceListener)` or `@Bean
MicroserviceListener` | The builder listener is registered into the bean store
as the unnamed entry and participates in fan-out alongside `@Bean`-supplied
listeners. |
+## REST Client and HTTP Stack Promotion (TODO-38)
+
+Juneau 9.5.0 promotes the next-generation, transport-agnostic REST client to
the canonical names.
+The pre-existing Apache HttpClient 4.5–based stack moves under `.classic`
packages and a new
+`juneau-rest-client-classic` Maven module so existing call sites keep working.
+
+### Maven module changes
+
+| Old | New | Notes |
+|-----|-----|-------|
+| `<artifactId>juneau-rest-client</artifactId>` |
`<artifactId>juneau-rest-client</artifactId>` *(canonical, NG)* **and/or**
`<artifactId>juneau-rest-client-classic</artifactId>` *(legacy)* | The
historical `juneau-rest-client` artifact is now the **transport-agnostic NG**
client with no `org.apache.http.*` dependency. The legacy HC4.5-based
`RestClient` moved into the new `juneau-rest-client-classic` sibling artifact.
Pull in both if you need both flavors; the aggregator artifacts (`jun [...]
+| `<artifactId>juneau-ng-rest-client-apache-httpclient-45</artifactId>` |
`<artifactId>juneau-rest-client-apache-httpclient-45</artifactId>` | Drop the
`ng-` prefix. The 9.5 early-snapshot package layout shipped these NG transport
modules under `juneau-ng-rest-client-*` artifacts; the GA cut renames them.
Same rename applies to `…-apache-httpclient-50`, `…-java-httpclient`,
`…-okhttp`, `…-jetty`. |
+
+### Package renames
+
+| Old | New | Notes |
+|-----|-----|-------|
+| `org.apache.juneau.http.*` *(Apache HttpCore-based types in
`juneau-rest-common`)* | `org.apache.juneau.http.classic.*` | The historical
`juneau-rest-common` types (`HttpHeaders` facade, `Authorization`, `Range`,
`BasicHeader`, `BasicStatusLine`, response/exception classes, etc., ~170 types)
moved under the `.classic` sub-package. Update `import
org.apache.juneau.http.*;` to `import org.apache.juneau.http.classic.*;`. |
+| `org.apache.juneau.ng.http.*` *(9.5 early snapshot only)* |
`org.apache.juneau.http.*` | The new JDK-native types that briefly lived under
`ng.http.*` graduated to the now-free canonical `org.apache.juneau.http.*`
namespace. The `@Remote` / `@RemoteGet` / `@RemotePost` / etc. annotations stay
at `org.apache.juneau.http.remote.*` (unchanged). |
+| `org.apache.juneau.ng.rest.client.*` *(9.5 early snapshot only)* |
`org.apache.juneau.rest.client.*` | The NG client and HTTP transport SPI are
now canonical. The legacy `RestClient` (Apache HttpClient 4.5–based) is at
`org.apache.juneau.rest.client.classic.*` in the new module. |
+| `org.apache.juneau.ng.rest.mock.*` *(9.5 early snapshot only)* |
`org.apache.juneau.rest.mock.*` | Canonical, paired with the NG `RestClient`. |
+
+### Class renames (early-snapshot only)
+
+If you adopted the 9.5 early snapshots that exposed `Ng*` class names, update
to the canonical names. No alias / deprecation shim is provided.
+
+| Old | New | Notes |
+|-----|-----|-------|
+| `NgRestClient` / `NgRestClient.Builder` | `RestClient` /
`RestClient.Builder` (in `org.apache.juneau.rest.client`) | Canonical name. |
+| `NgRestRequest` / `NgRestResponse` | `RestRequest` / `RestResponse` (in
`org.apache.juneau.rest.client`) | Canonical name. |
+| `NgMockRestClient` | `MockRestClient` (in `org.apache.juneau.rest.mock`) |
Canonical name for the NG mock client. The legacy mock client is at
`org.apache.juneau.rest.mock.classic.MockRestClient`. |
+| `import org.apache.juneau.ng.http.*;` | `import org.apache.juneau.http.*;` |
Same for any `ng.http.entity.*` / `ng.http.header.*` / `ng.http.part.*` /
`ng.http.resource.*` / `ng.http.response.*` sub-package. |
+
+### Mock client layout
+
+| Old (single-flavor) | New (split) | Notes |
+|-----|-----|-------|
+| `org.apache.juneau.rest.mock.MockRestClient` *(legacy)* |
`org.apache.juneau.rest.mock.classic.MockRestClient` | Apache HttpClient
4.5–based mock client. Still extends the classic `RestClient` and implements
`HttpClientConnection`. Same fluent surface — only the import changes. |
+| n/a | `org.apache.juneau.rest.mock.MockRestClient` *(new, NG)* |
Transport-agnostic mock client paired with the canonical `RestClient`. Wires
`MockHttpTransport` into a `RestContext`. |
+| `org.apache.juneau.rest.mock.MockRestRequest` / `MockRestResponse` |
`org.apache.juneau.rest.mock.classic.MockRestRequest` / `MockRestResponse` |
Subclasses of the classic `RestRequest` / `RestResponse`. The NG client uses
`org.apache.juneau.rest.client.RestRequest` / `RestResponse` directly — there
are no `Mock*` subclasses on the NG side. |
+| `MockServletRequest` / `MockServletResponse` / `MockHttpSession` /
`MockPathResolver` | `org.apache.juneau.rest.mock.MockServletRequest` /
`…MockServletResponse` / `…MockHttpSession` / `…MockPathResolver` | Shared by
both mock-client flavors. Unchanged location.
`MockServletRequest.debug(boolean)` and `MockServletResponse.getHeaders()` and
`MockPathResolver` were widened from package-private to public so the classic
mock client can reach them across the new package boundary; no source [...]
+| `MockConsole` / `MockLogger` |
`org.apache.juneau.rest.mock.classic.MockConsole` / `MockLogger` | Classic-only
logger helpers. |
+
+### `juneau-rest-common` package renames
+
+The package promotion changes the canonical imports for every
`juneau-rest-common` consumer:
+
+```diff
+-import org.apache.juneau.http.*; // pre-9.5: HC4.5 facade types
+-import org.apache.juneau.http.entity.*; // pre-9.5: SerializedHttpEntity,
BasicHttpEntity, ...
+-import org.apache.juneau.http.header.*; // pre-9.5: BasicHeader,
BasicMediaTypeHeader, Authorization, ...
+-import org.apache.juneau.http.part.*; // pre-9.5: BasicPart, PartList,
...
+-import org.apache.juneau.http.resource.*; // pre-9.5: BasicResource,
ByteArrayResource, ...
+-import org.apache.juneau.http.response.*; // pre-9.5: Ok, Created,
NotFound, BasicHttpException, ...
++import org.apache.juneau.http.classic.*;
++import org.apache.juneau.http.classic.entity.*;
++import org.apache.juneau.http.classic.header.*;
++import org.apache.juneau.http.classic.part.*;
++import org.apache.juneau.http.classic.resource.*;
++import org.apache.juneau.http.classic.response.*;
+```
+
+The new canonical `org.apache.juneau.http.*` (and sub-packages `entity` /
`header` / `part` / `response`) host the JDK-native NG types. The
`org.apache.juneau.http.remote.*` annotation package (`@Remote`, `@RemoteGet`,
etc.) **did not move**.
+
<!-- Additional rows will be populated as 9.5 breaking changes land. See
todo/TODO-17 for the
ongoing 9.5.0 audit. -->