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 0b58856  Context API refactoring.
0b58856 is described below

commit 0b58856be24c75b23e6f4961758d37e9bbac2aa4
Author: JamesBognar <james.bog...@salesforce.com>
AuthorDate: Tue Sep 28 11:45:39 2021 -0400

    Context API refactoring.
---
 .../main/java/org/apache/juneau/UriContext.java    |  17 +
 .../apache/juneau/html/annotation/HtmlConfig.java  |   2 +-
 .../apache/juneau/json/annotation/JsonConfig.java  |   2 +-
 .../juneau/msgpack/annotation/MsgPackConfig.java   |   2 +-
 .../org/apache/juneau/serializer/Serializer.java   | 433 +++------------------
 .../juneau/serializer/SerializerBuilder.java       | 213 +++++++---
 .../juneau/serializer/SerializerSession.java       |  30 +-
 .../juneau/serializer/SerializerSessionArgs.java   |   7 +-
 .../apache/juneau/serializer/SerializerWriter.java |   4 +-
 .../serializer/annotation/SerializerConfig.java    |  34 +-
 .../annotation/SerializerConfigAnnotation.java     |  35 +-
 .../apache/juneau/uon/annotation/UonConfig.java    |   2 +-
 .../apache/juneau/xml/annotation/XmlConfig.java    |   2 +-
 .../juneau/rest/client/RestClientBuilder.java      |  22 +-
 .../org/apache/juneau/rest/RestContextBuilder.java |   5 +-
 .../juneau/SerializerPropertiesComboTest.java      |  23 +-
 16 files changed, 307 insertions(+), 526 deletions(-)

diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/UriContext.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/UriContext.java
index c18d3a0..beb59ec 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/UriContext.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/UriContext.java
@@ -12,6 +12,7 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau;
 
+import static org.apache.juneau.internal.ExceptionUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
 
 import org.apache.juneau.annotation.*;
@@ -69,6 +70,22 @@ public class UriContext {
        }
 
        /**
+        * Static creator.
+        *
+        * @param s
+        *      The input string.
+        *      <br>Example: 
<js>{authority:'http://localhost:10000',contextRoot:'/myContext',servletPath:'/myServlet',pathInfo:'/foo'}</js>
+        * @return A new {@link UriContext} object.
+        */
+       public static UriContext of(String s) {
+               try {
+                       return new UriContext(s);
+               } catch (ParseException e) {
+                       throw runtimeException(e);
+               }
+       }
+
+       /**
         * Constructor.
         *
         * <p>
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlConfig.java
index e2c69ec..709fdcd 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlConfig.java
@@ -58,7 +58,7 @@ public @interface HtmlConfig {
         * through reflection.
         *
         * <p>
-        * When present, this value overrides the {@link 
Serializer#SERIALIZER_addBeanTypes} setting and is
+        * When present, this value overrides the {@link 
SerializerBuilder#addBeanTypes()} setting and is
         * provided to customize the behavior of specific serializers in a 
{@link SerializerGroup}.
         *
         * <ul class='notes'>
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/annotation/JsonConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/annotation/JsonConfig.java
index 0e1a93b..515f250 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/annotation/JsonConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/annotation/JsonConfig.java
@@ -86,7 +86,7 @@ public @interface JsonConfig {
         * through reflection.
         *
         * <p>
-        * When present, this value overrides the {@link 
Serializer#SERIALIZER_addBeanTypes} setting and is
+        * When present, this value overrides the {@link 
SerializerBuilder#addBeanTypes()} setting and is
         * provided to customize the behavior of specific serializers in a 
{@link SerializerGroup}.
         *
         * <ul class='notes'>
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/annotation/MsgPackConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/annotation/MsgPackConfig.java
index 04ef640..229aea5 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/annotation/MsgPackConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/annotation/MsgPackConfig.java
@@ -58,7 +58,7 @@ public @interface MsgPackConfig {
         * through reflection.
         *
         * <p>
-        * When present, this value overrides the {@link 
Serializer#SERIALIZER_addBeanTypes} setting and is
+        * When present, this value overrides the {@link 
SerializerBuilder#addBeanTypes()} setting and is
         * provided to customize the behavior of specific serializers in a 
{@link SerializerGroup}.
         *
         * <ul class='notes'>
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java
index 3e1bef2..a42ffc0 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/Serializer.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.serializer;
 
+import static java.util.Optional.*;
+
 import java.io.*;
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
@@ -42,6 +44,10 @@ import org.apache.juneau.internal.*;
 @ConfigurableContext
 public abstract class Serializer extends BeanTraverseContext {
 
+       
//-------------------------------------------------------------------------------------------------------------------
+       // Static
+       
//-------------------------------------------------------------------------------------------------------------------
+
        /**
         * Represents no Serializer.
         */
@@ -66,349 +72,11 @@ public abstract class Serializer extends 
BeanTraverseContext {
        }
 
        
