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 39580c1  RestClient tests.
39580c1 is described below

commit 39580c1c615e5ecda43207b6e023bff9e38acd9e
Author: JamesBognar <[email protected]>
AuthorDate: Thu Jun 4 13:06:33 2020 -0400

    RestClient tests.
---
 .../juneau/SerializerPropertiesComboTest.java      |   2 +-
 .../juneau/httppart/OpenApiPartParserTest.java     |  48 +++---
 .../juneau/httppart/OpenApiPartSerializerTest.java |  48 +++---
 .../java/org/apache/juneau/oapi/OpenApiTest.java   |  94 +++++------
 .../juneau/serializer/UriResolutionTest.java       |   2 +-
 .../utils/UriContextResolutionComboTest.java       |  24 +--
 .../juneau/utils/UriContextUriComboTest.java       |   2 +-
 .../main/java/org/apache/juneau/UriContext.java    |  17 ++
 .../main/java/org/apache/juneau/UriResolver.java   |  12 ++
 .../apache/juneau/http/BasicCsvArrayHeader.java    |  11 ++
 .../org/apache/juneau/http/BasicDateHeader.java    |  11 ++
 .../http/BasicEntityValidatorArrayHeader.java      |  11 ++
 .../java/org/apache/juneau/http/BasicHeader.java   |  12 ++
 .../org/apache/juneau/http/BasicIntegerHeader.java |  11 ++
 .../org/apache/juneau/http/BasicLongHeader.java    |  11 ++
 .../org/apache/juneau/http/BasicNameValuePair.java |  11 ++
 .../org/apache/juneau/http/BasicObjectHeader.java  |  11 ++
 .../apache/juneau/http/BasicRangeArrayHeader.java  |  11 ++
 .../org/apache/juneau/http/BasicStringHeader.java  |  11 ++
 .../org/apache/juneau/http/BasicUriHeader.java     |  11 ++
 .../org/apache/juneau/httppart/HttpPartSchema.java |  88 ++++++++++
 .../juneau/serializer/SerializerSession.java       |   2 +-
 .../apache/juneau/rest/client2/RestClientTest.java | 161 ++++++++++++++++--
 .../apache/juneau/rest/client2/RestRequest.java    | 185 +++++++++++++++++++++
 .../juneau/rest/client2/RestResponseHeader.java    |  16 +-
 .../java/org/apache/juneau/rest/RestRequest.java   |   6 +-
 26 files changed, 696 insertions(+), 133 deletions(-)

diff --git 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
index 941bb40..6477760 100644
--- 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
+++ 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java
@@ -320,7 +320,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, new 
UriContext("https://localhost:80";, "/context", "/resource", "/path"), 
SERIALIZER_uriRelativity, UriRelativity.PATH_INFO, SERIALIZER_uriResolution, 
UriResolution.ABSOLUTE))
+                               .properties(OMap.of(SERIALIZER_uriContext, 
UriContext.of("https://localhost:80";, "/context", "/resource", "/path"), 
SERIALIZER_uriRelativity, UriRelativity.PATH_INFO, SERIALIZER_uriResolution, 
UriResolution.ABSOLUTE))
                                .convert(x -> new T9())
                                .skipTest(x -> x.contains("parseRdf") || 
x.contains("verifyRdf"))
                        },
diff --git 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/OpenApiPartParserTest.java
 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/OpenApiPartParserTest.java
