You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2020/04/02 23:05:21 UTC

[juneau] branch master updated: Move to using part parser sessions for efficiency.

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 6afee4d  Move to using part parser sessions for efficiency.
6afee4d is described below

commit 6afee4d6111257337be7b825ca44651156aa6d73
Author: JamesBognar <ja...@apache.org>
AuthorDate: Thu Apr 2 19:05:04 2020 -0400

    Move to using part parser sessions for efficiency.
---
 .../java/org/apache/juneau/httppart/HttpPart.java  | 20 +++++-----------
 .../apache/juneau/httppart/SimplePartParser.java   |  4 ++++
 .../httppart/bean/RequestBeanPropertyMeta.java     | 22 +++++++++++++++++
 .../httppart/bean/ResponseBeanPropertyMeta.java    | 22 +++++++++++++++++
 .../juneau/rest/client2/RestClientBuilderTest.java |  2 +-
 .../juneau/rest/client/remote/RemoteMethodArg.java | 11 +++++++++
 .../org/apache/juneau/rest/client2/RestClient.java | 28 ++++++++++++----------
 .../juneau/rest/client2/RestClientUtils.java       | 12 +++++-----
 .../apache/juneau/rest/client2/RestRequest.java    | 12 +++++-----
 .../apache/juneau/rest/client2/RestResponse.java   |  9 ++++---
 .../juneau/rest/client2/RestResponseHeader.java    |  8 +++----
 .../juneau/rest/client2/ext/NameValuePairs.java    |  2 +-
 .../juneau/rest/client2/ext/SerializedHeader.java  | 12 +++++-----
 .../rest/client2/ext/SerializedNameValuePair.java  | 22 +++++++++++++----
 .../org/apache/juneau/rest/RequestFormData.java    | 24 +++++++++----------
 .../org/apache/juneau/rest/RequestHeaders.java     | 16 ++++++-------
 .../java/org/apache/juneau/rest/RequestPath.java   | 14 +++++------
 .../java/org/apache/juneau/rest/RequestQuery.java  | 22 ++++++++---------
 .../org/apache/juneau/rest/RestParamDefaults.java  | 20 +++++++++-------
 .../java/org/apache/juneau/rest/RestRequest.java   | 22 ++++++++++-------
 .../juneau/rest/reshandlers/DefaultHandler.java    |  4 ++--
 21 files changed, 190 insertions(+), 118 deletions(-)

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPart.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPart.java
index c1000a7..0ea76bd 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPart.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPart.java
@@ -27,10 +27,8 @@ public class HttpPart {
 	private final String spart;
 	private final HttpPartType partType;
 	private final HttpPartSchema schema;
-	private final HttpPartSerializer serializer;
-	private final HttpPartParser parser;
-	private final SerializerSessionArgs sargs;
-	private final ParserSessionArgs pargs;
+	private final HttpPartSerializerSession serializer;
+	private final HttpPartParserSession parser;
 
 	/**
 	 * Constructor.
@@ -42,19 +40,16 @@ public class HttpPart {
 	 * @param partType The HTTP part type.
 	 * @param schema Schema information about the part.
 	 * @param serializer The part serializer to use to serialize the part.
-	 * @param args Session arguments to pass to the serializer.
 	 * @param part The part POJO being serialized.
 	 */
-	public HttpPart(String name, HttpPartType partType, HttpPartSchema schema, HttpPartSerializer serializer, SerializerSessionArgs args, Object part) {
+	public HttpPart(String name, HttpPartType partType, HttpPartSchema schema, HttpPartSerializerSession serializer, Object part) {
 		this.name = name;
 		this.partType = partType;
 		this.schema = schema;
 		this.serializer = serializer;
-		this.sargs = args;
 		this.opart = part;
 		this.spart = null;
 		this.parser = null;
-		this.pargs = null;
 	}
 
 	/**
@@ -67,18 +62,15 @@ public class HttpPart {
 	 * @param partType The HTTP part type.
 	 * @param schema Schema information about the part.
 	 * @param parser The part parser to use to parse the part.
-	 * @param args Session arguments to pass to the parser.
 	 * @param part The part string being parsed.
 	 */
-	public HttpPart(String name, HttpPartType partType, HttpPartSchema schema, HttpPartParser parser, ParserSessionArgs args, String part) {
+	public HttpPart(String name, HttpPartType partType, HttpPartSchema schema, HttpPartParserSession parser, String part) {
 		this.name = name;
 		this.partType = partType;
 		this.schema = schema;
 		this.parser = parser;
-		this.pargs = args;
 		this.spart = part;
 		this.serializer = null;
-		this.sargs = null;
 		this.opart = null;
 	}
 
@@ -101,7 +93,7 @@ public class HttpPart {
 	public String asString() throws SchemaValidationException, SerializeException {
 		if (spart != null)
 			return spart;
-		return serializer.createPartSession(sargs).serialize(partType, schema, opart);
+		return serializer.serialize(partType, schema, opart);
 	}
 
 	/**
@@ -113,6 +105,6 @@ public class HttpPart {
 	 * @throws ParseException Malformed input encountered.
 	 */
 	public <T> T asType(Class<T> c) throws SchemaValidationException, ParseException {
-		return parser.createPartSession(pargs).parse(partType, schema, spart, parser.getClassMeta(c));
+		return parser.parse(partType, schema, spart, c);
 	}
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartParser.java
index fc37a2d..b47cf12 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartParser.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartParser.java
@@ -47,6 +47,10 @@ public class SimplePartParser extends BaseHttpPartParser {
 	/** Reusable instance of {@link SimplePartParser}, all default settings. */
 	public static final SimplePartParser DEFAULT = new SimplePartParser();
 
+	/** Reusable instance of {@link SimplePartParser}, all default settings. */
+	public static final SimplePartParserSession DEFAULT_SESSION = DEFAULT.createPartSession(null);
+
+
 	//-------------------------------------------------------------------------------------------------------------------
 	// Instance
 	//-------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanPropertyMeta.java
index 7b180c4..fcd0327 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanPropertyMeta.java
@@ -115,21 +115,43 @@ public class RequestBeanPropertyMeta {
 	 * @param _default The default serializer to use if not defined on the annotation.
 	 * @return The serializer to use for serializing the bean property value.
 	 */
+	@Deprecated
 	public HttpPartSerializer getSerializer(HttpPartSerializer _default) {
 		return serializer == null ? _default : serializer;
 	}
 
 	/**
+	 * Returns the serializer to use for serializing the bean property value.
+	 *
+	 * @param _default The default serializer to use if not defined on the annotation.
+	 * @return The serializer to use for serializing the bean property value.
+	 */
+	public HttpPartSerializerSession getSerializer(HttpPartSerializerSession _default) {
+		return serializer == null ? _default : serializer.createPartSession(null);
+	}
+
+	/**
 	 * Returns the parser to use for parsing the bean property value.
 	 *
 	 * @param _default The default parsing to use if not defined on the annotation.
 	 * @return The parsing to use for serializing the bean property value.
 	 */
+	@Deprecated
 	public HttpPartParser getParser(HttpPartParser _default) {
 		return parser == null ? _default : parser;
 	}
 
 	/**
+	 * Returns the parser to use for parsing the bean property value.
+	 *
+	 * @param _default The default parsing to use if not defined on the annotation.
+	 * @return The parsing to use for serializing the bean property value.
+	 */
+	public HttpPartParserSession getParser(HttpPartParserSession _default) {
+		return parser == null ? _default : parser.createPartSession(null);
+	}
+
+	/**
 	 * Returns the schema information gathered from annotations on the method and return type.
 	 *
 	 * @return
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanPropertyMeta.java
index 6ac33fc..b71c8c0 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanPropertyMeta.java
@@ -121,21 +121,43 @@ public class ResponseBeanPropertyMeta {
 	 * @param _default The default serializer to use if not defined on the annotation.
 	 * @return The serializer to use for serializing the bean property value.
 	 */
+	@Deprecated
 	public HttpPartSerializer getSerializer(HttpPartSerializer _default) {
 		return serializer == null ? _default : serializer;
 	}
 
 	/**
+	 * Returns the serializer to use for serializing the bean property value.
+	 *
+	 * @param _default The default serializer to use if not defined on the annotation.
+	 * @return The serializer to use for serializing the bean property value.
+	 */
+	public HttpPartSerializerSession getSerializer(HttpPartSerializerSession _default) {
+		return serializer == null ? _default : serializer.createPartSession(null);
+	}
+
+	/**
 	 * Returns the parser to use for parsing the bean property value.
 	 *
 	 * @param _default The default parser to use if not defined on the annotation.
 	 * @return The parser to use for parsing the bean property value.
 	 */
+	@Deprecated
 	public HttpPartParser getParser(HttpPartParser _default) {
 		return parser == null ? _default : parser;
 	}
 
 	/**
+	 * Returns the parser to use for parsing the bean property value.
+	 *
+	 * @param _default The default parser to use if not defined on the annotation.
+	 * @return The parser to use for parsing the bean property value.
+	 */
+	public HttpPartParserSession getParser(HttpPartParserSession _default) {
+		return parser == null ? _default : parser.createPartSession(null);
+	}
+
+	/**
 	 * Returns the schema information gathered from annotations on the method and return type.
 	 *
 	 * @return
diff --git a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientBuilderTest.java b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientBuilderTest.java
index 88f82a2..07d020f 100644
--- a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientBuilderTest.java
+++ b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientBuilderTest.java
@@ -1703,7 +1703,7 @@ public class RestClientBuilderTest {
 			.header("Check", "Foo")
 			.header("Foo", bean, new XPartSerializer(), null)
 			.build();
-		rc.get("/checkHeader").header(AddFlag.DEFAULT_FLAGS,"Foo",bean,new XPartSerializer(),null).run().getBody().assertValue("['x{f:1}','x{f:1}']");
+		rc.get("/checkHeader").header(AddFlag.DEFAULT_FLAGS,"Foo",bean,new XPartSerializer().createPartSession(null),null).run().getBody().assertValue("['x{f:1}','x{f:1}']");
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMethodArg.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMethodArg.java
index ad2a975..1e64aa6 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMethodArg.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMethodArg.java
@@ -93,11 +93,22 @@ public final class RemoteMethodArg {
 	 * @param _default The default serializer to use if the serializer was not defined via annotations.
 	 * @return The HTTP part serializer, or <jk>null</jk> if not specified.
 	 */
+	@Deprecated
 	public HttpPartSerializer getSerializer(HttpPartSerializer _default) {
 		return serializer == null ? _default : serializer;
 	}
 
 	/**
+	 * Returns the HTTP part serializer to use for serializing this part.
+	 *
+	 * @param _default The default serializer to use if the serializer was not defined via annotations.
+	 * @return The HTTP part serializer, or <jk>null</jk> if not specified.
+	 */
+	public HttpPartSerializerSession getSerializer(HttpPartSerializerSession _default) {
+		return serializer == null ? _default : serializer.createPartSession(null);
+	}
+
+	/**
 	 * Returns the HTTP part schema information about this part.
 	 *
 	 * @return The HTTP part schema information, or <jk>null</jk> if not found.
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClient.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClient.java
index 8ebcb6c..48646ac 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClient.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClient.java
@@ -317,7 +317,7 @@ import org.apache.http.client.CookieStore;
  * 	<ul>
  * 		<li class='jm'>{@link RestRequest#header(String,Object) header(String,Object)}
  * 		<li class='jm'>{@link RestRequest#header(EnumSet,String,Object) header(EnumSet&gt;AddFlag&gt;,String,Object)}
- * 		<li class='jm'>{@link RestRequest#header(EnumSet,String,Object,HttpPartSerializer,HttpPartSchema) header(EnumSet&gt;AddFlag&gt;,String,Object,HttpPartSerializer,HttpPartSchema)}
+ * 		<li class='jm'>{@link RestRequest#header(EnumSet,String,Object,HttpPartSerializerSession,HttpPartSchema) header(EnumSet&gt;AddFlag&gt;,String,Object,HttpPartSerializer,HttpPartSchema)}
  * 		<li class='jm'>{@link RestRequest#header(Object) header(Object)}
  * 		<li class='jm'>{@link RestRequest#header(EnumSet,Object) header(EnumSet&gt;AddFlag&gt;,Object)}
  * 		<li class='jm'>{@link RestRequest#headers(Object...) headers(Object...)}
@@ -408,7 +408,7 @@ import org.apache.http.client.CookieStore;
  * 	<ul>
  * 		<li class='jm'>{@link RestRequest#query(String,Object) query(String,Object)}
  * 		<li class='jm'>{@link RestRequest#query(EnumSet,String,Object) query(EnumSet&lt;AddFlag&gt;,String,Object)}
- * 		<li class='jm'>{@link RestRequest#query(EnumSet,String,Object,HttpPartSerializer,HttpPartSchema) query(EnumSet&lt;AddFlag&gt;,String,Object,HttpPartSerializer,HttpPartSchema)}
+ * 		<li class='jm'>{@link RestRequest#query(EnumSet,String,Object,HttpPartSerializerSession,HttpPartSchema) query(EnumSet&lt;AddFlag&gt;,String,Object,HttpPartSerializerSession,HttpPartSchema)}
  * 		<li class='jm'>{@link RestRequest#query(Object...) query(Object...)}
  * 		<li class='jm'>{@link RestRequest#query(EnumSet,Object...) query(EnumSet&lt;AddFlag&gt;,Object...)}
  * 		<li class='jm'>{@link RestRequest#queryPairs(Object...) queryPairs(Object...)}
@@ -448,7 +448,7 @@ import org.apache.http.client.CookieStore;
  * 	<ul>
  * 		<li class='jm'>{@link RestRequest#formData(String,Object) formData(String,Object)}
  * 		<li class='jm'>{@link RestRequest#formData(EnumSet,String,Object) formData(EnumSet&lt;AddFlag&gt;,String,Object)}
- * 		<li class='jm'>{@link RestRequest#formData(EnumSet,String,Object,HttpPartSerializer,HttpPartSchema) formData(EnumSet&lt;AddFlag&gt;,String,Object,HttpPartSerializer,HttpPartSchema)}
+ * 		<li class='jm'>{@link RestRequest#formData(EnumSet,String,Object,HttpPartSerializerSession,HttpPartSchema) formData(EnumSet&lt;AddFlag&gt;,String,Object,HttpPartSerializerSession,HttpPartSchema)}
  * 		<li class='jm'>{@link RestRequest#formData(Object...) formData(Object...)}
  * 		<li class='jm'>{@link RestRequest#formData(EnumSet,Object...) formData(EnumSet&lt;AddFlag&gt;,Object...)}
  * 		<li class='jm'>{@link RestRequest#formDataPairs(Object...) formDataPairs(Object...)}
@@ -1126,7 +1126,7 @@ public class RestClient extends BeanContext implements HttpClient, Closeable {
 	 * 			<ul>
 	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#formData(String,Object) formData(String,Object)}
 	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#formData(EnumSet,String,Object) formData(EnumSet&lt;AddFlag&gt;,String,Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#formData(EnumSet,String,Object,HttpPartSerializer,HttpPartSchema) formData(EnumSet&lt;AddFlag&gt;,String,Object,HttpPartSerializer,HttpPartSchema)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#formData(EnumSet,String,Object,HttpPartSerializerSession,HttpPartSchema) formData(EnumSet&lt;AddFlag&gt;,String,Object,HttpPartSerializerSession,HttpPartSchema)}
 	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#formData(Object...) formData(Object...)}
 	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#formData(EnumSet,Object...) formData(EnumSet&lt;AddFlag&gt;Object...)}
 	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#formDataPairs(Object...) formDataPairs(Object...)}
@@ -1195,7 +1195,7 @@ public class RestClient extends BeanContext implements HttpClient, Closeable {
 	 * 			<ul>
 	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#header(String,Object) header(String,Object)}
 	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#header(EnumSet,String,Object) header(EnumSet&gt;AddFlag&gt;,String,Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#header(EnumSet,String,Object,HttpPartSerializer,HttpPartSchema) header(EnumSet&gt;AddFlag&gt;,String,Object,HttpPartSerializer,HttpPartSchema)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#header(EnumSet,String,Object,HttpPartSerializerSession,HttpPartSchema) header(EnumSet&gt;AddFlag&gt;,String,Object,HttpPartSerializerSession,HttpPartSchema)}
 	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#header(Object) header(Object)}
 	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#header(EnumSet,Object) header(EnumSet&gt;AddFlag&gt;,Object)}
 	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#headers(Object...) headers(Object...)}
@@ -1424,7 +1424,7 @@ public class RestClient extends BeanContext implements HttpClient, Closeable {
 	 * 			<ul>
 	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#query(String,Object) query(String,Object)}
 	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#query(EnumSet,String,Object) query(EnumSet&lt;AddFlag&gt;,String,Object)}
-	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#query(EnumSet,String,Object,HttpPartSerializer,HttpPartSchema) query(EnumSet&lt;AddFlag&gt;,String,Object,HttpPartSerializer,HttpPartSchema)}
+	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#query(EnumSet,String,Object,HttpPartSerializerSession,HttpPartSchema) query(EnumSet&lt;AddFlag&gt;,String,Object,HttpPartSerializerSession,HttpPartSchema)}
 	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#query(Object...) query(Object...)}
 	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#query(EnumSet,Object...) query(EnumSet&lt;AddFlag&gt;,Object...)}
 	 * 				<li class='jm'>{@link org.apache.juneau.rest.client2.RestRequest#queryPairs(Object...) queryPairs(Object...)}
@@ -1579,7 +1579,9 @@ public class RestClient extends BeanContext implements HttpClient, Closeable {
 		this.partParser = getInstanceProperty(RESTCLIENT_partParser, HttpPartParser.class, OpenApiParser.class, ResourceResolver.FUZZY, ps);
 		this.executorService = getInstanceProperty(RESTCLIENT_executorService, ExecutorService.class, null);
 
-		Function<Object,Object> f = x -> x instanceof SerializedNameValuePair.Builder ? ((SerializedNameValuePair.Builder)x).serializer(partSerializer, false).build() : x;
+		HttpPartSerializerSession partSerializerSession = partSerializer.createPartSession(null);
+
+		Function<Object,Object> f = x -> x instanceof SerializedNameValuePair.Builder ? ((SerializedNameValuePair.Builder)x).serializer(partSerializerSession, false).build() : x;
 
 		this.headers = Collections.unmodifiableList(
 			getListProperty(RESTCLIENT_headers, Object.class)
@@ -2436,7 +2438,7 @@ public class RestClient extends BeanContext implements HttpClient, Closeable {
 							throw new RemoteMetadataException(interfaceClass, "Root URI has not been specified.  Cannot construct absolute path to remote resource.");
 
 						String httpMethod = rmm.getHttpMethod();
-						HttpPartSerializer s = getPartSerializer();
+						HttpPartSerializerSession s = getPartSerializerSession();
 
 						try {
 							RestRequest rc = request(httpMethod, url, hasContent(httpMethod));
@@ -2468,7 +2470,7 @@ public class RestClient extends BeanContext implements HttpClient, Closeable {
 										for (RequestBeanPropertyMeta p : rbm.getProperties()) {
 											Object val = p.getGetter().invoke(bean);
 											HttpPartType pt = p.getPartType();
-											HttpPartSerializer ps = p.getSerializer(s);
+											HttpPartSerializerSession ps = p.getSerializer(s);
 											String pn = p.getPartName();
 											HttpPartSchema schema = p.getSchema();
 											boolean sie = schema.isSkipIfEmpty();
@@ -2939,12 +2941,12 @@ public class RestClient extends BeanContext implements HttpClient, Closeable {
 	// Other methods.
 	//-----------------------------------------------------------------------------------------------------------------
 
-	HttpPartSerializer getPartSerializer() {
-		return partSerializer;
+	HttpPartSerializerSession getPartSerializerSession() {
+		return partSerializer == null ? null : partSerializer.createPartSession(null);
 	}
 
-	HttpPartParser getPartParser() {
-		return partParser;
+	HttpPartParserSession getPartParserSession() {
+		return partParser == null ? null : partParser.createPartSession(null);
 	}
 
 	private Pattern absUrlPattern = Pattern.compile("^\\w+\\:\\/\\/.*");
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClientUtils.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClientUtils.java
index e98df64..480fe3e 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClientUtils.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClientUtils.java
@@ -76,20 +76,20 @@ class RestClientUtils {
 		return l;
 	}
 
-	static Header toHeader(EnumSet<AddFlag> flags, String name, Object value, HttpPartSerializer serializer, HttpPartSchema schema) {
+	static Header toHeader(EnumSet<AddFlag> flags, String name, Object value, HttpPartSerializerSession serializer, HttpPartSchema schema) {
 		return new SerializedHeader(name, value, serializer, schema, flags.contains(SKIP_IF_EMPTY));
 	}
 
-	static NameValuePair toQuery(EnumSet<AddFlag> flags, String name, Object value, HttpPartSerializer serializer, HttpPartSchema schema) {
+	static NameValuePair toQuery(EnumSet<AddFlag> flags, String name, Object value, HttpPartSerializerSession serializer, HttpPartSchema schema) {
 		return new SerializedNameValuePair(name, value, QUERY,  serializer, schema, flags.contains(SKIP_IF_EMPTY));
 	}
 
-	static NameValuePair toFormData(EnumSet<AddFlag> flags, String name, Object value, HttpPartSerializer serializer, HttpPartSchema schema) {
+	static NameValuePair toFormData(EnumSet<AddFlag> flags, String name, Object value, HttpPartSerializerSession serializer, HttpPartSchema schema) {
 		return new SerializedNameValuePair(name, value, FORMDATA,  serializer, schema, flags.contains(SKIP_IF_EMPTY));
 	}
 
 	@SuppressWarnings("rawtypes")
-	static List<Header> toHeaders(EnumSet<AddFlag> flags, Map headers, HttpPartSerializer serializer, HttpPartSchema schema) {
+	static List<Header> toHeaders(EnumSet<AddFlag> flags, Map headers, HttpPartSerializerSession serializer, HttpPartSchema schema) {
 		List<Header> l = new ArrayList<>();
 		for (Map.Entry e : (Set<Map.Entry>)headers.entrySet())
 			l.add(new SerializedHeader(stringify(e.getKey()), e.getValue(), serializer, null, flags.contains(SKIP_IF_EMPTY)));
@@ -97,7 +97,7 @@ class RestClientUtils {
 	}
 
 	@SuppressWarnings("rawtypes")
-	static List<NameValuePair> toQuery(EnumSet<AddFlag> flags, Map params, HttpPartSerializer serializer, HttpPartSchema schema) {
+	static List<NameValuePair> toQuery(EnumSet<AddFlag> flags, Map params, HttpPartSerializerSession serializer, HttpPartSchema schema) {
 		List<NameValuePair> l = new ArrayList<>();
 		for (Map.Entry e : (Set<Map.Entry>)params.entrySet())
 			l.add(new SerializedNameValuePair(stringify(e.getKey()), e.getValue(), QUERY, serializer, null, flags.contains(SKIP_IF_EMPTY)));
@@ -105,7 +105,7 @@ class RestClientUtils {
 	}
 
 	@SuppressWarnings("rawtypes")
-	static List<NameValuePair> toFormData(EnumSet<AddFlag> flags, Map params, HttpPartSerializer serializer, HttpPartSchema schema) {
+	static List<NameValuePair> toFormData(EnumSet<AddFlag> flags, Map params, HttpPartSerializerSession serializer, HttpPartSchema schema) {
 		List<NameValuePair> l = new ArrayList<>();
 		for (Map.Entry e : (Set<Map.Entry>)params.entrySet())
 			l.add(new SerializedNameValuePair(stringify(e.getKey()), e.getValue(), FORMDATA, serializer, null, flags.contains(SKIP_IF_EMPTY)));
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 1ac9d7b..1b22123 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
@@ -72,7 +72,7 @@ public final class RestRequest extends BeanSession implements HttpUriRequest, Co
 	private boolean hasInput;                              // input() was called, even if it's setting 'null'.
 	private Serializer serializer;
 	private Parser parser;
-	private HttpPartSerializer partSerializer;
+	private HttpPartSerializerSession partSerializer;
 	private HttpPartSchema requestBodySchema;
 	private URIBuilder uriBuilder;
 	private NameValuePairs formData;
@@ -93,7 +93,7 @@ public final class RestRequest extends BeanSession implements HttpUriRequest, Co
 		this.client = client;
 		this.request = request;
 		this.errorCodes = client.errorCodes;
-		this.partSerializer = client.getPartSerializer();
+		this.partSerializer = client.getPartSerializerSession();
 		this.uriBuilder = new URIBuilder(uri);
 	}
 
@@ -394,7 +394,7 @@ public final class RestRequest extends BeanSession implements HttpUriRequest, Co
 	 * @throws RestCallException Error occurred.
 	 */
 	@SuppressWarnings("unchecked")
-	public RestRequest path(String name, Object value, HttpPartSerializer serializer, HttpPartSchema schema) throws RestCallException {
+	public RestRequest path(String name, Object value, HttpPartSerializerSession serializer, HttpPartSchema schema) throws RestCallException {
 		serializer = (serializer == null ? partSerializer : serializer);
 		boolean isMulti = isEmpty(name) || "*".equals(name) || value instanceof NameValuePairs;
 		if (! isMulti) {
@@ -673,7 +673,7 @@ public final class RestRequest extends BeanSession implements HttpUriRequest, Co
 	 * @throws RestCallException Invalid input.
 	 */
 	@SuppressWarnings("unchecked")
-	public RestRequest query(EnumSet<AddFlag> flags, String name, Object value, HttpPartSerializer serializer, HttpPartSchema schema) throws RestCallException {
+	public RestRequest query(EnumSet<AddFlag> flags, String name, Object value, HttpPartSerializerSession serializer, HttpPartSchema schema) throws RestCallException {
 		serializer = (serializer == null ? partSerializer : serializer);
 		flags = AddFlag.orDefault(flags);
 		boolean isMulti = isEmpty(name) || "*".equals(name) || value instanceof NameValuePairs;
@@ -1050,7 +1050,7 @@ public final class RestRequest extends BeanSession implements HttpUriRequest, Co
 	 * @throws RestCallException Invalid input.
 	 */
 	@SuppressWarnings("unchecked")
-	public RestRequest formData(EnumSet<AddFlag> flags, String name, Object value, HttpPartSerializer serializer, HttpPartSchema schema) throws RestCallException {
+	public RestRequest formData(EnumSet<AddFlag> flags, String name, Object value, HttpPartSerializerSession serializer, HttpPartSchema schema) throws RestCallException {
 		serializer = (serializer == null ? partSerializer : serializer);
 		flags = AddFlag.orDefault(flags);
 		boolean isMulti = isEmpty(name) || "*".equals(name) || value instanceof NameValuePairs;
@@ -1497,7 +1497,7 @@ public final class RestRequest extends BeanSession implements HttpUriRequest, Co
 	 * @throws RestCallException Invalid input.
 	 */
 	@SuppressWarnings("unchecked")
-	public RestRequest header(EnumSet<AddFlag> flags, String name, Object value, HttpPartSerializer serializer, HttpPartSchema schema) throws RestCallException {
+	public RestRequest header(EnumSet<AddFlag> flags, String name, Object value, HttpPartSerializerSession serializer, HttpPartSchema schema) throws RestCallException {
 		serializer = (serializer == null ? partSerializer : serializer);
 		flags = AddFlag.orDefault(flags);
 		boolean isMulti = isEmpty(name) || "*".equals(name) || value instanceof NameValuePairs;
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponse.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponse.java
index d90a674..3618bc4 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponse.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestResponse.java
@@ -12,7 +12,6 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest.client2;
 
-import org.apache.juneau.internal.*;
 import org.apache.juneau.parser.*;
 
 import static org.apache.juneau.httppart.HttpPartType.*;
@@ -47,7 +46,7 @@ public final class RestResponse implements HttpResponse {
 	private final RestRequest request;
 	private final HttpResponse response;
 	private final Parser parser;
-	private HttpPartParser partParser;
+	private HttpPartParserSession partParser;
 	private RestResponseBody responseBody;
 	private boolean isClosed;
 
@@ -64,7 +63,7 @@ public final class RestResponse implements HttpResponse {
 		this.parser = parser;
 		this.response = response == null ? new BasicHttpResponse(null, 0, null) : response;
 		this.responseBody = new RestResponseBody(client, request, this, parser);
-		this.partParser = client.getPartParser();
+		this.partParser = client.getPartParserSession();
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -238,7 +237,7 @@ public final class RestResponse implements HttpResponse {
 		try {
 			Class<T> c = (Class<T>)rbm.getClassMeta().getInnerClass();
 			final RestClient rc = this.client;
-			final HttpPartParser p = ObjectUtils.firstNonNull(partParser, rc.getPartParser());
+			final HttpPartParserSession p = partParser == null ? rc.getPartParserSession() : partParser;
 			return (T)Proxy.newProxyInstance(
 				c.getClassLoader(),
 				new Class[] { c },
@@ -247,7 +246,7 @@ public final class RestResponse implements HttpResponse {
 					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 						ResponseBeanPropertyMeta pm = rbm.getProperty(method.getName());
 						if (pm != null) {
-							HttpPartParser pp = pm.getParser(p);
+							HttpPartParserSession pp = pm.getParser(p);
 							HttpPartSchema schema = pm.getSchema();
 							String name = pm.getPartName();
 							ClassMeta<?> type = rc.getClassMeta(method.getGenericReturnType());
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 ce03208..0023f46 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
@@ -61,7 +61,7 @@ public class RestResponseHeader implements Header {
 	private final Header header;
 	private final RestRequest request;
 	private final RestResponse response;
-	private HttpPartParser parser;
+	private HttpPartParserSession parser;
 	private HttpPartSchema schema;
 
 	/**
@@ -108,8 +108,8 @@ public class RestResponseHeader implements Header {
 	 * 	<br>If <jk>null</jk>, {@link SimplePartParser#DEFAULT} will be used.
 	 * @return This object (for method chaining).
 	 */
-	public RestResponseHeader parser(HttpPartParser value) {
-		this.parser = value == null ? SimplePartParser.DEFAULT : value;
+	public RestResponseHeader parser(HttpPartParserSession value) {
+		this.parser = value == null ? SimplePartParser.DEFAULT_SESSION : value;
 		return this;
 	}
 
@@ -241,7 +241,7 @@ public class RestResponseHeader implements Header {
 	 */
 	public <T> T as(ClassMeta<T> type) throws RestCallException {
 		try {
-			return parser.createPartSession(null).parse(HEADER, schema, asString(), type);
+			return parser.parse(HEADER, schema, asString(), type);
 		} catch (ParseException e) {
 			throw new RestCallException(e);
 		}
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/ext/NameValuePairs.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/ext/NameValuePairs.java
index 43d8976..dcfa825 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/ext/NameValuePairs.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/ext/NameValuePairs.java
@@ -181,7 +181,7 @@ public final class NameValuePairs extends LinkedList<NameValuePair> {
 	 * @param skipIfEmpty If value is a blank string, the value should return as <jk>null</jk>.
 	 * @return This object (for method chaining).
 	 */
-	public NameValuePairs append(String name, Object value, HttpPartType partType, HttpPartSerializer serializer, HttpPartSchema schema, boolean skipIfEmpty) {
+	public NameValuePairs append(String name, Object value, HttpPartType partType, HttpPartSerializerSession serializer, HttpPartSchema schema, boolean skipIfEmpty) {
 		super.add(new SerializedNameValuePair(name, value, partType, serializer, schema, skipIfEmpty));
 		return this;
 	}
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/ext/SerializedHeader.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/ext/SerializedHeader.java
index 8cdd634..b6b62d3 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/ext/SerializedHeader.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/ext/SerializedHeader.java
@@ -38,7 +38,7 @@ public final class SerializedHeader extends BasicHeader {
 	private static final long serialVersionUID = 1L;
 
 	private Object value;
-	private HttpPartSerializer serializer;
+	private HttpPartSerializerSession serializer;
 	private HttpPartSchema schema;
 	private boolean skipIfEmpty;
 
@@ -65,7 +65,7 @@ public final class SerializedHeader extends BasicHeader {
 	 * 	<br>Only used if serializer is schema-aware (e.g. {@link OpenApiSerializer}).
 	 * @param skipIfEmpty If value is a blank string, the value should return as <jk>null</jk>.
 	 */
-	public SerializedHeader(String name, Object value, HttpPartSerializer serializer, HttpPartSchema schema, boolean skipIfEmpty) {
+	public SerializedHeader(String name, Object value, HttpPartSerializerSession serializer, HttpPartSchema schema, boolean skipIfEmpty) {
 		super(name, null);
 		this.value = value;
 		this.serializer = serializer;
@@ -86,7 +86,7 @@ public final class SerializedHeader extends BasicHeader {
 	public static class Builder {
 		String name;
 		Object value;
-		HttpPartSerializer serializer;
+		HttpPartSerializerSession serializer;
 		HttpPartSchema schema;
 
 		/**
@@ -117,7 +117,7 @@ public final class SerializedHeader extends BasicHeader {
 		 * @param value The new value for this property.
 		 * @return This object (for method chaining).
 		 */
-		public Builder serializer(HttpPartSerializer value) {
+		public Builder serializer(HttpPartSerializerSession value) {
 			return serializer(value, true);
 		}
 
@@ -128,7 +128,7 @@ public final class SerializedHeader extends BasicHeader {
 		 * @param overwrite If <jk>true</jk>, overwrites the existing value if the old value is <jk>null</jk>.
 		 * @return This object (for method chaining).
 		 */
-		public Builder serializer(HttpPartSerializer value, boolean overwrite) {
+		public Builder serializer(HttpPartSerializerSession value, boolean overwrite) {
 			if (overwrite || serializer == null)
 				this.serializer = value;
 			return this;
@@ -166,7 +166,7 @@ public final class SerializedHeader extends BasicHeader {
 			}
 			if (isEmpty(value) && skipIfEmpty && schema.getDefault() == null)
 				return null;
-			return serializer.createPartSession(null).serialize(HttpPartType.HEADER, schema, value);
+			return serializer.serialize(HttpPartType.HEADER, schema, value);
 		} catch (SchemaValidationException e) {
 			throw new FormattedRuntimeException(e, "Validation error on request {0} parameter ''{1}''=''{2}''", HttpPartType.HEADER, getName(), value);
 		} catch (SerializeException e) {
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/ext/SerializedNameValuePair.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/ext/SerializedNameValuePair.java
index 5b5b044..039ac00 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/ext/SerializedNameValuePair.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/ext/SerializedNameValuePair.java
@@ -37,7 +37,7 @@ public final class SerializedNameValuePair implements NameValuePair {
 	private String name;
 	private Object value;
 	private HttpPartType type;
-	private HttpPartSerializer serializer;
+	private HttpPartSerializerSession serializer;
 	private HttpPartSchema schema;
 	private boolean skipIfEmpty;
 
@@ -65,7 +65,7 @@ public final class SerializedNameValuePair implements NameValuePair {
 	 * 	<br>Only used if serializer is schema-aware (e.g. {@link OpenApiSerializer}).
 	 * @param skipIfEmpty If value is a blank string, the value should return as <jk>null</jk>.
 	 */
-	public SerializedNameValuePair(String name, Object value, HttpPartType type, HttpPartSerializer serializer, HttpPartSchema schema, boolean skipIfEmpty) {
+	public SerializedNameValuePair(String name, Object value, HttpPartType type, HttpPartSerializerSession serializer, HttpPartSchema schema, boolean skipIfEmpty) {
 		this.name = name;
 		this.value = value;
 		this.type = type;
@@ -89,7 +89,7 @@ public final class SerializedNameValuePair implements NameValuePair {
 		String name;
 		Object value;
 		HttpPartType type;
-		HttpPartSerializer serializer;
+		HttpPartSerializerSession serializer;
 		HttpPartSchema schema;
 
 		/**
@@ -132,6 +132,18 @@ public final class SerializedNameValuePair implements NameValuePair {
 		 * @return This object (for method chaining).
 		 */
 		public Builder serializer(HttpPartSerializer value) {
+			if (value != null)
+				return serializer(value.createPartSession(null));
+			return this;
+		}
+
+		/**
+		 * Sets the serializer to use for serializing the value to a string value.
+		 *
+		 * @param value The new value for this property.
+		 * @return This object (for method chaining).
+		 */
+		public Builder serializer(HttpPartSerializerSession value) {
 			return serializer(value, true);
 		}
 
@@ -142,7 +154,7 @@ public final class SerializedNameValuePair implements NameValuePair {
 		 * @param overwrite If <jk>true</jk>, overwrites the existing value if the old value is <jk>null</jk>.
 		 * @return This object (for method chaining).
 		 */
-		public Builder serializer(HttpPartSerializer value, boolean overwrite) {
+		public Builder serializer(HttpPartSerializerSession value, boolean overwrite) {
 			if (overwrite || serializer == null)
 				this.serializer = value;
 			return this;
@@ -185,7 +197,7 @@ public final class SerializedNameValuePair implements NameValuePair {
 			}
 			if (isEmpty(value) && skipIfEmpty && schema.getDefault() == null)
 				return null;
-			return serializer.createPartSession(null).serialize(type, schema, value);
+			return serializer.serialize(type, schema, value);
 		} catch (SchemaValidationException e) {
 			throw new FormattedRuntimeException(e, "Validation error on request {0} parameter ''{1}''=''{2}''", type, name, value);
 		} catch (SerializeException e) {
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestFormData.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestFormData.java
index 59bdd3e..3fef82e 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestFormData.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestFormData.java
@@ -58,9 +58,9 @@ public class RequestFormData extends LinkedHashMap<String,String[]> {
 	private static final long serialVersionUID = 1L;
 
 	private final RestRequest req;
-	private final HttpPartParser parser;
+	private final HttpPartParserSession parser;
 
-	RequestFormData(RestRequest req, HttpPartParser parser) {
+	RequestFormData(RestRequest req, HttpPartParserSession parser) {
 		this.req = req;
 		this.parser = parser;
 	}
@@ -263,7 +263,7 @@ public class RequestFormData extends LinkedHashMap<String,String[]> {
 	 * @throws BadRequest Thrown if input could not be parsed or fails schema validation.
 	 * @throws InternalServerError Thrown if any other exception occurs.
 	 */
-	public <T> T get(HttpPartParser parser, HttpPartSchema schema, String name, Class<T> type) throws BadRequest, InternalServerError {
+	public <T> T get(HttpPartParserSession parser, HttpPartSchema schema, String name, Class<T> type) throws BadRequest, InternalServerError {
 		return getInner(parser, schema, name, null, getClassMeta(type));
 	}
 
@@ -301,7 +301,7 @@ public class RequestFormData extends LinkedHashMap<String,String[]> {
 	 * @throws BadRequest Thrown if input could not be parsed or fails schema validation.
 	 * @throws InternalServerError Thrown if any other exception occurs.
 	 */
-	public <T> T get(HttpPartParser parser, HttpPartSchema schema, String name, T def, Class<T> type) throws BadRequest, InternalServerError {
+	public <T> T get(HttpPartParserSession parser, HttpPartSchema schema, String name, T def, Class<T> type) throws BadRequest, InternalServerError {
 		return getInner(parser, schema, name, def, getClassMeta(type));
 	}
 
@@ -342,7 +342,7 @@ public class RequestFormData extends LinkedHashMap<String,String[]> {
 	 * @throws BadRequest Thrown if input could not be parsed or fails schema validation.
 	 * @throws InternalServerError Thrown if any other exception occurs.
 	 */
-	public <T> T getAll(HttpPartParser parser, HttpPartSchema schema, String name, Class<T> type) throws BadRequest, InternalServerError {
+	public <T> T getAll(HttpPartParserSession parser, HttpPartSchema schema, String name, Class<T> type) throws BadRequest, InternalServerError {
 		return getAllInner(parser, schema, name, null, getClassMeta(type));
 	}
 
@@ -417,7 +417,7 @@ public class RequestFormData extends LinkedHashMap<String,String[]> {
 	 * @throws BadRequest Thrown if input could not be parsed or fails schema validation.
 	 * @throws InternalServerError Thrown if any other exception occurs.
 	 */
-	public <T> T get(HttpPartParser parser, HttpPartSchema schema, String name, Type type, Type...args) throws BadRequest, InternalServerError {
+	public <T> T get(HttpPartParserSession parser, HttpPartSchema schema, String name, Type type, Type...args) throws BadRequest, InternalServerError {
 		return getInner(parser, schema, name, null, this.<T>getClassMeta(type, args));
 	}
 
@@ -467,7 +467,7 @@ public class RequestFormData extends LinkedHashMap<String,String[]> {
 	 * @throws BadRequest Thrown if input could not be parsed or fails schema validation.
 	 * @throws InternalServerError Thrown if any other exception occurs.
 	 */
-	public <T> T get(HttpPartParser parser, HttpPartSchema schema, String name, T def, Type type, Type...args) throws BadRequest, InternalServerError {
+	public <T> T get(HttpPartParserSession parser, HttpPartSchema schema, String name, T def, Type type, Type...args) throws BadRequest, InternalServerError {
 		return getInner(parser, schema, name, def, this.<T>getClassMeta(type, args));
 	}
 
@@ -517,12 +517,12 @@ public class RequestFormData extends LinkedHashMap<String,String[]> {
 	 * @throws BadRequest Thrown if input could not be parsed or fails schema validation.
 	 * @throws InternalServerError Thrown if any other exception occurs.
 	 */
-	public <T> T getAll(HttpPartParser parser, HttpPartSchema schema, String name, Type type, Type...args) throws BadRequest, InternalServerError {
+	public <T> T getAll(HttpPartParserSession parser, HttpPartSchema schema, String name, Type type, Type...args) throws BadRequest, InternalServerError {
 		return getAllInner(parser, schema, name, null, this.<T>getClassMeta(type, args));
 	}
 
 	/* Workhorse method */
-	private <T> T getInner(HttpPartParser parser, HttpPartSchema schema, String name, T def, ClassMeta<T> cm) throws BadRequest, InternalServerError {
+	private <T> T getInner(HttpPartParserSession parser, HttpPartSchema schema, String name, T def, ClassMeta<T> cm) throws BadRequest, InternalServerError {
 		try {
 			if (cm.isMapOrBean() && isOneOf(name, "*", "")) {
 				OMap m = new OMap();
@@ -550,7 +550,7 @@ public class RequestFormData extends LinkedHashMap<String,String[]> {
 
 	/* Workhorse method */
 	@SuppressWarnings("rawtypes")
-	<T> T getAllInner(HttpPartParser parser, HttpPartSchema schema, String name, T def, ClassMeta<T> cm) throws BadRequest, InternalServerError {
+	<T> T getAllInner(HttpPartParserSession parser, HttpPartSchema schema, String name, T def, ClassMeta<T> cm) throws BadRequest, InternalServerError {
 		String[] p = get(name);
 		if (p == null)
 			return def;
@@ -578,10 +578,10 @@ public class RequestFormData extends LinkedHashMap<String,String[]> {
 		throw new InternalServerError("Invalid call to getParameters(String, ClassMeta).  Class type must be a Collection or array.");
 	}
 
-	private <T> T parse(HttpPartParser parser, HttpPartSchema schema, String val, ClassMeta<T> c) throws SchemaValidationException, ParseException {
+	private <T> T parse(HttpPartParserSession parser, HttpPartSchema schema, String val, ClassMeta<T> c) throws SchemaValidationException, ParseException {
 		if (parser == null)
 			parser = this.parser;
-		return parser.createPartSession(req.getParserSessionArgs()).parse(HttpPartType.FORMDATA, schema, val, c);
+		return parser.parse(HttpPartType.FORMDATA, schema, val, c);
 	}
 
 	/**
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestHeaders.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestHeaders.java
index f6400b0..68e8577 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestHeaders.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestHeaders.java
@@ -43,7 +43,7 @@ public class RequestHeaders extends TreeMap<String,String[]> {
 	private static final long serialVersionUID = 1L;
 
 	private final RestRequest req;
-	private HttpPartParser parser;
+	private HttpPartParserSession parser;
 	private RequestQuery queryParams;
 	private Set<String> allowedQueryParams;
 
@@ -52,7 +52,7 @@ public class RequestHeaders extends TreeMap<String,String[]> {
 		this.req = req;
 	}
 
-	RequestHeaders parser(HttpPartParser parser) {
+	RequestHeaders parser(HttpPartParserSession parser) {
 		this.parser = parser;
 		return this;
 	}
@@ -271,7 +271,7 @@ public class RequestHeaders extends TreeMap<String,String[]> {
 	 * @throws BadRequest Thrown if input could not be parsed or fails schema validation.
 	 * @throws InternalServerError Thrown if any other exception occurs.
 	 */
-	public <T> T get(HttpPartParser parser, HttpPartSchema schema, String name, Class<T> type) throws BadRequest, InternalServerError {
+	public <T> T get(HttpPartParserSession parser, HttpPartSchema schema, String name, Class<T> type) throws BadRequest, InternalServerError {
 		return getInner(parser, schema, name, null, getClassMeta(type));
 	}
 
@@ -309,7 +309,7 @@ public class RequestHeaders extends TreeMap<String,String[]> {
 	 * @throws BadRequest Thrown if input could not be parsed or fails schema validation.
 	 * @throws InternalServerError Thrown if any other exception occurs.
 	 */
-	public <T> T get(HttpPartParser parser, HttpPartSchema schema, String name, T def, Class<T> type) throws BadRequest, InternalServerError {
+	public <T> T get(HttpPartParserSession parser, HttpPartSchema schema, String name, T def, Class<T> type) throws BadRequest, InternalServerError {
 		return getInner(parser, schema, name, def, getClassMeta(type));
 	}
 
@@ -380,12 +380,12 @@ public class RequestHeaders extends TreeMap<String,String[]> {
 	 * @throws BadRequest Thrown if input could not be parsed or fails schema validation.
 	 * @throws InternalServerError Thrown if any other exception occurs.
 	 */
-	public <T> T get(HttpPartParser parser, HttpPartSchema schema, String name, Type type, Type...args) throws BadRequest, InternalServerError {
+	public <T> T get(HttpPartParserSession parser, HttpPartSchema schema, String name, Type type, Type...args) throws BadRequest, InternalServerError {
 		return getInner(parser, schema, name, null, this.<T>getClassMeta(type, args));
 	}
 
 	/* Workhorse method */
-	private <T> T getInner(HttpPartParser parser, HttpPartSchema schema, String name, T def, ClassMeta<T> cm) throws BadRequest, InternalServerError {
+	private <T> T getInner(HttpPartParserSession parser, HttpPartSchema schema, String name, T def, ClassMeta<T> cm) throws BadRequest, InternalServerError {
 		try {
 			if (cm.isMapOrBean() && isOneOf(name, "*", "")) {
 				OMap m = new OMap();
@@ -409,10 +409,10 @@ public class RequestHeaders extends TreeMap<String,String[]> {
 	}
 
 	/* Workhorse method */
-	private <T> T parse(HttpPartParser parser, HttpPartSchema schema, String val, ClassMeta<T> cm) throws SchemaValidationException, ParseException {
+	private <T> T parse(HttpPartParserSession parser, HttpPartSchema schema, String val, ClassMeta<T> cm) throws SchemaValidationException, ParseException {
 		if (parser == null)
 			parser = this.parser;
-		return parser.createPartSession(req.getParserSessionArgs()).parse(HttpPartType.HEADER, schema, val, cm);
+		return parser.parse(HttpPartType.HEADER, schema, val, cm);
 	}
 
 	/**
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestPath.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestPath.java
index b22ab91..1ce2c9d 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestPath.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestPath.java
@@ -45,7 +45,7 @@ public class RequestPath extends TreeMap<String,String> {
 	static final String REST_PATHVARS_ATTR = "juneau.pathVars";
 
 	private final RestRequest req;
-	private HttpPartParser parser;
+	private HttpPartParserSession parser;
 
 	RequestPath(RestRequest req) {
 		super(String.CASE_INSENSITIVE_ORDER);
@@ -57,7 +57,7 @@ public class RequestPath extends TreeMap<String,String> {
 				put(e.getKey(), e.getValue());
 	}
 
-	RequestPath parser(HttpPartParser parser) {
+	RequestPath parser(HttpPartParserSession parser) {
 		this.parser = parser;
 		return this;
 	}
@@ -168,7 +168,7 @@ public class RequestPath extends TreeMap<String,String> {
 	 * @throws BadRequest Thrown if input could not be parsed or fails schema validation.
 	 * @throws InternalServerError Thrown if any other exception occurs.
 	 */
-	public <T> T get(HttpPartParser parser, HttpPartSchema schema, String name, Class<T> type) throws BadRequest, InternalServerError {
+	public <T> T get(HttpPartParserSession parser, HttpPartSchema schema, String name, Class<T> type) throws BadRequest, InternalServerError {
 		return getInner(parser, schema, name, null, this.<T>getClassMeta(type));
 	}
 
@@ -248,12 +248,12 @@ public class RequestPath extends TreeMap<String,String> {
 	 * @throws BadRequest Thrown if input could not be parsed or fails schema validation.
 	 * @throws InternalServerError Thrown if any other exception occurs.
 	 */
-	public <T> T get(HttpPartParser parser, HttpPartSchema schema, String name, Type type, Type...args) throws BadRequest, InternalServerError {
+	public <T> T get(HttpPartParserSession parser, HttpPartSchema schema, String name, Type type, Type...args) throws BadRequest, InternalServerError {
 		return getInner(parser, schema, name, null, this.<T>getClassMeta(type, args));
 	}
 
 	/* Workhorse method */
-	private <T> T getInner(HttpPartParser parser, HttpPartSchema schema, String name, T def, ClassMeta<T> cm) throws BadRequest, InternalServerError {
+	private <T> T getInner(HttpPartParserSession parser, HttpPartSchema schema, String name, T def, ClassMeta<T> cm) throws BadRequest, InternalServerError {
 		try {
 			if (cm.isMapOrBean() && isOneOf(name, "*", "")) {
 				OMap m = new OMap();
@@ -277,10 +277,10 @@ public class RequestPath extends TreeMap<String,String> {
 	}
 
 	/* Workhorse method */
-	private <T> T parse(HttpPartParser parser, HttpPartSchema schema, String val, ClassMeta<T> cm) throws SchemaValidationException, ParseException {
+	private <T> T parse(HttpPartParserSession parser, HttpPartSchema schema, String val, ClassMeta<T> cm) throws SchemaValidationException, ParseException {
 		if (parser == null)
 			parser = this.parser;
-		return parser.createPartSession(req.getParserSessionArgs()).parse(HttpPartType.PATH, schema, val, cm);
+		return parser.parse(HttpPartType.PATH, schema, val, cm);
 	}
 
 	/**
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestQuery.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestQuery.java
index 5f2c75c..5ade3a8 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestQuery.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestQuery.java
@@ -47,13 +47,13 @@ public final class RequestQuery extends LinkedHashMap<String,String[]> {
 	private static final long serialVersionUID = 1L;
 
 	private final RestRequest req;
-	private HttpPartParser parser;
+	private HttpPartParserSession parser;
 
 	RequestQuery(RestRequest req) {
 		this.req = req;
 	}
 
-	RequestQuery parser(HttpPartParser parser) {
+	RequestQuery parser(HttpPartParserSession parser) {
 		this.parser = parser;
 		return this;
 	}
@@ -298,7 +298,7 @@ public final class RequestQuery extends LinkedHashMap<String,String[]> {
 	 * @throws BadRequest Thrown if input could not be parsed or fails schema validation.
 	 * @throws InternalServerError Thrown if any other exception occurs.
 	 */
-	public <T> T get(HttpPartParser parser, HttpPartSchema schema, String name, Class<T> type) throws BadRequest, InternalServerError {
+	public <T> T get(HttpPartParserSession parser, HttpPartSchema schema, String name, Class<T> type) throws BadRequest, InternalServerError {
 		return getInner(parser, schema, name, null, getClassMeta(type));
 	}
 
@@ -336,7 +336,7 @@ public final class RequestQuery extends LinkedHashMap<String,String[]> {
 	 * @throws BadRequest Thrown if input could not be parsed or fails schema validation.
 	 * @throws InternalServerError Thrown if any other exception occurs.
 	 */
-	public <T> T get(HttpPartParser parser, HttpPartSchema schema, String name, T def, Class<T> type) throws BadRequest, InternalServerError {
+	public <T> T get(HttpPartParserSession parser, HttpPartSchema schema, String name, T def, Class<T> type) throws BadRequest, InternalServerError {
 		return getInner(parser, schema, name, def, getClassMeta(type));
 	}
 
@@ -413,7 +413,7 @@ public final class RequestQuery extends LinkedHashMap<String,String[]> {
 	 * @throws BadRequest Thrown if input could not be parsed or fails schema validation.
 	 * @throws InternalServerError Thrown if any other exception occurs.
 	 */
-	public <T> T get(HttpPartParser parser, HttpPartSchema schema, String name, Type type, Type...args) throws BadRequest, InternalServerError {
+	public <T> T get(HttpPartParserSession parser, HttpPartSchema schema, String name, Type type, Type...args) throws BadRequest, InternalServerError {
 		return getInner(parser, schema, name, null, (ClassMeta<T>)getClassMeta(type, args));
 	}
 
@@ -463,7 +463,7 @@ public final class RequestQuery extends LinkedHashMap<String,String[]> {
 	 * @throws BadRequest Thrown if input could not be parsed or fails schema validation.
 	 * @throws InternalServerError Thrown if any other exception occurs.
 	 */
-	public <T> T get(HttpPartParser parser, HttpPartSchema schema, String name, T def, Type type, Type...args) throws BadRequest, InternalServerError {
+	public <T> T get(HttpPartParserSession parser, HttpPartSchema schema, String name, T def, Type type, Type...args) throws BadRequest, InternalServerError {
 		return getInner(parser, schema, name, def, (ClassMeta<T>)getClassMeta(type, args));
 	}
 
@@ -533,7 +533,7 @@ public final class RequestQuery extends LinkedHashMap<String,String[]> {
 	 * @throws BadRequest Thrown if input could not be parsed or fails schema validation.
 	 * @throws InternalServerError Thrown if any other exception occurs.
 	 */
-	public <T> T getAll(HttpPartParser parser, HttpPartSchema schema, String name, Type type, Type...args) throws BadRequest, InternalServerError {
+	public <T> T getAll(HttpPartParserSession parser, HttpPartSchema schema, String name, Type type, Type...args) throws BadRequest, InternalServerError {
 		return getAllInner(parser, schema, name, null, (ClassMeta<T>)getClassMeta(type, args));
 	}
 
@@ -615,7 +615,7 @@ public final class RequestQuery extends LinkedHashMap<String,String[]> {
 	}
 
 	/* Workhorse method */
-	private <T> T getInner(HttpPartParser parser, HttpPartSchema schema, String name, T def, ClassMeta<T> cm) throws BadRequest, InternalServerError {
+	private <T> T getInner(HttpPartParserSession parser, HttpPartSchema schema, String name, T def, ClassMeta<T> cm) throws BadRequest, InternalServerError {
 		try {
 			if (cm.isMapOrBean() && isOneOf(name, "*", "")) {
 				OMap m = new OMap();
@@ -643,7 +643,7 @@ public final class RequestQuery extends LinkedHashMap<String,String[]> {
 
 	/* Workhorse method */
 	@SuppressWarnings("rawtypes")
-	private <T> T getAllInner(HttpPartParser parser, HttpPartSchema schema, String name, T def, ClassMeta<T> cm) throws BadRequest, InternalServerError {
+	private <T> T getAllInner(HttpPartParserSession parser, HttpPartSchema schema, String name, T def, ClassMeta<T> cm) throws BadRequest, InternalServerError {
 		String[] p = get(name);
 		if (p == null)
 			return def;
@@ -671,10 +671,10 @@ public final class RequestQuery extends LinkedHashMap<String,String[]> {
 		throw new InternalServerError("Invalid call to getParameters(String, ClassMeta).  Class type must be a Collection or array.");
 	}
 
-	private <T> T parse(HttpPartParser parser, HttpPartSchema schema, String val, ClassMeta<T> c) throws SchemaValidationException, ParseException {
+	private <T> T parse(HttpPartParserSession parser, HttpPartSchema schema, String val, ClassMeta<T> c) throws SchemaValidationException, ParseException {
 		if (parser == null)
 			parser = this.parser;
-		return parser.createPartSession(req.getParserSessionArgs()).parse(HttpPartType.QUERY, schema, val, c);
+		return parser.parse(HttpPartType.QUERY, schema, val, c);
 	}
 
 	/**
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestParamDefaults.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestParamDefaults.java
index 4fe4c9e..43ed079 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestParamDefaults.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestParamDefaults.java
@@ -12,7 +12,6 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest;
 
-import static org.apache.juneau.internal.ObjectUtils.*;
 import static org.apache.juneau.internal.ClassUtils.*;
 import static org.apache.juneau.rest.RestParamType.*;
 
@@ -237,7 +236,8 @@ class RestParamDefaults {
 
 		@Override /* RestMethodParam */
 		public Object resolve(RestRequest req, RestResponse res) throws Exception {
-			return req.getPathMatch().get(partParser, schema, name, type);
+			HttpPartParserSession ps = partParser == null ? req.getPartParser() : partParser.createPartSession(req.getParserSessionArgs());
+			return req.getPathMatch().get(ps, schema, name, type);
 		}
 	}
 
@@ -280,7 +280,8 @@ class RestParamDefaults {
 
 		@Override /* RestMethodParam */
 		public Object resolve(RestRequest req, RestResponse res) throws Exception {
-			return req.getHeaders().get(partParser, schema, name, type);
+			HttpPartParserSession ps = partParser == null ? req.getPartParser() : partParser.createPartSession(req.getParserSessionArgs());
+			return req.getHeaders().get(ps, schema, name, type);
 		}
 	}
 
@@ -359,7 +360,8 @@ class RestParamDefaults {
 						ResponsePartMeta rpm = req.getResponseHeaderMeta(o);
 						if (rpm == null)
 							rpm = ResponseHeaderObject.this.meta;
-						res.setHeader(new HttpPart(name, HttpPartType.HEADER, rpm.getSchema(), firstNonNull(rpm.getSerializer(), req.getPartSerializer()), req.getSerializerSessionArgs(), o));
+						HttpPartSerializerSession pss = rpm.getSerializer() == null ? req.getPartSerializer() : rpm.getSerializer().createPartSession(req.getSerializerSessionArgs());
+						res.setHeader(new HttpPart(name, HttpPartType.HEADER, rpm.getSchema(), pss, o));
 					} catch (SerializeException | SchemaValidationException e) {
 						throw new RuntimeException(e);
 					}
@@ -463,9 +465,10 @@ class RestParamDefaults {
 
 		@Override /* RestMethodParam */
 		public Object resolve(RestRequest req, RestResponse res) throws Exception {
+			HttpPartParserSession ps = partParser == null ? req.getPartParser() : partParser.createPartSession(req.getParserSessionArgs());
 			if (multiPart)
-				return req.getFormData().getAll(partParser, schema, name, type);
-			return req.getFormData().get(partParser, schema, name, type);
+				return req.getFormData().getAll(ps, schema, name, type);
+			return req.getFormData().get(ps, schema, name, type);
 		}
 	}
 
@@ -499,9 +502,10 @@ class RestParamDefaults {
 
 		@Override /* RestMethodParam */
 		public Object resolve(RestRequest req, RestResponse res) throws Exception {
+			HttpPartParserSession ps = partParser == null ? req.getPartParser() : partParser.createPartSession(req.getParserSessionArgs());
 			if (multiPart)
-				return req.getQuery().getAll(partParser, schema, name, type);
-			return req.getQuery().get(partParser, schema, name, type);
+				return req.getQuery().getAll(ps, schema, name, type);
+			return req.getQuery().get(ps, schema, name, type);
 		}
 	}
 
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 f9f652c..18e5574 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
@@ -117,6 +117,8 @@ public final class RestRequest extends HttpServletRequestWrapper {
 	private SerializerSessionArgs serializerSessionArgs;
 	private ParserSessionArgs parserSessionArgs;
 	private RestResponse res;
+	private HttpPartSerializerSession partSerializerSession;
+	private HttpPartParserSession partParserSession;
 
 	/**
 	 * Constructor.
@@ -192,15 +194,17 @@ public final class RestRequest extends HttpServletRequestWrapper {
 		this.javaMethod = rjm.method;
 		this.properties = properties;
 		this.beanSession = rjm.createSession();
+		this.partParserSession = rjm.partParser.createPartSession(getParserSessionArgs());
+		this.partSerializerSession = rjm.partSerializer.createPartSession(getSerializerSessionArgs());
 		this.pathParams
-			.parser(rjm.partParser);
+			.parser(partParserSession);
 		this.queryParams
 			.addDefault(rjm.defaultQuery)
-			.parser(rjm.partParser);
+			.parser(partParserSession);
 		this.headers
 			.addDefault(rjm.reqHeaders)
 			.addDefault(context.getReqHeaders())
-			.parser(rjm.partParser);
+			.parser(partParserSession);
 		this.attrs = new RequestAttributes(this, rjm.reqAttrs);
 		this.body
 			.encoders(rjm.encoders)
@@ -659,7 +663,7 @@ public final class RestRequest extends HttpServletRequestWrapper {
 	public RequestFormData getFormData() throws InternalServerError {
 		try {
 			if (formData == null) {
-				formData = new RequestFormData(this, restJavaMethod == null ? OpenApiParser.DEFAULT : restJavaMethod.partParser);
+				formData = new RequestFormData(this, getPartParser());
 				if (! body.isLoaded()) {
 					formData.putAll(getParameterMap());
 				} else {
@@ -1156,8 +1160,8 @@ public final class RestRequest extends HttpServletRequestWrapper {
 	 *
 	 * @return The part serializer associated with this request.
 	 */
-	public HttpPartParser getPartParser() {
-		return restJavaMethod == null ? OpenApiParser.DEFAULT : restJavaMethod.partParser;
+	public HttpPartParserSession getPartParser() {
+		return partParserSession == null ? OpenApiParser.DEFAULT.createPartSession(null) : partParserSession;
 	}
 
 	/**
@@ -1165,8 +1169,8 @@ public final class RestRequest extends HttpServletRequestWrapper {
 	 *
 	 * @return The part serializer associated with this request.
 	 */
-	public HttpPartSerializer getPartSerializer() {
-		return restJavaMethod == null ? OpenApiSerializer.DEFAULT : restJavaMethod.partSerializer;
+	public HttpPartSerializerSession getPartSerializer() {
+		return partSerializerSession == null ? OpenApiSerializer.DEFAULT.createPartSession(null) : partSerializerSession;
 	}
 
 	/**
@@ -1656,7 +1660,7 @@ public final class RestRequest extends HttpServletRequestWrapper {
 					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 						RequestBeanPropertyMeta pm = rbm.getProperty(method.getName());
 						if (pm != null) {
-							HttpPartParser pp = pm.getParser(getPartParser());
+							HttpPartParserSession pp = pm.getParser(getPartParser());
 							HttpPartSchema schema = pm.getSchema();
 							String name = pm.getPartName();
 							ClassMeta<?> type = getContext().getClassMeta(method.getGenericReturnType());
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/DefaultHandler.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/DefaultHandler.java
index d0f6690..e924609 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/DefaultHandler.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/reshandlers/DefaultHandler.java
@@ -92,10 +92,10 @@ public class DefaultHandler implements ResponseHandler {
 							String k = stringify(key);
 							Object v = m.get(key);
 							HttpPartSchema s = hm.getSchema().getProperty(k);
-							res.setHeader(new HttpPart(k, RESPONSE_HEADER, s, hm.getSerializer(req.getPartSerializer()), req.getSerializerSessionArgs(), v));
+							res.setHeader(new HttpPart(k, RESPONSE_HEADER, s, hm.getSerializer(req.getPartSerializer()), v));
 						}
 					} else {
-						res.setHeader(new HttpPart(n, RESPONSE_HEADER, hm.getSchema(), hm.getSerializer(req.getPartSerializer()), req.getSerializerSessionArgs(), ho));
+						res.setHeader(new HttpPart(n, RESPONSE_HEADER, hm.getSchema(), hm.getSerializer(req.getPartSerializer()), ho));
 					}
 				} catch (Exception e) {
 					throw new InternalServerError(e, "Could not set header ''{0}''", hm.getPartName());