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.

Reply via email to