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 383e1a7f4c READY-404: Correct remote-proxy classic/next-gen parity
claims in the 10.0.0 release notes
383e1a7f4c is described below
commit 383e1a7f4c8b0021b1fd8ac326dec4898cd67947
Author: James Bognar <[email protected]>
AuthorDate: Mon Aug 17 10:13:01 2026 -0400
READY-404: Correct remote-proxy classic/next-gen parity claims in the
10.0.0 release notes
Reworks the "Next-generation remote-proxy declarative features" section to
reflect that the classic getRemote(...) engine has reached parity with the
next-generation engine for every declarative member except the
interceptors() call-policy attribute and the @Multipart marker, which
remain next-generation-only.
---
pages/release-notes/10.0.0.md | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/pages/release-notes/10.0.0.md b/pages/release-notes/10.0.0.md
index cf4fbfe8aa..f44772365f 100644
--- a/pages/release-notes/10.0.0.md
+++ b/pages/release-notes/10.0.0.md
@@ -661,16 +661,16 @@ page.
### Next-generation remote-proxy declarative features
-Juneau 10.0 significantly expands what the [REST
proxy](/docs/topics/RestProxies) annotation family (`@Remote`, `@RemoteOp`, and
the verb annotations `@RemoteGet` / `@RemotePost` / `@RemotePut` /
`@RemoteDelete` / `@RemotePatch`) can express declaratively. Most additions
below are honored by the **next-generation** proxy engine only
(`RestClient.remote(...)` → `RemoteClient`); the classic `getRemote(...)`
engine ignores those members. The one exception is dynamic URL & base override
(`@U [...]
+Juneau 10.0 significantly expands what the [REST
proxy](/docs/topics/RestProxies) annotation family (`@Remote`, `@RemoteOp`, and
the verb annotations `@RemoteGet` / `@RemotePost` / `@RemotePut` /
`@RemoteDelete` / `@RemotePatch`) can express declaratively. These additions
originally landed on the **next-generation** proxy engine only
(`RestClient.remote(...)` → `RemoteClient`); a later classic/next-gen parity
pass brought the classic `getRemote(...)` engine up to the same level for every
[...]
-- **Constant part values** — `@Remote` (interface) and `@RemoteOp` / verb
annotations (method) gain `headers` / `queryData` / `formData` members that
emit always-applied constant headers, query parameters, and form-data fields on
every call, with no dummy parameter. Method-level constants take precedence
over interface-level ones, caller-supplied values still compose, and all values
resolve through `VarResolver.DEFAULT`. (Constant path values are out of scope;
`@Remote(headerList=…)` rem [...]
+- **Constant part values** — `@Remote` (interface) and `@RemoteOp` / verb
annotations (method) gain `headers` / `queryData` / `formData` members that
emit always-applied constant headers, query parameters, and form-data fields on
every call, with no dummy parameter. Method-level constants take precedence
over interface-level ones, caller-supplied values still compose, and all values
resolve through `VarResolver.DEFAULT`. Honored by both engines. (Constant path
values are out of scope; `@ [...]
- **`@Content(def=…)` honored** — the next-gen engine now applies both the
parameter-level body default (when the body argument is `null`) and a
param-less, method-level constant body, matching the classic engine.
- **Per-part serializers** — `@HttpPartMarshalling(serializer=…)` is now wired
for outgoing query / header / path / form-data parts, with precedence parameter
› method › interface and a fallback to the default `OpenApiSerializer` when
absent. (Serializer side only; the parser member is not consumed by the
next-gen engine.)
-- **Declarative call policy** — `@Remote` and `@RemoteOp` / verb annotations
gain `interceptors()`, `timeout()`, `retries()`, `retryNonIdempotent()`, and
`throwOnError()`. Interceptors apply as a union (builder → interface → method);
timeout/retries/throwOnError scalars follow method › interface ›
builder-default precedence. Auto-retries are conservatively safe: triggered
only by connection failures or `429`/`5xx`, with exponential backoff, and gated
to idempotent verbs (POST/PATCH requi [...]
-- **Dynamic URL & base override** — a new `@Url` parameter annotation
(`org.apache.juneau.http.Url`) supplies the whole request URL at call time
(absolute replaces and bypasses the client root URL; relative resolves against
it), plus a declarative `baseUrl()` attribute on `@Remote` / `@RemoteOp` / verb
annotations that substitutes the authority+root while preserving the path and
`{var}` templating. Precedence: `@Url` › method `baseUrl` › interface `baseUrl`
› client `rootUrl`. **Unlike t [...]
+- **Declarative call policy** — `@Remote` and `@RemoteOp` / verb annotations
gain `interceptors()`, `timeout()`, `retries()`, `retryNonIdempotent()`, and
`throwOnError()`. Interceptors apply as a union (builder → interface → method);
timeout/retries/throwOnError scalars follow method › interface ›
builder-default precedence. Auto-retries are conservatively safe: triggered
only by connection failures or `429`/`5xx`, with exponential backoff, and gated
to idempotent verbs (POST/PATCH requi [...]
+- **Dynamic URL & base override** — a new `@Url` parameter annotation
(`org.apache.juneau.http.Url`) supplies the whole request URL at call time
(absolute replaces and bypasses the client root URL; relative resolves against
it), plus a declarative `baseUrl()` attribute on `@Remote` / `@RemoteOp` / verb
annotations that substitutes the authority+root while preserving the path and
`{var}` templating. Precedence: `@Url` › method `baseUrl` › interface `baseUrl`
› client `rootUrl`. **`@Url` / [...]
- **`@Remote` SSRF guardrail hardened: deny-private, pin-on-connect,
redirect-revalidation** — every absolute effective `@Remote` URL (`@Url`,
`baseUrl()`, or an already-absolute default path) is now checked against a
deny-private policy by default — loopback, RFC1918/unique-local, link-local
(including the `169.254.169.254`/`169.254.170.2` cloud-metadata addresses),
`localhost`, and `*.metadata.google.internal` are all rejected — and the check
runs both as a pre-check on the literal hos [...]
-- **Declarative multipart** — a new method-level `@Multipart` marker
(`org.apache.juneau.http.remote.Multipart`) plus a `@Part` parameter annotation
(`org.apache.juneau.http.Part`, with `name`/`value`/`fileName`/`contentType`)
build a `multipart/form-data` request from annotated parameters. Text,
`byte[]`, `File`, `InputStream`, `Reader`, `HttpBody`, and bean part sources
are accepted; file/stream/reader/bean parts stream rather than buffer. A method
is either multipart or single-`@Conte [...]
-- **Per-method format selection** — `contentType()` and `accept()` attributes
on `@Remote` / `@RemoteOp` / verb annotations drive marshaller **selection**
(not just header values). `contentType` selects the matching request serializer
and emits a single clean `Content-Type`; `accept` sets the `Accept` header and
acts as a fallback parser (the response `Content-Type` stays authoritative). A
no-match media type falls back to the default marshaller but still sends the
overridden label (vend [...]
+- **Declarative multipart** — a new method-level `@Multipart` marker
(`org.apache.juneau.http.remote.Multipart`) plus a `@Part` parameter annotation
(`org.apache.juneau.http.Part`, with `name`/`value`/`fileName`/`contentType`)
build a `multipart/form-data` request from annotated parameters. Text,
`byte[]`, `File`, `InputStream`, `Reader`, `HttpBody`, and bean part sources
are accepted; file/stream/reader/bean parts stream rather than buffer. A method
is either multipart or single-`@Conte [...]
+- **Per-method format selection** — `contentType()` and `accept()` attributes
on `@Remote` / `@RemoteOp` / verb annotations drive marshaller **selection**
(not just header values). `contentType` selects the matching request serializer
and emits a single clean `Content-Type`; `accept` sets the `Accept` header and
acts as a fallback parser (the response `Content-Type` stays authoritative). A
no-match media type falls back to the default marshaller but still sends the
overridden label (vend [...]
- **Streaming efficiency** — POJO and `Reader` request bodies now stream
straight to the wire instead of being buffered, and `Reader` / `InputStream`
return types hand the caller a lazy stream over the live response whose
connection is released on close.
See the expanded [Declarative Remote-Proxy
Features](/docs/topics/NextGenRestClient#declarative-remote-proxy-features-next-gen)
section of the Next-Generation REST Client topic page for full examples and
precedence rules.