This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new e4b7e9c937 SonarQube issue cleanup across the reactor.
e4b7e9c937 is described below

commit e4b7e9c937706c0dba97e1401f69a38d2055d28f
Author: James Bognar <[email protected]>
AuthorDate: Mon Jun 15 16:30:39 2026 -0400

    SonarQube issue cleanup across the reactor.
    
    - Strip redundant `throws Exception` from heavy test files (RestLogger_Test,
      DefaultSwaps_Test, TomlWriter_Test, CsvParser_Test, 
SamlAssertionValidator_Builder_Test,
      ConfigClasspathStore_Test).
    - Remove unnecessary casts (java:S1905) across the token-streaming 
parser/serializer
      role-interface family and related client code.
    - Add by-design rule suppressions with one-line rationales (e.g. java:S1192 
on the
      HTTP header beans).
    - Fix a ConfigStore ThreadLocal cleanup (remove the LOADING ThreadLocal 
when the
      per-thread loading set empties).
    
    Co-authored-by: Cursor <[email protected]>
---
 .../apache/juneau/config/store/ConfigStore.java    |   2 +
 .../config/store/ConfigClasspathStore_Test.java    |  10 +-
 .../apache/juneau/marshall/bson/BsonParser.java    |   4 +-
 .../juneau/marshall/bson/BsonSerializer.java       |   4 +-
 .../juneau/marshall/cbor/CborTokenReader.java      |   6 +-
 .../org/apache/juneau/marshall/csv/CsvParser.java  |   2 +-
 .../apache/juneau/marshall/csv/CsvSerializer.java  |   2 +-
 .../juneau/marshall/json/JsonTokenWriter.java      |   2 +-
 .../juneau/marshall/markdown/MarkdownParser.java   |   2 +-
 .../marshall/markdown/MarkdownSerializer.java      |   2 +-
 .../marshall/msgpack/MsgPackTokenReader.java       |   6 +-
 .../marshall/msgpack/MsgPackTokenWriter.java       |  12 +-
 .../juneau/marshall/plaintext/PlainTextParser.java |   2 +-
 .../marshall/plaintext/PlainTextSerializer.java    |   2 +-
 .../org/apache/juneau/marshall/sse/SseParser.java  |   2 +-
 .../apache/juneau/marshall/sse/SseSerializer.java  |   2 +-
 .../juneau/marshall/stream/RecordReader.java       |   2 +
 .../org/apache/juneau/marshall/uon/UonParser.java  |   2 +-
 .../apache/juneau/marshall/uon/UonSerializer.java  |   2 +-
 .../org/apache/juneau/marshall/xml/XmlParser.java  |   6 +-
 .../apache/juneau/marshall/xml/XmlSerializer.java  |   2 +-
 .../apache/juneau/marshall/yaml/YamlParser.java    |   4 +-
 .../juneau/marshall/yaml/YamlSerializer.java       |   4 +-
 .../apache/juneau/marshall/csv/CsvParser_Test.java |  42 ++---
 .../json/JsonTokenReaderSupplemental_Test.java     |  16 +-
 .../marshall/stream/ArrayRecordStream_Test.java    |  16 +-
 .../juneau/marshall/toml/TomlWriter_Test.java      |  24 +--
 .../marshall/transforms/DefaultSwaps_Test.java     | 172 ++++++++++-----------
 .../saml/SamlAssertionValidator_Builder_Test.java  |   8 +-
 .../juneau/rest/server/logger/RestLogger_Test.java |  66 ++++----
 .../src/main/resources/jetty.xml                   |   2 +-
 .../petstore/rest/PetFreemarkerViewResource.java   |   2 +-
 .../petstore/rest/PetMustacheViewResource.java     |   2 +-
 .../juneau/petstore/rest/PetSecureResource.java    |   2 +-
 .../juneau/petstore/rest/PetStoreResource.java     |   2 +-
 .../rest/client/classic/RecordStreamBody.java      |   4 +-
 .../rest/client/classic/ResponseContent.java       |   7 +-
 .../juneau/rest/client/classic/RestRequest.java    |  10 +-
 .../juneau/rest/client/RecordStreamBody.java       |   8 +-
 .../org/apache/juneau/rest/client/RestRequest.java |   4 +-
 .../juneau/rest/client/RecordStreamBody_Test.java  |  18 ++-
 .../rest/client/ResponseBody_Cursor_Test.java      |   3 +
 .../apache/juneau/http/header/Authorization.java   |   3 +
 .../juneau/http/header/ContentDisposition.java     |   3 +
 .../juneau/http/header/ProxyAuthenticate.java      |   3 +
 .../juneau/http/header/ProxyAuthorization.java     |   3 +
 .../apache/juneau/http/header/WwwAuthenticate.java |   3 +
 .../mock/RemoteCursorBinding_NextGen_Test.java     |  13 +-
 .../juneau/rest/mock/RemoteCursorBinding_Test.java |   2 +-
 .../saml/SamlAssertionValidator_Builder_Test.java  |   8 +-
 .../juneau/rest/server/logger/RestLogger_Test.java |  66 ++++----
 .../src/test/resources/templates/about.html        |   2 +-
 .../src/test/resources/templates/hello.html        |   2 +-
 .../src/test/resources/templates/nested/inner.html |   2 +-
 .../juneau/rest/server/arg/RecordReaderArg.java    |   4 +-
 .../juneau/rest/server/arg/TokenReaderArg.java     |   4 +-
 .../juneau/rest/server/health/ReadinessState.java  |   4 +-
 57 files changed, 326 insertions(+), 288 deletions(-)

diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigStore.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigStore.java
index b90135ecf9..915f97cefe 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigStore.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/store/ConfigStore.java
@@ -143,6 +143,8 @@ public abstract class ConfigStore extends Context 
implements Closeable {
                        cm = new ConfigMap(this, name, format2);
                } finally {
                        loading.remove(key);
+                       if (loading.isEmpty())
+                               LOADING.remove();
                }
 
                var cm2 = configMaps.putIfAbsent(key, cm);
diff --git 
a/juneau-core/juneau-config/src/test/java/org/apache/juneau/config/store/ConfigClasspathStore_Test.java
 
b/juneau-core/juneau-config/src/test/java/org/apache/juneau/config/store/ConfigClasspathStore_Test.java
index cefb06e213..967f711515 100644
--- 
a/juneau-core/juneau-config/src/test/java/org/apache/juneau/config/store/ConfigClasspathStore_Test.java
+++ 
b/juneau-core/juneau-config/src/test/java/org/apache/juneau/config/store/ConfigClasspathStore_Test.java
@@ -145,23 +145,23 @@ class ConfigClasspathStore_Test extends TestBase {
                assertNotNull(b.build());
        }
 