//-------------------------------------------------------------------------------------------------------------------
-       // Configurable properties
-       
//-------------------------------------------------------------------------------------------------------------------
-
-       static final String PREFIX = "Serializer";
-
-       /**
-        * Configuration property:  Add <js>"_type"</js> properties when needed.
-        *
-        * <p>
-        * When enabled, then <js>"_type"</js> properties will be added to 
beans if their type cannot be inferred
-        * through reflection.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.serializer.Serializer#SERIALIZER_addBeanTypes 
SERIALIZER_addBeanTypes}
-        *      <li><b>Name:</b>  <js>"Serializer.addBeanTypes.b"</js>
-        *      <li><b>Data type:</b>  <jk>boolean</jk>
-        *      <li><b>System property:</b>  <c>Serializer.addBeanTypes</c>
-        *      <li><b>Environment variable:</b>  <c>SERIALIZER_ADDBEANTYPES</c>
-        *      <li><b>Default:</b>  <jk>false</jk>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.serializer.annotation.SerializerConfig#addBeanTypes()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.serializer.SerializerBuilder#addBeanTypes()}
-        *              </ul>
-        * </ul>
-        */
-       public static final String SERIALIZER_addBeanTypes = PREFIX + 
".addBeanTypes.b";
-
-       /**
-        * Configuration property:  Add type attribute to root nodes.
-        *
-        * <p>
-        * When enabled, <js>"_type"</js> properties will be added to top-level 
beans.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.serializer.Serializer#SERIALIZER_addRootType 
SERIALIZER_addRootType}
-        *      <li><b>Name:</b>  <js>"Serializer.addRootType.b"</js>
-        *      <li><b>Data type:</b>  <jk>boolean</jk>
-        *      <li><b>System property:</b>  <c>Serializer.addRootType</c>
-        *      <li><b>Environment variable:</b>  <c>SERIALIZER_ADDROOTTYPE</c>
-        *      <li><b>Default:</b>  <jk>false</jk>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.serializer.annotation.SerializerConfig#addRootType()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.serializer.SerializerBuilder#addRootType()}
-        *              </ul>
-        * </ul>
-        */
-       public static final String SERIALIZER_addRootType = PREFIX + 
".addRootType.b";
-
-       /**
-        * Configuration property:  Serializer listener.
-        *
-        * <p>
-        * Class used to listen for errors and warnings that occur during 
serialization.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.serializer.Serializer#SERIALIZER_listener SERIALIZER_listener}
-        *      <li><b>Name:</b>  <js>"Serializer.listener.c"</js>
-        *      <li><b>Data type:</b>  <c>Class&lt;{@link 
org.apache.juneau.serializer.SerializerListener}&gt;</c>
-        *      <li><b>Default:</b>  <jk>null</jk>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.serializer.annotation.SerializerConfig#listener()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.serializer.SerializerBuilder#listener(Class)}
-        *              </ul>
-        * </ul>
-        */
-       public static final String SERIALIZER_listener = PREFIX + ".listener.c";
-
-       /**
-        * Configuration property:  Don't trim null bean property values.
-        *
-        * <p>
-        * When enabled, null bean values will be serialized to the output.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.serializer.Serializer#SERIALIZER_keepNullProperties 
SERIALIZER_keepNullProperties}
-        *      <li><b>Name:</b>  <js>"Serializer.keepNullProperties.b"</js>
-        *      <li><b>Data type:</b>  <jk>boolean</jk>
-        *      <li><b>System property:</b>  
<c>Serializer.keepNullProperties</c>
-        *      <li><b>Environment variable:</b>  
<c>SERIALIZER_KEEPNULLPROPERTIES</c>
-        *      <li><b>Default:</b>  <jk>false</jk>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.serializer.annotation.SerializerConfig#keepNullProperties()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.serializer.SerializerBuilder#keepNullProperties()}
-        *              </ul>
-        * </ul>
-        */
-       public static final String SERIALIZER_keepNullProperties = PREFIX + 
".keepNullProperties.b";
-
-       /**
-        * Configuration property:  Sort arrays and collections alphabetically.
-        *
-        * <p>
-        * When enabled, copies and sorts the contents of arrays and 
collections before serializing them.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.serializer.Serializer#SERIALIZER_sortCollections 
SERIALIZER_sortCollections}
-        *      <li><b>Name:</b>  <js>"Serializer.sortCollections.b"</js>
-        *      <li><b>Data type:</b>  <jk>boolean</jk>
-        *      <li><b>System property:</b>  <c>Serializer.sortCollections</c>
-        *      <li><b>Environment variable:</b>  
<c>SERIALIZER_SORTCOLLECTIONS</c>
-        *      <li><b>Default:</b>  <jk>false</jk>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.serializer.annotation.SerializerConfig#sortCollections()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.serializer.SerializerBuilder#sortCollections()}
-        *              </ul>
-        * </ul>
-        */
-       public static final String SERIALIZER_sortCollections = PREFIX + 
".sortCollections.b";
-
-       /**
-        * Configuration property:  Sort maps alphabetically.
-        *
-        * <p>
-        * When enabled, copies and sorts the contents of maps by their keys 
before serializing them.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.serializer.Serializer#SERIALIZER_sortMaps SERIALIZER_sortMaps}
-        *      <li><b>Name:</b>  <js>"Serializer.sortMaps.b"</js>
-        *      <li><b>Data type:</b>  <jk>boolean</jk>
-        *      <li><b>System property:</b>  <c>Serializer.sortMaps</c>
-        *      <li><b>Environment variable:</b>  <c>SERIALIZER_SORTMAPS</c>
-        *      <li><b>Default:</b>  <jk>false</jk>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.serializer.annotation.SerializerConfig#sortMaps()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.serializer.SerializerBuilder#sortMaps()}
-        *              </ul>
-        * </ul>
-        */
-       public static final String SERIALIZER_sortMaps = PREFIX + ".sortMaps.b";
-
-       /**
-        * Configuration property:  Trim empty lists and arrays.
-        *
-        * <p>
-        * When enabled, empty lists and arrays will not be serialized.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyCollections 
SERIALIZER_trimEmptyCollections}
-        *      <li><b>Name:</b>  <js>"Serializer.trimEmptyCollections.b"</js>
-        *      <li><b>Data type:</b>  <jk>boolean</jk>
-        *      <li><b>System property:</b>  
<c>Serializer.trimEmptyCollections</c>
-        *      <li><b>Environment variable:</b>  
<c>SERIALIZER_TRIMEMPTYCOLLECTIONS</c>
-        *      <li><b>Default:</b>  <jk>false</jk>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.serializer.annotation.SerializerConfig#trimEmptyCollections()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.serializer.SerializerBuilder#trimEmptyCollections()}
-        *              </ul>
-        * </ul>
-        */
-       public static final String SERIALIZER_trimEmptyCollections = PREFIX + 
".trimEmptyCollections.b";
-
-       /**
-        * Configuration property:  Trim empty maps.
-        *
-        * <p>
-        * When enabled, empty map values will not be serialized to the output.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyMaps 
SERIALIZER_trimEmptyMaps}
-        *      <li><b>Name:</b>  <js>"Serializer.trimEmptyMaps.b"</js>
-        *      <li><b>Data type:</b>  <jk>boolean</jk>
-        *      <li><b>System property:</b>  <c>Serializer.trimEmptyMaps</c>
-        *      <li><b>Environment variable:</b>  
<c>SERIALIZER_TRIMEMPTYMAPS</c>
-        *      <li><b>Default:</b>  <jk>false</jk>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.serializer.annotation.SerializerConfig#trimEmptyMaps()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.serializer.SerializerBuilder#trimEmptyMaps()}
-        *              </ul>
-        * </ul>
-        */
-       public static final String SERIALIZER_trimEmptyMaps = PREFIX + 
".trimEmptyMaps.b";
-
-       /**
-        * Configuration property:  Trim strings.
-        *
-        * <p>
-        * When enabled, string values will be trimmed of whitespace using 
{@link String#trim()} before being serialized.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.serializer.Serializer#SERIALIZER_trimStrings 
SERIALIZER_trimStrings}
-        *      <li><b>Name:</b>  <js>"Serializer.trimStrings.b"</js>
-        *      <li><b>Data type:</b>  <jk>boolean</jk>
-        *      <li><b>System property:</b>  <c>Serializer.trimStrings</c>
-        *      <li><b>Environment variable:</b>  <c>SERIALIZER_TRIMSTRINGS</c>
-        *      <li><b>Default:</b>  <jk>false</jk>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.serializer.annotation.SerializerConfig#trimStrings()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.serializer.SerializerBuilder#trimStrings()}
-        *              </ul>
-        * </ul>
-        */
-       public static final String SERIALIZER_trimStrings = PREFIX + 
".trimStrings.b";
-
-       /**
-        * Configuration property:  URI context bean.
-        *
-        * <p>
-        * Bean used for resolution of URIs to absolute or root-relative form.
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.serializer.Serializer#SERIALIZER_uriContext 
SERIALIZER_uriContext}
-        *      <li><b>Name:</b>  <js>"Serializer.uriContext.s"</js>
-        *      <li><b>Data type:</b>  {@link org.apache.juneau.UriContext}
-        *      <li><b>System property:</b>  <c>Serializer.uriContext</c>
-        *      <li><b>Environment variable:</b>  <c>SERIALIZER_URICONTEXT</c>
-        *      <li><b>Default:</b>  <js>"{}"</js>
-        *      <li><b>Session property:</b>  <jk>true</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.serializer.annotation.SerializerConfig#uriContext()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.serializer.SerializerBuilder#uriContext(UriContext)}
-        *              </ul>
-        * </ul>
-        */
-       public static final String SERIALIZER_uriContext = PREFIX + 
".uriContext.s";
-
-       /**
-        * Configuration property:  URI relativity.
-        *
-        * <p>
-        * Defines what relative URIs are relative to when serializing any of 
the following:
-        * <ul>
-        *      <li>{@link java.net.URI}
-        *      <li>{@link java.net.URL}
-        *      <li>Properties and classes annotated with {@link Uri @Uri}
-        * </ul>
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.serializer.Serializer#SERIALIZER_uriRelativity 
SERIALIZER_uriRelativity}
-        *      <li><b>Name:</b>  <js>"Serializer.uriRelativity.s"</js>
-        *      <li><b>Data type:</b>  {@link org.apache.juneau.UriRelativity}
-        *      <li><b>System property:</b>  <c>Serializer.uriRelativity</c>
-        *      <li><b>Environment variable:</b>  
<c>SERIALIZER_URIRELATIVITY</c>
-        *      <li><b>Default:</b>  <js>"RESOURCE"</js>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.serializer.annotation.SerializerConfig#uriRelativity()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.serializer.SerializerBuilder#uriRelativity(UriRelativity)}
-        *              </ul>
-        * </ul>
-        */
-       public static final String SERIALIZER_uriRelativity = PREFIX + 
".uriRelativity.s";
-
-       /**
-        * Configuration property:  URI resolution.
-        *
-        * <p>
-        * Defines the resolution level for URIs when serializing any of the 
following:
-        * <ul>
-        *      <li>{@link java.net.URI}
-        *      <li>{@link java.net.URL}
-        *      <li>Properties and classes annotated with {@link Uri @Uri}
-        * </ul>
-        *
-        * <h5 class='section'>Property:</h5>
-        * <ul class='spaced-list'>
-        *      <li><b>ID:</b>  {@link 
org.apache.juneau.serializer.Serializer#SERIALIZER_uriResolution 
SERIALIZER_uriResolution}
-        *      <li><b>Name:</b>  <js>"Serializer.uriResolution.s"</js>
-        *      <li><b>Data type:</b>  {@link org.apache.juneau.UriResolution}
-        *      <li><b>System property:</b>  <c>Serializer.uriResolution</c>
-        *      <li><b>Environment variable:</b>  
<c>SERIALIZER_URIRESOLUTION</c>
-        *      <li><b>Default:</b>  <js>"NONE"</js>
-        *      <li><b>Session property:</b>  <jk>false</jk>
-        *      <li><b>Annotations:</b>
-        *              <ul>
-        *                      <li class='ja'>{@link 
org.apache.juneau.serializer.annotation.SerializerConfig#uriResolution()}
-        *              </ul>
-        *      <li><b>Methods:</b>
-        *              <ul>
-        *                      <li class='jm'>{@link 
org.apache.juneau.serializer.SerializerBuilder#uriResolution(UriResolution)}
-        *              </ul>
-        * </ul>
-        */
-       public static final String SERIALIZER_uriResolution = PREFIX + 
".uriResolution.s";
-
-       
//-------------------------------------------------------------------------------------------------------------------
        // Instance
        
//-------------------------------------------------------------------------------------------------------------------
 
-       private final boolean
+       final String produces, accept;
+       final boolean
                addBeanTypes,
                keepNullProperties,
                trimEmptyCollections,