index fb19559..497601e 100644
--- 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/OpenApiPartParserTest.java
+++ 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/OpenApiPartParserTest.java
@@ -48,7 +48,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void a01_inputValidations_nullInput() throws Exception {
-               HttpPartSchema s = tNone().build();
+               HttpPartSchema s = T_NONE;
                assertNull(parse(s, null, String.class));
 
                s = tNone().required(false).build();
@@ -285,7 +285,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void c01_stringType_simple() throws Exception {
-               HttpPartSchema s = tString().build();
+               HttpPartSchema s = T_STRING;
                assertEquals("foo", parse(s, "foo", String.class));
        }
 
@@ -298,7 +298,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void c03_stringType_byteFormat() throws Exception {
-               HttpPartSchema s = tByte().build();
+               HttpPartSchema s = T_BYTE;
                String in = base64Encode("foo".getBytes());
                assertEquals("foo", parse(s, in, String.class));
                assertEquals("foo", IOUtils.read(parse(s, in, 
InputStream.class)));
@@ -308,7 +308,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void c04_stringType_binaryFormat() throws Exception {
-               HttpPartSchema s = tBinary().build();
+               HttpPartSchema s = T_BINARY;
                String in = toHex("foo".getBytes());
                assertEquals("foo", parse(s, in, String.class));
                assertEquals("foo", IOUtils.read(parse(s, in, 
InputStream.class)));
@@ -318,7 +318,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void c05_stringType_binarySpacedFormat() throws Exception {
-               HttpPartSchema s = tBinarySpaced().build();
+               HttpPartSchema s = T_BINARY_SPACED;
                String in = toSpacedHex("foo".getBytes());
                assertEquals("foo", parse(s, in, String.class));
                assertEquals("foo", IOUtils.read(parse(s, in, 
InputStream.class)));
@@ -328,7 +328,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void c06_stringType_dateFormat() throws Exception {
-               HttpPartSchema s = tDate().build();
+               HttpPartSchema s = T_DATE;
                String in = "2012-12-21";
                assertTrue(parse(s, in, String.class).contains("2012"));
                assertTrue(parse(s, in, 
Date.class).toString().contains("2012"));
@@ -338,7 +338,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void c07_stringType_dateTimeFormat() throws Exception {
-               HttpPartSchema s = tDateTime().build();
+               HttpPartSchema s = T_DATETIME;
                String in = "2012-12-21T12:34:56.789";
                assertTrue(parse(s, in, String.class).contains("2012"));
                assertTrue(parse(s, in, 
Date.class).toString().contains("2012"));
@@ -348,7 +348,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void c08_stringType_uonFormat() throws Exception {
-               HttpPartSchema s = tUon().build();
+               HttpPartSchema s = T_UON;
                assertEquals("foo", parse(s, "foo", String.class));
                assertEquals("foo", parse(s, "'foo'", String.class));
                assertEquals("C2-foo", parse(s, "'foo'", C2.class).toString());
@@ -358,7 +358,7 @@ public class OpenApiPartParserTest {
        @Test
        public void c09_stringType_noneFormat() throws Exception {
                // If no format is specified, then we should transform directly 
from a string.
-               HttpPartSchema s = tString().build();
+               HttpPartSchema s = T_STRING;
                assertEquals("foo", parse(s, "foo", String.class));
                assertEquals("'foo'", parse(s, "'foo'", String.class));
                assertEquals("C2-foo", parse(s, "foo", C2.class).toString());
@@ -400,7 +400,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void c12a_stringType_nullKeyword_plain() throws Exception {
-               HttpPartSchema s = tString().build();
+               HttpPartSchema s = T_STRING;
                assertEquals(null, parse(s, "null", String.class));
        }
 
@@ -413,7 +413,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void c12c_stringType_nullKeyword_uon() throws Exception {
-               HttpPartSchema s = tUon().build();
+               HttpPartSchema s = T_UON;
                assertEquals(null, parse(s, "null", String.class));
                assertEquals("null", parse(s, "'null'", String.class));
        }
@@ -445,7 +445,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void d01_arrayType_collectionFormatCsv() throws Exception {
-               HttpPartSchema s = tArrayCsv().build();
+               HttpPartSchema s = T_ARRAY_CSV;
                assertObjectEquals("['foo','bar']", parse(s, "foo,bar", 
String[].class));
                assertObjectEquals("['foo','bar']", parse(s, "foo,bar", 
Object[].class));
                assertObjectEquals("['D-foo','D-bar']", parse(s, "foo,bar", 
D[].class));
@@ -458,7 +458,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void d02_arrayType_collectionFormatPipes() throws Exception {
-               HttpPartSchema s = tArrayPipes().build();
+               HttpPartSchema s = T_ARRAY_PIPES;
                assertObjectEquals("['foo','bar']", parse(s, "foo|bar", 
String[].class));
                assertObjectEquals("['foo','bar']", parse(s, "foo|bar", 
Object[].class));
                assertObjectEquals("['D-foo','D-bar']", parse(s, "foo|bar", 
D[].class));
@@ -471,7 +471,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void d03_arrayType_collectionFormatSsv() throws Exception {
-               HttpPartSchema s = tArraySsv().build();
+               HttpPartSchema s = T_ARRAY_SSV;
                assertObjectEquals("['foo','bar']", parse(s, "foo bar", 
String[].class));
                assertObjectEquals("['foo','bar']", parse(s, "foo bar", 
Object[].class));
                assertObjectEquals("['D-foo','D-bar']", parse(s, "foo bar", 
D[].class));
@@ -484,7 +484,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void d04_arrayType_collectionFormatTsv() throws Exception {
-               HttpPartSchema s = tArrayTsv().build();
+               HttpPartSchema s = T_ARRAY_TSV;
                assertObjectEquals("['foo','bar']", parse(s, "foo\tbar", 
String[].class));
                assertObjectEquals("['foo','bar']", parse(s, "foo\tbar", 
Object[].class));
                assertObjectEquals("['D-foo','D-bar']", parse(s, "foo\tbar", 
D[].class));
@@ -497,7 +497,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void d05_arrayType_collectionFormatUon() throws Exception {
-               HttpPartSchema s = tArrayUon().build();
+               HttpPartSchema s = T_ARRAY_UON;
                assertObjectEquals("['foo','bar']", parse(s, "@(foo,bar)", 
String[].class));
                assertObjectEquals("['foo','bar']", parse(s, "@(foo,bar)", 
Object[].class));
                assertObjectEquals("['D-foo','D-bar']", parse(s, "@(foo,bar)", 
D[].class));
@@ -510,7 +510,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void d06a_arrayType_collectionFormatNone() throws Exception {
-               HttpPartSchema s = tArray().build();
+               HttpPartSchema s = T_ARRAY;
                assertObjectEquals("['foo','bar']", parse(s, "foo,bar", 
String[].class));
                assertObjectEquals("['foo','bar']", parse(s, "foo,bar", 
Object[].class));
                assertObjectEquals("['D-foo','D-bar']", parse(s, "foo,bar", 
D[].class));
@@ -522,7 +522,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void d06b_arrayType_collectionFormatNone_autoDetectUon() throws 
Exception {
-               HttpPartSchema s = tArray().build();
+               HttpPartSchema s = T_ARRAY;
                assertObjectEquals("['foo','bar']", parse(s, "@(foo,bar)", 
String[].class));
                assertObjectEquals("['foo','bar']", parse(s, "@(foo,bar)", 
Object[].class));
                assertObjectEquals("['D-foo','D-bar']", parse(s, "@(foo,bar)", 
D[].class));
@@ -535,7 +535,7 @@ public class OpenApiPartParserTest {
        @Test
        public void d07_arrayType_collectionFormatMulti() throws Exception {
                // collectionFormat=multi should not do any sort of splitting.
-               HttpPartSchema s = tArrayMulti().build();
+               HttpPartSchema s = T_ARRAY_MULTI;
                assertObjectEquals("['foo,bar']", parse(s, "foo,bar", 
String[].class));
                assertObjectEquals("['foo,bar']", parse(s, "foo,bar", 
Object[].class));
                assertObjectEquals("['D-foo,bar']", parse(s, "foo,bar", 
D[].class));
@@ -618,7 +618,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void e01_booleanType() throws Exception {
-               HttpPartSchema s = tBoolean().build();
+               HttpPartSchema s = T_BOOLEAN;
                assertEquals(true, parse(s, "true", boolean.class));
                assertEquals(true, parse(s, "true", Boolean.class));
                assertNull(parse(s, "null", Boolean.class));
@@ -723,7 +723,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void f01_integerType_int32() throws Exception {
-               HttpPartSchema s = tInt32().build();
+               HttpPartSchema s = T_INT32;
                assertObjectEquals("1", parse(s, "1", int.class));
                assertObjectEquals("1", parse(s, "1", Integer.class));
                assertObjectEquals("1", parse(s, "1", short.class));
@@ -791,7 +791,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void f04_integerType_int64() throws Exception {
-               HttpPartSchema s = tInt64().build();
+               HttpPartSchema s = T_INT64;
                assertObjectEquals("1", parse(s, "1", int.class));
                assertObjectEquals("1", parse(s, "1", Integer.class));
                assertObjectEquals("1", parse(s, "1", short.class));
@@ -906,7 +906,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void g01_numberType_float() throws Exception {
-               HttpPartSchema s = tFloat().build();
+               HttpPartSchema s = T_FLOAT;
                assertObjectEquals("1.0", parse(s, "1", float.class));
                assertObjectEquals("1.0", parse(s, "1", Float.class));
                assertObjectEquals("1.0", parse(s, "1", double.class));
@@ -964,7 +964,7 @@ public class OpenApiPartParserTest {
 
        @Test
        public void g04_numberType_double() throws Exception {
-               HttpPartSchema s = tDouble().build();
+               HttpPartSchema s = T_DOUBLE;
                assertObjectEquals("1.0", parse(s, "1", float.class));
                assertObjectEquals("1.0", parse(s, "1", Float.class));
                assertObjectEquals("1.0", parse(s, "1", double.class));
diff --git 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/OpenApiPartSerializerTest.java
 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/OpenApiPartSerializerTest.java
index 1844b10..3534267 100644
--- 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/OpenApiPartSerializerTest.java
+++ 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/httppart/OpenApiPartSerializerTest.java
@@ -41,7 +41,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void a01_outputValidations_nullOutput() throws Exception {
-               HttpPartSchema ps = tNone().build();
+               HttpPartSchema ps = T_NONE;
                assertEquals("null", serialize(ps, null));
 
                ps = tNone().required(false).build();
@@ -210,7 +210,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void c01_stringType_simple() throws Exception {
-               HttpPartSchema ps = tString().build();
+               HttpPartSchema ps = T_STRING;
                assertEquals("foo", serialize(ps, "foo"));
        }
 
@@ -223,7 +223,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void c03_stringType_byteFormat() throws Exception {
-               HttpPartSchema ps = tByte().build();
+               HttpPartSchema ps = T_BYTE;
                byte[] foob = "foo".getBytes();
                String expected = base64Encode(foob);
                assertEquals(expected, serialize(ps, foob));
@@ -234,7 +234,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void c04_stringType_binaryFormat() throws Exception {
-               HttpPartSchema ps = tBinary().build();
+               HttpPartSchema ps = T_BINARY;
                byte[] foob = "foo".getBytes();
                String expected = toHex(foob);
                assertEquals(expected, serialize(ps, foob));
@@ -245,7 +245,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void c05_stringType_binarySpacedFormat() throws Exception {
-               HttpPartSchema ps = tBinarySpaced().build();
+               HttpPartSchema ps = T_BINARY_SPACED;
                byte[] foob = "foo".getBytes();
                String expected = toSpacedHex(foob);
                assertEquals(expected, serialize(ps, foob));
@@ -256,7 +256,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void c06_stringType_dateFormat() throws Exception {
-               HttpPartSchema ps = tDate().build();
+               HttpPartSchema ps = T_DATE;
                Calendar in = StringUtils.parseIsoCalendar("2012-12-21");
                assertTrue(serialize(ps, in).contains("2012"));
                assertEquals("null", serialize(ps, null));
@@ -264,7 +264,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void c07_stringType_dateTimeFormat() throws Exception {
-               HttpPartSchema ps = tDateTime().build();
+               HttpPartSchema ps = T_DATETIME;
                Calendar in = 
StringUtils.parseIsoCalendar("2012-12-21T12:34:56.789");
                assertTrue(serialize(ps, in).contains("2012"));
                assertEquals("null", serialize(ps, null));
@@ -272,7 +272,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void c08_stringType_uonFormat() throws Exception {
-               HttpPartSchema ps = tUon().build();
+               HttpPartSchema ps = T_UON;
                assertEquals("foo", serialize(ps, "foo"));
                assertEquals("'foo'", serialize(ps, "'foo'"));
                assertEquals("foo", serialize(ps, new C2("foo")));
@@ -285,7 +285,7 @@ public class OpenApiPartSerializerTest {
        @Test
        public void c09_stringType_noneFormat() throws Exception {
                // If no format is specified, then we should transform directly 
from a string.
-               HttpPartSchema ps = tString().build();
+               HttpPartSchema ps = T_STRING;
                assertEquals("foo", serialize(ps, "foo"));
                assertEquals("'foo'", serialize(ps, "'foo'"));
                assertEquals("foo", serialize(ps, new C2("foo")));
@@ -324,7 +324,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void c12_stringType_uonKeywords_plain() throws Exception {
-               HttpPartSchema ps = tString().build();
+               HttpPartSchema ps = T_STRING;
                // When serialized normally, the following should not be quoted.
                assertEquals("true", serialize(ps, "true"));
                assertEquals("false", serialize(ps, "false"));
@@ -336,7 +336,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void c13_stringType_uonKeywords_uon() throws Exception {
-               HttpPartSchema ps = tUon().build();
+               HttpPartSchema ps = T_UON;
                // When serialized as UON, the following should be quoted so 
that they're not confused with booleans or numbers.
                assertEquals("'true'", serialize(ps, "true"));
                assertEquals("'false'", serialize(ps, "false"));
@@ -363,7 +363,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void d01_arrayType_collectionFormatCsv() throws Exception {
-               HttpPartSchema ps = tArrayCsv().build();
+               HttpPartSchema ps = T_ARRAY_CSV;
                assertEquals("foo,bar,null", serialize(ps, new 
String[]{"foo","bar",null}));
                assertEquals("foo,bar,null", serialize(ps, new 
Object[]{"foo","bar",null}));
                assertEquals("foo,bar,null,null", serialize(ps, new D[]{new 
D("foo"),new D("bar"),new D(null),null}));
@@ -377,7 +377,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void d02_arrayType_collectionFormatPipes() throws Exception {
-               HttpPartSchema ps = tArrayPipes().build();
+               HttpPartSchema ps = T_ARRAY_PIPES;
                assertEquals("foo|bar|null", serialize(ps, new 
String[]{"foo","bar",null}));
                assertEquals("foo|bar|null", serialize(ps, new 
Object[]{"foo","bar",null}));
                assertEquals("foo|bar|null|null", serialize(ps, new D[]{new 
D("foo"),new D("bar"),new D(null),null}));
@@ -389,7 +389,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void d03_arrayType_collectionFormatSsv() throws Exception {
-               HttpPartSchema ps = tArraySsv().build();
+               HttpPartSchema ps = T_ARRAY_SSV;
                assertEquals("foo bar null", serialize(ps, new 
String[]{"foo","bar",null}));
                assertEquals("foo bar null", serialize(ps, new 
Object[]{"foo","bar",null}));
                assertEquals("foo bar null null", serialize(ps, new D[]{new 
D("foo"),new D("bar"),new D(null),null}));
@@ -401,7 +401,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void d04_arrayType_collectionFormatTsv() throws Exception {
-               HttpPartSchema ps = tArrayTsv().build();
+               HttpPartSchema ps = T_ARRAY_TSV;
                assertEquals("foo\tbar\tnull", serialize(ps, new 
String[]{"foo","bar",null}));
                assertEquals("foo\tbar\tnull", serialize(ps, new 
Object[]{"foo","bar",null}));
                assertEquals("foo\tbar\tnull\tnull", serialize(ps, new D[]{new 
D("foo"),new D("bar"),new D(null),null}));
@@ -413,7 +413,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void d05_arrayType_collectionFormatUon() throws Exception {
-               HttpPartSchema ps = tArrayUon().build();
+               HttpPartSchema ps = T_ARRAY_UON;
                assertEquals("@(foo,bar,'null',null)", serialize(ps, new 
String[]{"foo","bar","null",null}));
                assertEquals("@(foo,bar,'null',null)", serialize(ps, new 
Object[]{"foo","bar","null",null}));
                assertEquals("@(foo,bar,'null',null)", serialize(ps, new 
D[]{new D("foo"),new D("bar"),new D("null"),null}));
@@ -425,7 +425,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void d06a_arrayType_collectionFormatNone() throws Exception {
-               HttpPartSchema ps = tArray().build();
+               HttpPartSchema ps = T_ARRAY;
                assertEquals("foo,bar,null", serialize(ps, new 
String[]{"foo","bar",null}));
                assertEquals("foo,bar,null", serialize(ps, new 
Object[]{"foo","bar",null}));
                assertEquals("foo,bar,null,null", serialize(ps, new D[]{new 
D("foo"),new D("bar"),new D(null),null}));
@@ -438,7 +438,7 @@ public class OpenApiPartSerializerTest {
        @Test
        public void d07_arrayType_collectionFormatMulti() throws Exception {
                // collectionFormat=multi really shouldn't be applicable to 
collections of values, so just use csv.
-               HttpPartSchema ps = tArrayMulti().build();
+               HttpPartSchema ps = T_ARRAY_MULTI;
                assertEquals("foo,bar,null", serialize(ps, new 
String[]{"foo","bar",null}));
                assertEquals("foo,bar,null", serialize(ps, new 
Object[]{"foo","bar",null}));
                assertEquals("foo,bar,null,null", serialize(ps, new D[]{new 
D("foo"),new D("bar"),new D(null),null}));
@@ -503,7 +503,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void e01_booleanType() throws Exception {
-               HttpPartSchema ps = tBoolean().build();
+               HttpPartSchema ps = T_BOOLEAN;
                assertEquals("true", serialize(ps, true));
                assertEquals("true", serialize(ps, "true"));
                assertEquals("true", serialize(ps, new E1(true)));
@@ -596,7 +596,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void f01_integerType_int32() throws Exception {
-               HttpPartSchema ps = tInt32().build();
+               HttpPartSchema ps = T_INT32;
                assertEquals("1", serialize(ps, 1));
                assertEquals("1", serialize(ps, new Integer(1)));
                assertEquals("1", serialize(ps, (short)1));
@@ -663,7 +663,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void f04_integerType_int64() throws Exception {
-               HttpPartSchema ps = tInt64().build();
+               HttpPartSchema ps = T_INT64;
                assertEquals("1", serialize(ps, 1));
                assertEquals("1", serialize(ps, new Integer(1)));
                assertEquals("1", serialize(ps, (short)1));
@@ -775,7 +775,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void g01_numberType_float() throws Exception {
-               HttpPartSchema ps = tFloat().build();
+               HttpPartSchema ps = T_FLOAT;
                assertEquals("1.0", serialize(ps, 1f));
                assertEquals("1.0", serialize(ps, new Float(1f)));
                assertEquals("1.0", serialize(ps, 1d));
@@ -833,7 +833,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void g04_numberType_double() throws Exception {
-               HttpPartSchema ps = tDouble().build();
+               HttpPartSchema ps = T_DOUBLE;
                assertEquals("1.0", serialize(ps, 1f));
                assertEquals("1.0", serialize(ps, new Float(1f)));
                assertEquals("1.0", serialize(ps, 1d));
@@ -917,7 +917,7 @@ public class OpenApiPartSerializerTest {
 
        @Test
        public void h02_objectType_uon() throws Exception {
-               HttpPartSchema ps = tObjectUon().build();
+               HttpPartSchema ps = T_OBJECT_UON;
                assertEquals("(f1='1',f2=2,f3=true)", serialize(ps, new 
H1("1",2,true)));
                assertEquals("()", serialize(ps, new H1(null,null,null)));
                assertEquals("(f1='1',f2=2,f3=true)", serialize(ps, 
OMap.ofJson("{f1:'1',f2:2,f3:true}")));
diff --git 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/oapi/OpenApiTest.java
 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/oapi/OpenApiTest.java
index 1a2b906..1faab15 100644
--- 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/oapi/OpenApiTest.java
+++ 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/oapi/OpenApiTest.java
@@ -64,7 +64,7 @@ public class OpenApiTest {
        @Test
        public void a01a_noType_formatDefault() throws Exception {
                String in = "foo";
-               HttpPartSchema ps = tNone().build();
+               HttpPartSchema ps = T_NONE;
                String s = serialize(ps, in);
                assertEquals("foo", s);
                String r = parse(ps, s, String.class);
@@ -74,7 +74,7 @@ public class OpenApiTest {
        @Test
        public void a01b_noType_formatDefault_null() throws Exception {
                String in = null;
-               HttpPartSchema ps = tNone().build();
+               HttpPartSchema ps = T_NONE;
                String s = serialize(ps, in);
                assertEquals("null", s);
        }
@@ -280,7 +280,7 @@ public class OpenApiTest {
        @Test
        public void b01_typeString_formatDefault() throws Exception {
                String in = "foo";
-               HttpPartSchema ps = tString().build();
+               HttpPartSchema ps = T_STRING;
                String s = serialize(ps, in);
                assertEquals("foo", s);
                String r = parse(ps, s, String.class);
@@ -290,7 +290,7 @@ public class OpenApiTest {
        @Test
        public void b02_typeString_formatByte() throws Exception {
                String in = "foo";
-               HttpPartSchema ps = tByte().build();
+               HttpPartSchema ps = T_BYTE;
                String s = serialize(ps, in);
                assertEquals("Zm9v", s);
                String r = parse(ps, s, String.class);
@@ -300,7 +300,7 @@ public class OpenApiTest {
        @Test
        public void b03_typeString_formatBinary() throws Exception {
                String in = "foo";
-               HttpPartSchema ps = tBinary().build();
+               HttpPartSchema ps = T_BINARY;
                String s = serialize(ps, in);
                assertEquals("666F6F", s);
                String r = parse(ps, s, String.class);
@@ -310,7 +310,7 @@ public class OpenApiTest {
        @Test
        public void b04_typeString_formatBinarySpaced() throws Exception {
                String in = "foo";
-               HttpPartSchema ps = tBinarySpaced().build();
+               HttpPartSchema ps = T_BINARY_SPACED;
                String s = serialize(ps, in);
                assertEquals("66 6F 6F", s);
                String r = parse(ps, s, String.class);
@@ -320,7 +320,7 @@ public class OpenApiTest {
        @Test
        public void b05_typeString_formatDate_String() throws Exception {
                String in = "2012-12-21";
-               HttpPartSchema ps = tDate().build();
+               HttpPartSchema ps = T_DATE;
                String s = serialize(ps, in);
                assertEquals("2012-12-21", s);
                String r = parse(ps, s, String.class);
@@ -330,7 +330,7 @@ public class OpenApiTest {
        @Test
        public void b06_typeString_formatDate_Calendar() throws Exception {
                Calendar in = CalendarUtils.parseCalendar("2012-12-21", 
CalendarUtils.Format.ISO8601_D, null, null);
-               HttpPartSchema ps = tDate().build();
+               HttpPartSchema ps = T_DATE;
                String s = serialize(ps, in);
                assertEquals("2012-12-21Z", s);
                Calendar r = parse(ps, s, Calendar.class);
@@ -341,7 +341,7 @@ public class OpenApiTest {
        @Test
        public void b07_typeString_formatDate_Date() throws Exception {
                Date in = CalendarUtils.parseCalendar("2012-12-21", 
CalendarUtils.Format.ISO8601_D, null, null).getTime();
-               HttpPartSchema ps = tDate().build();
+               HttpPartSchema ps = T_DATE;
                String s = serialize(ps, in);
                assertEquals("2012-12-21Z", s);
                Calendar r = parse(ps, s, Calendar.class);
@@ -352,7 +352,7 @@ public class OpenApiTest {
        @Test
        public void b08_typeString_formatDate_Temporal() throws Exception {
                Instant in = CalendarUtils.parseCalendar("2012-12-21", 
CalendarUtils.Format.ISO8601_D, null, null).toInstant();
-               HttpPartSchema ps = tDate().build();
+               HttpPartSchema ps = T_DATE;
                String s = serialize(ps, in);
                assertEquals("2012-12-21Z", s);
                Calendar r = parse(ps, s, Calendar.class);
@@ -363,7 +363,7 @@ public class OpenApiTest {
        @Test
        public void b09_typeString_formatDate_Other() throws Exception {
                StringBuilder in = new StringBuilder("2012-12-21");
-               HttpPartSchema ps = tDate().build();
+               HttpPartSchema ps = T_DATE;
                String s = serialize(ps, in);
                assertEquals("2012-12-21", s);
                String r = parse(ps, s, String.class);
@@ -373,7 +373,7 @@ public class OpenApiTest {
        @Test
        public void b10_typeString_formatDate_null() throws Exception {
                String in = null;
-               HttpPartSchema ps = tDate().build();
+               HttpPartSchema ps = T_DATE;
                String s = serialize(ps, in);
                assertEquals("null", s);
                String r = parse(ps, s, String.class);
@@ -383,7 +383,7 @@ public class OpenApiTest {
        @Test
        public void b11_typeString_formatDateTime_String() throws Exception {
                String in = "2012-12-21T00:00:00";
-               HttpPartSchema ps = tDateTime().build();
+               HttpPartSchema ps = T_DATETIME;
                String s = serialize(ps, in);
                assertEquals("2012-12-21T00:00:00", s);
                String r = parse(ps, s, String.class);
@@ -393,7 +393,7 @@ public class OpenApiTest {
        @Test
        public void b12_typeString_formatDateTime_Calendar() throws Exception {
                Calendar in = CalendarUtils.parseCalendar("2012-12-21", 
CalendarUtils.Format.ISO8601_D, null, null);
-               HttpPartSchema ps = tDateTime().build();
+               HttpPartSchema ps = T_DATETIME;
                String s = serialize(ps, in);
                assertEquals("2012-12-21T00:00:00Z", s);
                Calendar r = parse(ps, s, Calendar.class);
@@ -404,7 +404,7 @@ public class OpenApiTest {
        @Test
        public void b13_typeString_formatDateTime_Date() throws Exception {
                Date in = CalendarUtils.parseCalendar("2012-12-21", 
CalendarUtils.Format.ISO8601_D, null, null).getTime();
-               HttpPartSchema ps = tDateTime().build();
+               HttpPartSchema ps = T_DATETIME;
                String s = serialize(ps, in);
                assertEquals("2012-12-21T00:00:00Z", s);
                Calendar r = parse(ps, s, Calendar.class);
@@ -415,7 +415,7 @@ public class OpenApiTest {
        @Test
        public void b14_typeString_formatDateTime_Temporal() throws Exception {
                Instant in = CalendarUtils.parseCalendar("2012-12-21", 
CalendarUtils.Format.ISO8601_D, null, null).toInstant();
-               HttpPartSchema ps = tDateTime().build();
+               HttpPartSchema ps = T_DATETIME;
                String s = serialize(ps, in);
                assertEquals("2012-12-21T00:00:00Z", s);
                Calendar r = parse(ps, s, Calendar.class);
@@ -426,7 +426,7 @@ public class OpenApiTest {
        @Test
        public void b15_typeString_formatDate_Other() throws Exception {
                StringBuilder in = new StringBuilder("2012-12-21T00:00:00");
-               HttpPartSchema ps = tDateTime().build();
+               HttpPartSchema ps = T_DATETIME;
                String s = serialize(ps, in);
                assertEquals("2012-12-21T00:00:00", s);
                String r = parse(ps, s, String.class);
@@ -436,7 +436,7 @@ public class OpenApiTest {
        @Test
        public void b16_typeString_formatDate_null() throws Exception {
                String in = null;
-               HttpPartSchema ps = tDateTime().build();
+               HttpPartSchema ps = T_DATETIME;
                String s = serialize(ps, in);
                assertEquals("null", s);
                String r = parse(ps, s, String.class);
@@ -450,7 +450,7 @@ public class OpenApiTest {
        @Test
        public void c01_typeBoolean_formatDefault_String() throws Exception {
                String in = "true";
-               HttpPartSchema ps = tBoolean().build();
+               HttpPartSchema ps = T_BOOLEAN;
                String s = serialize(ps, in);
                assertEquals("true", s);
                String r = parse(ps, s, String.class);
@@ -460,7 +460,7 @@ public class OpenApiTest {
        @Test
        public void c02_typeBoolean_formatDefault_Boolean() throws Exception {
                Boolean in = true;
-               HttpPartSchema ps = tBoolean().build();
+               HttpPartSchema ps = T_BOOLEAN;
                String s = serialize(ps, in);
                assertEquals("true", s);
                Boolean r = parse(ps, s, Boolean.class);
@@ -474,7 +474,7 @@ public class OpenApiTest {
        @Test
        public void d01_typeInteger_formatDefault_String() throws Exception {
                String in = "123";
-               HttpPartSchema ps = tInteger().build();
+               HttpPartSchema ps = T_INTEGER;
                String s = serialize(ps, in);
                assertEquals("123", s);
                String r = parse(ps, s, String.class);
@@ -484,7 +484,7 @@ public class OpenApiTest {
        @Test
        public void d02_typeInteger_formatDefault_Integer() throws Exception {
                Integer in = 123;
-               HttpPartSchema ps = tInteger().build();
+               HttpPartSchema ps = T_INTEGER;
                String s = serialize(ps, in);
                assertEquals("123", s);
                Integer r = parse(ps, s, Integer.class);
@@ -494,7 +494,7 @@ public class OpenApiTest {
        @Test
        public void d03_typeInteger_formatInt32_String() throws Exception {
                String in = "123";
-               HttpPartSchema ps = tInt32().build();
+               HttpPartSchema ps = T_INT32;
                String s = serialize(ps, in);
                assertEquals("123", s);
                String r = parse(ps, s, String.class);
@@ -504,7 +504,7 @@ public class OpenApiTest {
        @Test
        public void d04_typeInteger_formatInt32_Integer() throws Exception {
                Integer in = 123;
-               HttpPartSchema ps = tInt32().build();
+               HttpPartSchema ps = T_INT32;
                String s = serialize(ps, in);
                assertEquals("123", s);
                Integer r = parse(ps, s, Integer.class);
@@ -514,7 +514,7 @@ public class OpenApiTest {
        @Test
        public void d05_typeInteger_formatInt64_String() throws Exception {
                String in = "123";
-               HttpPartSchema ps = tInt64().build();
+               HttpPartSchema ps = T_INT64;
                String s = serialize(ps, in);
                assertEquals("123", s);
                String r = parse(ps, s, String.class);
@@ -524,7 +524,7 @@ public class OpenApiTest {
        @Test
        public void d06_typeInteger_formatInt64_Long() throws Exception {
                Long in = 123l;
-               HttpPartSchema ps = tInt64().build();
+               HttpPartSchema ps = T_INT64;
                String s = serialize(ps, in);
                assertEquals("123", s);
                Long r = parse(ps, s, Long.class);
@@ -538,7 +538,7 @@ public class OpenApiTest {
        @Test
        public void e01_tNumberDefault_String() throws Exception {
                String in = "123";
-               HttpPartSchema ps = tNumber().build();
+               HttpPartSchema ps = T_NUMBER;
                String s = serialize(ps, in);
                assertEquals("123.0", s);
                String r = parse(ps, s, String.class);
@@ -548,7 +548,7 @@ public class OpenApiTest {
        @Test
        public void e02_tNumberDefault_Float() throws Exception {
                Float in = 123f;
-               HttpPartSchema ps = tNumber().build();
+               HttpPartSchema ps = T_NUMBER;
                String s = serialize(ps, in);
                assertEquals("123.0", s);
                Float r = parse(ps, s, Float.class);
@@ -558,7 +558,7 @@ public class OpenApiTest {
        @Test
        public void e03_tNumberFloat_String() throws Exception {
                String in = "123";
-               HttpPartSchema ps = tFloat().build();
+               HttpPartSchema ps = T_FLOAT;
                String s = serialize(ps, in);
                assertEquals("123.0", s);
                String r = parse(ps, s, String.class);
@@ -568,7 +568,7 @@ public class OpenApiTest {
        @Test
        public void e04_tNumberFloat_Integer() throws Exception {
                Float in = 123f;
-               HttpPartSchema ps = tFloat().build();
+               HttpPartSchema ps = T_FLOAT;
                String s = serialize(ps, in);
                assertEquals("123.0", s);
                Float r = parse(ps, s, Float.class);
@@ -578,7 +578,7 @@ public class OpenApiTest {
        @Test
        public void e05_tNumberDouble_String() throws Exception {
                String in = "123";
-               HttpPartSchema ps = tDouble().build();
+               HttpPartSchema ps = T_DOUBLE;
                String s = serialize(ps, in);
                assertEquals("123.0", s);
                String r = parse(ps, s, String.class);
@@ -588,7 +588,7 @@ public class OpenApiTest {
        @Test
        public void e06_tNumberDouble_Double() throws Exception {
                Double in = 123d;
-               HttpPartSchema ps = tDouble().build();
+               HttpPartSchema ps = T_DOUBLE;
                String s = serialize(ps, in);
                assertEquals("123.0", s);
                Double r = parse(ps, s, Double.class);
@@ -602,7 +602,7 @@ public class OpenApiTest {
        @Test
        public void f01_tArray_String() throws Exception {
                String in = "123";
-               HttpPartSchema ps = tArray().build();
+               HttpPartSchema ps = T_ARRAY;
                try {
                        serialize(ps, in);
                        fail("Exception expected");
@@ -615,7 +615,7 @@ public class OpenApiTest {
        @SuppressWarnings("unchecked")
        public void f02a_tArray_StringList() throws Exception {
                List<String> in = AList.of("123");
-               HttpPartSchema ps = tArray().build();
+               HttpPartSchema ps = T_ARRAY;
                String s = serialize(ps, in);
                assertEquals("123", s);
                List<String> r = parse(ps, s, List.class, String.class);
@@ -652,7 +652,7 @@ public class OpenApiTest {
        @Test
        public void f03a_tArray_IntArray() throws Exception {
                int[] in = new int[]{123};
-               HttpPartSchema ps = tArray().build();
+               HttpPartSchema ps = T_ARRAY;
                String s = serialize(ps, in);
                assertEquals("123", s);
                int[] r = parse(ps, s, int[].class);
@@ -702,7 +702,7 @@ public class OpenApiTest {
        @Test
        public void f04_tArray_StringArrayMutator() throws Exception {
                F04 in = new F04("a");
-               HttpPartSchema ps = tArray().build();
+               HttpPartSchema ps = T_ARRAY;
                String s = serialize(ps, in);
                SimpleJson.DEFAULT.println(in);
                assertEquals("a", s);
@@ -719,7 +719,7 @@ public class OpenApiTest {
        @Test
        public void f05a_tArrayUon_IntArray() throws Exception {
                int[] in = new int[]{123};
-               HttpPartSchema ps = tArrayUon().build();
+               HttpPartSchema ps = T_ARRAY_UON;
                String s = serialize(ps, in);
                assertEquals("@(123)", s);
                int[] r = parse(ps, s, int[].class);
@@ -735,7 +735,7 @@ public class OpenApiTest {
        @Test
        public void f05b_tArrayUon_3dIntArray() throws Exception {
                int[][][] in = {{{123}}};
-               HttpPartSchema ps = tArrayUon().build();
+               HttpPartSchema ps = T_ARRAY_UON;
                String s = serialize(ps, in);
                assertEquals("@(@(@(123)))", s);
                int[][][] r = parse(ps, s, int[][][].class);
@@ -752,7 +752,7 @@ public class OpenApiTest {
        @Test
        public void f06a_tArrayPipes_IntArray() throws Exception {
                int[] in = new int[]{123};
-               HttpPartSchema ps = tArrayPipes().build();
+               HttpPartSchema ps = T_ARRAY_PIPES;
                String s = serialize(ps, in);
                assertEquals("123", s);
                int[] r = parse(ps, s, int[].class);
@@ -768,7 +768,7 @@ public class OpenApiTest {
        @Test
        public void f06b_tArrayPipes_3dIntArray() throws Exception {
                int[][][] in = {{{123}}};
-               HttpPartSchema ps = tArrayPipes().build();
+               HttpPartSchema ps = T_ARRAY_PIPES;
                String s = serialize(ps, in);
                assertEquals("123", s);
                int[][][] r = parse(ps, s, int[][][].class);
@@ -785,7 +785,7 @@ public class OpenApiTest {
        @Test
        public void f07a_tArraySsv_IntArray() throws Exception {
                int[] in = new int[]{123};
-               HttpPartSchema ps = tArraySsv().build();
+               HttpPartSchema ps = T_ARRAY_SSV;
                String s = serialize(ps, in);
                assertEquals("123", s);
                int[] r = parse(ps, s, int[].class);
@@ -801,7 +801,7 @@ public class OpenApiTest {
        @Test
        public void f07b_tArraySsv_3dIntArray() throws Exception {
                int[][][] in = {{{123}}};
-               HttpPartSchema ps = tArraySsv().build();
+               HttpPartSchema ps = T_ARRAY_SSV;
                String s = serialize(ps, in);
                assertEquals("123", s);
                int[][][] r = parse(ps, s, int[][][].class);
@@ -818,7 +818,7 @@ public class OpenApiTest {
        @Test
        public void f08a_tArrayTsv_IntArray() throws Exception {
                int[] in = new int[]{123};
-               HttpPartSchema ps = tArrayTsv().build();
+               HttpPartSchema ps = T_ARRAY_TSV;
                String s = serialize(ps, in);
                assertEquals("123", s);
                int[] r = parse(ps, s, int[].class);
@@ -834,7 +834,7 @@ public class OpenApiTest {
        @Test
        public void f08b_tArrayTsv_3dIntArray() throws Exception {
                int[][][] in = {{{123}}};
-               HttpPartSchema ps = tArrayTsv().build();
+               HttpPartSchema ps = T_ARRAY_TSV;
                String s = serialize(ps, in);
                assertEquals("123", s);
                int[][][] r = parse(ps, s, int[][][].class);
@@ -851,7 +851,7 @@ public class OpenApiTest {
        @Test
        public void f09a_tArrayCsv_IntArray() throws Exception {
                int[] in = new int[]{123};
-               HttpPartSchema ps = tArrayCsv().build();
+               HttpPartSchema ps = T_ARRAY_CSV;
                String s = serialize(ps, in);
                assertEquals("123", s);
                int[] r = parse(ps, s, int[].class);
@@ -867,7 +867,7 @@ public class OpenApiTest {
        @Test
        public void f09b_tArrayCsv_3dIntArray() throws Exception {
                int[][][] in = {{{123}}};
-               HttpPartSchema ps = tArrayCsv().build();
+               HttpPartSchema ps = T_ARRAY_CSV;
                String s = serialize(ps, in);
                assertEquals("123", s);
                int[][][] r = parse(ps, s, int[][][].class);
@@ -903,7 +903,7 @@ public class OpenApiTest {
        @Test
        public void g01a_objectType_formatDefault_Map() throws Exception {
                OMap in = OMap.of("a","b");
-               HttpPartSchema ps = tObject().build();
+               HttpPartSchema ps = T_OBJECT;
                String s = serialize(ps, in);
                assertEquals("a=b", s);
                OMap r = parse(ps, s, OMap.class);
diff --git 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/serializer/UriResolutionTest.java
 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/serializer/UriResolutionTest.java
index 61ca559..c79118c 100644
--- 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/serializer/UriResolutionTest.java
+++ 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/serializer/UriResolutionTest.java
@@ -52,7 +52,7 @@ public class UriResolutionTest {
                public Input(UriResolution resolution, UriRelativity 
relativity, String authority, String context, String resource, String path) {
                        this.resolution = resolution;
                        this.relativity = relativity;
-                       this.context = new UriContext(authority, context, 
resource, path);
+                       this.context = UriContext.of(authority, context, 
resource, path);
                }
        }
 
diff --git 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/utils/UriContextResolutionComboTest.java
 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/utils/UriContextResolutionComboTest.java
index d941c38..d38403b 100644
--- 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/utils/UriContextResolutionComboTest.java
+++ 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/utils/UriContextResolutionComboTest.java
@@ -995,61 +995,61 @@ public class UriContextResolutionComboTest {
 
        @Test
        public void a01_testAbsoluteResource() {
-               assertEquals(r.aResource, new UriResolver(ABSOLUTE, RESOURCE, 
new UriContext(in.authority, in.context, in.resource, 
in.path)).resolve(in.uri), "{0}: testAbsolute() failed", label);
+               assertEquals(r.aResource, UriResolver.of(ABSOLUTE, RESOURCE, 
UriContext.of(in.authority, in.context, in.resource, in.path)).resolve(in.uri), 
"{0}: testAbsolute() failed", label);
        }
 
        @Test
        public void a02_testAppendAbsoluteResource() {
-               assertEquals(r.aResource, new UriResolver(ABSOLUTE, RESOURCE, 
new UriContext(in.authority, in.context, in.resource, in.path)).append(new 
StringBuilder(), in.uri).toString(), "{0}: testAbsolute() failed", label);
+               assertEquals(r.aResource, UriResolver.of(ABSOLUTE, RESOURCE, 
UriContext.of(in.authority, in.context, in.resource, in.path)).append(new 
StringBuilder(), in.uri).toString(), "{0}: testAbsolute() failed", label);
        }
 
        @Test
        public void a03_testAbsolutePathInfo() {
-               assertEquals(r.aPathInfo, new UriResolver(ABSOLUTE, PATH_INFO, 
new UriContext(in.authority, in.context, in.resource, 
in.path)).resolve(in.uri), "{0}: testAbsolute() failed", label);
+               assertEquals(r.aPathInfo, UriResolver.of(ABSOLUTE, PATH_INFO, 
UriContext.of(in.authority, in.context, in.resource, in.path)).resolve(in.uri), 
"{0}: testAbsolute() failed", label);
        }
 
        @Test
        public void a04_testAppendAbsolutePathInfo() {
-               assertEquals(r.aPathInfo, new UriResolver(ABSOLUTE, PATH_INFO, 
new UriContext(in.authority, in.context, in.resource, in.path)).append(new 
StringBuilder(), in.uri).toString(), "{0}: testAbsolute() failed", label);
+               assertEquals(r.aPathInfo, UriResolver.of(ABSOLUTE, PATH_INFO, 
UriContext.of(in.authority, in.context, in.resource, in.path)).append(new 
StringBuilder(), in.uri).toString(), "{0}: testAbsolute() failed", label);
        }
 
        @Test
        public void a05_testRootRelativeResource() {
-               assertEquals(r.rrResource, new UriResolver(ROOT_RELATIVE, 
RESOURCE, new UriContext(in.authority, in.context, in.resource, 
in.path)).resolve(in.uri), "{0}: testAbsolute() failed", label);
+               assertEquals(r.rrResource, UriResolver.of(ROOT_RELATIVE, 
RESOURCE, UriContext.of(in.authority, in.context, in.resource, 
in.path)).resolve(in.uri), "{0}: testAbsolute() failed", label);
        }
 
        @Test
        public void a06_testAppendRootRelativeResource() {
-               assertEquals(r.rrResource, new UriResolver(ROOT_RELATIVE, 
RESOURCE, new UriContext(in.authority, in.context, in.resource, 
in.path)).append(new StringBuilder(), in.uri).toString(), "{0}: testAbsolute() 
failed", label);
+               assertEquals(r.rrResource, UriResolver.of(ROOT_RELATIVE, 
RESOURCE, UriContext.of(in.authority, in.context, in.resource, 
in.path)).append(new StringBuilder(), in.uri).toString(), "{0}: testAbsolute() 
failed", label);
        }
 
        @Test
        public void a07_testRootRelativePathInfo() {
-               assertEquals(r.rrPathInfo, new UriResolver(ROOT_RELATIVE, 
PATH_INFO, new UriContext(in.authority, in.context, in.resource, 
in.path)).resolve(in.uri), "{0}: testAbsolute() failed", label);
+               assertEquals(r.rrPathInfo, UriResolver.of(ROOT_RELATIVE, 
PATH_INFO, UriContext.of(in.authority, in.context, in.resource, 
in.path)).resolve(in.uri), "{0}: testAbsolute() failed", label);
        }
 
        @Test
        public void a08_testAppendRootRelativePathInfo() {
-               assertEquals(r.rrPathInfo, new UriResolver(ROOT_RELATIVE, 
PATH_INFO, new UriContext(in.authority, in.context, in.resource, 
in.path)).append(new StringBuilder(), in.uri).toString(), "{0}: testAbsolute() 
failed", label);
+               assertEquals(r.rrPathInfo, UriResolver.of(ROOT_RELATIVE, 
PATH_INFO, UriContext.of(in.authority, in.context, in.resource, 
in.path)).append(new StringBuilder(), in.uri).toString(), "{0}: testAbsolute() 
failed", label);
        }
 
        @Test
        public void a09_testNoneResource() {
-               assertEquals(r.nResource, new UriResolver(NONE, RESOURCE, new 
UriContext(in.authority, in.context, in.resource, in.path)).resolve(in.uri), 
"{0}: testAbsolute() failed", label);
+               assertEquals(r.nResource, UriResolver.of(NONE, RESOURCE, 
UriContext.of(in.authority, in.context, in.resource, in.path)).resolve(in.uri), 
"{0}: testAbsolute() failed", label);
        }
 
        @Test
        public void a10_testAppendNoneResource() {
-               assertEquals(r.nResource, new UriResolver(NONE, RESOURCE, new 
UriContext(in.authority, in.context, in.resource, in.path)).append(new 
StringBuilder(), in.uri).toString(), "{0}: testAbsolute() failed", label);
+               assertEquals(r.nResource, UriResolver.of(NONE, RESOURCE, 
UriContext.of(in.authority, in.context, in.resource, in.path)).append(new 
StringBuilder(), in.uri).toString(), "{0}: testAbsolute() failed", label);
        }
 
        @Test
        public void a11_testNonePathInfo() {
-               assertEquals(r.nPathInfo, new UriResolver(NONE, PATH_INFO, new 
UriContext(in.authority, in.context, in.resource, in.path)).resolve(in.uri), 
"{0}: testAbsolute() failed", label);
+               assertEquals(r.nPathInfo, UriResolver.of(NONE, PATH_INFO, 
UriContext.of(in.authority, in.context, in.resource, in.path)).resolve(in.uri), 
"{0}: testAbsolute() failed", label);
        }
 
        @Test
        public void a12_testAppendNonePathInfo() {
-               assertEquals(r.nPathInfo, new UriResolver(NONE, PATH_INFO, new 
UriContext(in.authority, in.context, in.resource, in.path)).append(new 
StringBuilder(), in.uri).toString(), "{0}: testAbsolute() failed", label);
+               assertEquals(r.nPathInfo, UriResolver.of(NONE, PATH_INFO, 
UriContext.of(in.authority, in.context, in.resource, in.path)).append(new 
StringBuilder(), in.uri).toString(), "{0}: testAbsolute() failed", label);
        }
 }
diff --git 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/utils/UriContextUriComboTest.java
 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/utils/UriContextUriComboTest.java
index b2c6f62..67b6f6d 100644
--- 
a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/utils/UriContextUriComboTest.java
+++ 
b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/utils/UriContextUriComboTest.java
@@ -200,7 +200,7 @@ public class UriContextUriComboTest {
                private final UriContext uriContext;
 
                public Input(String authority, String context, String resource, 
String path) {
-                       this.uriContext = new UriContext(authority, context, 
resource, path);
+                       this.uriContext = UriContext.of(authority, context, 
resource, path);
                }
        }
 
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 cd2f134..2a90a0f 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
@@ -52,6 +52,23 @@ public class UriContext {
        private String aContextRoot, rContextRoot, aServletPath, rResource, 
aPathInfo, rPath;
 
        /**
+        * Convenience creator.
+        *
+        * @param authority
+        *      The authority portion of URL (e.g. 
<js>"http://hostname:port";</js>)
+        * @param contextRoot
+        *      The context root of the application (e.g. 
<js>"/context-root"</js>, or <js>"context-root"</js>)
+        * @param servletPath
+        *      The servlet path (e.g. <js>"/servlet-path"</js>, or 
<js>"servlet-path"</js>)
+        * @param pathInfo
+        *      The path info (e.g. <js>"/path-info"</js>, or 
<js>"path-info"</js>)
+        * @return A new {@link UriContext} object.
+        */
+       public static UriContext of(String authority, String contextRoot, 
String servletPath, String pathInfo) {
+               return new UriContext(authority, contextRoot, servletPath, 
pathInfo);
+       }
+
+       /**
         * Constructor.
         *
         * <p>
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/UriResolver.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/UriResolver.java
index 3a5a4c2..2c8c480 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/UriResolver.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/UriResolver.java
@@ -55,6 +55,18 @@ public class UriResolver {
        private final String authority, contextRoot, servletPath, pathInfo, 
parentPath;
 
        /**
+        * Convenience creator.
+        *
+        * @param resolution Rule on how URIs should be resolved.
+        * @param relativity Rule on what relative URIs are relative to.
+        * @param uriContext Current URI context (i.e. the current URI 
'location').
+        * @return A new {@link UriResolver} object.
+        */
+       public static UriResolver of(UriResolution resolution, UriRelativity 
relativity, UriContext uriContext) {
+               return new UriResolver(resolution, relativity, uriContext);
+       }
+
+       /**
         * Constructor.
         *
         * @param resolution Rule on how URIs should be resolved.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicCsvArrayHeader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicCsvArrayHeader.java
index 26094d7..63e2936 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicCsvArrayHeader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicCsvArrayHeader.java
@@ -38,6 +38,17 @@ public class BasicCsvArrayHeader extends BasicHeader {
        private final String[] value;
 
        /**
+        * Convenience creator.
+        *
+        * @param name The parameter name.
+        * @param value The parameter value.
+        * @return A new {@link BasicCsvArrayHeader} object.
+        */
+       public static BasicCsvArrayHeader of(String name, String value) {
+               return new BasicCsvArrayHeader(name, split(value));
+       }
+
+       /**
         * Constructor.
         *
         * @param name The HTTP header name.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicDateHeader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicDateHeader.java
index 942bcff..429c6d6 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicDateHeader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicDateHeader.java
@@ -41,6 +41,17 @@ public class BasicDateHeader extends BasicHeader {
        private final ZonedDateTime zdt;
 
        /**
+        * Convenience creator.
+        *
+        * @param name The parameter name.
+        * @param value The parameter value.
+        * @return A new {@link BasicDateHeader} object.
+        */
+       public static BasicDateHeader of(String name, String value) {
+               return new BasicDateHeader(name, value);
+       }
+
+       /**
         * Constructor.
         *
         * @param name The HTTP header name.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicEntityValidatorArrayHeader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicEntityValidatorArrayHeader.java
index cde2401..4dcd1a3 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicEntityValidatorArrayHeader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicEntityValidatorArrayHeader.java
@@ -36,6 +36,17 @@ public class BasicEntityValidatorArrayHeader extends 
BasicHeader {
        private final EntityValidator[] value;
 
        /**
+        * Convenience creator.
+        *
+        * @param name The parameter name.
+        * @param value The parameter value.
+        * @return A new {@link BasicEntityValidatorArrayHeader} object.
+        */
+       public static BasicEntityValidatorArrayHeader of(String name, String 
value) {
+               return new BasicEntityValidatorArrayHeader(name, value);
+       }
+
+       /**
         * Constructor.
         *
         * @param name The HTTP header name.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicHeader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicHeader.java
index 569d935..9458dab 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicHeader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicHeader.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.http;
 
 import org.apache.juneau.annotation.*;
+import org.apache.juneau.internal.*;
 
 /**
  * Superclass of all headers defined in this package.
@@ -22,6 +23,17 @@ public class BasicHeader extends 
org.apache.http.message.BasicHeader {
        private static final long serialVersionUID = 1L;
 
        /**
+        * Convenience creator.
+        *
+        * @param name The parameter name.
+        * @param value The parameter value.
+        * @return A new {@link BasicHeader} object.
+        */
+       public static BasicHeader of(String name, Object value) {
+               return new BasicHeader(name, StringUtils.asString(value));
+       }
+
+       /**
         * Constructor.
         *
         * @param name Header name.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicIntegerHeader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicIntegerHeader.java
index 224e559..3ad5d17 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicIntegerHeader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicIntegerHeader.java
@@ -37,6 +37,17 @@ public class BasicIntegerHeader extends BasicHeader {
        private final Integer value;
 
        /**
+        * Convenience creator.
+        *
+        * @param name The parameter name.
+        * @param value The parameter value.
+        * @return A new {@link BasicIntegerHeader} object.
+        */
+       public static BasicIntegerHeader of(String name, Object value) {
+               return new BasicIntegerHeader(name, value);
+       }
+
+       /**
         * Constructor.
         *
         * @param name HTTP header name.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicLongHeader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicLongHeader.java
index c723201..87ad8e9 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicLongHeader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicLongHeader.java
@@ -37,6 +37,17 @@ public class BasicLongHeader extends BasicHeader {
        private final Long value;
 
        /**
+        * Convenience creator.
+        *
+        * @param name The parameter name.
+        * @param value The parameter value.
+        * @return A new {@link BasicLongHeader} object.
+        */
+       public static BasicLongHeader of(String name, Object value) {
+               return new BasicLongHeader(name, value);
+       }
+
+       /**
         * Constructor.
         *
         * @param name The HTTP header name.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicNameValuePair.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicNameValuePair.java
index c344723..df9191d 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicNameValuePair.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicNameValuePair.java
@@ -27,6 +27,17 @@ public class BasicNameValuePair implements NameValuePair {
        private Object value;
 
        /**
+        * Convenience creator.
+        *
+        * @param name The parameter name.
+        * @param value The parameter value.
+        * @return A new {@link BasicNameValuePair} object.
+        */
+       public static BasicNameValuePair of(String name, Object value) {
+               return new BasicNameValuePair(name, value);
+       }
+
+       /**
         * Constructor.
         *
         * @param name The parameter name.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicObjectHeader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicObjectHeader.java
index 3bbb85f..25edaf3 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicObjectHeader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicObjectHeader.java
@@ -25,6 +25,17 @@ public class BasicObjectHeader extends BasicHeader {
        private final Object value;
 
        /**
+        * Convenience creator.
+        *
+        * @param name The parameter name.
+        * @param value The parameter value.
+        * @return A new {@link BasicObjectHeader} object.
+        */
+       public static BasicObjectHeader of(String name, Object value) {
+               return new BasicObjectHeader(name, value);
+       }
+
+       /**
         * Constructor.
         *
         * @param name The HTTP header name.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicRangeArrayHeader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicRangeArrayHeader.java
index ec94bd8..239e9dd 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicRangeArrayHeader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicRangeArrayHeader.java
@@ -37,6 +37,17 @@ public class BasicRangeArrayHeader extends BasicHeader {
        private final List<StringRange> typeRangesList;
 
        /**
+        * Convenience creator.
+        *
+        * @param name The parameter name.
+        * @param value The parameter value.
+        * @return A new {@link BasicRangeArrayHeader} object.
+        */
+       public static BasicRangeArrayHeader of(String name, String value) {
+               return new BasicRangeArrayHeader(name, value);
+       }
+
+       /**
         * Constructor.
         *
         * @param name The HTTP header name.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicStringHeader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicStringHeader.java
index 1539def..c9eacbd 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicStringHeader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicStringHeader.java
@@ -32,6 +32,17 @@ public class BasicStringHeader extends BasicHeader {
        private static final long serialVersionUID = 1L;
 
        /**
+        * Convenience creator.
+        *
+        * @param name The parameter name.
+        * @param value The parameter value.
+        * @return A new {@link BasicStringHeader} object.
+        */
+       public static BasicStringHeader of(String name, String value) {
+               return new BasicStringHeader(name, value);
+       }
+
+       /**
         * Constructor
         *
         * @param name Header name.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicUriHeader.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicUriHeader.java
index f5eef7e..66ef59c 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicUriHeader.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/BasicUriHeader.java
@@ -36,6 +36,17 @@ public class BasicUriHeader extends BasicHeader {
        final String value;
 
        /**
+        * Convenience creator.
+        *
+        * @param name The parameter name.
+        * @param value The parameter value.
+        * @return A new {@link BasicUriHeader} object.
+        */
+       public static BasicUriHeader of(String name, String value) {
+               return new BasicUriHeader(name, value);
+       }
+
+       /**
         * Constructor.
         *
         * @param name The HTTP header name.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
index 616e3a7..ae54100 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
@@ -57,6 +57,94 @@ public class HttpPartSchema {
        /** Reusable instance of this object, all default settings. */
        public static final HttpPartSchema DEFAULT = 
HttpPartSchema.create().allowEmptyValue(true).build();
 
+       /** Boolean type */
+       public static final HttpPartSchema T_BOOLEAN = 
HttpPartSchema.tBoolean().build();
+
+       /** File type */
+       public static final HttpPartSchema T_FILE = 
HttpPartSchema.tFile().build();
+
+       /** Integer type */
+       public static final HttpPartSchema T_INTEGER = 
HttpPartSchema.tInteger().build();
+
+       /** Int32 type */
+       public static final HttpPartSchema T_INT32 = 
HttpPartSchema.tInt32().build();
+
+       /** Int64 type */
+       public static final HttpPartSchema T_INT64 = 
HttpPartSchema.tInt64().build();
+
+       /** No type */
+       public static final HttpPartSchema T_NONE = 
HttpPartSchema.tNone().build();
+
+       /** Number type */
+       public static final HttpPartSchema T_NUMBER = 
HttpPartSchema.tNumber().build();
+
+       /** Float type */
+       public static final HttpPartSchema T_FLOAT = 
HttpPartSchema.tFloat().build();
+
+       /** Double type */
+       public static final HttpPartSchema T_DOUBLE = 
HttpPartSchema.tDouble().build();
+
+       /** String type */
+       public static final HttpPartSchema T_STRING = 
HttpPartSchema.tString().build();
+
+       /** Byte type */
+       public static final HttpPartSchema T_BYTE = 
HttpPartSchema.tByte().build();
+
+       /** Binary type */
+       public static final HttpPartSchema T_BINARY = 
HttpPartSchema.tBinary().build();
+
+       /** Spaced binary type */
+       public static final HttpPartSchema T_BINARY_SPACED = 
HttpPartSchema.tBinarySpaced().build();
+
+       /** Date type */
+       public static final HttpPartSchema T_DATE = 
HttpPartSchema.tDate().build();
+
+       /** Date-time type */
+       public static final HttpPartSchema T_DATETIME = 
HttpPartSchema.tDateTime().build();
+
+       /** UON-formated simple type */
+       public static final HttpPartSchema T_UON = 
HttpPartSchema.tUon().build();
+
+       /** Array type */
+       public static final HttpPartSchema T_ARRAY = 
HttpPartSchema.tArray().build();
+
+       /** Comma-delimited array type */
+       public static final HttpPartSchema T_ARRAY_CSV = 
HttpPartSchema.tArrayCsv().build();
+
+       /** Pipe-delimited array type */
+       public static final HttpPartSchema T_ARRAY_PIPES = 
HttpPartSchema.tArrayPipes().build();
+
+       /** Space-delimited array type */
+       public static final HttpPartSchema T_ARRAY_SSV = 
HttpPartSchema.tArraySsv().build();
+
+       /** Tab-delimited array type */
+       public static final HttpPartSchema T_ARRAY_TSV = 
HttpPartSchema.tArrayTsv().build();
+
+       /** UON-formatted array type */
+       public static final HttpPartSchema T_ARRAY_UON = 
HttpPartSchema.tArrayUon().build();
+
+       /** Multi-part array type */
+       public static final HttpPartSchema T_ARRAY_MULTI = 
HttpPartSchema.tArrayMulti().build();
+
+       /** Object type */
+       public static final HttpPartSchema T_OBJECT = 
HttpPartSchema.tObject().build();
+
+       /** Comma-delimited object type */
+       public static final HttpPartSchema T_OBJECT_CSV = 
HttpPartSchema.tObjectCsv().build();
+
+       /** Pipe-delimited object type */
+       public static final HttpPartSchema T_OBJECT_PIPES = 
HttpPartSchema.tObjectPipes().build();
+
+       /** Space-delimited object type */
+       public static final HttpPartSchema T_OBJECT_SSV = 
HttpPartSchema.tObjectSsv().build();
+
+       /** Tab-delimited object type */
+       public static final HttpPartSchema T_OBJECT_TSV = 
HttpPartSchema.tObjectTsv().build();
+
+       /** UON-formated object type */
+       public static final HttpPartSchema T_OBJECT_UON = 
HttpPartSchema.tObjectUon().build();
+
+
        final String name;
        final Set<Integer> codes;
        final String _default;
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 e24f347..463e5dd 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
@@ -78,7 +78,7 @@ public abstract class SerializerSession extends 
BeanTraverseSession {
                this.ctx = ctx;
                args = args == null ? SerializerSessionArgs.DEFAULT : args;
                this.javaMethod = args.javaMethod;
-               this.uriResolver = new UriResolver(ctx.getUriResolution(), 
ctx.getUriRelativity(), getProperty(SERIALIZER_uriContext, UriContext.class, 
ctx.getUriContext()));
+               this.uriResolver = UriResolver.of(ctx.getUriResolution(), 
ctx.getUriRelativity(), getProperty(SERIALIZER_uriContext, UriContext.class, 
ctx.getUriContext()));
                this.listener = castOrCreate(SerializerListener.class, 
ctx.getListener());
                this.vrs = args.resolver;
        }
diff --git 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java
 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java
index 30a443a..d94c0e3 100644
--- 
a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java
+++ 
b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java
@@ -470,11 +470,11 @@ public class RestClientTest {
                MockRestClient
                        .create(A.class)
                        .simpleJson()
-                       .header(new BasicObjectHeader("Foo", "bar"))
+                       .header(BasicObjectHeader.of("Foo", "bar"))
                        .header("Check", "Foo")
                        .build()
                        .get("/checkHeader")
-                       .header(new BasicObjectHeader("Foo", "baz"))
+                       .header(BasicObjectHeader.of("Foo", "baz"))
                        .run()
                        .assertBody().is("['bar','baz']");
        }
@@ -568,11 +568,11 @@ public class RestClientTest {
                MockRestClient
                        .create(A.class)
                        .simpleJson()
-                       .headers(new BasicObjectHeader("Foo", "bar"))
+                       .headers(BasicObjectHeader.of("Foo", "bar"))
                        .header("Check", "Foo")
                        .build()
                        .get("/checkHeader")
-                       .headers(new BasicObjectHeader("Foo", "baz"))
+                       .headers(BasicObjectHeader.of("Foo", "baz"))
                        .run()
                        .assertBody().is("['bar','baz']");
        }
@@ -709,6 +709,19 @@ public class RestClientTest {
        }
 
        @Test
+       public void f23a_headers_contentEncoding() throws Exception {
+               MockRestClient
+                       .create(A.class)
+                       .simpleJson()
+                       .contentEncoding("identity")
+                       .header("Check", "Content-Encoding")
+                       .build()
+                       .get("/checkHeader")
+                       .run()
+                       .assertBody().is("['identity']");
+       }
+
+       @Test
        public void f24_headers_date() throws Exception {
                MockRestClient
                        .create(A.class)
@@ -947,7 +960,7 @@ public class RestClientTest {
                MockRestClient
                        .create(A.class)
                        .simpleJson()
-                       .userAgent("foo")
+                       .userAgent(new StringBuilder("foo"))
                        .header("Check", "User-Agent")
                        .build()
                        .get("/checkHeader")
@@ -1571,6 +1584,58 @@ public class RestClientTest {
                        .assertBody().is("['x{f:1}','x{f:1}']");
        }
 
+       @Test
+       public void h08_headers_withSchema() throws Exception {
+               MockRestClient
+                       .create(A.class)
+                       .simpleJson()
+                       .header("Foo", AList.of("bar","baz"), 
HttpPartSchema.T_ARRAY_CSV)
+                       .header("Check", "Foo")
+                       .build()
+                       .get("/checkHeader")
+                       .run()
+                       .assertBody().is("['bar,baz']");
+       }
+
+       @Test
+       public void h09_headers_nullHeader() throws Exception {
+               MockRestClient
+                       .create(A.class)
+                       .simpleJson()
+                       .headers(BasicStringHeader.of("Foo", "bar"), null)
+                       .header("Check", "Foo")
+                       .build()
+                       .get("/checkHeader")
+                       .run()
+                       .assertBody().is("['bar']");
+       }
+
+       @Test
+       public void h10_headers_invalidHeader() throws Exception {
+               try {
+                       MockRestClient
+                               .create(A.class)
+                               .simpleJson()
+                               .headers("Foo");
+                       fail("Exception expected");
+               } catch (RuntimeException e) {
+                       assertEquals("Invalid type passed to 
headers(Object...):  java.lang.String", e.getLocalizedMessage());
+               }
+       }
+
+       @Test
+       public void h10_headers_invalidHeaderPairs() throws Exception {
+               try {
+                       MockRestClient
+                               .create(A.class)
+                               .simpleJson()
+                               .headerPairs("Foo");
+                       fail("Exception expected");
+               } catch (RuntimeException e) {
+                       assertEquals("Odd number of parameters passed into 
headerPairs(Object...)", e.getLocalizedMessage());
+               }
+       }
+
        
//-----------------------------------------------------------------------------------------------------------------
        // Query
        
//-----------------------------------------------------------------------------------------------------------------
@@ -1593,17 +1658,54 @@ public class RestClientTest {
                MockRestClient
                        .create(A.class)
                        .simpleJson()
-                       .query(new BasicNameValuePair("Foo","f1"))
+                       .query(BasicNameValuePair.of("Foo","f1"))
                        .query(OMap.of("Foo","f2"))
                        .query(AMap.of("Foo","f3"))
                        .query(NameValuePairs.of("Foo","f4","Foo","f5"))
-                       .query(new BasicNameValuePair("Foo","f6"), new 
BasicNameValuePair("Foo","f7"))
+                       .query(BasicNameValuePair.of("Foo","f6"), 
BasicNameValuePair.of("Foo","f7"))
                        .build()
                        .get("/checkQuery")
                        .run()
                        
.assertBody().is("Foo=f1&Foo=f2&Foo=f3&Foo=f4&Foo=f5&Foo=f6&Foo=f7");
        }
 
+       @Test
+       public void i03_query_withSchema() throws Exception {
+               MockRestClient
+                       .create(A.class)
+                       .simpleJson()
+                       .query("Foo",AList.of("bar","baz"), 
HttpPartSchema.T_ARRAY_PIPES)
+                       .build()
+                       .get("/checkQuery")
+                       .run()
+                       .assertBody().is("Foo=bar%7Cbaz");
+       }
+
+       @Test
+       public void i04_query_withNull() throws Exception {
+               MockRestClient
+                       .create(A.class)
+                       .simpleJson()
+                       .query(BasicNameValuePair.of("Foo","bar"), null)
+                       .build()
+                       .get("/checkQuery")
+                       .run()
+                       .assertBody().is("Foo=bar");
+       }
+
+       @Test
+       public void i05_query_invalid() throws Exception {
+               try {
+                       MockRestClient
+                               .create(A.class)
+                               .simpleJson()
+                               .query(BasicNameValuePair.of("Foo","bar"), 
"Baz");
+                       fail();
+               } catch (Exception e) {
+                       assertEquals("Invalid type passed to query(Object...):  
java.lang.String", e.getMessage());
+               }
+       }
+
        
//-----------------------------------------------------------------------------------------------------------------
        // Form data
        
//-----------------------------------------------------------------------------------------------------------------
@@ -1625,17 +1727,54 @@ public class RestClientTest {
                MockRestClient
                        .create(A.class)
                        .simpleJson()
-                       .formData(new BasicNameValuePair("Foo","f1"))
+                       .formData(BasicNameValuePair.of("Foo","f1"))
                        .formData(OMap.of("Foo","f2"))
                        .formData(AMap.of("Foo","f3"))
                        .formData(NameValuePairs.of("Foo","f4","Foo","f5"))
-                       .formData(new BasicNameValuePair("Foo","f6"), new 
BasicNameValuePair("Foo","f7"))
+                       .formData(BasicNameValuePair.of("Foo","f6"), 
BasicNameValuePair.of("Foo","f7"))
                        .build()
                        .post("/checkFormData")
                        .run()
                        
.assertBody().is("Foo=f1&Foo=f2&Foo=f3&Foo=f4&Foo=f5&Foo=f6&Foo=f7");
        }
 
+       @Test
+       public void j03_formData_withSchema() throws Exception {
+               MockRestClient
+                       .create(A.class)
+                       .simpleJson()
+                       .formData("Foo",AList.of("bar","baz"), 
HttpPartSchema.T_ARRAY_PIPES)
+                       .build()
+                       .post("/checkFormData")
+                       .run()
+                       .assertBody().is("Foo=bar%7Cbaz");
+       }
+
+       @Test
+       public void j04_formData_withNull() throws Exception {
+               MockRestClient
+                       .create(A.class)
+                       .simpleJson()
+                       .formData(BasicNameValuePair.of("Foo","bar"), null)
+                       .build()
+                       .post("/checkFormData")
+                       .run()
+                       .assertBody().is("Foo=bar");
+       }
+
+       @Test
+       public void j05_formData_invalid() throws Exception {
+               try {
+                       MockRestClient
+                               .create(A.class)
+                               .simpleJson()
+                               .formData(BasicNameValuePair.of("Foo","bar"), 
"Baz");
+                       fail();
+               } catch (Exception e) {
+                       assertEquals("Invalid type passed to 
formData(Object...):  java.lang.String", e.getMessage());
+               }
+       }
+
        
//-----------------------------------------------------------------------------------------------------------------
        // RestClient properties
        
//-----------------------------------------------------------------------------------------------------------------
@@ -2329,7 +2468,7 @@ public class RestClientTest {
                        .simpleJson()
                        .uriResolution(UriResolution.ABSOLUTE)
                        .uriRelativity(UriRelativity.PATH_INFO)
-                       .uriContext(new UriContext("http://localhost:80";, 
"/context", "/resource", "/path"))
+                       .uriContext(UriContext.of("http://localhost:80";, 
"/context", "/resource", "/path"))
                        .build()
                        .post("/echoBody", x)
                        .run()
@@ -2340,7 +2479,7 @@ public class RestClientTest {
                        .simpleJson()
                        .uriResolution(UriResolution.NONE)
                        .uriRelativity(UriRelativity.RESOURCE)
-                       .uriContext(new UriContext("http://localhost:80";, 
"/context", "/resource", "/path"))
+                       .uriContext(UriContext.of("http://localhost:80";, 
"/context", "/resource", "/path"))
                        .build()
                        .post("/echoBody", x)
                        .run()
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestRequest.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestRequest.java
index 0222021..d6647ef 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestRequest.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestRequest.java
@@ -943,6 +943,36 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
        /**
         * Replaces a path parameter of the form <js>"{name}"</js> in the URL.
         *
+        * <p>
+        * The optional schema allows for specifying how part should be 
serialized (as a pipe-delimited list for example).
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        * <jc>// Creates path "/bar|baz"</jc>
+        *      client
+        *              .get(<js>"/{foo}"</js>)
+        *              .path(<js>"foo"</js>, 
AList.<jsm>of</jsm>(<js>"bar"</js>,<js>"baz"</js>), 
HttpPartSchema.<jsf>T_ARRAY_PIPES</jsf>)
+        *              .run();
+        * </p>
+        *
+        * @param name The parameter name.
+        * @param value The parameter value.
+        *      <ul>
+        *              <li>Can be any POJO.
+        *              <li>Converted to a string using the specified part 
serializer.
+        *              <li>Values are converted to strings at runtime to allow 
them to be modified externally.
+        *      </ul>
+        * @param schema The part schema.  Can be <jk>null</jk>.
+        * @return This object (for method chaining).
+        * @throws RestCallException Invalid input.
+        */
+       public RestRequest path(String name, Object value, HttpPartSchema 
schema) throws RestCallException {
+               return path(name, value, null, schema);
+       }
+
+       /**
+        * Replaces a path parameter of the form <js>"{name}"</js> in the URL.
+        *
         * <h5 class='section'>Example:</h5>
         * <p class='bcode w800'>
         *      client
@@ -1242,6 +1272,59 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
        /**
         * Adds a query parameter to the URI.
         *
+        * <p>
+        * The optional schema allows for specifying how part should be 
serialized (as a pipe-delimited list for example).
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      <jc>// Creates query parameter "foo=bar|baz"</jc>
+        *      client
+        *              .get(<jsf>URL</jsf>)
+        *              .query(<js>"foo"</js>, 
AList.<jsm>of</jsm>(<js>"bar"</js>,<js>"baz"</js>), 
HttpPartSchema.<jsf>T_ARRAY_PIPES</jsf>)
+        *              .run();
+        * </p>
+        *
+        * @param name The parameter name.
+        *      <ul>
+        *              <li>If the name is <js>"*"</js>, the value is assumed 
to be a collection of parameters.
+        *      </ul>
+        * @param value The parameter value.
+        *      <ul>
+        *              <li>For single value parameters:
+        *              <ul>
+        *                      <li>Can be any POJO.
+        *                      <li>Converted to a string using the specified 
part serializer.
+        *                      <li>Values are converted to strings at runtime 
to allow them to be modified externally.
+        *              </ul>
+        *              <li>For multi-value parameters:
+        *              <ul>
+        *                      <li>{@link Map} / {@link OMap} / bean
+        *                      <ul>
+        *                              <li>Values can be any POJO.
+        *                              <li>Values converted to a string using 
the configured part serializer.
+        *                              <li>Values are converted to strings at 
runtime to allow them to be modified externally.
+        *                      </ul>
+        *                      <li>{@link NameValuePairs}
+        *                      <ul>
+        *                              <li>Values converted directly to 
strings.
+        *                      </ul>
+        *                      <li>{@link Reader} / {@link InputStream} / 
{@link CharSequence}
+        *                      <ul>
+        *                              <li>Sets the entire query string to the 
contents of the input.
+        *                      </ul>
+        *              </ul>
+        *      </ul>
+        * @param schema The HTTP part schema.  Can be <jk>null</jk>.
+        * @return This object (for method chaining).
+        * @throws RestCallException Invalid input.
+        */
+       public RestRequest query(String name, Object value, HttpPartSchema 
schema) throws RestCallException {
+               return query(DEFAULT_FLAGS, name, value, partSerializer, 
schema);
+       }
+
+       /**
+        * Adds a query parameter to the URI.
+        *
         * <h5 class='section'>Example:</h5>
         * <p class='bcode w800'>
         *      client
@@ -1619,6 +1702,59 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
        /**
         * Adds a form-data parameter to the request body.
         *
+        * <p>
+        * The optional schema allows for specifying how part should be 
serialized (as a pipe-delimited list for example).
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      <jc>// Creates form-data parameter "foo=bar|baz"</jc>
+        *      client
+        *              .formPost(<jsf>URL</jsf>)
+        *              .formData(<js>"foo"</js>, 
AList.<jsm>of</jsm>(<js>"bar"</js>,<js>"baz"</js>), 
HttpPartSchema.<jsf>T_ARRAY_PIPES</jsf>)
+        *              .run();
+        * </p>
+        *
+        * @param name The parameter name.
+        *      <ul>
+        *              <li>If the name is <js>"*"</js>, the value is assumed 
to be a collection of parameters.
+        *      </ul>
+        * @param value The parameter value.
+        *      <ul>
+        *              <li>For single value parameters:
+        *              <ul>
+        *                      <li>Can be any POJO.
+        *                      <li>Converted to a string using the specified 
part serializer.
+        *                      <li>Values are converted to strings at runtime 
to allow them to be modified externally.
+        *              </ul>
+        *              <li>For multi-value parameters:
+        *              <ul>
+        *                      <li>{@link Map} / {@link OMap} / bean
+        *                      <ul>
+        *                              <li>Values can be any POJO.
+        *                              <li>Values converted to a string using 
the configured part serializer.
+        *                              <li>Values are converted to strings at 
runtime to allow them to be modified externally.
+        *                      </ul>
+        *                      <li>{@link NameValuePairs}
+        *                      <ul>
+        *                              <li>Values converted directly to 
strings.
+        *                      </ul>
+        *                      <li>{@link Reader} / {@link InputStream} / 
{@link CharSequence}
+        *                      <ul>
+        *                              <li>Sets the entire query string to the 
contents of the input.
+        *                      </ul>
+        *              </ul>
+        *      </ul>
+        * @param schema The HTTP part schema.  Can be <jk>null</jk>.
+        * @return This object (for method chaining).
+        * @throws RestCallException Invalid input.
+        */
+       public RestRequest formData(String name, Object value, HttpPartSchema 
schema) throws RestCallException {
+               return formData(DEFAULT_FLAGS, name, value, partSerializer, 
schema);
+       }
+
+       /**
+        * Adds a form-data parameter to the request body.
+        *
         * <h5 class='section'>Example:</h5>
         * <p class='bcode w800'>
         *      client
@@ -2090,6 +2226,55 @@ public class RestRequest extends BeanSession implements 
HttpUriRequest, Configur
        }
 
        /**
+        * Appends a header on the request.
+        *
+        * <p>
+        * The optional schema allows for specifying how part should be 
serialized (as a pipe-delimited list for example).
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode w800'>
+        *      <jc>// Creates header "Foo=bar|baz"</jc>
+        *      client
+        *              .get(<jsf>URL</jsf>)
+        *              .header(<js>"Foo"</js>, 
AList.<jsm>of</jsm>(<js>"bar"</js>,<js>"baz"</js>), 
HttpPartSchema.<jsf>T_ARRAY_PIPES</jsf>)
+        *              .run();
+        * </p>
+        *
+        * @param name The header name.
+        *      <ul>
+        *              <li>If the name is <js>"*"</js>, the value is assumed 
to be a collection of headers.
+        *      </ul>
+        * @param value The header value.
+        *      <ul>
+        *              <li>For single value headers:
+        *              <ul>
+        *                      <li>Can be any POJO.
+        *                      <li>Converted to a string using the specified 
part serializer.
+        *                      <li>Values are converted to strings at runtime 
to allow them to be modified externally.
+        *              </ul>
+        *              <li>For multi-value headers:
+        *              <ul>
+        *                      <li>{@link Map} / {@link OMap} / bean
+        *                      <ul>
+        *                              <li>Values can be any POJO.
+        *                              <li>Values converted to a string using 
the configured part serializer.
+        *                              <li>Values are converted to strings at 
runtime to allow them to be modified externally.
+        *                      </ul>
+        *                      <li>{@link NameValuePairs}
+        *                      <ul>
+        *                              <li>Values converted directly to 
strings.
+        *                      </ul>
+        *              </ul>
+        *      </ul>
+        * @param schema The HTTP part schema.  Can be <jk>null</jk>.
+        * @return This object (for method chaining).
+        * @throws RestCallException Invalid input.
+        */
+       public RestRequest header(String name, Object value, HttpPartSchema 
schema) throws RestCallException {
+               return header(DEFAULT_FLAGS, name, value, partSerializer, 
schema);
+       }
+
+       /**
         * Sets a header on the request.
         *
         * <h5 class='section'>Example:</h5>
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseHeader.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseHeader.java
index d7d455d..c6de2bc 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseHeader.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponseHeader.java
@@ -164,7 +164,7 @@ public class RestResponseHeader implements Header {
         * @return The value of this header as a CSV array header, never 
<jk>null</jk>.
         */
        public BasicCsvArrayHeader asCsvArrayHeader() {
-               return new BasicCsvArrayHeader(getName(), getValue());
+               return BasicCsvArrayHeader.of(getName(), getValue());
        }
 
        /**
@@ -173,7 +173,7 @@ public class RestResponseHeader implements Header {
         * @return The value of this header as a date header, never 
<jk>null</jk>.
         */
        public BasicDateHeader asDateHeader() {
-               return new BasicDateHeader(getName(), getValue());
+               return BasicDateHeader.of(getName(), getValue());
        }
 
        /**
@@ -182,7 +182,7 @@ public class RestResponseHeader implements Header {
         * @return The value of this header as an entity validator array 
header, never <jk>null</jk>.
         */
        public BasicEntityValidatorArrayHeader asEntityValidatorArrayHeader() {
-               return new BasicEntityValidatorArrayHeader(getName(), 
getValue());
+               return BasicEntityValidatorArrayHeader.of(getName(), 
getValue());
        }
 
        /**
@@ -191,7 +191,7 @@ public class RestResponseHeader implements Header {
         * @return The value of this header as an integer header, never 
<jk>null</jk>.
         */
        public BasicIntegerHeader asIntegerHeader() {
-               return new BasicIntegerHeader(getName(), getValue());
+               return BasicIntegerHeader.of(getName(), getValue());
        }
 
        /**
@@ -200,7 +200,7 @@ public class RestResponseHeader implements Header {
         * @return The value of this header as a long header, never 
<jk>null</jk>.
         */
        public BasicLongHeader asLongHeader() {
-               return new BasicLongHeader(getName(), getValue());
+               return BasicLongHeader.of(getName(), getValue());
        }
 
        /**
@@ -209,7 +209,7 @@ public class RestResponseHeader implements Header {
         * @return The value of this header as a range array header, never 
<jk>null</jk>.
         */
        public BasicRangeArrayHeader asRangeArrayHeader() {
-               return new BasicRangeArrayHeader(getName(), getValue());
+               return BasicRangeArrayHeader.of(getName(), getValue());
        }
 
        /**
@@ -218,7 +218,7 @@ public class RestResponseHeader implements Header {
         * @return The value of this header as a string header, never 
<jk>null</jk>.
         */
        public BasicStringHeader asStringHeader() {
-               return new BasicStringHeader(getName(), getValue());
+               return BasicStringHeader.of(getName(), getValue());
        }
 
        /**
@@ -227,7 +227,7 @@ public class RestResponseHeader implements Header {
         * @return The value of this header as a URI header, never 
<jk>null</jk>.
         */
        public BasicUriHeader asUriHeader() {
-               return new BasicUriHeader(getName(), getValue());
+               return BasicUriHeader.of(getName(), getValue());
        }
 
        /**
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
index ac1cd3d..aa62d64 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
@@ -882,7 +882,7 @@ public final class RestRequest extends 
HttpServletRequestWrapper {
         */
        public UriContext getUriContext() {
                if (uriContext == null)
-                       uriContext = new UriContext(getAuthorityPath(), 
getContextPath(), getServletPath(), 
StringUtils.urlEncodePath(super.getPathInfo()));
+                       uriContext = UriContext.of(getAuthorityPath(), 
getContextPath(), getServletPath(), 
StringUtils.urlEncodePath(super.getPathInfo()));
                return uriContext;
        }
 
@@ -894,7 +894,7 @@ public final class RestRequest extends 
HttpServletRequestWrapper {
         * @return The URI resolver for this request.
         */
        public UriResolver getUriResolver(UriResolution resolution, 
UriRelativity relativity) {
-               return new UriResolver(resolution, relativity, getUriContext());
+               return UriResolver.of(resolution, relativity, getUriContext());
        }
 
        /**
@@ -904,7 +904,7 @@ public final class RestRequest extends 
HttpServletRequestWrapper {
         * @return The URI resolver for this request.
         */
        public UriResolver getUriResolver() {
-               return new UriResolver(context.getUriResolution(), 
context.getUriRelativity(), getUriContext());
+               return UriResolver.of(context.getUriResolution(), 
context.getUriRelativity(), getUriContext());
        }
 
        /**

Reply via email to