-       @Test void b09_builder_annotations() throws Exception {
+       @Test void b09_builder_annotations() {
                var fs = ClasspathStore.create().annotations().build();
                assertNotNull(fs);
        }
 
-       @Test void b10_builder_cache() throws Exception {
+       @Test void b10_builder_cache() {
                var fs = ClasspathStore.create().cache(null).build();
                assertNotNull(fs);
        }
 
-       @Test void b11_builder_impl() throws Exception {
+       @Test void b11_builder_impl() {
                var impl = ClasspathStore.DEFAULT;
                var fs = ClasspathStore.create().impl(impl).build();
                assertNotNull(fs);
        }
 
-       @Test void b12_close() throws Exception {
+       @Test void b12_close() {
                var fs = ClasspathStore.create().build();
                assertDoesNotThrow(fs::close);
        }
@@ -171,7 +171,7 @@ class ConfigClasspathStore_Test extends TestBase {
                assertNull(fs.write("same.cfg", "same", "same"));
        }
 
-       @Test void b14_unregister_noListener() throws Exception {
+       @Test void b14_unregister_noListener() {
                var fs = ClasspathStore.create().build();
                assertDoesNotThrow(() -> fs.unregister("nonexistent.cfg", s -> 
{}));
        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/bson/BsonParser.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/bson/BsonParser.java
index be0035d1ee..2937867926 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/bson/BsonParser.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/bson/BsonParser.java
@@ -275,7 +275,7 @@ public class BsonParser extends InputStreamParser 
implements BsonMetaProvider, R
         */
        @Override /* RecordReadable */
        public RecordReader parseRecords(Object input) throws IOException {
-               return ((RecordReadable) getSession()).parseRecords(input);
+               return getSession().parseRecords(input);
        }
 
        /**
@@ -289,7 +289,7 @@ public class BsonParser extends InputStreamParser 
implements BsonMetaProvider, R
         */
        @Override /* ArrayRecordReadable */
        public RecordReader parseArrayRecords(Object input) throws IOException {
-               return ((ArrayRecordReadable) 
getSession()).parseArrayRecords(input);
+               return getSession().parseArrayRecords(input);
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/bson/BsonSerializer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/bson/BsonSerializer.java
index 6e281ef929..3ea92d15d0 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/bson/BsonSerializer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/bson/BsonSerializer.java
@@ -349,7 +349,7 @@ public class BsonSerializer extends OutputStreamSerializer 
implements BsonMetaPr
         */
        @Override /* RecordWritable */
        public RecordWriter serializeRecords(Object output) throws IOException {
-               return ((RecordWritable) getSession()).serializeRecords(output);
+               return getSession().serializeRecords(output);
        }
 
        /**
@@ -364,7 +364,7 @@ public class BsonSerializer extends OutputStreamSerializer 
implements BsonMetaPr
         */
        @Override /* ArrayRecordWritable */
        public RecordWriter serializeArrayRecords(Object output) throws 
IOException {
-               return ((ArrayRecordWritable) 
getSession()).serializeArrayRecords(output);
+               return getSession().serializeArrayRecords(output);
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/cbor/CborTokenReader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/cbor/CborTokenReader.java
index 4d35306c6f..6ebc3d02cd 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/cbor/CborTokenReader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/cbor/CborTokenReader.java
@@ -141,6 +141,9 @@ public class CborTokenReader implements TokenReader {
        // counting elements.
        // 
==============================================================================================
        @Override /* TokenReader */
+       @SuppressWarnings({
+               "java:S3776" // Token-reader state machine; complexity is 
inherent to the format decode loop.
+       })
        public TokenType next() throws IOException, ParseException {
                if (ended) {
                        currentToken = TokenType.END_OF_STREAM;
@@ -262,8 +265,7 @@ public class CborTokenReader implements TokenReader {
        private String readScalarAsString(DataType dt) throws IOException, 
ParseException {
                switch (dt) {
                        case STRING:    return is.readString();
-                       case UINT:
-                       case NINT:      return 
Long.toString(is.readSignedLong());
+                       case UINT, NINT: return 
Long.toString(is.readSignedLong());
                        case BINARY: {
                                var b = is.readBinary();
                                return new String(b, 
java.nio.charset.StandardCharsets.UTF_8);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/csv/CsvParser.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/csv/CsvParser.java
index 44273232cb..52cab33702 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/csv/CsvParser.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/csv/CsvParser.java
@@ -286,7 +286,7 @@ public class CsvParser extends ReaderParser implements 
CsvMetaProvider, RecordRe
         */
        @Override /* RecordReadable */
        public RecordReader parseRecords(Object input) throws IOException {
-               return ((RecordReadable) getSession()).parseRecords(input);
+               return getSession().parseRecords(input);
        }
 
        @Override /* RecordReadable */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/csv/CsvSerializer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/csv/CsvSerializer.java
index e198bd0d03..f7548e30b8 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/csv/CsvSerializer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/csv/CsvSerializer.java
@@ -290,7 +290,7 @@ public class CsvSerializer extends WriterSerializer 
implements CsvMetaProvider,
         */
        @Override /* RecordWritable */
        public RecordWriter serializeRecords(Object output) throws IOException {
-               return ((RecordWritable) getSession()).serializeRecords(output);
+               return getSession().serializeRecords(output);
        }
 
        @Override /* RecordWritable */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/json/JsonTokenWriter.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/json/JsonTokenWriter.java
index a6aaa967f0..7a72c13fcc 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/json/JsonTokenWriter.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/json/JsonTokenWriter.java
@@ -446,7 +446,7 @@ public class JsonTokenWriter implements TokenWriter {
        private void pushContext(int kind) {
                if (depth < 32) {
                        // Two bits per level: 00 = root, 01 = object, 10 = 
array.
-                       ctxBits |= ((long) kind & 0x3L) << (depth * 2);
+                       ctxBits |= (kind & 0x3L) << (depth * 2);
                } else {
                        if (ctxOverflow == null || depth - 32 >= 
ctxOverflow.length)
                                growOverflow();
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/markdown/MarkdownParser.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/markdown/MarkdownParser.java
index 8583c409d5..9b356a2425 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/markdown/MarkdownParser.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/markdown/MarkdownParser.java
@@ -255,7 +255,7 @@ public class MarkdownParser extends ReaderParser implements 
MarkdownMetaProvider
         */
        @Override /* RecordReadable */
        public RecordReader parseRecords(Object input) throws IOException {
-               return ((RecordReadable) getSession()).parseRecords(input);
+               return getSession().parseRecords(input);
        }
 
        @Override /* RecordReadable */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/markdown/MarkdownSerializer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/markdown/MarkdownSerializer.java
index 943cad0a14..87da1188c1 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/markdown/MarkdownSerializer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/markdown/MarkdownSerializer.java
@@ -291,7 +291,7 @@ public class MarkdownSerializer extends WriterSerializer 
implements MarkdownMeta
         */
        @Override /* RecordWritable */
        public RecordWriter serializeRecords(Object output) throws IOException {
-               return ((RecordWritable) getSession()).serializeRecords(output);
+               return getSession().serializeRecords(output);
        }
 
        @Override /* RecordWritable */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackTokenReader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackTokenReader.java
index b321ddde88..040d3e2535 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackTokenReader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackTokenReader.java
@@ -309,11 +309,7 @@ public class MsgPackTokenReader implements TokenReader {
 
        @Override /* TokenReader */
        public boolean canRead() throws IOException, ParseException {
-               if (ended)
-                       return false;
-               if (depth > 0 && stackRemaining[depth - 1] == 0)
-                       return false;
-               return true;
+               return !ended && !(depth > 0 && stackRemaining[depth - 1] == 0);
        }
 
        @Override /* TokenReader */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackTokenWriter.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackTokenWriter.java
index c7f0958663..bb15173a3a 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackTokenWriter.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/msgpack/MsgPackTokenWriter.java
@@ -138,7 +138,7 @@ public class MsgPackTokenWriter implements TokenWriter {
        @Override /* TokenWriter */
        public TokenWriter endObject() throws IOException {
                assertOpen();
-               if (buffers.isEmpty() || !isMapStack.peek())
+               if (buffers.isEmpty() || 
!Boolean.TRUE.equals(isMapStack.peek()))
                        throw new IllegalStateException("endObject called with 
no matching startObject");
                var body = buffers.pop();
                var count = elementCount.pop();
@@ -165,7 +165,7 @@ public class MsgPackTokenWriter implements TokenWriter {
        @Override /* TokenWriter */
        public TokenWriter endArray() throws IOException {
                assertOpen();
-               if (buffers.isEmpty() || isMapStack.peek())
+               if (buffers.isEmpty() || Boolean.TRUE.equals(isMapStack.peek()))
                        throw new IllegalStateException("endArray called with 
no matching startArray");
                var body = buffers.pop();
                var count = elementCount.pop();
@@ -182,9 +182,9 @@ public class MsgPackTokenWriter implements TokenWriter {
        public TokenWriter fieldName(String name) throws IOException {
                assertOpen();
                assertArgNotNull("name", name);
-               if (isMapStack.isEmpty() || !isMapStack.peek())
+               if (isMapStack.isEmpty() || 
!Boolean.TRUE.equals(isMapStack.peek()))
                        throw new IllegalStateException("field called outside 
an object");
-               if (!awaitingKey.peek())
+               if (!Boolean.TRUE.equals(awaitingKey.peek()))
                        throw new IllegalStateException("field called twice 
without an intervening value");
                new MsgPackOutputStream(activeOut()).appendString(name);
                // Replace top of awaitingKey with false (we just wrote the 
key; expect a value next).
@@ -325,7 +325,7 @@ public class MsgPackTokenWriter implements TokenWriter {
 
        private void preValueCheck() {
                // At map-key position, value emits are illegal — caller must 
call field() first.
-               if (!isMapStack.isEmpty() && isMapStack.peek() && 
awaitingKey.peek())
+               if (!isMapStack.isEmpty() && 
Boolean.TRUE.equals(isMapStack.peek()) && 
Boolean.TRUE.equals(awaitingKey.peek()))
                        throw new IllegalStateException(
                                "Value emitted at map-key position without 
preceding field(...).");
        }
@@ -336,7 +336,7 @@ public class MsgPackTokenWriter implements TokenWriter {
                // After emitting a value:
                // - In a map, flip awaitingKey back to true (next emit is the 
next pair's key).
                // - In an array, increment element count.
-               if (isMapStack.peek()) {
+               if (Boolean.TRUE.equals(isMapStack.peek())) {
                        awaitingKey.pop();
                        awaitingKey.push(true);
                } else {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/plaintext/PlainTextParser.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/plaintext/PlainTextParser.java
index ec572ce41c..b8cc00da57 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/plaintext/PlainTextParser.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/plaintext/PlainTextParser.java
@@ -176,7 +176,7 @@ public class PlainTextParser extends ReaderParser 
implements PlainTextMetaProvid
         */
        @Override /* RecordReadable */
        public RecordReader parseRecords(Object input) throws IOException {
-               return ((RecordReadable) getSession()).parseRecords(input);
+               return getSession().parseRecords(input);
        }
 
        @Override /* RecordReadable */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/plaintext/PlainTextSerializer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/plaintext/PlainTextSerializer.java
index 472f0725b5..351e83a21b 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/plaintext/PlainTextSerializer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/plaintext/PlainTextSerializer.java
@@ -173,7 +173,7 @@ public class PlainTextSerializer extends WriterSerializer 
implements PlainTextMe
         */
        @Override /* RecordWritable */
        public RecordWriter serializeRecords(Object output) throws IOException {
-               return ((RecordWritable) getSession()).serializeRecords(output);
+               return getSession().serializeRecords(output);
        }
 
        @Override /* RecordWritable */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/sse/SseParser.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/sse/SseParser.java
index a48164a616..d4774ac9f7 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/sse/SseParser.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/sse/SseParser.java
@@ -151,7 +151,7 @@ public class SseParser extends ReaderParser implements 
RecordReadable {
         */
        @Override /* RecordReadable */
        public RecordReader parseRecords(Object input) throws IOException {
-               return ((RecordReadable) getSession()).parseRecords(input);
+               return getSession().parseRecords(input);
        }
 
        @Override /* RecordReadable */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/sse/SseSerializer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/sse/SseSerializer.java
index 9f47192942..1679df6069 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/sse/SseSerializer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/sse/SseSerializer.java
@@ -189,7 +189,7 @@ public class SseSerializer extends WriterSerializer 
implements RecordWritable {
         */
        @Override /* RecordWritable */
        public RecordWriter serializeRecords(Object output) throws IOException {
-               return ((RecordWritable) getSession()).serializeRecords(output);
+               return getSession().serializeRecords(output);
        }
 
        @Override /* RecordWritable */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/stream/RecordReader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/stream/RecordReader.java
index 855390085f..ff4d83517d 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/stream/RecordReader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/stream/RecordReader.java
@@ -136,6 +136,8 @@ public interface RecordReader extends Closeable {
                                }
                        }
                        @Override public T next() {
+                               if (! hasNext())
+                                       throw new 
java.util.NoSuchElementException();
                                try {
                                        return read(type);
                                } catch (IOException | ParseException e) {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/uon/UonParser.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/uon/UonParser.java
index f0c91b6827..a811df148f 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/uon/UonParser.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/uon/UonParser.java
@@ -331,7 +331,7 @@ public class UonParser extends ReaderParser implements 
HttpPartParser, UonMetaPr
         */
        @Override /* RecordReadable */
        public RecordReader parseRecords(Object input) throws IOException {
-               return ((RecordReadable) getSession()).parseRecords(input);
+               return getSession().parseRecords(input);
        }
 
        @Override /* RecordReadable */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/uon/UonSerializer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/uon/UonSerializer.java
index e051285d13..793c6b1138 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/uon/UonSerializer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/uon/UonSerializer.java
@@ -543,7 +543,7 @@ public class UonSerializer extends WriterSerializer 
implements HttpPartSerialize
         */
        @Override /* RecordWritable */
        public RecordWriter serializeRecords(Object output) throws IOException {
-               return ((RecordWritable) getSession()).serializeRecords(output);
+               return getSession().serializeRecords(output);
        }
 
        @Override /* RecordWritable */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/xml/XmlParser.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/xml/XmlParser.java
index 6b2d35798b..6540164387 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/xml/XmlParser.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/xml/XmlParser.java
@@ -389,7 +389,7 @@ public class XmlParser extends ReaderParser implements 
XmlMetaProvider, RecordRe
         */
        @Override /* RecordReadable */
        public RecordReader parseRecords(Object input) throws IOException {
-               return ((RecordReadable) getSession()).parseRecords(input);
+               return getSession().parseRecords(input);
        }
 
        /**
@@ -403,7 +403,7 @@ public class XmlParser extends ReaderParser implements 
XmlMetaProvider, RecordRe
         */
        @Override /* ArrayRecordReadable */
        public RecordReader parseArrayRecords(Object input) throws IOException {
-               return ((ArrayRecordReadable) 
getSession()).parseArrayRecords(input);
+               return getSession().parseArrayRecords(input);
        }
 
        /**
@@ -418,7 +418,7 @@ public class XmlParser extends ReaderParser implements 
XmlMetaProvider, RecordRe
         */
        @Override /* ArrayRecordReadable */
        public RecordReader parseArrayRecords(Object input, String 
rootElementName) throws IOException {
-               return ((ArrayRecordReadable) 
getSession()).parseArrayRecords(input, rootElementName);
+               return getSession().parseArrayRecords(input, rootElementName);
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/xml/XmlSerializer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/xml/XmlSerializer.java
index 24751e6665..f14684887c 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/xml/XmlSerializer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/xml/XmlSerializer.java
@@ -674,7 +674,7 @@ public class XmlSerializer extends WriterSerializer 
implements XmlMetaProvider,
         */
        @Override /* RecordWritable */
        public RecordWriter serializeRecords(Object output) throws IOException {
-               return ((RecordWritable) getSession()).serializeRecords(output);
+               return getSession().serializeRecords(output);
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/yaml/YamlParser.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/yaml/YamlParser.java
index 879a487ce6..62800ef4cc 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/yaml/YamlParser.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/yaml/YamlParser.java
@@ -188,7 +188,7 @@ public class YamlParser extends ReaderParser implements 
RecordReadable, ArrayRec
         */
        @Override /* RecordReadable */
        public RecordReader parseRecords(Object input) throws IOException {
-               return ((RecordReadable) getSession()).parseRecords(input);
+               return getSession().parseRecords(input);
        }
 
        /**
@@ -202,7 +202,7 @@ public class YamlParser extends ReaderParser implements 
RecordReadable, ArrayRec
         */
        @Override /* ArrayRecordReadable */
        public RecordReader parseArrayRecords(Object input) throws IOException {
-               return ((ArrayRecordReadable) 
getSession()).parseArrayRecords(input);
+               return getSession().parseArrayRecords(input);
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/yaml/YamlSerializer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/yaml/YamlSerializer.java
index 072e380372..1c444c153d 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/yaml/YamlSerializer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/marshall/yaml/YamlSerializer.java
@@ -311,7 +311,7 @@ public class YamlSerializer extends WriterSerializer 
implements RecordWritable,
         */
        @Override /* RecordWritable */
        public RecordWriter serializeRecords(Object output) throws IOException {
-               return ((RecordWritable) getSession()).serializeRecords(output);
+               return getSession().serializeRecords(output);
        }
 
        /**
@@ -325,7 +325,7 @@ public class YamlSerializer extends WriterSerializer 
implements RecordWritable,
         */
        @Override /* ArrayRecordWritable */
        public RecordWriter serializeArrayRecords(Object output) throws 
IOException {
-               return ((ArrayRecordWritable) 
getSession()).serializeArrayRecords(output);
+               return getSession().serializeArrayRecords(output);
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/csv/CsvParser_Test.java
 
b/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/csv/CsvParser_Test.java
index 0a2cb19504..a11bbd3cf0 100644
--- 
a/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/csv/CsvParser_Test.java
+++ 
b/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/csv/CsvParser_Test.java
@@ -45,7 +45,7 @@ class CsvParser_Test extends TestBase {
        // a - Parse into collection of beans
        
//====================================================================================================
 
-       @Test void a01_parseBeanCollection() throws Exception {
+       @Test void a01_parseBeanCollection() {
                var csv = "b,c\nb1,1\nb2,2\n";
                var r = parseList(csv, A.class);
                assertEquals(2, r.size());
@@ -55,14 +55,14 @@ class CsvParser_Test extends TestBase {
                assertEquals(2, r.get(1).c);
        }
 
-       @Test void a02_parseSingleBean() throws Exception {
+       @Test void a02_parseSingleBean() {
                var csv = "b,c\nhello,42\n";
                var r = CsvParser.DEFAULT.parse(csv, A.class);
                assertEquals("hello", r.b);
                assertEquals(42, r.c);
        }
 
-       @Test void a03_parseBeanArray() throws Exception {
+       @Test void a03_parseBeanArray() {
                var csv = "b,c\nfoo,10\nbar,20\n";
                var r = CsvParser.DEFAULT.parse(csv, A[].class);
                assertEquals(2, r.length);
@@ -81,7 +81,7 @@ class CsvParser_Test extends TestBase {
        // b - Parse into collection of maps
        
//====================================================================================================
 
-       @Test void b01_parseMapCollection() throws Exception {
+       @Test void b01_parseMapCollection() {
                var csv = "name,value\nfoo,1\nbar,2\n";
                var r = parseList(csv, Map.class);
                assertEquals(2, r.size());
@@ -91,7 +91,7 @@ class CsvParser_Test extends TestBase {
                assertEquals("2", r.get(1).get("value"));
        }
 
-       @Test void b02_parseSingleMap() throws Exception {
+       @Test void b02_parseSingleMap() {
                var csv = "k1,k2\nv1,v2\n";
                var r = CsvParser.DEFAULT.parse(csv, Map.class);
                assertEquals("v1", r.get("k1"));
@@ -102,19 +102,19 @@ class CsvParser_Test extends TestBase {
        // c - Parse simple value collections (single "value" column)
        
//====================================================================================================
 
-       @Test void c01_parseStringList() throws Exception {
+       @Test void c01_parseStringList() {
                var csv = "value\nalpha\nbeta\ngamma\n";
                var r = parseList(csv, String.class);
                assertEquals(List.of("alpha", "beta", "gamma"), r);
        }
 
-       @Test void c02_parseIntegerList() throws Exception {
+       @Test void c02_parseIntegerList() {
                var csv = "value\n1\n2\n3\n";
                var r = parseList(csv, Integer.class);
                assertEquals(List.of(1, 2, 3), r);
        }
 
-       @Test void c03_parseBooleanList() throws Exception {
+       @Test void c03_parseBooleanList() {
                var csv = "value\ntrue\nfalse\ntrue\n";
                var r = parseList(csv, Boolean.class);
                assertEquals(List.of(true, false, true), r);
@@ -124,7 +124,7 @@ class CsvParser_Test extends TestBase {
        // d - Null and empty value handling
        
//====================================================================================================
 
-       @Test void d01_parseNullValues() throws Exception {
+       @Test void d01_parseNullValues() {
                var csv = "b,c\n<NULL>,1\nb2,<NULL>\n";
                var r = parseList(csv, B.class);
                assertEquals(2, r.size());
@@ -139,12 +139,12 @@ class CsvParser_Test extends TestBase {
                public Integer c;
        }
 
-       @Test void d02_parseEmptyInput() throws Exception {
+       @Test void d02_parseEmptyInput() {
                var r1 = CsvParser.DEFAULT.parse("", A.class);
                assertNull(r1);
        }
 
-       @Test void d03_parseHeaderOnly() throws Exception {
+       @Test void d03_parseHeaderOnly() {
                var csv = "b,c\n";
                var r = parseList(csv, A.class);
                assertTrue(r.isEmpty());
@@ -164,7 +164,7 @@ class CsvParser_Test extends TestBase {
 
        @ParameterizedTest
        @MethodSource("quotedFieldCases")
-       void e01_parseQuotedFields(String csv, String expected) throws 
Exception {
+       void e01_parseQuotedFields(String csv, String expected) {
                var r = parseList(csv, String.class);
                assertEquals(expected, r.get(0));
        }
@@ -173,7 +173,7 @@ class CsvParser_Test extends TestBase {
        // f - Enum values
        
//====================================================================================================
 
-       @Test void f01_parseEnumValues() throws Exception {
+       @Test void f01_parseEnumValues() {
                var csv = "name,status\nTask1,PENDING\nTask2,COMPLETED\n";
                var r = parseList(csv, C.class);
                assertEquals(2, r.size());
@@ -194,14 +194,14 @@ class CsvParser_Test extends TestBase {
        // g - Object (untyped) parsing
        
//====================================================================================================
 
-       @Test void g01_parseAsObject_multipleRows() throws Exception {
+       @Test void g01_parseAsObject_multipleRows() {
                var csv = "a,b\n1,2\n3,4\n";
                var r = CsvParser.DEFAULT.parse(csv, Object.class);
                assertInstanceOf(MarshalledList.class, r);
                assertEquals(2, ((MarshalledList) r).size());
        }
 
-       @Test void g02_parseAsObject_singleRow() throws Exception {
+       @Test void g02_parseAsObject_singleRow() {
                var csv = "a,b\n1,2\n";
                var r = CsvParser.DEFAULT.parse(csv, Object.class);
                assertInstanceOf(MarshalledMap.class, r);
@@ -214,7 +214,7 @@ class CsvParser_Test extends TestBase {
        // h - Mismatch: fewer fields than headers
        
//====================================================================================================
 
-       @Test void h01_fewerFieldsThanHeaders() throws Exception {
+       @Test void h01_fewerFieldsThanHeaders() {
                // Row has fewer columns than header; missing fields are 
treated as null/default.
                var csv = "b,c\nhello\n";
                var r = parseList(csv, A.class);
@@ -227,7 +227,7 @@ class CsvParser_Test extends TestBase {
        // i - Round-trip: serialize then parse
        
//====================================================================================================
 
-       @Test void i01_roundTripBeanList() throws Exception {
+       @Test void i01_roundTripBeanList() {
                var original = List.of(new D("alice", 30), new D("bob", 25));
                var csv = CsvSerializer.DEFAULT.serialize(original);
                var parsed = parseList(csv, D.class);
@@ -238,14 +238,14 @@ class CsvParser_Test extends TestBase {
                assertEquals(25, parsed.get(1).age);
        }
 
-       @Test void i02_roundTripStringList() throws Exception {
+       @Test void i02_roundTripStringList() {
                var original = List.of("foo", "bar", "baz");
                var csv = CsvSerializer.DEFAULT.serialize(original);
                var parsed = parseList(csv, String.class);
                assertEquals(original, parsed);
        }
 
-       @Test void i03_roundTripIntList() throws Exception {
+       @Test void i03_roundTripIntList() {
                var original = List.of(1, 2, 3);
                var csv = CsvSerializer.DEFAULT.serialize(original);
                var parsed = parseList(csv, Integer.class);
@@ -263,7 +263,7 @@ class CsvParser_Test extends TestBase {
        // j - Bean annotations
        
//====================================================================================================
 
-       @Test void j01_parseWithMarshalledAnnotations() throws Exception {
+       @Test void j01_parseWithMarshalledAnnotations() {
                var csv = "full_name,years\nJohn,35\n";
                var r = parseList(csv, E.class);
                assertEquals(1, r.size());
@@ -283,7 +283,7 @@ class CsvParser_Test extends TestBase {
        // k - CRLF line endings
        
//====================================================================================================
 
-       @Test void k01_parseCrlfLineEndings() throws Exception {
+       @Test void k01_parseCrlfLineEndings() {
                var csv = "b,c\r\nhello,1\r\nworld,2\r\n";
                var r = parseList(csv, A.class);
                assertEquals(2, r.size());
diff --git 
a/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/json/JsonTokenReaderSupplemental_Test.java
 
b/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/json/JsonTokenReaderSupplemental_Test.java
index 1a774a4053..86fb76b187 100644
--- 
a/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/json/JsonTokenReaderSupplemental_Test.java
+++ 
b/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/json/JsonTokenReaderSupplemental_Test.java
@@ -88,26 +88,26 @@ class JsonTokenReaderSupplemental_Test extends TestBase {
                        assertThrowsWithMessage(ParseException.class, "Invalid 
JSON number", () -> drain("1.e0"));
                }
 
-               @Test void b06_validDecimal() throws Exception {
-                       drain("1.5");
+               @Test void b06_validDecimal() {
+                       assertDoesNotThrow(() -> drain("1.5"));
                }
        }
 
        @Nested class C_comments extends TestBase {
 
-               @Test void c01_blockComment() throws Exception {
+               @Test void c01_blockComment() {
                        // '*' that does not immediately precede '/' stays 
inside the block.
-                       drain("/* a * b */ 1");
+                       assertDoesNotThrow(() -> drain("/* a * b */ 1"));
                }
 
-               @Test void c02_lineCommentTerminatedByNewline() throws 
Exception {
-                       drain("// comment\n1");
+               @Test void c02_lineCommentTerminatedByNewline() {
+                       assertDoesNotThrow(() -> drain("// comment\n1"));
                }
 
-               @Test void c03_lineCommentTerminatedByEof() throws Exception {
+               @Test void c03_lineCommentTerminatedByEof() {
                        // A whole-document line comment is scanned through to 
EOF (the c == -1 branch of the
                        // line-comment loop) and the document is then a valid 
empty input.
-                       drain("// just a comment, no newline");
+                       assertDoesNotThrow(() -> drain("// just a comment, no 
newline"));
                }
 
                @Test void c04_unterminatedBlockComment() {
diff --git 
a/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/stream/ArrayRecordStream_Test.java
 
b/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/stream/ArrayRecordStream_Test.java
index 4976814dc5..73c3fad309 100644
--- 
a/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/stream/ArrayRecordStream_Test.java
+++ 
b/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/stream/ArrayRecordStream_Test.java
@@ -331,13 +331,11 @@ class ArrayRecordStream_Test extends TestBase {
        @Test
        void g02_msgpackCountMismatchThrows() throws Exception {
                var baos = new ByteArrayOutputStream();
-               assertThrows(IOException.class, () -> {
-                       try (var w = 
MsgPackSerializer.DEFAULT.serializeArrayRecords(baos, 3)) {
-                               w.write(new Bean("a", 1));
-                               w.write(new Bean("b", 2));
-                               // declared 3, only wrote 2 → close should throw
-                       }
-               });
+               var w = MsgPackSerializer.DEFAULT.serializeArrayRecords(baos, 
3);
+               w.write(new Bean("a", 1));
+               w.write(new Bean("b", 2));
+               // declared 3, only wrote 2 → close should throw
+               assertThrows(IOException.class, w::close);
        }
 
        @Test
@@ -350,8 +348,8 @@ class ArrayRecordStream_Test extends TestBase {
        }
 
        // 
=====================================================================================
-       // Very-deeply-nested array elements (5+ levels) through the 
true-streaming binary cursors —
-       // TODO-175ab Item 2.  Exercises element-at-a-time streaming over 
non-trivial element shapes.
+       // Very-deeply-nested array elements (5+ levels) through the 
true-streaming binary cursors.
+       // Exercises element-at-a-time streaming over non-trivial element 
shapes.
        // 
=====================================================================================
 
        @ParameterizedTest
diff --git 
a/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/toml/TomlWriter_Test.java
 
b/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/toml/TomlWriter_Test.java
index 38b9b0cfb5..d139c9743c 100644
--- 
a/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/toml/TomlWriter_Test.java
+++ 
b/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/toml/TomlWriter_Test.java
@@ -381,7 +381,7 @@ class TomlWriter_Test extends TestBase {
 
        @ParameterizedTest
        @MethodSource("k01_escapeBasicStringCases")
-       void k01_escapeBasicString(String input, String expected) throws 
Exception {
+       void k01_escapeBasicString(String input, String expected) {
                var sw = new StringWriter();
                var w = newWriter(sw, false);
                assertEquals(expected, w.escapeBasicString(input));
@@ -392,7 +392,7 @@ class TomlWriter_Test extends TestBase {
        
//-----------------------------------------------------------------------------------------------------------------
 
        @Test
-       void l01_isBareKeyValid() throws Exception {
+       void l01_isBareKeyValid() {
                var sw = new StringWriter();
                var w = newWriter(sw, false);
                assertTrue(w.isBareKey("simple"));
@@ -403,7 +403,7 @@ class TomlWriter_Test extends TestBase {
        }
 
        @Test
-       void l02_isBareKeyInvalid() throws Exception {
+       void l02_isBareKeyInvalid() {
                var sw = new StringWriter();
                var w = newWriter(sw, false);
                assertFalse(w.isBareKey(null));
@@ -531,42 +531,42 @@ class TomlWriter_Test extends TestBase {
        }
 
        @Test
-       void m12_chainCr() throws Exception {
+       void m12_chainCr() {
                var sw = new StringWriter();
                var w = newWriter(sw, false);
                assertSame(w, w.cr(2));
        }
 
        @Test
-       void m13_chainCre() throws Exception {
+       void m13_chainCre() {
                var sw = new StringWriter();
                var w = newWriter(sw, false);
                assertSame(w, w.cre(2));
        }
 
        @Test
-       void m14_chainI() throws Exception {
+       void m14_chainI() {
                var sw = new StringWriter();
                var w = newWriter(sw, false);
                assertSame(w, w.i(2));
        }
 
        @Test
-       void m15_chainIe() throws Exception {
+       void m15_chainIe() {
                var sw = new StringWriter();
                var w = newWriter(sw, false);
                assertSame(w, w.ie(2));
        }
 
        @Test
-       void m16_chainNl() throws Exception {
+       void m16_chainNl() {
                var sw = new StringWriter();
                var w = newWriter(sw, false);
                assertSame(w, w.nl(0));
        }
 
        @Test
-       void m17_chainNlIf() throws Exception {
+       void m17_chainNlIf() {
                var sw = new StringWriter();
                var w = newWriter(sw, false);
                assertSame(w, w.nlIf(true, 0));
@@ -574,21 +574,21 @@ class TomlWriter_Test extends TestBase {
        }
 
        @Test
-       void m18_chainQ() throws Exception {
+       void m18_chainQ() {
                var sw = new StringWriter();
                var w = newWriter(sw, false);
                assertSame(w, w.q());
        }
 
        @Test
-       void m19_chainS() throws Exception {
+       void m19_chainS() {
                var sw = new StringWriter();
                var w = newWriter(sw, false);
                assertSame(w, w.s());
        }
 
        @Test
-       void m20_chainSIf() throws Exception {
+       void m20_chainSIf() {
                var sw = new StringWriter();
                var w = newWriter(sw, false);
                assertSame(w, w.sIf(true));
diff --git 
a/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/transforms/DefaultSwaps_Test.java
 
b/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/transforms/DefaultSwaps_Test.java
index 80e08d957a..20652371c3 100644
--- 
a/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/transforms/DefaultSwaps_Test.java
+++ 
b/juneau-core/juneau-marshall/src/test/java/org/apache/juneau/marshall/transforms/DefaultSwaps_Test.java
@@ -78,7 +78,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class ASwap extends StringSwap<Enumeration<?>> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, Enumeration<?> 
o) throws Exception {
+               public String swap(MarshallingSession session, Enumeration<?> 
o) {
                        return "FOO";
                }
        }
@@ -89,15 +89,15 @@ class DefaultSwaps_Test extends TestBase {
                public Enumeration<String> f2 = A.elements();
        }
 
-       @Test void a01_Enumeration() throws Exception {
+       @Test void a01_Enumeration() {
                test1("['foo','bar']", A.elements());
        }
 
-       @Test void a02_Enumeration_overrideSwap() throws Exception {
+       @Test void a02_Enumeration_overrideSwap() {
                test3("'FOO'", A.elements(), ASwap.class);
        }
 
-       @Test void a03_Enumeration_overrideAnnotation() throws Exception {
+       @Test void a03_Enumeration_overrideAnnotation() {
                test1("{f1:['foo','bar'],f2:'FOO'}", new ABean());
        }
 
@@ -109,7 +109,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class AcSwap extends StringSwap<Enumeration<?>> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, Enumeration<?> 
o) throws Exception {
+               public String swap(MarshallingSession session, Enumeration<?> 
o) {
                        return "FOO";
                }
        }
@@ -125,15 +125,15 @@ class DefaultSwaps_Test extends TestBase {
                public Enumeration<String> f2 = A.elements();
        }
 
-       @Test void a01c_Enumeration_usingConfig() throws Exception {
+       @Test void a01c_Enumeration_usingConfig() {
                test2("['foo','bar']", A_C.elements(), 
AcMarshalledConfig.class);
        }
 
-       @Test void a02c_Enumeration_overrideSwap_usingConfig() throws Exception 
{
+       @Test void a02c_Enumeration_overrideSwap_usingConfig() {
                test4("'FOO'", A_C.elements(), AcSwap.class, 
AcMarshalledConfig.class);
        }
 
-       @Test void a03c_Enumeration_overrideAnnotation_usingConfig() throws 
Exception {
+       @Test void a03c_Enumeration_overrideAnnotation_usingConfig() {
                test2("{f1:['foo','bar'],f2:'FOO'}", new AcBean(), 
AcMarshalledConfig.class);
        }
 
@@ -144,7 +144,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class BSwap extends StringSwap<Iterator<?>> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, Iterator<?> o) 
throws Exception {
+               public String swap(MarshallingSession session, Iterator<?> o) {
                        return "FOO";
                }
        }
@@ -155,15 +155,15 @@ class DefaultSwaps_Test extends TestBase {
                public Iterator<?> f2 = B.iterator();
        }
 
-       @Test void b01_Iterator() throws Exception {
+       @Test void b01_Iterator() {
                test1("['foo','bar']", B.iterator());
        }
 
-       @Test void b02_Iterator_overrideSwap() throws Exception {
+       @Test void b02_Iterator_overrideSwap() {
                test3("'FOO'", B.iterator(), BSwap.class);
        }
 
-       @Test void b03_Iterator_overrideAnnotation() throws Exception {
+       @Test void b03_Iterator_overrideAnnotation() {
                test1("{f1:['foo','bar'],f2:'FOO'}", new BBean());
        }
 
@@ -171,7 +171,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class BcSwap extends StringSwap<Iterator<?>> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, Iterator<?> o) 
throws Exception {
+               public String swap(MarshallingSession session, Iterator<?> o) {
                        return "FOO";
                }
        }
@@ -186,15 +186,15 @@ class DefaultSwaps_Test extends TestBase {
                public Iterator<?> f2 = B.iterator();
        }
 
-       @Test void b01c_Iterator_usingConfig() throws Exception {
+       @Test void b01c_Iterator_usingConfig() {
                test2("['foo','bar']", B_C.iterator(), 
BcMarshalledConfig.class);
        }
 
-       @Test void b02c_Iterator_overrideSwap_usingConfig() throws Exception {
+       @Test void b02c_Iterator_overrideSwap_usingConfig() {
                test4("'FOO'", B_C.iterator(), BcSwap.class, 
BcMarshalledConfig.class);
        }
 
-       @Test void b03c_Iterator_overrideAnnotation_usingConfig() throws 
Exception {
+       @Test void b03c_Iterator_overrideAnnotation_usingConfig() {
                test2("{f1:['foo','bar'],f2:'FOO'}", new BcBean(), 
BcMarshalledConfig.class);
        }
 
@@ -205,7 +205,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class CSwap extends StringSwap<Locale> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, Locale o) throws 
Exception {
+               public String swap(MarshallingSession session, Locale o) {
                        return "FOO";
                }
        }
@@ -216,15 +216,15 @@ class DefaultSwaps_Test extends TestBase {
                public Locale f2 = C;
        }
 
-       @Test void c01_Locale() throws Exception {
+       @Test void c01_Locale() {
                test1("'ja-JP'", C);
        }
 
-       @Test void c02_Locale_overrideSwap() throws Exception {
+       @Test void c02_Locale_overrideSwap() {
                test3("'FOO'", C, CSwap.class);
        }
 
-       @Test void c03_Locale_overrideAnnotation() throws Exception {
+       @Test void c03_Locale_overrideAnnotation() {
                test1("{f1:'ja-JP',f2:'FOO'}", new CBean());
        }
 
@@ -235,7 +235,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class DSwap extends StringSwap<Calendar> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, Calendar o) 
throws Exception {
+               public String swap(MarshallingSession session, Calendar o) {
                        return "FOO";
                }
        }
@@ -246,15 +246,15 @@ class DefaultSwaps_Test extends TestBase {
                public GregorianCalendar f2 = D;
        }
 
-       @Test void d01_Calendar() throws Exception {
+       @Test void d01_Calendar() {
                test1("'2012-12-21T12:34:56Z'", D);
        }
 
-       @Test void d02_Calendar_overrideSwap() throws Exception {
+       @Test void d02_Calendar_overrideSwap() {
                test3("'FOO'", D, DSwap.class);
        }
 
-       @Test void d03_Calendar_overrideAnnotation() throws Exception {
+       @Test void d03_Calendar_overrideAnnotation() {
                test1("{f1:'2012-12-21T12:34:56Z',f2:'FOO'}", new DBean());
        }
 
@@ -265,7 +265,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class ESwap extends StringSwap<Date> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, Date o) throws 
Exception {
+               public String swap(MarshallingSession session, Date o) {
                        return "FOO";
                }
        }
@@ -276,15 +276,15 @@ class DefaultSwaps_Test extends TestBase {
                public Date f2 = E;
        }
 
-       @Test void e01_Date() throws Exception {
+       @Test void e01_Date() {
                test1("'2012-12-21T07:34:56'", E);
        }
 
-       @Test void e02_Date_overrideSwap() throws Exception {
+       @Test void e02_Date_overrideSwap() {
                test3("'FOO'", E, ESwap.class);
        }
 
-       @Test void e03_Date_overrideAnnotation() throws Exception {
+       @Test void e03_Date_overrideAnnotation() {
                test1("{f1:'2012-12-21T07:34:56',f2:'FOO'}", new EBean());
        }
 
@@ -295,7 +295,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class FASwap extends StringSwap<Instant> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, Instant o) 
throws Exception {
+               public String swap(MarshallingSession session, Instant o) {
                        return "FOO";
                }
        }
@@ -306,15 +306,15 @@ class DefaultSwaps_Test extends TestBase {
                public Instant f2 = FA;
        }
 
-       @Test void fa01_Instant() throws Exception {
+       @Test void fa01_Instant() {
                test1("'2012-12-21T12:34:56Z'", FA);
        }
 
-       @Test void fa02_Instant_overrideSwap() throws Exception {
+       @Test void fa02_Instant_overrideSwap() {
                test3("'FOO'", FA, FASwap.class);
        }
 
-       @Test void fa03_Instant_overrideAnnotation() throws Exception {
+       @Test void fa03_Instant_overrideAnnotation() {
                test1("{f1:'2012-12-21T12:34:56Z',f2:'FOO'}", new FABean());
        }
 
@@ -325,7 +325,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class FBSwap extends StringSwap<ZonedDateTime> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, ZonedDateTime o) 
throws Exception {
+               public String swap(MarshallingSession session, ZonedDateTime o) 
{
                        return "FOO";
                }
        }
@@ -336,15 +336,15 @@ class DefaultSwaps_Test extends TestBase {
                public ZonedDateTime f2 = FB;
        }
 
-       @Test void fb01_ZonedDateTime() throws Exception {
+       @Test void fb01_ZonedDateTime() {
                test1("'2012-12-21T12:34:56Z'", FB);
        }
 
-       @Test void fb02_ZonedDateTime_overrideSwap() throws Exception {
+       @Test void fb02_ZonedDateTime_overrideSwap() {
                test3("'FOO'", FB, FBSwap.class);
        }
 
-       @Test void fb03_ZonedDateTime_overrideAnnotation() throws Exception {
+       @Test void fb03_ZonedDateTime_overrideAnnotation() {
                test1("{f1:'2012-12-21T12:34:56Z',f2:'FOO'}", new FBBean());
        }
 
@@ -355,7 +355,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class FCSwap extends StringSwap<LocalDate> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, LocalDate o) 
throws Exception {
+               public String swap(MarshallingSession session, LocalDate o) {
                        return "FOO";
                }
        }
@@ -366,15 +366,15 @@ class DefaultSwaps_Test extends TestBase {
                public LocalDate f2 = FC;
        }
 
-       @Test void fc01_LocalDate() throws Exception {
+       @Test void fc01_LocalDate() {
                test1("'2012-12-21'", FC);
        }
 
-       @Test void fc02_LocalDate_overrideSwap() throws Exception {
+       @Test void fc02_LocalDate_overrideSwap() {
                test3("'FOO'", FC, FCSwap.class);
        }
 
-       @Test void fc03_LocalDate_overrideAnnotation() throws Exception {
+       @Test void fc03_LocalDate_overrideAnnotation() {
                test1("{f1:'2012-12-21',f2:'FOO'}", new FCBean());
        }
 
@@ -385,7 +385,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class FDSwap extends StringSwap<LocalDateTime> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, LocalDateTime o) 
throws Exception {
+               public String swap(MarshallingSession session, LocalDateTime o) 
{
                        return "FOO";
                }
        }
@@ -396,15 +396,15 @@ class DefaultSwaps_Test extends TestBase {
                public LocalDateTime f2 = FD;
        }
 
-       @Test void fd01_LocalDateTime() throws Exception {
+       @Test void fd01_LocalDateTime() {
                test1("'2012-12-21T12:34:56'", FD);
        }
 
-       @Test void fd02_LocalDateTime_overrideSwap() throws Exception {
+       @Test void fd02_LocalDateTime_overrideSwap() {
                test3("'FOO'", FD, FDSwap.class);
        }
 
-       @Test void fd03_LocalDateTime_overrideAnnotation() throws Exception {
+       @Test void fd03_LocalDateTime_overrideAnnotation() {
                test1("{f1:'2012-12-21T12:34:56',f2:'FOO'}", new FDBean());
        }
 
@@ -415,7 +415,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class FESwap extends StringSwap<LocalTime> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, LocalTime o) 
throws Exception {
+               public String swap(MarshallingSession session, LocalTime o) {
                        return "FOO";
                }
        }
@@ -426,15 +426,15 @@ class DefaultSwaps_Test extends TestBase {
                public LocalTime f2 = FE;
        }
 
-       @Test void fe01_LocalTime() throws Exception {
+       @Test void fe01_LocalTime() {
                test1("'12:34:56'", FE);
        }
 
-       @Test void fe02_LocalTime_overrideSwap() throws Exception {
+       @Test void fe02_LocalTime_overrideSwap() {
                test3("'FOO'", FE, FESwap.class);
        }
 
-       @Test void fe03_LocalTime_overrideAnnotation() throws Exception {
+       @Test void fe03_LocalTime_overrideAnnotation() {
                test1("{f1:'12:34:56',f2:'FOO'}", new FEBean());
        }
 
@@ -445,7 +445,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class FFSwap extends StringSwap<OffsetDateTime> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, OffsetDateTime 
o) throws Exception {
+               public String swap(MarshallingSession session, OffsetDateTime 
o) {
                        return "FOO";
                }
        }
@@ -456,15 +456,15 @@ class DefaultSwaps_Test extends TestBase {
                public OffsetDateTime f2 = FF;
        }
 
-       @Test void ff01_OffsetDateTime() throws Exception {
+       @Test void ff01_OffsetDateTime() {
                test1("'2012-12-21T12:34:56-05:00'", FF);
        }
 
-       @Test void ff02_OffsetDateTime_overrideSwap() throws Exception {
+       @Test void ff02_OffsetDateTime_overrideSwap() {
                test3("'FOO'", FF, FFSwap.class);
        }
 
-       @Test void ff03_OffsetDateTime_overrideAnnotation() throws Exception {
+       @Test void ff03_OffsetDateTime_overrideAnnotation() {
                test1("{f1:'2012-12-21T12:34:56-05:00',f2:'FOO'}", new 
FFBean());
        }
 
@@ -475,7 +475,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class FGSwap extends StringSwap<OffsetTime> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, OffsetTime o) 
throws Exception {
+               public String swap(MarshallingSession session, OffsetTime o) {
                        return "FOO";
                }
        }
@@ -486,15 +486,15 @@ class DefaultSwaps_Test extends TestBase {
                public OffsetTime f2 = FG;
        }
 
-       @Test void fg01_OffsetTime() throws Exception {
+       @Test void fg01_OffsetTime() {
                test1("'12:34:56-05:00'", FG);
        }
 
-       @Test void fg02_OffsetTime_overrideSwap() throws Exception {
+       @Test void fg02_OffsetTime_overrideSwap() {
                test3("'FOO'", FG, FGSwap.class);
        }
 
-       @Test void fg03_OffsetTime_overrideAnnotation() throws Exception {
+       @Test void fg03_OffsetTime_overrideAnnotation() {
                test1("{f1:'12:34:56-05:00',f2:'FOO'}", new FGBean());
        }
 
@@ -505,7 +505,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class FHSwap extends StringSwap<Year> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, Year o) throws 
Exception {
+               public String swap(MarshallingSession session, Year o) {
                        return "FOO";
                }
        }
@@ -516,15 +516,15 @@ class DefaultSwaps_Test extends TestBase {
                public Year f2 = FH;
        }
 
-       @Test void fh01_Year() throws Exception {
+       @Test void fh01_Year() {
                test1("'2012'", FH);
        }
 
-       @Test void fh02_Year_overrideSwap() throws Exception {
+       @Test void fh02_Year_overrideSwap() {
                test3("'FOO'", FH, FHSwap.class);
        }
 
-       @Test void fh03_Year_overrideAnnotation() throws Exception {
+       @Test void fh03_Year_overrideAnnotation() {
                test1("{f1:'2012',f2:'FOO'}", new FHBean());
        }
 
@@ -535,7 +535,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class FISwap extends StringSwap<YearMonth> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, YearMonth o) 
throws Exception {
+               public String swap(MarshallingSession session, YearMonth o) {
                        return "FOO";
                }
        }
@@ -546,15 +546,15 @@ class DefaultSwaps_Test extends TestBase {
                public YearMonth f2 = FI;
        }
 
-       @Test void fi01_YearMonth() throws Exception {
+       @Test void fi01_YearMonth() {
                test1("'2012-12'", FI);
        }
 
-       @Test void fi02_YearMonth_overrideSwap() throws Exception {
+       @Test void fi02_YearMonth_overrideSwap() {
                test3("'FOO'", FI, FISwap.class);
        }
 
-       @Test void fi03_YearMonth_overrideAnnotation() throws Exception {
+       @Test void fi03_YearMonth_overrideAnnotation() {
                test1("{f1:'2012-12',f2:'FOO'}", new FIBean());
        }
 
@@ -565,7 +565,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class FJSwap extends StringSwap<Temporal> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, Temporal o) 
throws Exception {
+               public String swap(MarshallingSession session, Temporal o) {
                        return "FOO";
                }
        }
@@ -576,15 +576,15 @@ class DefaultSwaps_Test extends TestBase {
                public Temporal f2 = FJ;
        }
 
-       @Test void fj01_Temporal() throws Exception {
+       @Test void fj01_Temporal() {
                test1("'2012-12-21T05:00:00Z'", FJ);
        }
 
-       @Test void fj02_Temporal_overrideSwap() throws Exception {
+       @Test void fj02_Temporal_overrideSwap() {
                test3("'FOO'", FJ, FJSwap.class);
        }
 
-       @Test void fj03_Temporal_overrideAnnotation() throws Exception {
+       @Test void fj03_Temporal_overrideAnnotation() {
                test1("{f1:'2012-12-21T05:00:00Z',f2:'FOO'}", new FJBean());
        }
 
@@ -595,7 +595,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class GSwap extends StringSwap<TimeZone> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, TimeZone o) 
throws Exception {
+               public String swap(MarshallingSession session, TimeZone o) {
                        return "FOO";
                }
        }
@@ -606,15 +606,15 @@ class DefaultSwaps_Test extends TestBase {
                public TimeZone f2 = G;
        }
 
-       @Test void g01_TimeZone() throws Exception {
+       @Test void g01_TimeZone() {
                test1("'GMT'", G);
        }
 
-       @Test void g02_TimeZone_overrideSwap() throws Exception {
+       @Test void g02_TimeZone_overrideSwap() {
                test3("'FOO'", G, GSwap.class);
        }
 
-       @Test void g03_TimeZone_overrideAnnotation() throws Exception {
+       @Test void g03_TimeZone_overrideAnnotation() {
                test1("{f1:'GMT',f2:'FOO'}", new GBean());
        }
 
@@ -625,7 +625,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class HSwap extends StringSwap<XMLGregorianCalendar> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, 
XMLGregorianCalendar o) throws Exception {
+               public String swap(MarshallingSession session, 
XMLGregorianCalendar o) {
                        return "FOO";
                }
        }
@@ -636,15 +636,15 @@ class DefaultSwaps_Test extends TestBase {
                public XMLGregorianCalendar f2 = H;
        }
 
-       @Test void h01_XMLGregorianCalendar() throws Exception {
+       @Test void h01_XMLGregorianCalendar() {
                test1("'2012-12-21T12:34:56.789Z'", H);
        }
 
-       @Test void h02_XMLGregorianCalendar_overrideSwap() throws Exception {
+       @Test void h02_XMLGregorianCalendar_overrideSwap() {
                test3("'FOO'", H, HSwap.class);
        }
 
-       @Test void h03_XMLGregorianCalendar_overrideAnnotation() throws 
Exception {
+       @Test void h03_XMLGregorianCalendar_overrideAnnotation() {
                test1("{f1:'2012-12-21T12:34:56.789Z',f2:'FOO'}", new HBean());
        }
 
@@ -655,7 +655,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class ISwap extends StringSwap<ZoneId> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, ZoneId o) throws 
Exception {
+               public String swap(MarshallingSession session, ZoneId o) {
                        return "FOO";
                }
        }
@@ -666,15 +666,15 @@ class DefaultSwaps_Test extends TestBase {
                public ZoneId f2 = I;
        }
 
-       @Test void i01_ZoneId() throws Exception {
+       @Test void i01_ZoneId() {
                test1("'Z'", I);
        }
 
-       @Test void i02_ZoneId_overrideSwap() throws Exception {
+       @Test void i02_ZoneId_overrideSwap() {
                test3("'FOO'", I, ISwap.class);
        }
 
-       @Test void i03_ZoneId_overrideAnnotation() throws Exception {
+       @Test void i03_ZoneId_overrideAnnotation() {
                test1("{f1:'Z',f2:'FOO'}", new IBean());
        }
 
@@ -685,7 +685,7 @@ class DefaultSwaps_Test extends TestBase {
 
        public static class JSwap extends StringSwap<java.time.Duration> {
                @Override /* ObjectSwap */
-               public String swap(MarshallingSession session, 
java.time.Duration o) throws Exception {
+               public String swap(MarshallingSession session, 
java.time.Duration o) {
                        return "FOO";
                }
        }
@@ -696,15 +696,15 @@ class DefaultSwaps_Test extends TestBase {
                public java.time.Duration f2 = J;
        }
 
-       @Test void j01_Duration() throws Exception {
+       @Test void j01_Duration() {
                test1("'PT1H30M'", J);
        }
 
-       @Test void j02_Duration_overrideSwap() throws Exception {
+       @Test void j02_Duration_overrideSwap() {
                test3("'FOO'", J, JSwap.class);
        }
 
-       @Test void j03_Duration_overrideAnnotation() throws Exception {
+       @Test void j03_Duration_overrideAnnotation() {
                test1("{f1:'PT1H30M',f2:'FOO'}", new JBean());
        }
 
@@ -715,7 +715,7 @@ class DefaultSwaps_Test extends TestBase {
                public java.time.Duration f2 = java.time.Duration.ofSeconds(5);
        }
 
-       @Test void j04_Duration_propertyFormatOverride() throws Exception {
+       @Test void j04_Duration_propertyFormatOverride() {
                test1("{f1:5000,f2:5.0}", new J2Bean());
        }
 
@@ -726,7 +726,7 @@ class DefaultSwaps_Test extends TestBase {
                public java.time.Period f2 = java.time.Period.ofDays(2);
        }
 
-       @Test void j05_Period_propertyFormatOverride() throws Exception {
+       @Test void j05_Period_propertyFormatOverride() {
                test1("{f1:9,f2:2}", new J3Bean());
        }
 }
\ No newline at end of file
diff --git 
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/auth/saml/SamlAssertionValidator_Builder_Test.java
 
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/auth/saml/SamlAssertionValidator_Builder_Test.java
index 4556c6f149..328af829bf 100644
--- 
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/auth/saml/SamlAssertionValidator_Builder_Test.java
+++ 
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/auth/saml/SamlAssertionValidator_Builder_Test.java
@@ -78,13 +78,13 @@ class SamlAssertionValidator_Builder_Test extends TestBase {
                
assertTrue(v.getAlgorithms().contains(SignatureConstants.ALGO_ID_SIGNATURE_ECDSA_SHA256));
        }
 
-       @Test void b01_clockSkew_negativeRejected() throws Exception {
+       @Test void b01_clockSkew_negativeRejected() {
                assertThrows(IllegalArgumentException.class, () -> 
SamlAssertionValidator.create()
                        
.spEntityId("sp").expectedIssuer("idp").signingCredential(dummyCredential())
                        .clockSkew(Duration.ofSeconds(-1)));
        }
 
-       @Test void b02_clockSkew_overFiveMinutesRejected() throws Exception {
+       @Test void b02_clockSkew_overFiveMinutesRejected() {
                assertThrows(IllegalArgumentException.class, () -> 
SamlAssertionValidator.create()
                        
.spEntityId("sp").expectedIssuer("idp").signingCredential(dummyCredential())
                        .clockSkew(Duration.ofMinutes(6)));
@@ -98,13 +98,13 @@ class SamlAssertionValidator_Builder_Test extends TestBase {
                assertEquals(Duration.ofMinutes(5), v.getClockSkew());
        }
 
-       @Test void c01_algorithms_sha1Rejected() throws Exception {
+       @Test void c01_algorithms_sha1Rejected() {
                assertThrows(IllegalArgumentException.class, () -> 
SamlAssertionValidator.create()
                        
.spEntityId("sp").expectedIssuer("idp").signingCredential(dummyCredential())
                        
.algorithms(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA1));
        }
 
-       @Test void c02_algorithms_emptyRejected() throws Exception {
+       @Test void c02_algorithms_emptyRejected() {
                assertThrows(IllegalArgumentException.class, () -> 
SamlAssertionValidator.create()
                        
.spEntityId("sp").expectedIssuer("idp").signingCredential(dummyCredential())
                        .algorithms());
diff --git 
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/logger/RestLogger_Test.java
 
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/logger/RestLogger_Test.java
index cfd1e82d80..fd7d866f14 100644
--- 
a/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/logger/RestLogger_Test.java
+++ 
b/juneau-integration-tests/src/test/java/org/apache/juneau/rest/server/logger/RestLogger_Test.java
@@ -35,7 +35,7 @@ class RestLogger_Test extends TestBase {
        // a - CallLoggerRule.matches() with status filters
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void a01_ruleMatchesStatusFilter_ge500() throws Exception {
+       @Test void a01_ruleMatchesStatusFilter_ge500() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .statusFilter(x -> x >= 500)
                        .build();
@@ -45,7 +45,7 @@ class RestLogger_Test extends TestBase {
                assertTrue(rule.matches(req, res));
        }
 
-       @Test void a02_ruleDoesNotMatchStatusFilter_below500() throws Exception 
{
+       @Test void a02_ruleDoesNotMatchStatusFilter_below500() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .statusFilter(x -> x >= 500)
                        .build();
@@ -55,7 +55,7 @@ class RestLogger_Test extends TestBase {
                assertFalse(rule.matches(req, res));
        }
 
-       @Test void a03_ruleMatchesStatusFilter_ge400() throws Exception {
+       @Test void a03_ruleMatchesStatusFilter_ge400() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .statusFilter(x -> x >= 400)
                        .build();
@@ -65,7 +65,7 @@ class RestLogger_Test extends TestBase {
                assertTrue(rule.matches(req, res));
        }
 
-       @Test void a04_ruleNoFilter_matchesEverything() throws Exception {
+       @Test void a04_ruleNoFilter_matchesEverything() {
                var rule = 
CallLoggerRule.create(BasicBeanStore.INSTANCE).build();
                var req = new 
org.springframework.mock.web.MockHttpServletRequest();
                var res = new 
org.springframework.mock.web.MockHttpServletResponse();
@@ -77,7 +77,7 @@ class RestLogger_Test extends TestBase {
        // b - CallLoggerRule.matches() with request filters
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void b01_requestFilter_matches() throws Exception {
+       @Test void b01_requestFilter_matches() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .requestFilter(x -> "GET".equals(x.getMethod()))
                        .build();
@@ -86,7 +86,7 @@ class RestLogger_Test extends TestBase {
                assertTrue(rule.matches(req, res));
        }
 
-       @Test void b02_requestFilter_doesNotMatch() throws Exception {
+       @Test void b02_requestFilter_doesNotMatch() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .requestFilter(x -> "GET".equals(x.getMethod()))
                        .build();
@@ -99,7 +99,7 @@ class RestLogger_Test extends TestBase {
        // c - CallLoggerRule.matches() with response filters
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void c01_responseFilter_matches() throws Exception {
+       @Test void c01_responseFilter_matches() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .responseFilter(x -> x.getStatus() >= 500)
                        .build();
@@ -109,7 +109,7 @@ class RestLogger_Test extends TestBase {
                assertTrue(rule.matches(req, res));
        }
 
-       @Test void c02_responseFilter_doesNotMatch() throws Exception {
+       @Test void c02_responseFilter_doesNotMatch() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .responseFilter(x -> x.getStatus() >= 500)
                        .build();
@@ -123,7 +123,7 @@ class RestLogger_Test extends TestBase {
        // d - CallLoggerRule.matches() with exception filter
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void d01_exceptionFilter_matchesWhenExceptionPresent() throws 
Exception {
+       @Test void d01_exceptionFilter_matchesWhenExceptionPresent() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        
.exceptionFilter(IllegalArgumentException.class::isInstance)
                        .build();
@@ -133,7 +133,7 @@ class RestLogger_Test extends TestBase {
                assertTrue(rule.matches(req, res));
        }
 
-       @Test void d02_exceptionFilter_doesNotMatchWrongType() throws Exception 
{
+       @Test void d02_exceptionFilter_doesNotMatchWrongType() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        
.exceptionFilter(IllegalArgumentException.class::isInstance)
                        .build();
@@ -143,7 +143,7 @@ class RestLogger_Test extends TestBase {
                assertFalse(rule.matches(req, res));
        }
 
-       @Test void d03_exceptionFilter_matchesWhenNoException() throws 
Exception {
+       @Test void d03_exceptionFilter_matchesWhenNoException() {
                // When no exception is present, the exception filter is not 
evaluated; the rule still matches.
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        
.exceptionFilter(IllegalArgumentException.class::isInstance)
@@ -157,7 +157,7 @@ class RestLogger_Test extends TestBase {
        // e - CallLoggerRule.matches() with combined filters
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void e01_combinedFilters_allMatch() throws Exception {
+       @Test void e01_combinedFilters_allMatch() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .statusFilter(x -> x >= 500)
                        .requestFilter(x -> "GET".equals(x.getMethod()))
@@ -168,7 +168,7 @@ class RestLogger_Test extends TestBase {
                assertTrue(rule.matches(req, res));
        }
 
-       @Test void e02_combinedFilters_statusMissesRequestMatches() throws 
Exception {
+       @Test void e02_combinedFilters_statusMissesRequestMatches() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .statusFilter(x -> x >= 500)
                        .requestFilter(x -> "GET".equals(x.getMethod()))
@@ -183,33 +183,33 @@ class RestLogger_Test extends TestBase {
        // f - CallLoggerRule getter methods
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void f01_getLevel() throws Exception {
+       @Test void f01_getLevel() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .level(Level.SEVERE)
                        .build();
                assertEquals(Level.SEVERE, rule.getLevel());
        }
 
-       @Test void f02_getLevel_null() throws Exception {
+       @Test void f02_getLevel_null() {
                var rule = 
CallLoggerRule.create(BasicBeanStore.INSTANCE).build();
                assertNull(rule.getLevel());
        }
 
-       @Test void f03_getRequestDetail() throws Exception {
+       @Test void f03_getRequestDetail() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .requestDetail(CallLoggingDetail.ENTITY)
                        .build();
                assertEquals(CallLoggingDetail.ENTITY, rule.getRequestDetail());
        }
 
-       @Test void f04_getResponseDetail() throws Exception {
+       @Test void f04_getResponseDetail() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .responseDetail(CallLoggingDetail.HEADER)
                        .build();
                assertEquals(CallLoggingDetail.HEADER, 
rule.getResponseDetail());
        }
 
-       @Test void f05_getEnabled() throws Exception {
+       @Test void f05_getEnabled() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .enabled(Enablement.NEVER)
                        .build();
@@ -220,7 +220,7 @@ class RestLogger_Test extends TestBase {
        // g - BasicTestCaptureCallLogger captures log messages
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void g01_captureLogger_logs500() throws Exception {
+       @Test void g01_captureLogger_logs500() {
                var logger = new BasicTestCaptureCallLogger();
                // Simulate a log call directly
                var req = new 
org.springframework.mock.web.MockHttpServletRequest("GET", "/error");
@@ -233,7 +233,7 @@ class RestLogger_Test extends TestBase {
                assertEquals(Level.SEVERE, logger.getLevel());
        }
 
-       @Test void g02_captureLogger_noLog200() throws Exception {
+       @Test void g02_captureLogger_noLog200() {
                var logger = new BasicTestCaptureCallLogger();
                var req = new 
org.springframework.mock.web.MockHttpServletRequest("GET", "/ok");
                var res = new 
org.springframework.mock.web.MockHttpServletResponse();
@@ -243,7 +243,7 @@ class RestLogger_Test extends TestBase {
                assertNull(logger.getMessage());
        }
 
-       @Test void g03_captureLogger_logs400AsWarning() throws Exception {
+       @Test void g03_captureLogger_logs400AsWarning() {
                var logger = new BasicTestCaptureCallLogger();
                var req = new 
org.springframework.mock.web.MockHttpServletRequest("POST", "/bad");
                var res = new 
org.springframework.mock.web.MockHttpServletResponse();
@@ -254,7 +254,7 @@ class RestLogger_Test extends TestBase {
                assertEquals(Level.WARNING, logger.getLevel());
        }
 
-       @Test void g04_captureLogger_reset() throws Exception {
+       @Test void g04_captureLogger_reset() {
                var logger = new BasicTestCaptureCallLogger();
                var req = new 
org.springframework.mock.web.MockHttpServletRequest("GET", "/error");
                var res = new 
org.springframework.mock.web.MockHttpServletResponse();
@@ -265,7 +265,7 @@ class RestLogger_Test extends TestBase {
                assertNull(logger.getMessage());
        }
 
-       @Test void g05_captureLogger_getMessageAndReset() throws Exception {
+       @Test void g05_captureLogger_getMessageAndReset() {
                var logger = new BasicTestCaptureCallLogger();
                var req = new 
org.springframework.mock.web.MockHttpServletRequest("GET", "/error");
                var res = new 
org.springframework.mock.web.MockHttpServletResponse();
@@ -281,7 +281,7 @@ class RestLogger_Test extends TestBase {
        // h - BasicDisabledCallLogger never logs
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void h01_disabledLogger_neverLogs() throws Exception {
+       @Test void h01_disabledLogger_neverLogs() {
                var logger = new 
BasicDisabledCallLogger(BasicBeanStore.INSTANCE);
                var req = new 
org.springframework.mock.web.MockHttpServletRequest("GET", "/error");
                var res = new 
org.springframework.mock.web.MockHttpServletResponse();
@@ -296,23 +296,23 @@ class RestLogger_Test extends TestBase {
        // i - CallLoggingDetail.fromString
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void i01_fromString_statusLine() throws Exception {
+       @Test void i01_fromString_statusLine() {
                assertEquals(CallLoggingDetail.STATUS_LINE, 
CallLoggingDetail.fromString("STATUS_LINE"));
        }
 
-       @Test void i02_fromString_caseInsensitive() throws Exception {
+       @Test void i02_fromString_caseInsensitive() {
                assertEquals(CallLoggingDetail.HEADER, 
CallLoggingDetail.fromString("header"));
        }
 
-       @Test void i03_fromString_null() throws Exception {
+       @Test void i03_fromString_null() {
                assertNull(CallLoggingDetail.fromString(null));
        }
 
-       @Test void i04_fromString_invalid() throws Exception {
+       @Test void i04_fromString_invalid() {
                assertNull(CallLoggingDetail.fromString("INVALID"));
        }
 
-       @Test void i05_fromString_entity() throws Exception {
+       @Test void i05_fromString_entity() {
                assertEquals(CallLoggingDetail.ENTITY, 
CallLoggingDetail.fromString("ENTITY"));
        }
 
@@ -320,7 +320,7 @@ class RestLogger_Test extends TestBase {
        // j - CallLoggerRule.toString and CallLogger.toString
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void j01_ruleToString_includesLevel() throws Exception {
+       @Test void j01_ruleToString_includesLevel() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .level(Level.WARNING)
                        .requestDetail(CallLoggingDetail.HEADER)
@@ -330,7 +330,7 @@ class RestLogger_Test extends TestBase {
                assertTrue(s.contains("WARNING"));
        }
 
-       @Test void j02_loggerToString_includesEnabled() throws Exception {
+       @Test void j02_loggerToString_includesEnabled() {
                var logger = CallLogger.create(BasicBeanStore.INSTANCE).build();
                var s = logger.toString();
                assertNotNull(s);
@@ -341,11 +341,11 @@ class RestLogger_Test extends TestBase {
        // k - CallLoggingDetail.isOneOf
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void k01_isOneOf_matches() throws Exception {
+       @Test void k01_isOneOf_matches() {
                
assertTrue(CallLoggingDetail.HEADER.isOneOf(CallLoggingDetail.STATUS_LINE, 
CallLoggingDetail.HEADER));
        }
 
-       @Test void k02_isOneOf_noMatch() throws Exception {
+       @Test void k02_isOneOf_noMatch() {
                
assertFalse(CallLoggingDetail.ENTITY.isOneOf(CallLoggingDetail.STATUS_LINE, 
CallLoggingDetail.HEADER));
        }
 }
diff --git 
a/juneau-microservice/juneau-microservice-jetty/src/main/resources/jetty.xml 
b/juneau-microservice/juneau-microservice-jetty/src/main/resources/jetty.xml
index d5a24b31e0..074f37d8f4 100644
--- a/juneau-microservice/juneau-microservice-jetty/src/main/resources/jetty.xml
+++ b/juneau-microservice/juneau-microservice-jetty/src/main/resources/jetty.xml
@@ -23,7 +23,7 @@
   - Plain HTTP localhost dev default; one ServerConnector on 
$S{availablePort,10000} (the value resolves
     from the [Jetty] section of the bundled juneau.cfg, which defaults to 
10000).
   - No resourceBase / ResourceHandler / WebAppContext filesystem mount: no 
static-file serving by
-    default (TODO-126 SAFE classification).  Servlets are auto-mounted from 
@Bean Servlet
+    default (path-traversal-safe by construction).  Servlets are auto-mounted 
from @Bean Servlet
     contributions; consumers who need static content register their own 
handler via a user-supplied
     jetty.xml on the working directory or classpath.
   - All defaults are overridable: a consumer-supplied jetty.xml on the working 
directory or earlier on
diff --git 
a/juneau-petstore/juneau-petstore-core/src/main/java/org/apache/juneau/petstore/rest/PetFreemarkerViewResource.java
 
b/juneau-petstore/juneau-petstore-core/src/main/java/org/apache/juneau/petstore/rest/PetFreemarkerViewResource.java
index 0633966fcd..c45a234ae3 100644
--- 
a/juneau-petstore/juneau-petstore-core/src/main/java/org/apache/juneau/petstore/rest/PetFreemarkerViewResource.java
+++ 
b/juneau-petstore/juneau-petstore-core/src/main/java/org/apache/juneau/petstore/rest/PetFreemarkerViewResource.java
@@ -51,7 +51,7 @@ public class PetFreemarkerViewResource extends 
BasicRestServlet {
 
        private static final long serialVersionUID = 1L;
 
-       private final PetStore store = new PetStore();
+       private final transient PetStore store = new PetStore();
 
        /**
         * Provides a {@link FreemarkerMixin} configured to resolve templates 
under {@code petstore-templates/}.
diff --git 
a/juneau-petstore/juneau-petstore-core/src/main/java/org/apache/juneau/petstore/rest/PetMustacheViewResource.java
 
b/juneau-petstore/juneau-petstore-core/src/main/java/org/apache/juneau/petstore/rest/PetMustacheViewResource.java
index 6ece716f8a..3b593d4958 100644
--- 
a/juneau-petstore/juneau-petstore-core/src/main/java/org/apache/juneau/petstore/rest/PetMustacheViewResource.java
+++ 
b/juneau-petstore/juneau-petstore-core/src/main/java/org/apache/juneau/petstore/rest/PetMustacheViewResource.java
@@ -57,7 +57,7 @@ public class PetMustacheViewResource extends BasicRestServlet 
{
 
        private static final long serialVersionUID = 1L;
 
-       private final PetStore store = new PetStore();
+       private final transient PetStore store = new PetStore();
 
        /**
         * Provides a {@link MustacheMixin} configured to resolve templates 
under {@code petstore-templates/} with
diff --git 
a/juneau-petstore/juneau-petstore-core/src/main/java/org/apache/juneau/petstore/rest/PetSecureResource.java
 
b/juneau-petstore/juneau-petstore-core/src/main/java/org/apache/juneau/petstore/rest/PetSecureResource.java
index d9ae835f9c..a2b396d472 100644
--- 
a/juneau-petstore/juneau-petstore-core/src/main/java/org/apache/juneau/petstore/rest/PetSecureResource.java
+++ 
b/juneau-petstore/juneau-petstore-core/src/main/java/org/apache/juneau/petstore/rest/PetSecureResource.java
@@ -76,7 +76,7 @@ public class PetSecureResource extends BasicRestServlet {
 
        private static final long serialVersionUID = 1L;
 
-       private final PetStore store = new PetStore();
+       private final transient PetStore store = new PetStore();
 
        /**
         * Provides the {@link RestGuardList} that gates every op on this 
resource with a
diff --git 
a/juneau-petstore/juneau-petstore-core/src/main/java/org/apache/juneau/petstore/rest/PetStoreResource.java
 
b/juneau-petstore/juneau-petstore-core/src/main/java/org/apache/juneau/petstore/rest/PetStoreResource.java
index 1c5dc461c6..a1d7b19924 100644
--- 
a/juneau-petstore/juneau-petstore-core/src/main/java/org/apache/juneau/petstore/rest/PetStoreResource.java
+++ 
b/juneau-petstore/juneau-petstore-core/src/main/java/org/apache/juneau/petstore/rest/PetStoreResource.java
@@ -69,7 +69,7 @@ public class PetStoreResource extends BasicRestServlet {
        private static final long serialVersionUID = 1L;
 
        /** Backing store.  Singleton servlet → singleton store, shared across 
requests. */
-       private final PetStore store = new PetStore();
+       private final transient PetStore store = new PetStore();
 
        
//------------------------------------------------------------------------------------------------------------------
        // Pets
diff --git 
a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RecordStreamBody.java
 
b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RecordStreamBody.java
index 3ce00e7d2b..cecf414d20 100644
--- 
a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RecordStreamBody.java
+++ 
b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RecordStreamBody.java
@@ -39,7 +39,7 @@ import org.apache.juneau.marshall.stream.*;
  *     }
  *
  *     <jc>// Caller</jc>
- *     <jv>api</jv>.upload(RecordStreamBody.<jsm>record</jsm>(<jv>w</jv> -&gt; 
{
+ *     <jv>api</jv>.upload(RecordStreamBody.<jsm>records</jsm>(<jv>w</jv> 
-&gt; {
  *             <jk>for</jk> (Bean <jv>b</jv> : <jv>source</jv>())
  *                     <jv>w</jv>.write(<jv>b</jv>);
  *     }));
@@ -53,7 +53,7 @@ public final class RecordStreamBody {
         * @param consumer The callback that emits records.  Must not be 
<jk>null</jk>.
         * @return A new body wrapper.
         */
-       public static RecordStreamBody record(Consumer<RecordWriter> consumer) {
+       public static RecordStreamBody records(Consumer<RecordWriter> consumer) 
{
                return new RecordStreamBody(consumer, RecordWriter.class);
        }
 
diff --git 
a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ResponseContent.java
 
b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ResponseContent.java
index a3dd8d653b..b55caa28b2 100644
--- 
a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ResponseContent.java
+++ 
b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/ResponseContent.java
@@ -64,6 +64,7 @@ import org.apache.juneau.rest.client.classic.assertion.*;
 public class ResponseContent implements HttpEntity {
 
        private static final String HEADER_ContentType = "Content-Type";
+       private static final String CONTENT_TYPE_TEXT_PLAIN = "text/plain";
 
        private static final HttpEntity NULL_ENTITY = new HttpEntity() {
 
@@ -255,14 +256,14 @@ public class ResponseContent implements HttpEntity {
                        if (result.isPresent())
                                return result.get();
 
-                       var ct = 
firstNonEmpty(response.getHeader(HEADER_ContentType).orElse("text/plain"));
+                       var ct = 
firstNonEmpty(response.getHeader(HEADER_ContentType).orElse(CONTENT_TYPE_TEXT_PLAIN));
 
                        if (parser == null)
                                parser = client.getMatchingParser(ct);
 
                        var mt = MediaType.of(ct);
 
-                       if ((parser == null || 
(mt.toString().contains("text/plain") && ! parser.canHandle(ct))) && 
type.hasStringMutater())
+                       if ((parser == null || 
(mt.toString().contains(CONTENT_TYPE_TEXT_PLAIN) && ! parser.canHandle(ct))) && 
type.hasStringMutater())
                                return BasicConverter.INSTANCE.to(asString(), 
type.inner());
 
                        if (nn(parser)) {
@@ -331,7 +332,7 @@ public class ResponseContent implements HttpEntity {
         */
        private Object asCursor(ClassMeta<?> type) throws RestCallException {
                try {
-                       var ct = 
firstNonEmpty(response.getHeader(HEADER_ContentType).orElse("text/plain"));
+                       var ct = 
firstNonEmpty(response.getHeader(HEADER_ContentType).orElse(CONTENT_TYPE_TEXT_PLAIN));
                        var matchedParser = parser != null ? parser : 
client.getMatchingParser(ct);
                        if (matchedParser == null)
                                throw new RestCallException(response, null,
diff --git 
a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestRequest.java
 
b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestRequest.java
index 0a1dfb03b6..c14fd70a67 100644
--- 
a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestRequest.java
+++ 
b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestRequest.java
@@ -2844,17 +2844,15 @@ public class RestRequest extends MarshallingSession 
implements HttpUriRequest, C
        @SuppressWarnings({"unchecked", "rawtypes"})
        private HttpEntity streamBodyEntity(RecordStreamBody body, Serializer 
serializer) {
                if (serializer == null)
-                       throw new RuntimeException("No serializer registered 
for cursor-streamed request body.");
+                       throw illegalArg("No serializer registered for 
cursor-streamed request body.");
                try {
                        var consumer = body.getConsumer();
                        var writerKind = body.getWriterKind();
 
                        if (writerKind == TokenWriter.class && !(serializer 
instanceof TokenWritable))
-                               throw new RuntimeException(
-                                       "Serializer '" + 
serializer.getClass().getName() + "' does not support the token-writer 
surface.");
+                               throw illegalArg("Serializer ''{0}'' does not 
support the token-writer surface.", serializer.getClass().getName());
                        if (writerKind == RecordWriter.class && !(serializer 
instanceof RecordWritable))
-                               throw new RuntimeException(
-                                       "Serializer '" + 
serializer.getClass().getName() + "' does not support the record-writer 
surface.");
+                               throw illegalArg("Serializer ''{0}'' does not 
support the record-writer surface.", serializer.getClass().getName());
 
                        var buf = new ByteArrayOutputStream();
                        Object output = serializer.isWriterSerializer()
@@ -2875,7 +2873,7 @@ public class RestRequest extends MarshallingSession 
implements HttpUriRequest, C
                        var contentType2 = ct != null ? 
ContentType.of(ct.toString()) : ContentType.APPLICATION_OCTET_STREAM;
                        return byteArrayEntity(buf.toByteArray(), 
getRequestContentType(contentType2));
                } catch (IOException e) {
-                       throw new RuntimeException("I/O error streaming request 
body.", e);
+                       throw rex(e, "I/O error streaming request body.");
                }
        }
 }
\ No newline at end of file
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RecordStreamBody.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RecordStreamBody.java
index d27a7b7f02..8e8974d450 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RecordStreamBody.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RecordStreamBody.java
@@ -59,7 +59,7 @@ import org.apache.juneau.marshall.stream.*;
  *     }
  *
  *     <jc>// Caller</jc>
- *     <jv>api</jv>.upload(RecordStreamBody.<jsm>record</jsm>(<jv>w</jv> -&gt; 
{
+ *     <jv>api</jv>.upload(RecordStreamBody.<jsm>records</jsm>(<jv>w</jv> 
-&gt; {
  *             <jk>for</jk> (Bean <jv>b</jv> : <jv>source</jv>())
  *                     <jv>w</jv>.write(<jv>b</jv>);
  *     }));
@@ -85,8 +85,8 @@ public final class RecordStreamBody implements HttpBody {
         * @param consumer The callback that emits records. Must not be 
<jk>null</jk>.
         * @return A new body. Never <jk>null</jk>.
         */
-       public static RecordStreamBody record(Consumer<RecordWriter> consumer) {
-               return record(JsonSerializer.DEFAULT, consumer);
+       public static RecordStreamBody records(Consumer<RecordWriter> consumer) 
{
+               return records(JsonSerializer.DEFAULT, consumer);
        }
 
        /**
@@ -98,7 +98,7 @@ public final class RecordStreamBody implements HttpBody {
         * @return A new body. Never <jk>null</jk>.
         * @throws IllegalArgumentException If the serializer does not support 
the record-writer surface.
         */
-       public static RecordStreamBody record(Serializer serializer, 
Consumer<RecordWriter> consumer) {
+       public static RecordStreamBody records(Serializer serializer, 
Consumer<RecordWriter> consumer) {
                assertArgNotNull("serializer", serializer);
                assertArgNotNull("consumer", consumer);
                if (! (serializer instanceof RecordWritable))
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestRequest.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestRequest.java
index 82d444d990..f9c2d3c1d5 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestRequest.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestRequest.java
@@ -285,7 +285,7 @@ public final class RestRequest {
         * <h5 class='section'>Example:</h5>
         * <p class='bjava'>
         *      <jv>client</jv>.post(<js>"/bulk-upload"</js>)
-        *              
.streamBodyEntity(RecordStreamBody.<jsm>record</jsm>(<jv>w</jv> -&gt; {
+        *              
.streamBodyEntity(RecordStreamBody.<jsm>records</jsm>(<jv>w</jv> -&gt; {
         *                      <jk>for</jk> (Bean <jv>b</jv> : 
<jv>source</jv>())
         *                              <jv>w</jv>.write(<jv>b</jv>);
         *              }))
@@ -296,7 +296,7 @@ public final class RestRequest {
         * @return This object.
         */
        public RestRequest streamBodyEntity(RecordStreamBody value) {
-               return body((HttpBody) value);
+               return body(value);
        }
 
        /**
diff --git 
a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/RecordStreamBody_Test.java
 
b/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/RecordStreamBody_Test.java
index e47b44ec58..76bf2e991e 100644
--- 
a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/RecordStreamBody_Test.java
+++ 
b/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/RecordStreamBody_Test.java
@@ -52,7 +52,7 @@ class RecordStreamBody_Test {
                "resource" // Fluent writer is caller-owned; nothing new to 
close.
        })
        void a01_record_defaultJson() throws Exception {
-               var body = RecordStreamBody.record(w -> {
+               var body = RecordStreamBody.records(w -> {
                        try {
                                w.write(new Bean("dave", 99));
                        } catch (IOException e) {
@@ -65,7 +65,7 @@ class RecordStreamBody_Test {
 
        @Test
        void a02_record_metadata() {
-               var body = RecordStreamBody.record(w -> {});
+               var body = RecordStreamBody.records(w -> {});
                assertEquals("application/json", body.getContentType());
                assertEquals(-1, body.getContentLength());
                assertFalse(body.isRepeatable());
@@ -76,7 +76,7 @@ class RecordStreamBody_Test {
                "resource" // Fluent writer is caller-owned; nothing new to 
close.
        })
        void a03_record_explicitSerializer() throws Exception {
-               var body = RecordStreamBody.record(JsonSerializer.DEFAULT, w -> 
{
+               var body = RecordStreamBody.records(JsonSerializer.DEFAULT, w 
-> {
                        try {
                                w.write(new Bean("amy", 7));
                        } catch (IOException e) {
@@ -116,13 +116,16 @@ class RecordStreamBody_Test {
 
        @Test
        void c01_repeatable_optIn() {
-               var body = RecordStreamBody.record(w -> {}).repeatable();
+               var body = RecordStreamBody.records(w -> {}).repeatable();
                assertTrue(body.isRepeatable());
        }
 
        @Test
+       @SuppressWarnings({
+               "resource" // Fluent writer is caller-owned; nothing new to 
close.
+       })
        void c02_repeatable_isReusable() throws Exception {
-               var body = RecordStreamBody.record(w -> {
+               var body = RecordStreamBody.records(w -> {
                        try {
                                w.write(new Bean("x", 1));
                        } catch (IOException e) {
@@ -134,8 +137,11 @@ class RecordStreamBody_Test {
        }
 
        @Test
+       @SuppressWarnings({
+               "resource" // Fluent writer is caller-owned; nothing new to 
close.
+       })
        void c03_nonRepeatable_failsFastOnResend() throws Exception {
-               var body = RecordStreamBody.record(w -> {
+               var body = RecordStreamBody.records(w -> {
                        try {
                                w.write(new Bean("x", 1));
                        } catch (IOException e) {
diff --git 
a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/ResponseBody_Cursor_Test.java
 
b/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/ResponseBody_Cursor_Test.java
index 41631d37ba..f91c268602 100644
--- 
a/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/ResponseBody_Cursor_Test.java
+++ 
b/juneau-rest/juneau-rest-client/src/test/java/org/apache/juneau/rest/client/ResponseBody_Cursor_Test.java
@@ -37,6 +37,9 @@ class ResponseBody_Cursor_Test {
                public Bean() {}
        }
 
+       @SuppressWarnings({
+               "resource" // Returned RestResponse owns the inner RestClient; 
caller closes via try-with-resources at the call site.
+       })
        private static RestResponse response(String json) {
                var tr = TransportResponse.builder()
                        .statusCode(200)
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/Authorization.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/Authorization.java
index b1c768cc64..3373763d10 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/Authorization.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/Authorization.java
@@ -41,6 +41,9 @@ import java.util.function.*;
  *
  * @since 9.2.1
  */
+@SuppressWarnings({
+       "java:S1192" // Duplicated "value" literals are HTTP header component 
keys; a constant would obscure the header grammar.
+})
 public class Authorization extends HttpStringHeader {
 
        /** The header name */
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/ContentDisposition.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/ContentDisposition.java
index b17bec7e14..1c45edff36 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/ContentDisposition.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/ContentDisposition.java
@@ -38,6 +38,9 @@ import org.apache.juneau.commons.http.*;
  *
  * @since 9.2.1
  */
+@SuppressWarnings({
+       "java:S1192" // Duplicated "value" literals are HTTP header component 
keys; a constant would obscure the header grammar.
+})
 public class ContentDisposition extends HttpStringRangesHeader {
 
        public static final String NAME = "Content-Disposition";
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/ProxyAuthenticate.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/ProxyAuthenticate.java
index e55c526cfd..ea8c21a229 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/ProxyAuthenticate.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/ProxyAuthenticate.java
@@ -40,6 +40,9 @@ import java.util.function.*;
  *
  * @since 9.2.1
  */
+@SuppressWarnings({
+       "java:S1192" // Duplicated "value" literals are HTTP header component 
keys; a constant would obscure the header grammar.
+})
 public class ProxyAuthenticate extends HttpStringHeader {
 
        /** The header name */
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/ProxyAuthorization.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/ProxyAuthorization.java
index 9c90a8d23f..c5380704ef 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/ProxyAuthorization.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/ProxyAuthorization.java
@@ -41,6 +41,9 @@ import java.util.function.*;
  *
  * @since 9.2.1
  */
+@SuppressWarnings({
+       "java:S1192" // Duplicated "value" literals are HTTP header component 
keys; a constant would obscure the header grammar.
+})
 public class ProxyAuthorization extends HttpStringHeader {
 
        /** The header name */
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/WwwAuthenticate.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/WwwAuthenticate.java
index 6da341f9b7..2714c1e505 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/WwwAuthenticate.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/WwwAuthenticate.java
@@ -40,6 +40,9 @@ import java.util.function.*;
  *
  * @since 9.2.1
  */
+@SuppressWarnings({
+       "java:S1192" // Duplicated "value" literals are HTTP header component 
keys; a constant would obscure the header grammar.
+})
 public class WwwAuthenticate extends HttpStringHeader {
 
        /** The header name */
diff --git 
a/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/mock/RemoteCursorBinding_NextGen_Test.java
 
b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/mock/RemoteCursorBinding_NextGen_Test.java
index 8f6b301a55..f21aff0dcb 100644
--- 
a/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/mock/RemoteCursorBinding_NextGen_Test.java
+++ 
b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/mock/RemoteCursorBinding_NextGen_Test.java
@@ -80,6 +80,9 @@ class RemoteCursorBinding_NextGen_Test {
        // 
==========================================================================
 
        @Test
+       @SuppressWarnings({
+               "resource" // Inner client returned by getClient() is owned by 
the MockRestClient, not closed separately.
+       })
        void a01_recordReaderReturnType() throws Exception {
                try (var client = MockRestClient.create(JsonServer.class)) {
                        var api = 
client.getClient().remote(JsonClientApi.class);
@@ -92,6 +95,9 @@ class RemoteCursorBinding_NextGen_Test {
        }
 
        @Test
+       @SuppressWarnings({
+               "resource" // Inner client returned by getClient() is owned by 
the MockRestClient, not closed separately.
+       })
        void a02_tokenReaderReturnType() throws Exception {
                try (var client = MockRestClient.create(JsonServer.class)) {
                        var api = 
client.getClient().remote(JsonClientApi.class);
@@ -104,6 +110,9 @@ class RemoteCursorBinding_NextGen_Test {
        }
 
        @Test
+       @SuppressWarnings({
+               "resource" // Inner client returned by getClient() is owned by 
the MockRestClient, not closed separately.
+       })
        void a03_concreteCursorReturnType() throws Exception {
                try (var client = MockRestClient.create(JsonServer.class)) {
                        var api = 
client.getClient().remote(JsonClientApi.class);
@@ -125,7 +134,7 @@ class RemoteCursorBinding_NextGen_Test {
        void b01_recordStreamBody_record() throws Exception {
                try (var client = MockRestClient.create(JsonServer.class)) {
                        var api = 
client.getClient().remote(JsonClientApi.class);
-                       Bean got = api.echo(RecordStreamBody.record(w -> {
+                       Bean got = api.echo(RecordStreamBody.records(w -> {
                                try {
                                        w.write(new Bean("dave", 99));
                                } catch (IOException e) {
@@ -171,7 +180,7 @@ class RemoteCursorBinding_NextGen_Test {
        })
        void c01_streamBodyEntity_direct() throws Exception {
                try (var client = MockRestClient.create(JsonServer.class)) {
-                       try (var resp = 
client.post("/echo").streamBodyEntity(RecordStreamBody.record(w -> {
+                       try (var resp = 
client.post("/echo").streamBodyEntity(RecordStreamBody.records(w -> {
                                try {
                                        w.write(new Bean("frank", 12));
                                } catch (IOException e) {
diff --git 
a/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/mock/RemoteCursorBinding_Test.java
 
b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/mock/RemoteCursorBinding_Test.java
index 809b0b3cb2..45dd290287 100644
--- 
a/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/mock/RemoteCursorBinding_Test.java
+++ 
b/juneau-rest/juneau-rest-mock/src/test/java/org/apache/juneau/rest/mock/RemoteCursorBinding_Test.java
@@ -166,7 +166,7 @@ class RemoteCursorBinding_Test {
        void b01_recordStreamBody_record() throws Exception {
                try (var client = 
org.apache.juneau.rest.mock.classic.MockRestClient.buildJson(JsonServer.class)) 
{
                        var api = client.getRemote(JsonClientApi.class);
-                       Bean got = api.echo(RecordStreamBody.record(w -> {
+                       Bean got = api.echo(RecordStreamBody.records(w -> {
                                try {
                                        w.write(new Bean("dave", 99));
                                } catch (Exception e) {
diff --git 
a/juneau-rest/juneau-rest-server-auth-saml/src/test/java/org/apache/juneau/rest/server/auth/saml/SamlAssertionValidator_Builder_Test.java
 
b/juneau-rest/juneau-rest-server-auth-saml/src/test/java/org/apache/juneau/rest/server/auth/saml/SamlAssertionValidator_Builder_Test.java
index 4556c6f149..328af829bf 100644
--- 
a/juneau-rest/juneau-rest-server-auth-saml/src/test/java/org/apache/juneau/rest/server/auth/saml/SamlAssertionValidator_Builder_Test.java
+++ 
b/juneau-rest/juneau-rest-server-auth-saml/src/test/java/org/apache/juneau/rest/server/auth/saml/SamlAssertionValidator_Builder_Test.java
@@ -78,13 +78,13 @@ class SamlAssertionValidator_Builder_Test extends TestBase {
                
assertTrue(v.getAlgorithms().contains(SignatureConstants.ALGO_ID_SIGNATURE_ECDSA_SHA256));
        }
 
-       @Test void b01_clockSkew_negativeRejected() throws Exception {
+       @Test void b01_clockSkew_negativeRejected() {
                assertThrows(IllegalArgumentException.class, () -> 
SamlAssertionValidator.create()
                        
.spEntityId("sp").expectedIssuer("idp").signingCredential(dummyCredential())
                        .clockSkew(Duration.ofSeconds(-1)));
        }
 
-       @Test void b02_clockSkew_overFiveMinutesRejected() throws Exception {
+       @Test void b02_clockSkew_overFiveMinutesRejected() {
                assertThrows(IllegalArgumentException.class, () -> 
SamlAssertionValidator.create()
                        
.spEntityId("sp").expectedIssuer("idp").signingCredential(dummyCredential())
                        .clockSkew(Duration.ofMinutes(6)));
@@ -98,13 +98,13 @@ class SamlAssertionValidator_Builder_Test extends TestBase {
                assertEquals(Duration.ofMinutes(5), v.getClockSkew());
        }
 
-       @Test void c01_algorithms_sha1Rejected() throws Exception {
+       @Test void c01_algorithms_sha1Rejected() {
                assertThrows(IllegalArgumentException.class, () -> 
SamlAssertionValidator.create()
                        
.spEntityId("sp").expectedIssuer("idp").signingCredential(dummyCredential())
                        
.algorithms(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA1));
        }
 
-       @Test void c02_algorithms_emptyRejected() throws Exception {
+       @Test void c02_algorithms_emptyRejected() {
                assertThrows(IllegalArgumentException.class, () -> 
SamlAssertionValidator.create()
                        
.spEntityId("sp").expectedIssuer("idp").signingCredential(dummyCredential())
                        .algorithms());
diff --git 
a/juneau-rest/juneau-rest-server-springboot/src/test/java/org/apache/juneau/rest/server/logger/RestLogger_Test.java
 
b/juneau-rest/juneau-rest-server-springboot/src/test/java/org/apache/juneau/rest/server/logger/RestLogger_Test.java
index cfd1e82d80..fd7d866f14 100644
--- 
a/juneau-rest/juneau-rest-server-springboot/src/test/java/org/apache/juneau/rest/server/logger/RestLogger_Test.java
+++ 
b/juneau-rest/juneau-rest-server-springboot/src/test/java/org/apache/juneau/rest/server/logger/RestLogger_Test.java
@@ -35,7 +35,7 @@ class RestLogger_Test extends TestBase {
        // a - CallLoggerRule.matches() with status filters
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void a01_ruleMatchesStatusFilter_ge500() throws Exception {
+       @Test void a01_ruleMatchesStatusFilter_ge500() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .statusFilter(x -> x >= 500)
                        .build();
@@ -45,7 +45,7 @@ class RestLogger_Test extends TestBase {
                assertTrue(rule.matches(req, res));
        }
 
-       @Test void a02_ruleDoesNotMatchStatusFilter_below500() throws Exception 
{
+       @Test void a02_ruleDoesNotMatchStatusFilter_below500() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .statusFilter(x -> x >= 500)
                        .build();
@@ -55,7 +55,7 @@ class RestLogger_Test extends TestBase {
                assertFalse(rule.matches(req, res));
        }
 
-       @Test void a03_ruleMatchesStatusFilter_ge400() throws Exception {
+       @Test void a03_ruleMatchesStatusFilter_ge400() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .statusFilter(x -> x >= 400)
                        .build();
@@ -65,7 +65,7 @@ class RestLogger_Test extends TestBase {
                assertTrue(rule.matches(req, res));
        }
 
-       @Test void a04_ruleNoFilter_matchesEverything() throws Exception {
+       @Test void a04_ruleNoFilter_matchesEverything() {
                var rule = 
CallLoggerRule.create(BasicBeanStore.INSTANCE).build();
                var req = new 
org.springframework.mock.web.MockHttpServletRequest();
                var res = new 
org.springframework.mock.web.MockHttpServletResponse();
@@ -77,7 +77,7 @@ class RestLogger_Test extends TestBase {
        // b - CallLoggerRule.matches() with request filters
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void b01_requestFilter_matches() throws Exception {
+       @Test void b01_requestFilter_matches() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .requestFilter(x -> "GET".equals(x.getMethod()))
                        .build();
@@ -86,7 +86,7 @@ class RestLogger_Test extends TestBase {
                assertTrue(rule.matches(req, res));
        }
 
-       @Test void b02_requestFilter_doesNotMatch() throws Exception {
+       @Test void b02_requestFilter_doesNotMatch() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .requestFilter(x -> "GET".equals(x.getMethod()))
                        .build();
@@ -99,7 +99,7 @@ class RestLogger_Test extends TestBase {
        // c - CallLoggerRule.matches() with response filters
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void c01_responseFilter_matches() throws Exception {
+       @Test void c01_responseFilter_matches() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .responseFilter(x -> x.getStatus() >= 500)
                        .build();
@@ -109,7 +109,7 @@ class RestLogger_Test extends TestBase {
                assertTrue(rule.matches(req, res));
        }
 
-       @Test void c02_responseFilter_doesNotMatch() throws Exception {
+       @Test void c02_responseFilter_doesNotMatch() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .responseFilter(x -> x.getStatus() >= 500)
                        .build();
@@ -123,7 +123,7 @@ class RestLogger_Test extends TestBase {
        // d - CallLoggerRule.matches() with exception filter
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void d01_exceptionFilter_matchesWhenExceptionPresent() throws 
Exception {
+       @Test void d01_exceptionFilter_matchesWhenExceptionPresent() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        
.exceptionFilter(IllegalArgumentException.class::isInstance)
                        .build();
@@ -133,7 +133,7 @@ class RestLogger_Test extends TestBase {
                assertTrue(rule.matches(req, res));
        }
 
-       @Test void d02_exceptionFilter_doesNotMatchWrongType() throws Exception 
{
+       @Test void d02_exceptionFilter_doesNotMatchWrongType() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        
.exceptionFilter(IllegalArgumentException.class::isInstance)
                        .build();
@@ -143,7 +143,7 @@ class RestLogger_Test extends TestBase {
                assertFalse(rule.matches(req, res));
        }
 
-       @Test void d03_exceptionFilter_matchesWhenNoException() throws 
Exception {
+       @Test void d03_exceptionFilter_matchesWhenNoException() {
                // When no exception is present, the exception filter is not 
evaluated; the rule still matches.
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        
.exceptionFilter(IllegalArgumentException.class::isInstance)
@@ -157,7 +157,7 @@ class RestLogger_Test extends TestBase {
        // e - CallLoggerRule.matches() with combined filters
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void e01_combinedFilters_allMatch() throws Exception {
+       @Test void e01_combinedFilters_allMatch() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .statusFilter(x -> x >= 500)
                        .requestFilter(x -> "GET".equals(x.getMethod()))
@@ -168,7 +168,7 @@ class RestLogger_Test extends TestBase {
                assertTrue(rule.matches(req, res));
        }
 
-       @Test void e02_combinedFilters_statusMissesRequestMatches() throws 
Exception {
+       @Test void e02_combinedFilters_statusMissesRequestMatches() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .statusFilter(x -> x >= 500)
                        .requestFilter(x -> "GET".equals(x.getMethod()))
@@ -183,33 +183,33 @@ class RestLogger_Test extends TestBase {
        // f - CallLoggerRule getter methods
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void f01_getLevel() throws Exception {
+       @Test void f01_getLevel() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .level(Level.SEVERE)
                        .build();
                assertEquals(Level.SEVERE, rule.getLevel());
        }
 
-       @Test void f02_getLevel_null() throws Exception {
+       @Test void f02_getLevel_null() {
                var rule = 
CallLoggerRule.create(BasicBeanStore.INSTANCE).build();
                assertNull(rule.getLevel());
        }
 
-       @Test void f03_getRequestDetail() throws Exception {
+       @Test void f03_getRequestDetail() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .requestDetail(CallLoggingDetail.ENTITY)
                        .build();
                assertEquals(CallLoggingDetail.ENTITY, rule.getRequestDetail());
        }
 
-       @Test void f04_getResponseDetail() throws Exception {
+       @Test void f04_getResponseDetail() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .responseDetail(CallLoggingDetail.HEADER)
                        .build();
                assertEquals(CallLoggingDetail.HEADER, 
rule.getResponseDetail());
        }
 
-       @Test void f05_getEnabled() throws Exception {
+       @Test void f05_getEnabled() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .enabled(Enablement.NEVER)
                        .build();
@@ -220,7 +220,7 @@ class RestLogger_Test extends TestBase {
        // g - BasicTestCaptureCallLogger captures log messages
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void g01_captureLogger_logs500() throws Exception {
+       @Test void g01_captureLogger_logs500() {
                var logger = new BasicTestCaptureCallLogger();
                // Simulate a log call directly
                var req = new 
org.springframework.mock.web.MockHttpServletRequest("GET", "/error");
@@ -233,7 +233,7 @@ class RestLogger_Test extends TestBase {
                assertEquals(Level.SEVERE, logger.getLevel());
        }
 
-       @Test void g02_captureLogger_noLog200() throws Exception {
+       @Test void g02_captureLogger_noLog200() {
                var logger = new BasicTestCaptureCallLogger();
                var req = new 
org.springframework.mock.web.MockHttpServletRequest("GET", "/ok");
                var res = new 
org.springframework.mock.web.MockHttpServletResponse();
@@ -243,7 +243,7 @@ class RestLogger_Test extends TestBase {
                assertNull(logger.getMessage());
        }
 
-       @Test void g03_captureLogger_logs400AsWarning() throws Exception {
+       @Test void g03_captureLogger_logs400AsWarning() {
                var logger = new BasicTestCaptureCallLogger();
                var req = new 
org.springframework.mock.web.MockHttpServletRequest("POST", "/bad");
                var res = new 
org.springframework.mock.web.MockHttpServletResponse();
@@ -254,7 +254,7 @@ class RestLogger_Test extends TestBase {
                assertEquals(Level.WARNING, logger.getLevel());
        }
 
-       @Test void g04_captureLogger_reset() throws Exception {
+       @Test void g04_captureLogger_reset() {
                var logger = new BasicTestCaptureCallLogger();
                var req = new 
org.springframework.mock.web.MockHttpServletRequest("GET", "/error");
                var res = new 
org.springframework.mock.web.MockHttpServletResponse();
@@ -265,7 +265,7 @@ class RestLogger_Test extends TestBase {
                assertNull(logger.getMessage());
        }
 
-       @Test void g05_captureLogger_getMessageAndReset() throws Exception {
+       @Test void g05_captureLogger_getMessageAndReset() {
                var logger = new BasicTestCaptureCallLogger();
                var req = new 
org.springframework.mock.web.MockHttpServletRequest("GET", "/error");
                var res = new 
org.springframework.mock.web.MockHttpServletResponse();
@@ -281,7 +281,7 @@ class RestLogger_Test extends TestBase {
        // h - BasicDisabledCallLogger never logs
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void h01_disabledLogger_neverLogs() throws Exception {
+       @Test void h01_disabledLogger_neverLogs() {
                var logger = new 
BasicDisabledCallLogger(BasicBeanStore.INSTANCE);
                var req = new 
org.springframework.mock.web.MockHttpServletRequest("GET", "/error");
                var res = new 
org.springframework.mock.web.MockHttpServletResponse();
@@ -296,23 +296,23 @@ class RestLogger_Test extends TestBase {
        // i - CallLoggingDetail.fromString
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void i01_fromString_statusLine() throws Exception {
+       @Test void i01_fromString_statusLine() {
                assertEquals(CallLoggingDetail.STATUS_LINE, 
CallLoggingDetail.fromString("STATUS_LINE"));
        }
 
-       @Test void i02_fromString_caseInsensitive() throws Exception {
+       @Test void i02_fromString_caseInsensitive() {
                assertEquals(CallLoggingDetail.HEADER, 
CallLoggingDetail.fromString("header"));
        }
 
-       @Test void i03_fromString_null() throws Exception {
+       @Test void i03_fromString_null() {
                assertNull(CallLoggingDetail.fromString(null));
        }
 
-       @Test void i04_fromString_invalid() throws Exception {
+       @Test void i04_fromString_invalid() {
                assertNull(CallLoggingDetail.fromString("INVALID"));
        }
 
-       @Test void i05_fromString_entity() throws Exception {
+       @Test void i05_fromString_entity() {
                assertEquals(CallLoggingDetail.ENTITY, 
CallLoggingDetail.fromString("ENTITY"));
        }
 
@@ -320,7 +320,7 @@ class RestLogger_Test extends TestBase {
        // j - CallLoggerRule.toString and CallLogger.toString
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void j01_ruleToString_includesLevel() throws Exception {
+       @Test void j01_ruleToString_includesLevel() {
                var rule = CallLoggerRule.create(BasicBeanStore.INSTANCE)
                        .level(Level.WARNING)
                        .requestDetail(CallLoggingDetail.HEADER)
@@ -330,7 +330,7 @@ class RestLogger_Test extends TestBase {
                assertTrue(s.contains("WARNING"));
        }
 
-       @Test void j02_loggerToString_includesEnabled() throws Exception {
+       @Test void j02_loggerToString_includesEnabled() {
                var logger = CallLogger.create(BasicBeanStore.INSTANCE).build();
                var s = logger.toString();
                assertNotNull(s);
@@ -341,11 +341,11 @@ class RestLogger_Test extends TestBase {
        // k - CallLoggingDetail.isOneOf
        
//-----------------------------------------------------------------------------------------------------------------
 
-       @Test void k01_isOneOf_matches() throws Exception {
+       @Test void k01_isOneOf_matches() {
                
assertTrue(CallLoggingDetail.HEADER.isOneOf(CallLoggingDetail.STATUS_LINE, 
CallLoggingDetail.HEADER));
        }
 
-       @Test void k02_isOneOf_noMatch() throws Exception {
+       @Test void k02_isOneOf_noMatch() {
                
assertFalse(CallLoggingDetail.ENTITY.isOneOf(CallLoggingDetail.STATUS_LINE, 
CallLoggingDetail.HEADER));
        }
 }
diff --git 
a/juneau-rest/juneau-rest-server-view-thymeleaf/src/test/resources/templates/about.html
 
b/juneau-rest/juneau-rest-server-view-thymeleaf/src/test/resources/templates/about.html
index 9ea219bc3d..d9749ee33d 100644
--- 
a/juneau-rest/juneau-rest-server-view-thymeleaf/src/test/resources/templates/about.html
+++ 
b/juneau-rest/juneau-rest-server-view-thymeleaf/src/test/resources/templates/about.html
@@ -15,7 +15,7 @@
   limitations under the License.
 -->
 <!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org";>
+<html lang="en" xmlns:th="http://www.thymeleaf.org";>
 <head><title>About Juneau</title></head>
 <body>
 <h1>About Juneau</h1>
diff --git 
a/juneau-rest/juneau-rest-server-view-thymeleaf/src/test/resources/templates/hello.html
 
b/juneau-rest/juneau-rest-server-view-thymeleaf/src/test/resources/templates/hello.html
index cfe2f660ad..64ff62c0b8 100644
--- 
a/juneau-rest/juneau-rest-server-view-thymeleaf/src/test/resources/templates/hello.html
+++ 
b/juneau-rest/juneau-rest-server-view-thymeleaf/src/test/resources/templates/hello.html
@@ -15,7 +15,7 @@
   limitations under the License.
 -->
 <!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org";>
+<html lang="en" xmlns:th="http://www.thymeleaf.org";>
 <head><title>Hello</title></head>
 <body>
 <p>Hello, <span th:text="${name}">World</span>!</p>
diff --git 
a/juneau-rest/juneau-rest-server-view-thymeleaf/src/test/resources/templates/nested/inner.html
 
b/juneau-rest/juneau-rest-server-view-thymeleaf/src/test/resources/templates/nested/inner.html
index 5a3bb5996f..da754dec07 100644
--- 
a/juneau-rest/juneau-rest-server-view-thymeleaf/src/test/resources/templates/nested/inner.html
+++ 
b/juneau-rest/juneau-rest-server-view-thymeleaf/src/test/resources/templates/nested/inner.html
@@ -15,7 +15,7 @@
   limitations under the License.
 -->
 <!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org";>
+<html lang="en" xmlns:th="http://www.thymeleaf.org";>
 <head><title>Inner</title></head>
 <body>
 <p>inner template</p>
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/arg/RecordReaderArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/arg/RecordReaderArg.java
index fb807d00af..2f86179abe 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/arg/RecordReaderArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/arg/RecordReaderArg.java
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.rest.server.arg;
 
+import java.io.*;
+
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.http.response.*;
 import org.apache.juneau.marshall.parser.*;
@@ -90,7 +92,7 @@ public class RecordReaderArg extends SimpleRestOperationArg {
                this.declaredType = declaredType;
        }
 
-       private static Object resolve(RestOpSession opSession, Class<?> 
declaredType) throws Exception {
+       private static Object resolve(RestOpSession opSession, Class<?> 
declaredType) throws IOException, ParseException {
                var req = opSession.getRequest();
                var content = req.getContent();
                var match = content.getParserMatch();
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/arg/TokenReaderArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/arg/TokenReaderArg.java
index 200cf9e3ee..897a3222cd 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/arg/TokenReaderArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/arg/TokenReaderArg.java
@@ -16,6 +16,8 @@
  */
 package org.apache.juneau.rest.server.arg;
 
+import java.io.*;
+
 import org.apache.juneau.commons.reflect.*;
 import org.apache.juneau.http.response.*;
 import org.apache.juneau.marshall.parser.*;
@@ -92,7 +94,7 @@ public class TokenReaderArg extends SimpleRestOperationArg {
                this.declaredType = declaredType;
        }
 
-       private static Object resolve(RestOpSession opSession, Class<?> 
declaredType) throws Exception {
+       private static Object resolve(RestOpSession opSession, Class<?> 
declaredType) throws IOException, ParseException {
                var req = opSession.getRequest();
                var content = req.getContent();
                var match = content.getParserMatch();
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/health/ReadinessState.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/health/ReadinessState.java
index 8a22839818..73d73f3741 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/health/ReadinessState.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/health/ReadinessState.java
@@ -86,7 +86,9 @@ public final class ReadinessState {
         * <p>
         * The new state starts {@link #isReady() ready}.
         */
-       public ReadinessState() {}
+       public ReadinessState() {
+               // Intentionally empty — the volatile `ready` field defaults to 
true.
+       }
 
        /**
         * Returns whether this service is currently ready to receive traffic.

Reply via email to