@@ -417,16 +85,14 @@ public abstract class Serializer extends 
BeanTraverseContext {
                sortCollections,
                sortMaps,
                addRootType;
-       private final UriContext uriContext;
-       private final UriResolution uriResolution;
-       private final UriRelativity uriRelativity;
-       private final Class<? extends SerializerListener> listener;
-
-       private final MediaRanges accept;
-       private final MediaType[] accepts;
-       private final MediaType produces;
+       final UriContext uriContext;
+       final UriResolution uriResolution;
+       final UriRelativity uriRelativity;
+       final Class<? extends SerializerListener> listener;
 
-       final String _produces, _accept;
+       private final MediaRanges acceptRanges;
+       private final MediaType[] acceptMediaTypes;
+       private final MediaType producesMediaType;
 
        /**
         * Constructor
@@ -436,25 +102,24 @@ public abstract class Serializer extends 
BeanTraverseContext {
        protected Serializer(SerializerBuilder builder) {
                super(builder);
 
-               _produces = builder.produces;
-               _accept = builder.accept;
-               ContextProperties cp = getContextProperties();
-               addBeanTypes = 
cp.getBoolean(SERIALIZER_addBeanTypes).orElse(false);
-               keepNullProperties = 
cp.getBoolean(SERIALIZER_keepNullProperties).orElse(false);
-               trimEmptyCollections = 
cp.getBoolean(SERIALIZER_trimEmptyCollections).orElse(false);
-               trimEmptyMaps = 
cp.getBoolean(SERIALIZER_trimEmptyMaps).orElse(false);
-               trimStrings = 
cp.getBoolean(SERIALIZER_trimStrings).orElse(false);
-               sortCollections = 
cp.getBoolean(SERIALIZER_sortCollections).orElse(false);
-               sortMaps = cp.getBoolean(SERIALIZER_sortMaps).orElse(false);
-               addRootType = 
cp.getBoolean(SERIALIZER_addRootType).orElse(false);
-               uriContext = cp.get(SERIALIZER_uriContext, 
UriContext.class).orElse(UriContext.DEFAULT);
-               uriResolution = cp.get(SERIALIZER_uriResolution, 
UriResolution.class).orElse(UriResolution.NONE);
-               uriRelativity = cp.get(SERIALIZER_uriRelativity, 
UriRelativity.class).orElse(UriRelativity.RESOURCE);
-               listener = cp.getClass(SERIALIZER_listener, 
SerializerListener.class).orElse(null);
-
-               this.produces = MediaType.of(builder.produces);
-               this.accept = builder.accept == null ? 
MediaRanges.of(builder.produces) : MediaRanges.of(builder.accept);
-               this.accepts = builder.accept == null ? new MediaType[] 
{this.produces} : MediaType.ofAll(StringUtils.split(builder.accept, ','));
+               produces = builder.produces;
+               accept = builder.accept;
+               addBeanTypes = builder.addBeanTypes;
+               keepNullProperties = builder.keepNullProperties;
+               trimEmptyCollections = builder.trimEmptyCollections;
+               trimEmptyMaps = builder.trimEmptyMaps;
+               trimStrings = builder.trimStrings;
+               sortCollections = builder.sortCollections;
+               sortMaps = builder.sortMaps;
+               addRootType = builder.addRootType;
+               uriContext = builder.uriContext;
+               uriResolution = builder.uriResolution;
+               uriRelativity = builder.uriRelativity;
+               listener = builder.listener;
+
+               this.producesMediaType = MediaType.of(produces);
+               this.acceptRanges = 
ofNullable(accept).map(MediaRanges::of).orElseGet(()->MediaRanges.of(produces));
+               this.acceptMediaTypes = ofNullable(builder.accept).map(x -> 
StringUtils.split(x, ',')).map(MediaType::ofAll).orElseGet(()->new MediaType[] 
{this.producesMediaType});
        }
 
        @Override
@@ -573,7 +238,7 @@ public abstract class Serializer extends 
BeanTraverseContext {
         * @return The list of media types.  Never <jk>null</jk>.
         */
        public final MediaRanges getMediaTypeRanges() {
-               return accept;
+               return acceptRanges;
        }
 
        /**
@@ -585,7 +250,7 @@ public abstract class Serializer extends 
BeanTraverseContext {
         * @return The media type.  Never <jk>null</jk>.
         */
        public final MediaType getPrimaryMediaType() {
-               return accepts[0];
+               return acceptMediaTypes[0];
        }
 
        /**
@@ -597,7 +262,7 @@ public abstract class Serializer extends 
BeanTraverseContext {
         * @return The list of media types.  Never <jk>null</jk>.
         */
        public final MediaType[] getAcceptMediaTypes() {
-               return accepts;
+               return acceptMediaTypes;
        }
 
        /**
@@ -617,7 +282,7 @@ public abstract class Serializer extends 
BeanTraverseContext {
         * @return The response content type.  If <jk>null</jk>, then the 
matched media type is used.
         */
        public final MediaType getResponseContentType() {
-               return produces;
+               return producesMediaType;
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
@@ -627,7 +292,7 @@ public abstract class Serializer extends 
BeanTraverseContext {
        /**
         * Add <js>"_type"</js> properties when needed.
         *
-        * @see #SERIALIZER_addBeanTypes
+        * @see SerializerBuilder#addBeanTypes()
         * @return
         *      <jk>true</jk> if <js>"_type"</js> properties added to beans if 
their type cannot be inferred
         *      through reflection.
@@ -639,7 +304,7 @@ public abstract class Serializer extends 
BeanTraverseContext {
        /**
         * Add type attribute to root nodes.
         *
-        * @see #SERIALIZER_addRootType
+        * @see SerializerBuilder#addRootType()
         * @return
         *      <jk>true</jk> if type property should be added to root node.
         */
@@ -650,7 +315,7 @@ public abstract class Serializer extends 
BeanTraverseContext {
        /**
         * Serializer listener.
         *
-        * @see #SERIALIZER_listener
+        * @see SerializerBuilder#listener(Class)
         * @return
         *      Class used to listen for errors and warnings that occur during 
serialization.
         */
@@ -661,7 +326,7 @@ public abstract class Serializer extends 
BeanTraverseContext {
        /**
         * Sort arrays and collections alphabetically.
         *
-        * @see #SERIALIZER_sortCollections
+        * @see SerializerBuilder#sortCollections()
         * @return
         *      <jk>true</jk> if arrays and collections are copied and sorted 
before serialization.
         */
@@ -672,7 +337,7 @@ public abstract class Serializer extends 
BeanTraverseContext {
        /**
         * Sort maps alphabetically.
         *
-        * @see #SERIALIZER_sortMaps
+        * @see SerializerBuilder#sortMaps()
         * @return
         *      <jk>true</jk> if maps are copied and sorted before 
serialization.
         */
@@ -683,7 +348,7 @@ public abstract class Serializer extends 
BeanTraverseContext {
        /**
         * Trim empty lists and arrays.
         *
-        * @see #SERIALIZER_trimEmptyCollections
+        * @see SerializerBuilder#trimEmptyCollections()
         * @return
         *      <jk>true</jk> if empty lists and arrays are not serialized to 
the output.
         */
@@ -694,7 +359,7 @@ public abstract class Serializer extends 
BeanTraverseContext {
        /**
         * Trim empty maps.
         *
-        * @see #SERIALIZER_trimEmptyMaps
+        * @see SerializerBuilder#trimEmptyMaps()
         * @return
         *      <jk>true</jk> if empty map values are not serialized to the 
output.
         */
@@ -705,7 +370,7 @@ public abstract class Serializer extends 
BeanTraverseContext {
        /**
         * Don't trim null bean property values.
         *
-        * @see #SERIALIZER_keepNullProperties
+        * @see SerializerBuilder#keepNullProperties()
         * @return
         *      <jk>true</jk> if null bean values are serialized to the output.
         */
@@ -716,7 +381,7 @@ public abstract class Serializer extends 
BeanTraverseContext {
        /**
         * Trim strings.
         *
-        * @see #SERIALIZER_trimStrings
+        * @see SerializerBuilder#trimStrings()
         * @return
         *      <jk>true</jk> if string values will be trimmed of whitespace 
using {@link String#trim()} before being serialized.
         */
@@ -727,7 +392,7 @@ public abstract class Serializer extends 
BeanTraverseContext {
        /**
         * URI context bean.
         *
-        * @see #SERIALIZER_uriContext
+        * @see SerializerBuilder#uriContext(UriContext)
         * @return
         *      Bean used for resolution of URIs to absolute or root-relative 
form.
         */
@@ -738,7 +403,7 @@ public abstract class Serializer extends 
BeanTraverseContext {
        /**
         * URI relativity.
         *
-        * @see #SERIALIZER_uriRelativity
+        * @see SerializerBuilder#uriRelativity(UriRelativity)
         * @return
         *      Defines what relative URIs are relative to when serializing any 
of the following:
         */
@@ -749,7 +414,7 @@ public abstract class Serializer extends 
BeanTraverseContext {
        /**
         * URI resolution.
         *
-        * @see #SERIALIZER_uriResolution
+        * @see SerializerBuilder#uriResolution(UriResolution)
         * @return
         *      Defines the resolution level for URIs when serializing URIs.
         */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
index a3cde89..80ca7f1 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerBuilder.java
@@ -12,8 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.serializer;
 
-import static org.apache.juneau.serializer.Serializer.*;
-
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.util.*;
@@ -30,13 +28,33 @@ import org.apache.juneau.internal.*;
 @FluentSetters
 public abstract class SerializerBuilder extends BeanTraverseBuilder {
 
+       boolean addBeanTypes, addRootType, keepNullProperties, sortCollections, 
sortMaps, trimEmptyCollections,
+               trimEmptyMaps, trimStrings;
        String produces, accept;
+       UriContext uriContext;
+       UriRelativity uriRelativity;
+       UriResolution uriResolution;
+       Class<? extends SerializerListener> listener;
 
        /**
         * Constructor, default settings.
         */
        protected SerializerBuilder() {
                super();
+               produces = null;
+               accept = null;
+               addBeanTypes = env("Serializer.addBeanTypes", false);
+               addRootType = env("Serializer.addRootType", false);
+               keepNullProperties = env("Serializer.keepNullProperties", 
false);
+               sortCollections = env("Serializer.sortCollections", false);
+               sortMaps = env("Serializer.sortMaps", false);
+               trimEmptyCollections = env("Serializer.trimEmptyCollections", 
false);
+               trimEmptyMaps = env("Serializer.trimEmptyMaps", false);
+               trimStrings = env("Serializer.trimStrings", false);
+               uriContext = UriContext.DEFAULT;
+               uriRelativity = UriRelativity.RESOURCE;
+               uriResolution = UriResolution.NONE;
+               listener = null;
        }
 
        /**
@@ -46,8 +64,20 @@ public abstract class SerializerBuilder extends 
BeanTraverseBuilder {
         */
        protected SerializerBuilder(Serializer copyFrom) {
                super(copyFrom);
-               produces = copyFrom._produces;
-               accept = copyFrom._accept;
+               produces = copyFrom.produces;
+               accept = copyFrom.accept;
+               addBeanTypes = copyFrom.addBeanTypes;
+               addRootType = copyFrom.addRootType;
+               keepNullProperties = copyFrom.keepNullProperties;
+               sortCollections = copyFrom.sortCollections;
+               sortMaps = copyFrom.sortMaps;
+               trimEmptyCollections = copyFrom.trimEmptyCollections;
+               trimEmptyMaps = copyFrom.trimEmptyMaps;
+               trimStrings = copyFrom.trimStrings;
+               uriContext = copyFrom.uriContext;
+               uriRelativity = copyFrom.uriRelativity;
+               uriResolution = copyFrom.uriResolution;
+               listener = copyFrom.listener;
        }
 
        /**
@@ -59,6 +89,18 @@ public abstract class SerializerBuilder extends 
BeanTraverseBuilder {
                super(copyFrom);
                produces = copyFrom.produces;
                accept = copyFrom.accept;
+               addBeanTypes = copyFrom.addBeanTypes;
+               addRootType = copyFrom.addRootType;
+               keepNullProperties = copyFrom.keepNullProperties;
+               sortCollections = copyFrom.sortCollections;
+               sortMaps = copyFrom.sortMaps;
+               trimEmptyCollections = copyFrom.trimEmptyCollections;
+               trimEmptyMaps = copyFrom.trimEmptyMaps;
+               trimStrings = copyFrom.trimStrings;
+               uriContext = copyFrom.uriContext;
+               uriRelativity = copyFrom.uriRelativity;
+               uriResolution = copyFrom.uriResolution;
+               listener = copyFrom.listener;
        }
 
        @Override /* ContextBuilder */
@@ -170,15 +212,23 @@ public abstract class SerializerBuilder extends 
BeanTraverseBuilder {
         *      String <jv>json</jv> = 
<jv>serializer</jv>.serialize(<jv>myMapp</jv>);
         * </p>
         *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_addBeanTypes}
-        * </ul>
-        *
         * @return This object (for method chaining).
         */
        @FluentSetter
        public SerializerBuilder addBeanTypes() {
-               return set(SERIALIZER_addBeanTypes);
+               return addBeanTypes(true);
+       }
+
+       /**
+        * Same as {@link #addBeanTypes()} but allows you to explicitly specify 
the value.
+        *
+        * @param value The value for this setting.
+        * @return This object.
+        */
+       @FluentSetter
+       public SerializerBuilder addBeanTypes(boolean value) {
+               addBeanTypes = value;
+               return this;
        }
 
        /**
@@ -220,15 +270,23 @@ public abstract class SerializerBuilder extends 
BeanTraverseBuilder {
         *      String <jv>json</jv> = 
<jv>serializer</jv>.serialize(<jk>new</jk> MyBean());
         * </p>
         *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_addRootType}
-        * </ul>
-        *
         * @return This object (for method chaining).
         */
        @FluentSetter
        public SerializerBuilder addRootType() {
-               return set(SERIALIZER_addRootType);
+               return addRootType(true);
+       }
+
+       /**
+        * Same as {@link #addRootType()} but allows you to explicitly specify 
the value.
+        *
+        * @param value The value for this setting.
+        * @return This object.
+        */
+       @FluentSetter
+       public SerializerBuilder addRootType(boolean value) {
+               addRootType = value;
+               return this;
        }
 
        /**
@@ -258,15 +316,23 @@ public abstract class SerializerBuilder extends 
BeanTraverseBuilder {
         *      String <jv>json</jv> = 
<jv>serializer</jv>.serialize(<jk>new</jk> MyBean());
         * </p>
         *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_keepNullProperties}
-        * </ul>
-        *
         * @return This object (for method chaining).
         */
        @FluentSetter
        public SerializerBuilder keepNullProperties() {
-               return set(SERIALIZER_keepNullProperties);
+               return keepNullProperties(true);
+       }
+
+       /**
+        * Same as {@link #keepNullProperties()} but allows you to explicitly 
specify the value.
+        *
+        * @param value The value for this setting.
+        * @return This object.
+        */
+       @FluentSetter
+       public SerializerBuilder keepNullProperties(boolean value) {
+               keepNullProperties = value;
+               return this;
        }
 
        /**
@@ -311,17 +377,14 @@ public abstract class SerializerBuilder extends 
BeanTraverseBuilder {
         *      }
         * </p>
         *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_listener}
-        * </ul>
-        *
         * @param value
         *      The new value for this property.
         * @return This object (for method chaining).
         */
        @FluentSetter
        public SerializerBuilder listener(Class<? extends SerializerListener> 
value) {
-               return set(SERIALIZER_listener, value);
+               listener = value;
+               return this;
        }
 
        /**
@@ -348,15 +411,23 @@ public abstract class SerializerBuilder extends 
BeanTraverseBuilder {
         *      String <jv>json</jv> = 
<jv>serializer</jv>.serialize(<jv>myArray</jv>);
         * </p>
         *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_sortCollections}
-        * </ul>
-        *
         * @return This object (for method chaining).
         */
        @FluentSetter
        public SerializerBuilder sortCollections() {
-               return set(SERIALIZER_sortCollections);
+               return sortCollections(true);
+       }
+
+       /**
+        * Same as {@link #sortCollections()} but allows you to explicitly 
specify the value.
+        *
+        * @param value The value for this setting.
+        * @return This object.
+        */
+       @FluentSetter
+       public SerializerBuilder sortCollections(boolean value) {
+               sortCollections = value;
+               return this;
        }
 
        /**
@@ -383,15 +454,23 @@ public abstract class SerializerBuilder extends 
BeanTraverseBuilder {
         *      String <jv>json</jv> = 
<jv>serializer</jv>.serialize(<jv>myMap</jv>);
         * </p>
         *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_sortMaps}
-        * </ul>
-        *
         * @return This object (for method chaining).
         */
        @FluentSetter
        public SerializerBuilder sortMaps() {
-               return set(SERIALIZER_sortMaps);
+               return sortMaps(true);
+       }
+
+       /**
+        * Same as {@link #sortMaps()} but allows you to explicitly specify the 
value.
+        *
+        * @param value The value for this setting.
+        * @return This object.
+        */
+       @FluentSetter
+       public SerializerBuilder sortMaps(boolean value) {
+               sortMaps = value;
+               return this;
        }
 
        /**
@@ -426,15 +505,23 @@ public abstract class SerializerBuilder extends 
BeanTraverseBuilder {
         *      String <jv>json</jv> = 
<jv>serializer</jv>.serialize(<jk>new</jk> MyBean());
         * </p>
         *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link 
Serializer#SERIALIZER_trimEmptyCollections}
-        * </ul>
-        *
         * @return This object (for method chaining).
         */
        @FluentSetter
        public SerializerBuilder trimEmptyCollections() {
-               return set(SERIALIZER_trimEmptyCollections);
+               return trimEmptyCollections(true);
+       }
+
+       /**
+        * Same as {@link #trimEmptyCollections()} but allows you to explicitly 
specify the value.
+        *
+        * @param value The value for this setting.
+        * @return This object.
+        */
+       @FluentSetter
+       public SerializerBuilder trimEmptyCollections(boolean value) {
+               trimEmptyCollections = value;
+               return this;
        }
 
        /**
@@ -467,15 +554,23 @@ public abstract class SerializerBuilder extends 
BeanTraverseBuilder {
         *      String <jv>json</jv> = 
<jv>serializer</jv>.serialize(<jk>new</jk> MyBean());
         * </p>
         *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_trimEmptyMaps}
-        * </ul>
-        *
         * @return This object (for method chaining).
         */
        @FluentSetter
        public SerializerBuilder trimEmptyMaps() {
-               return set(SERIALIZER_trimEmptyMaps);
+               return trimEmptyMaps(true);
+       }
+
+       /**
+        * Same as {@link #trimEmptyMaps()} but allows you to explicitly 
specify the value.
+        *
+        * @param value The value for this setting.
+        * @return This object.
+        */
+       @FluentSetter
+       public SerializerBuilder trimEmptyMaps(boolean value) {
+               trimEmptyMaps = value;
+               return this;
        }
 
        /**
@@ -499,15 +594,23 @@ public abstract class SerializerBuilder extends 
BeanTraverseBuilder {
         *      String <jv>json</jv> = 
<jv>serializer</jv>.toString(<jv>myMap</jv>);
         * </p>
         *
-        * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_trimStrings}
-        * </ul>
-        *
         * @return This object (for method chaining).
         */
        @FluentSetter
        public SerializerBuilder trimStrings() {
-               return set(SERIALIZER_trimStrings);
+               return trimStrings(true);
+       }
+
+       /**
+        * Same as {@link #trimStrings()} but allows you to explicitly specify 
the value.
+        *
+        * @param value The value for this setting.
+        * @return This object.
+        */
+       @FluentSetter
+       public SerializerBuilder trimStrings(boolean value) {
+               trimStrings = value;
+               return this;
        }
 
        /**
@@ -543,7 +646,6 @@ public abstract class SerializerBuilder extends 
BeanTraverseBuilder {
         * </p>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_uriContext}
         *      <li class='link'>{@doc MarshallingUris}
         * </ul>
         *
@@ -552,7 +654,8 @@ public abstract class SerializerBuilder extends 
BeanTraverseBuilder {
         */
        @FluentSetter
        public SerializerBuilder uriContext(UriContext value) {
-               return set(SERIALIZER_uriContext, value);
+               uriContext = value;
+               return this;
        }
 
        /**
@@ -579,7 +682,6 @@ public abstract class SerializerBuilder extends 
BeanTraverseBuilder {
         * See {@link #uriContext(UriContext)} for examples.
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_uriRelativity}
         *      <li class='link'>{@doc MarshallingUris}
         * </ul>
         *
@@ -590,7 +692,8 @@ public abstract class SerializerBuilder extends 
BeanTraverseBuilder {
         */
        @FluentSetter
        public SerializerBuilder uriRelativity(UriRelativity value) {
-               return set(SERIALIZER_uriRelativity, value);
+               uriRelativity = value;
+               return this;
        }
 
        /**
@@ -619,7 +722,6 @@ public abstract class SerializerBuilder extends 
BeanTraverseBuilder {
         * See {@link #uriContext(UriContext)} for examples.
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_uriResolution}
         *      <li class='link'>{@doc MarshallingUris}
         * </ul>
         *
@@ -630,7 +732,8 @@ public abstract class SerializerBuilder extends 
BeanTraverseBuilder {
         */
        @FluentSetter
        public SerializerBuilder uriResolution(UriResolution value) {
-               return set(SERIALIZER_uriResolution, value);
+               uriResolution = value;
+               return this;
        }
 
        // <FluentSetters>
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
index 7e469db..62d224b 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
@@ -14,7 +14,7 @@ package org.apache.juneau.serializer;
 
 import static org.apache.juneau.internal.ClassUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
-import static org.apache.juneau.serializer.Serializer.*;
+import static java.util.Optional.*;
 
 import java.io.*;
 import java.lang.reflect.*;
@@ -78,9 +78,9 @@ public abstract class SerializerSession extends 
BeanTraverseSession {
                super(ctx, args == null ? SerializerSessionArgs.DEFAULT : args);
                this.ctx = ctx;
                args = args == null ? SerializerSessionArgs.DEFAULT : args;
-               SessionProperties sp = getSessionProperties();
                this.javaMethod = args.javaMethod;
-               this.uriResolver = UriResolver.of(ctx.getUriResolution(), 
ctx.getUriRelativity(), sp.get(SERIALIZER_uriContext, 
UriContext.class).orElse(ctx.getUriContext()));
+               UriContext uriContext = 
ofNullable(args.uriContext).orElse(ctx.getUriContext());
+               this.uriResolver = UriResolver.of(ctx.getUriResolution(), 
ctx.getUriRelativity(), uriContext);
                this.listener = castOrCreate(SerializerListener.class, 
ctx.getListener());
                this.vrs = args.resolver;
        }
@@ -607,7 +607,7 @@ public abstract class SerializerSession extends 
BeanTraverseSession {
         * Returns the parser-side expected type for the object.
         *
         * <p>
-        * The return value depends on the {@link 
Serializer#SERIALIZER_addRootType} setting.
+        * The return value depends on the {@link 
SerializerBuilder#addRootType()} setting.
         * When disabled, the parser already knows the Java POJO type being 
parsed, so there is
         * no reason to add <js>"_type"</js> attributes to the root-level 
object.
         *
@@ -707,7 +707,7 @@ public abstract class SerializerSession extends 
BeanTraverseSession {
        /**
         * Configuration property:  Add <js>"_type"</js> properties when needed.
         *
-        * @see Serializer#SERIALIZER_addBeanTypes
+        * @see SerializerBuilder#addBeanTypes()
         * @return
         *      <jk>true</jk> if <js>"_type"</js> properties added to beans if 
their type cannot be inferred
         *      through reflection.
@@ -719,7 +719,7 @@ public abstract class SerializerSession extends 
BeanTraverseSession {
        /**
         * Configuration property:  Add type attribute to root nodes.
         *
-        * @see Serializer#SERIALIZER_addRootType
+        * @see SerializerBuilder#addRootType()
         * @return
         *      <jk>true</jk> if type property should be added to root node.
         */
@@ -739,7 +739,7 @@ public abstract class SerializerSession extends 
BeanTraverseSession {
        /**
         * Configuration property:  Sort arrays and collections alphabetically.
         *
-        * @see Serializer#SERIALIZER_sortCollections
+        * @see SerializerBuilder#sortCollections()
         * @return
         *      <jk>true</jk> if arrays and collections are copied and sorted 
before serialization.
         */
@@ -750,7 +750,7 @@ public abstract class SerializerSession extends 
BeanTraverseSession {
        /**
         * Configuration property:  Sort maps alphabetically.
         *
-        * @see Serializer#SERIALIZER_sortMaps
+        * @see SerializerBuilder#sortMaps()
         * @return
         *      <jk>true</jk> if maps are copied and sorted before 
serialization.
         */
@@ -761,7 +761,7 @@ public abstract class SerializerSession extends 
BeanTraverseSession {
        /**
         * Configuration property:  Trim empty lists and arrays.
         *
-        * @see Serializer#SERIALIZER_trimEmptyCollections
+        * @see SerializerBuilder#trimEmptyCollections()
         * @return
         *      <jk>true</jk> if empty lists and arrays are not serialized to 
the output.
         */
@@ -772,7 +772,7 @@ public abstract class SerializerSession extends 
BeanTraverseSession {
        /**
         * Configuration property:  Trim empty maps.
         *
-        * @see Serializer#SERIALIZER_trimEmptyMaps
+        * @see SerializerBuilder#trimEmptyMaps()
         * @return
         *      <jk>true</jk> if empty map values are not serialized to the 
output.
         */
@@ -783,7 +783,7 @@ public abstract class SerializerSession extends 
BeanTraverseSession {
        /**
         * Configuration property:  Don't trim null bean property values.
         *
-        * @see Serializer#SERIALIZER_keepNullProperties
+        * @see SerializerBuilder#keepNullProperties()
         * @return
         *      <jk>true</jk> if null bean values are serialized to the output.
         */
@@ -794,7 +794,7 @@ public abstract class SerializerSession extends 
BeanTraverseSession {
        /**
         * Configuration property:  Trim strings.
         *
-        * @see Serializer#SERIALIZER_trimStrings
+        * @see SerializerBuilder#trimStrings()
         * @return
         *      <jk>true</jk> if string values will be trimmed of whitespace 
using {@link String#trim()} before being serialized.
         */
@@ -805,7 +805,7 @@ public abstract class SerializerSession extends 
BeanTraverseSession {
        /**
         * Configuration property:  URI context bean.
         *
-        * @see Serializer#SERIALIZER_uriContext
+        * @see SerializerBuilder#uriContext(UriContext)
         * @return
         *      Bean used for resolution of URIs to absolute or root-relative 
form.
         */
@@ -816,7 +816,7 @@ public abstract class SerializerSession extends 
BeanTraverseSession {
        /**
         * Configuration property:  URI relativity.
         *
-        * @see Serializer#SERIALIZER_uriRelativity
+        * @see SerializerBuilder#uriRelativity(UriRelativity)
         * @return
         *      Defines what relative URIs are relative to when serializing any 
of the following:
         */
@@ -827,7 +827,7 @@ public abstract class SerializerSession extends 
BeanTraverseSession {
        /**
         * Configuration property:  URI resolution.
         *
-        * @see Serializer#SERIALIZER_uriResolution
+        * @see SerializerBuilder#uriResolution(UriResolution)
         * @return
         *      Defines the resolution level for URIs when serializing URIs.
         */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSessionArgs.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSessionArgs.java
index a524bec..a87a955 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSessionArgs.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSessionArgs.java
@@ -12,8 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.serializer;
 
-import static org.apache.juneau.serializer.Serializer.*;
-
 import java.lang.reflect.*;
 import java.nio.charset.*;
 import java.util.*;
@@ -43,6 +41,7 @@ public final class SerializerSessionArgs extends 
BeanSessionArgs {
        VarResolverSession resolver;
        Boolean useWhitespace;
        Charset fileCharset, streamCharset;
+       UriContext uriContext;
 
        /**
         * Static creator.
@@ -141,7 +140,7 @@ public final class SerializerSessionArgs extends 
BeanSessionArgs {
         * Bean used for resolution of URIs to absolute or root-relative form.
         *
         * <p>
-        * If not specified, defaults to {@link 
Serializer#SERIALIZER_uriContext}.
+        * If not specified, defaults to {@link 
SerializerBuilder#uriContext(UriContext)}.
         *
         * @param value
         *      The new property value.
@@ -150,7 +149,7 @@ public final class SerializerSessionArgs extends 
BeanSessionArgs {
         */
        @FluentSetter
        public SerializerSessionArgs uriContext(UriContext value) {
-               property(SERIALIZER_uriContext, value);
+               uriContext = value;
                return this;
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerWriter.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerWriter.java
index f17748a..95ccac1 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerWriter.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerWriter.java
@@ -189,8 +189,8 @@ public class SerializerWriter extends Writer {
         * {@link URI} objects, or any other type that returns a URI via it's 
<c>toString()</c> method.
         *
         * <p>
-        * The URI is resolved based on the {@link 
Serializer#SERIALIZER_uriRelativity} and
-        * {@link Serializer#SERIALIZER_uriResolution} settings and the {@link 
UriContext} that's part of the
+        * The URI is resolved based on the {@link 
SerializerBuilder#uriRelativity(UriRelativity)} and
+        * {@link SerializerBuilder#uriResolution(UriResolution)} settings and 
the {@link UriContext} that's part of the
         * session.
         *
         * @param uri The URI to serialize.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java
index 9c43828..6c4bf08 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java
@@ -33,7 +33,7 @@ import org.apache.juneau.serializer.*;
 @Target({TYPE,METHOD})
 @Retention(RUNTIME)
 @Inherited
-@ContextApply({SerializerConfigAnnotation.Apply.class,SerializerConfigAnnotation.OutputStreamSerializerApply.class,SerializerConfigAnnotation.WriterSerializerApply.class})
+@ContextApply({SerializerConfigAnnotation.SerializerApply.class,SerializerConfigAnnotation.OutputStreamSerializerApply.class,SerializerConfigAnnotation.WriterSerializerApply.class})
 public @interface SerializerConfig {
 
        /**
@@ -92,8 +92,8 @@ public @interface SerializerConfig {
         * <p>
         * Note the differences between the following settings:
         * <ul>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_addRootType} - 
Affects whether <js>'_type'</js> is added to root node.
-        *      <li class='jf'>{@link Serializer#SERIALIZER_addBeanTypes} - 
Affects whether <js>'_type'</js> is added to any nodes.
+        *      <li class='jm'>{@link SerializerBuilder#addRootType()} - 
Affects whether <js>'_type'</js> is added to root node.
+        *      <li class='jm'>{@link SerializerBuilder#addBeanTypes()} - 
Affects whether <js>'_type'</js> is added to any nodes.
         * </ul>
         *
         * <ul class='notes'>
@@ -108,7 +108,7 @@ public @interface SerializerConfig {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_addBeanTypes}
+        *      <li class='jm'>{@link SerializerBuilder#addBeanTypes()}
         * </ul>
         */
        String addBeanTypes() default "";
@@ -127,8 +127,8 @@ public @interface SerializerConfig {
         * <p>
         * Note the differences between the following settings:
         * <ul>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_addRootType} - 
Affects whether <js>'_type'</js> is added to root node.
-        *      <li class='jf'>{@link Serializer#SERIALIZER_addBeanTypes} - 
Affects whether <js>'_type'</js> is added to any nodes.
+        *      <li class='jm'>{@link SerializerBuilder#addRootType()} - 
Affects whether <js>'_type'</js> is added to root node.
+        *      <li class='jm'>{@link SerializerBuilder#addBeanTypes()} - 
Affects whether <js>'_type'</js> is added to any nodes.
         * </ul>
         *
         * <ul class='notes'>
@@ -143,7 +143,7 @@ public @interface SerializerConfig {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_addRootType}
+        *      <li class='jm'>{@link SerializerBuilder#addRootType()}
         * </ul>
         */
        String addRootType() default "";
@@ -173,7 +173,7 @@ public @interface SerializerConfig {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_keepNullProperties}
+        *      <li class='jm'>{@link SerializerBuilder#keepNullProperties()}
         * </ul>
         */
        String keepNullProperties() default "";
@@ -185,7 +185,7 @@ public @interface SerializerConfig {
         * Class used to listen for errors and warnings that occur during 
serialization.
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_listener}
+        *      <li class='jm'>{@link SerializerBuilder#listener(Class)}
         * </ul>
         */
        Class<? extends SerializerListener> listener() default 
SerializerListener.Null.class;
@@ -211,7 +211,7 @@ public @interface SerializerConfig {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_sortCollections}
+        *      <li class='jm'>{@link SerializerBuilder#sortCollections()}
         * </ul>
         */
        String sortCollections() default "";
@@ -237,7 +237,7 @@ public @interface SerializerConfig {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_sortMaps}
+        *      <li class='jm'>{@link SerializerBuilder#sortMaps()}
         * </ul>
         */
        String sortMaps() default "";
@@ -269,7 +269,7 @@ public @interface SerializerConfig {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link 
Serializer#SERIALIZER_trimEmptyCollections}
+        *      <li class='jm'>{@link SerializerBuilder#trimEmptyCollections()}
         * </ul>
         */
        String trimEmptyCollections() default "";
@@ -299,7 +299,7 @@ public @interface SerializerConfig {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_trimEmptyMaps}
+        *      <li class='jm'>{@link SerializerBuilder#trimEmptyMaps()}
         * </ul>
         */
        String trimEmptyMaps() default "";
@@ -322,7 +322,7 @@ public @interface SerializerConfig {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_trimStrings}
+        *      <li class='jm'>{@link SerializerBuilder#trimStrings()}
         * </ul>
         */
        String trimStrings() default "";
@@ -342,7 +342,7 @@ public @interface SerializerConfig {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_uriContext}
+        *      <li class='jm'>{@link SerializerBuilder#uriContext(UriContext)}
         * </ul>
         */
        String uriContext() default "";
@@ -370,7 +370,7 @@ public @interface SerializerConfig {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_uriRelativity}
+        *      <li class='jm'>{@link 
SerializerBuilder#uriRelativity(UriRelativity)}
         *      <li class='link'>{@doc MarshallingUris}
         * </ul>
         */
@@ -400,7 +400,7 @@ public @interface SerializerConfig {
         * </ul>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_uriResolution}
+        *      <li class='jm'>{@link 
SerializerBuilder#uriResolution(UriResolution)}
         *      <li class='link'>{@doc MarshallingUris}
         * </ul>
         */
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfigAnnotation.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfigAnnotation.java
index 3ad79a4..b62ab47 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfigAnnotation.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfigAnnotation.java
@@ -13,7 +13,6 @@
 package org.apache.juneau.serializer.annotation;
 
 import static org.apache.juneau.BeanTraverseContext.*;
-import static org.apache.juneau.serializer.OutputStreamSerializer.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.reflect.*;
@@ -26,35 +25,35 @@ import org.apache.juneau.svl.*;
 public class SerializerConfigAnnotation {
 
        /**
-        * Applies {@link SerializerConfig} annotations to a {@link 
ContextPropertiesBuilder}.
+        * Applies {@link SerializerConfig} annotations to a {@link 
SerializerBuilder}.
         */
-       public static class Apply extends 
AnnotationApplier<SerializerConfig,ContextPropertiesBuilder> {
+       public static class SerializerApply extends 
AnnotationApplier<SerializerConfig,SerializerBuilder> {
 
                /**
                 * Constructor.
                 *
                 * @param vr The resolver for resolving values in annotations.
                 */
-               public Apply(VarResolverSession vr) {
-                       super(SerializerConfig.class, 
ContextPropertiesBuilder.class, vr);
+               public SerializerApply(VarResolverSession vr) {
+                       super(SerializerConfig.class, SerializerBuilder.class, 
vr);
                }
 
                @Override
-               public void apply(AnnotationInfo<SerializerConfig> ai, 
ContextPropertiesBuilder b) {
+               public void apply(AnnotationInfo<SerializerConfig> ai, 
SerializerBuilder b) {
                        SerializerConfig a = ai.getAnnotation();
 
-                       bool(a.addBeanTypes()).ifPresent(x -> 
b.set(SERIALIZER_addBeanTypes, x));
-                       bool(a.addRootType()).ifPresent(x -> 
b.set(SERIALIZER_addRootType, x));
-                       bool(a.keepNullProperties()).ifPresent(x -> 
b.set(SERIALIZER_keepNullProperties, x));
-                       type(a.listener()).ifPresent(x -> 
b.set(SERIALIZER_listener, x));
-                       bool(a.sortCollections()).ifPresent(x -> 
b.set(SERIALIZER_sortCollections, x));
-                       bool(a.sortMaps()).ifPresent(x -> 
b.set(SERIALIZER_sortMaps, x));
-                       bool(a.trimEmptyCollections()).ifPresent(x -> 
b.set(SERIALIZER_trimEmptyCollections, x));
-                       bool(a.trimEmptyMaps()).ifPresent(x -> 
b.set(SERIALIZER_trimEmptyMaps, x));
-                       bool(a.trimStrings()).ifPresent(x -> 
b.set(SERIALIZER_trimStrings, x));
-                       string(a.uriContext()).ifPresent(x -> 
b.set(SERIALIZER_uriContext, x));
-                       string(a.uriRelativity()).ifPresent(x -> 
b.set(SERIALIZER_uriRelativity, x));
-                       string(a.uriResolution()).ifPresent(x -> 
b.set(SERIALIZER_uriResolution, x));
+                       bool(a.addBeanTypes()).ifPresent(x -> 
b.addBeanTypes(x));
+                       bool(a.addRootType()).ifPresent(x -> b.addRootType(x));
+                       bool(a.keepNullProperties()).ifPresent(x -> 
b.keepNullProperties(x));
+                       type(a.listener()).ifPresent(x -> b.listener(x));
+                       bool(a.sortCollections()).ifPresent(x -> 
b.sortCollections(x));
+                       bool(a.sortMaps()).ifPresent(x -> b.sortMaps(x));
+                       bool(a.trimEmptyCollections()).ifPresent(x -> 
b.trimEmptyCollections(x));
+                       bool(a.trimEmptyMaps()).ifPresent(x -> 
b.trimEmptyMaps(x));
+                       bool(a.trimStrings()).ifPresent(x -> b.trimStrings(x));
+                       string(a.uriContext()).map(UriContext::of).ifPresent(x 
-> b.uriContext(x));
+                       
string(a.uriRelativity()).map(UriRelativity::valueOf).ifPresent(x -> 
b.uriRelativity(x));
+                       
string(a.uriResolution()).map(UriResolution::valueOf).ifPresent(x -> 
b.uriResolution(x));
                        bool(a.detectRecursions()).ifPresent(x -> 
b.set(BEANTRAVERSE_detectRecursions, x));
                        bool(a.ignoreRecursions()).ifPresent(x -> 
b.set(BEANTRAVERSE_ignoreRecursions, x));
                        integer(a.initialDepth(), "initialDepth").ifPresent(x 
-> b.set(BEANTRAVERSE_initialDepth, x));
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/annotation/UonConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/annotation/UonConfig.java
index be6cfac..1632ffa 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/annotation/UonConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/annotation/UonConfig.java
@@ -113,7 +113,7 @@ public @interface UonConfig {
         * through reflection.
         *
         * <p>
-        * When present, this value overrides the {@link 
Serializer#SERIALIZER_addBeanTypes} setting and is
+        * When present, this value overrides the {@link 
SerializerBuilder#addBeanTypes()} setting and is
         * provided to customize the behavior of specific serializers in a 
{@link SerializerGroup}.
         *
         * <ul class='notes'>
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfig.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfig.java
index 3a78dcc..f077125 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfig.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/annotation/XmlConfig.java
@@ -157,7 +157,7 @@ public @interface XmlConfig {
         * through reflection.
         *
         * <p>
-        * When present, this value overrides the {@link 
Serializer#SERIALIZER_addBeanTypes} setting and is
+        * When present, this value overrides the {@link 
SerializerBuilder#addBeanTypes()} setting and is
         * provided to customize the behavior of specific serializers in a 
{@link SerializerGroup}.
         *
         * <ul class='notes'>
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
index dbeb990..6e460d8 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
@@ -3703,7 +3703,7 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         * </p>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_addBeanTypes}
+        *      <li class='jm'>{@link SerializerBuilder#addBeanTypes()}
         * </ul>
         *
         * @return This object (for method chaining).
@@ -3757,7 +3757,7 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         * </p>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_addRootType}
+        *      <li class='jm'>{@link SerializerBuilder#addRootType()}
         * </ul>
         *
         * @return This object (for method chaining).
@@ -3799,7 +3799,7 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         * </p>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_keepNullProperties}
+        *      <li class='jm'>{@link SerializerBuilder#keepNullProperties()}
         * </ul>
         *
         * @return This object (for method chaining).
@@ -3838,7 +3838,7 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         * </p>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_sortCollections}
+        *      <li class='jm'>{@link SerializerBuilder#sortCollections()}
         * </ul>
         *
         * @return This object (for method chaining).
@@ -3877,7 +3877,7 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         * </p>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_sortMaps}
+        *      <li class='jm'>{@link SerializerBuilder#sortMaps()}
         * </ul>
         *
         * @return This object (for method chaining).
@@ -3923,7 +3923,7 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         * </p>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link 
Serializer#SERIALIZER_trimEmptyCollections}
+        *      <li class='jm'>{@link SerializerBuilder#trimEmptyCollections()}
         * </ul>
         *
         * @return This object (for method chaining).
@@ -3968,7 +3968,7 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         * </p>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_trimEmptyMaps}
+        *      <li class='jm'>{@link SerializerBuilder#trimEmptyMaps()}
         * </ul>
         *
         * @return This object (for method chaining).
@@ -4004,7 +4004,7 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         * </p>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_trimStrings}
+        *      <li class='jm'>{@link SerializerBuilder#trimStrings()}
         * </ul>
         *
         * @return This object (for method chaining).
@@ -4051,7 +4051,7 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         * </p>
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_uriContext}
+        *      <li class='jm'>{@link SerializerBuilder#uriContext(UriContext)}
         *      <li class='link'>{@doc MarshallingUris}
         * </ul>
         *
@@ -4088,7 +4088,7 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         * See {@link #uriContext(UriContext)} for examples.
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_uriRelativity}
+        *      <li class='jm'>{@link 
SerializerBuilder#uriRelativity(UriRelativity)}
         *      <li class='link'>{@doc MarshallingUris}
         * </ul>
         *
@@ -4129,7 +4129,7 @@ public class RestClientBuilder extends 
BeanContextableBuilder {
         * See {@link #uriContext(UriContext)} for examples.
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_uriResolution}
+        *      <li class='jm'>{@link 
SerializerBuilder#uriResolution(UriResolution)}
         *      <li class='link'>{@doc MarshallingUris}
         * </ul>
         *
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
index ed438f2..4955720 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
@@ -19,7 +19,6 @@ import static org.apache.juneau.internal.ObjectUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.rest.HttpRuntimeException.*;
 import static org.apache.juneau.rest.logging.RestLoggingDetail.*;
-import static org.apache.juneau.serializer.Serializer.*;
 import static java.util.Arrays.*;
 import static java.util.Optional.*;
 import static java.util.logging.Level.*;
@@ -5687,7 +5686,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * Specifies the serializer listener class to use for listening to 
non-fatal serialization errors.
         *
         * <ul class='seealso'>
-        *      <li class='jf'>{@link Serializer#SERIALIZER_listener}
+        *      <li class='jm'>{@link SerializerBuilder#listener(Class)}
         * </ul>
         *
         * @param value The new value for this setting.
@@ -5696,7 +5695,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
        @FluentSetter
        public RestContextBuilder serializerListener(Class<? extends 
SerializerListener> value) {
                if (value != SerializerListener.Null.class)
-                       set(SERIALIZER_listener, value);
+                       serializers.forEach(x -> x.listener(value));
                return this;
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
index 90569fc..5bb27ef 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
@@ -12,7 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau;
 
-import static org.apache.juneau.serializer.Serializer.*;
 import java.util.*;
 
 import org.apache.juneau.annotation.*;
@@ -60,7 +59,7 @@ public class SerializerPropertiesComboTest extends 
ComboRoundTripTest {
                                .rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:a 
rdf:parseType='Resource'>\n<jp:t>BwT</jp:t>\n<jp:f>1</jp:f>\n</jp:a>\n</rdf:Description>\n</rdf:RDF>\n")
                                .rdfXmlR("<rdf:RDF>\n  <rdf:Description>\n    
<jp:a rdf:parseType='Resource'>\n      <jp:_type>BwT</jp:_type>\n      
<jp:f>1</jp:f>\n    </jp:a>\n  </rdf:Description>\n</rdf:RDF>\n")
                                .beanContext(x -> x.beanDictionary(T0.class))
-                               .properties(OMap.of(SERIALIZER_addBeanTypes, 
true))
+                               .apply(SerializerBuilder.class, x -> 
x.addBeanTypes())
                        },
                        {       /* 1 */
                                new ComboInput<>(
@@ -90,7 +89,7 @@ public class SerializerPropertiesComboTest extends 
ComboRoundTripTest {
                                
.rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:t>BwT</jp:t>\n<jp:f>1</jp:f>\n</rdf:Description>\n</rdf:RDF>\n")
                                .rdfXmlR("<rdf:RDF>\n  <rdf:Description>\n    
<jp:_type>BwT</jp:_type>\n    <jp:f>1</jp:f>\n  
</rdf:Description>\n</rdf:RDF>\n")
                                .beanContext(x -> x.beanDictionary(T0.class))
-                               .properties(OMap.of(SERIALIZER_addRootType, 
true))
+                               .apply(SerializerBuilder.class, x -> 
x.addRootType())
                        },
                        {       /* 2 */
                                new ComboInput<>(
@@ -119,7 +118,7 @@ public class SerializerPropertiesComboTest extends 
ComboRoundTripTest {
                                
.rdfXml("<rdf:RDF>\n<rdf:Seq>\n<rdf:li>a</rdf:li>\n<rdf:li>b</rdf:li>\n<rdf:li>c</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n")
                                
.rdfXmlT("<rdf:RDF>\n<rdf:Seq>\n<rdf:li>a</rdf:li>\n<rdf:li>b</rdf:li>\n<rdf:li>c</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n")
                                .rdfXmlR("<rdf:RDF>\n  <rdf:Seq>\n    
<rdf:li>a</rdf:li>\n    <rdf:li>b</rdf:li>\n    <rdf:li>c</rdf:li>\n  
</rdf:Seq>\n</rdf:RDF>\n")
-                               .properties(OMap.of(SERIALIZER_sortCollections, 
true))
+                               .apply(SerializerBuilder.class, x -> 
x.sortCollections())
                        },
                        {       /* 3 */
                                new ComboInput<>(
@@ -148,7 +147,7 @@ public class SerializerPropertiesComboTest extends 
ComboRoundTripTest {
                                
.rdfXml("<rdf:RDF>\n<rdf:Seq>\n<rdf:li>a</rdf:li>\n<rdf:li>b</rdf:li>\n<rdf:li>c</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n")
                                
.rdfXmlT("<rdf:RDF>\n<rdf:Seq>\n<rdf:li>a</rdf:li>\n<rdf:li>b</rdf:li>\n<rdf:li>c</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n")
                                .rdfXmlR("<rdf:RDF>\n  <rdf:Seq>\n    
<rdf:li>a</rdf:li>\n    <rdf:li>b</rdf:li>\n    <rdf:li>c</rdf:li>\n  
</rdf:Seq>\n</rdf:RDF>\n")
-                               .properties(OMap.of(SERIALIZER_sortCollections, 
true))
+                               .apply(SerializerBuilder.class, x -> 
x.sortCollections())
                        },
                        {       /* 4 */
                                new ComboInput<>(
@@ -177,7 +176,7 @@ public class SerializerPropertiesComboTest extends 
ComboRoundTripTest {
                                
.rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:a>1</jp:a>\n<jp:b>2</jp:b>\n<jp:c>3</jp:c>\n</rdf:Description>\n</rdf:RDF>\n")
                                
.rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:a>1</jp:a>\n<jp:b>2</jp:b>\n<jp:c>3</jp:c>\n</rdf:Description>\n</rdf:RDF>\n")
                                .rdfXmlR("<rdf:RDF>\n  <rdf:Description>\n    
<jp:a>1</jp:a>\n    <jp:b>2</jp:b>\n    <jp:c>3</jp:c>\n  
</rdf:Description>\n</rdf:RDF>\n")
-                               .properties(OMap.of(SERIALIZER_sortMaps, true))
+                               .apply(SerializerBuilder.class, x -> 
x.sortMaps())
                        },
                        {       /* 5 */
                                new ComboInput<>(
@@ -206,7 +205,7 @@ public class SerializerPropertiesComboTest extends 
ComboRoundTripTest {
                                .rdfXml("<rdf:RDF>\n</rdf:RDF>\n")
                                .rdfXmlT("<rdf:RDF>\n</rdf:RDF>\n")
                                .rdfXmlR("<rdf:RDF>\n</rdf:RDF>\n")
-                               
.properties(OMap.of(SERIALIZER_trimEmptyCollections, true))
+                               .apply(SerializerBuilder.class, x -> 
x.trimEmptyCollections())
                        },
                        {       /* 6 */
                                new ComboInput<>(
@@ -235,7 +234,7 @@ public class SerializerPropertiesComboTest extends 
ComboRoundTripTest {
                                .rdfXml("<rdf:RDF>\n</rdf:RDF>\n")
                                .rdfXmlT("<rdf:RDF>\n</rdf:RDF>\n")
                                .rdfXmlR("<rdf:RDF>\n</rdf:RDF>\n")
-                               .properties(OMap.of(SERIALIZER_trimEmptyMaps, 
true))
+                               .apply(SerializerBuilder.class, x -> 
x.trimEmptyMaps())
                        },
                        {       /* 7 */
                                new ComboInput<>(
@@ -264,7 +263,7 @@ public class SerializerPropertiesComboTest extends 
ComboRoundTripTest {
                                .rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:f 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Description>\n</rdf:RDF>\n")
                                .rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:f 
rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n</rdf:Description>\n</rdf:RDF>\n")
                                .rdfXmlR("<rdf:RDF>\n  <rdf:Description>\n    
<jp:f rdf:resource='http://www.w3.org/1999/02/22-rdf-syntax-ns#nil'/>\n  
</rdf:Description>\n</rdf:RDF>\n")
-                               
.properties(OMap.of(SERIALIZER_keepNullProperties, true))
+                               .apply(SerializerBuilder.class, x -> 
x.keepNullProperties())
                        },
                        {       /* 8 */
                                new ComboInput<>(
@@ -293,7 +292,7 @@ public class SerializerPropertiesComboTest extends 
ComboRoundTripTest {
                                
.rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:f>foo</jp:f>\n</rdf:Description>\n</rdf:RDF>\n")
                                
.rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:f>foo</jp:f>\n</rdf:Description>\n</rdf:RDF>\n")
                                .rdfXmlR("<rdf:RDF>\n  <rdf:Description>\n    
<jp:f>foo</jp:f>\n  </rdf:Description>\n</rdf:RDF>\n")
-                               .properties(OMap.of(SERIALIZER_trimStrings, 
true))
+                               .apply(SerializerBuilder.class, x -> 
x.trimStrings())
                        },
                        {       /* 9 */
                                new ComboInput<>(
@@ -322,7 +321,7 @@ public class SerializerPropertiesComboTest extends 
ComboRoundTripTest {
                                .rdfXml("<rdf:RDF>\n<rdf:Description>\n<jp:f 
rdf:resource='https://localhost:80/context/resource/foo'/>\n</rdf:Description>\n</rdf:RDF>\n")
                                .rdfXmlT("<rdf:RDF>\n<rdf:Description>\n<jp:f 
rdf:resource='https://localhost:80/context/resource/foo'/>\n</rdf:Description>\n</rdf:RDF>\n")
                                .rdfXmlR("<rdf:RDF>\n  <rdf:Description>\n    
<jp:f rdf:resource='https://localhost:80/context/resource/foo'/>\n  
</rdf:Description>\n</rdf:RDF>\n")
-                               .properties(OMap.of(SERIALIZER_uriContext, 
UriContext.of("https://localhost:80";, "/context", "/resource", "/path"), 
SERIALIZER_uriRelativity, UriRelativity.PATH_INFO, SERIALIZER_uriResolution, 
UriResolution.ABSOLUTE))
+                               .apply(SerializerBuilder.class, x -> 
x.uriContext(UriContext.of("https://localhost:80";, "/context", "/resource", 
"/path")).uriRelativity(UriRelativity.PATH_INFO).uriResolution(UriResolution.ABSOLUTE))
                                .convert(x -> new T9())
                                .skipTest(x -> x.contains("parseRdf") || 
x.contains("verifyRdf"))
                        },
@@ -384,7 +383,7 @@ public class SerializerPropertiesComboTest extends 
ComboRoundTripTest {
                                .rdfXmlR("<rdf:RDF>\n  <rdf:Description>\n    
<jp:_type>T11</jp:_type>\n    <jp:f>\n      <rdf:Seq>\n        <rdf:li 
rdf:parseType='Resource'>\n          <jp:f>\n            <rdf:Seq>\n            
  <rdf:li>_x0020_foo_x0020_</rdf:li>\n            </rdf:Seq>\n          
</jp:f>\n        </rdf:li>\n      </rdf:Seq>\n    </jp:f>\n  
</rdf:Description>\n</rdf:RDF>\n")
                                .apply(XmlSerializerBuilder.class, x -> 
x.addNamespaceUrisToRoot())
                                .apply(WriterSerializerBuilder.class, x -> 
x.quoteCharOverride('|'))
-                               .properties(OMap.of(SERIALIZER_addBeanTypes, 
true, SERIALIZER_addRootType, true))
+                               .apply(SerializerBuilder.class, x -> 
x.addBeanTypes().addRootType())
                                .skipTest(x -> x.startsWith("parse") || 
x.startsWith("verify"))
                        },
                });

Reply via email to