juneau-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jamesbog...@apache.org
Subject [juneau] branch master updated: Javadocs (mostly)
Date Wed, 25 Jul 2018 19:58:50 GMT
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 510a4cf  Javadocs (mostly)
510a4cf is described below

commit 510a4cfbf67da0b46363b277960221dc0599c858
Author: JamesBognar <jamesbognar@apache.org>
AuthorDate: Wed Jul 25 15:58:31 2018 -0400

    Javadocs (mostly)
---
 .../org/apache/juneau/http/annotation/Body.java    |  16 +
 .../apache/juneau/http/annotation/Response.java    |  24 +-
 .../org/apache/juneau/httppart/HttpPartSchema.java |  33 +-
 .../juneau/httppart/HttpPartSchemaBuilder.java     |  42 +-
 .../apache/juneau/remoteable/RemoteMethodArg.java  |  12 +-
 juneau-doc/src/main/javadoc/overview.html          | 770 ++++++++++-----------
 .../07.OpenApiSchemaPartParsing.html               | 430 ++----------
 .../08.OpenApiSchemaPartSerializing.html           |  81 ++-
 .../09.HttpPartAnnotations.html                    |  67 +-
 .../09.HttpPartAnnotations/01.Body.html            |  95 ++-
 .../09.HttpPartAnnotations/02.FormData.html        |  27 +
 .../09.HttpPartAnnotations/04.Query.html           |  27 +
 .../09.HttpPartAnnotations/06.Header.html          |  26 +
 .../09.HttpPartAnnotations/07.Path.html            |  21 +
 .../org/apache/juneau/rest/client/RestCall.java    |   1 +
 .../java/org/apache/juneau/rest/RequestBody.java   |  15 +-
 .../java/org/apache/juneau/rest/RestContext.java   |   2 +-
 .../org/apache/juneau/rest/RestParamDefaults.java  |  27 +-
 18 files changed, 867 insertions(+), 849 deletions(-)

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Body.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Body.java
index 4bc0b35..20be37c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Body.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Body.java
@@ -260,6 +260,22 @@ public @interface Body {
 	 */
 	Class<? extends HttpPartParser> partParser() default HttpPartParser.Null.class;
 
+	/**
+	 * Specifies whether a part serializer should be used for serializing this value.
+	 *
+	 * <p>
+	 * If <jk>false</jk>, then it indicates that normal Juneau serializers (e.g. {@link JsonSerializer}) should be used for this part.
+	 */
+	public boolean usePartSerializer() default false;
+
+	/**
+	 * Specifies whether a part parser should be used for parsing this value.
+	 *
+	 * <p>
+	 * If <jk>false</jk>, then it indicates that normal Juneau parsers (e.g. {@link JsonParser}) should be used for this part.
+	 */
+	public boolean usePartParser() default false;
+
 	//=================================================================================================================
 	// Attributes common to all Swagger Parameter objects
 	//=================================================================================================================
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Response.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Response.java
index 1d5580d..7f3efd3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Response.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/Response.java
@@ -121,6 +121,22 @@ import org.apache.juneau.jsonschema.*;
 public @interface Response {
 
 	/**
+	 * Specifies the {@link HttpPartSerializer} class used for serializing values to strings.
+	 *
+	 * <p>
+	 * Overrides for this part the part serializer defined on the REST resource which by default is {@link OpenApiPartSerializer}.
+	 */
+	Class<? extends HttpPartSerializer> partSerializer() default HttpPartSerializer.Null.class;
+
+	/**
+	 * Specifies whether a part serializer should be used for serializing this value.
+	 *
+	 * <p>
+	 * If <jk>false</jk>, then it indicates that normal Juneau serializers (e.g. {@link JsonSerializer}) should be used for this part.
+	 */
+	public boolean usePartSerializer() default false;
+
+	/**
 	 * The HTTP response code.
 	 *
 	 * The default value is <code>500</code> for exceptions and <code>200</code> for return types.
@@ -147,14 +163,6 @@ public @interface Response {
 	int[] value() default {};
 
 	/**
-	 * Specifies the {@link HttpPartSerializer} class used for serializing values to strings.
-	 *
-	 * <p>
-	 * Overrides for this part the part serializer defined on the REST resource which by default is {@link OpenApiPartSerializer}.
-	 */
-	Class<? extends HttpPartSerializer> serializer() default HttpPartSerializer.Null.class;
-
-	/**
 	 * <mk>description</mk> field of the Swagger <a class="doclink" href="https://swagger.io/specification/v2/#responseObject">Response</a> object.
 	 *
 	 * <h5 class='section'>Used for:</h5>
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 7a13930..ee20f0c 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
@@ -25,6 +25,7 @@ import java.util.regex.*;
 import org.apache.juneau.*;
 import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.internal.*;
+import org.apache.juneau.json.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.utils.*;
 
@@ -60,7 +61,7 @@ public class HttpPartSchema {
 	final String _default;
 	final Set<String> _enum;
 	final Map<String,HttpPartSchema> properties;
-	final boolean allowEmptyValue, exclusiveMaximum, exclusiveMinimum, required, uniqueItems, skipIfEmpty;
+	final boolean allowEmptyValue, exclusiveMaximum, exclusiveMinimum, required, uniqueItems, skipIfEmpty, usePartSerializer, usePartParser;
 	final CollectionFormat collectionFormat;
 	final Type type;
 	final Format format;
@@ -290,6 +291,8 @@ public class HttpPartSchema {
 		this.required = resolve(b.required);
 		this.uniqueItems = resolve(b.uniqueItems);
 		this.skipIfEmpty = resolve(b.skipIfEmpty);
+		this.usePartSerializer = resolve(b.usePartSerializer);
+		this.usePartParser = resolve(b.usePartParser);
 		this.collectionFormat = b.collectionFormat;
 		this.type = b.type;
 		this.format = b.format;
@@ -977,6 +980,34 @@ public class HttpPartSchema {
 	}
 
 	/**
+	 * Returns the <code>usePartSerializer</code> field of this schema.
+	 *
+	 * <p>
+	 * This flag is only applicable for HTTP bodies.
+	 * It specifies whether the HTTP body should be serialized using normal Juneau serializers (e.g. {@link JsonSerializer}) or HTTP part serializers (e.g. {@link OpenApiPartSerializer}.
+	 *
+	 * @return The <code>usePartSerializer</code> field of this schema.
+	 * @see HttpPartSchemaBuilder#usePartSerializer(Boolean)
+	 */
+	public boolean isUsePartSerializer() {
+		return usePartSerializer;
+	}
+
+	/**
+	 * Returns the <code>usePartParser</code> field of this schema.
+	 *
+	 * <p>
+	 * This flag is only applicable for HTTP bodies.
+	 * It specifies whether the HTTP body should be parsed using normal Juneau parser (e.g. {@link JsonParser}) or HTTP part serializers (e.g. {@link OpenApiPartParser}.
+	 *
+	 * @return The <code>usePartParser</code> field of this schema.
+	 * @see HttpPartSchemaBuilder#usePartParser(Boolean)
+	 */
+	public boolean isUsePartParser() {
+		return usePartParser;
+	}
+
+	/**
 	 * Returns the <code>allowEmptyValue</code> field of this schema.
 	 *
 	 * @return The <code>skipIfEmpty</code> field of this schema.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchemaBuilder.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchemaBuilder.java
index bef9411..9c902ba 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchemaBuilder.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchemaBuilder.java
@@ -24,6 +24,7 @@ import org.apache.juneau.http.annotation.*;
 import org.apache.juneau.httppart.HttpPartSchema.*;
 import org.apache.juneau.httppart.HttpPartSchema.Type;
 import org.apache.juneau.internal.*;
+import org.apache.juneau.json.*;
 import org.apache.juneau.utils.*;
 
 /**
@@ -34,7 +35,7 @@ public class HttpPartSchemaBuilder {
 	String name, _default;
 	Set<Integer> codes;
 	Set<String> _enum;
-	Boolean allowEmptyValue, exclusiveMaximum, exclusiveMinimum, required, uniqueItems, skipIfEmpty;
+	Boolean allowEmptyValue, exclusiveMaximum, exclusiveMinimum, required, uniqueItems, skipIfEmpty, usePartSerializer, usePartParser;
 	CollectionFormat collectionFormat = CollectionFormat.NO_COLLECTION_FORMAT;
 	Type type = Type.NO_TYPE;
 	Format format = Format.NO_FORMAT;
@@ -121,6 +122,8 @@ public class HttpPartSchemaBuilder {
 		allowEmptyValue(! a.required());
 		serializer(a.partSerializer());
 		parser(a.partParser());
+		usePartSerializer(a.usePartSerializer());
+		usePartParser(a.usePartParser());
 		apply(a.schema());
 		return this;
 	}
@@ -280,7 +283,8 @@ public class HttpPartSchemaBuilder {
 		codes(a.code());
 		required(false);
 		allowEmptyValue(true);
-		serializer(a.serializer());
+		serializer(a.partSerializer());
+		usePartSerializer(a.usePartSerializer());
 		apply(a.schema());
 		return this;
 	}
@@ -1559,6 +1563,40 @@ public class HttpPartSchemaBuilder {
 	}
 
 	/**
+	 * Identifies whether a part serializer should be used for serializing this part.
+	 *
+	 * <p>
+	 * This flag is only applicable for HTTP bodies.
+	 * It specifies whether the HTTP body should be serialized using normal Juneau serializers (e.g. {@link JsonSerializer}) or HTTP part serializers (e.g. {@link OpenApiPartSerializer}.
+	 *
+	 * @param value
+	 * 	The new value for this property.
+	 * 	<br>Ignored if value is <jk>null</jk>.
+	 * @return This object (for method chaining).
+	 */
+	public HttpPartSchemaBuilder usePartSerializer(Boolean value) {
+		usePartSerializer = resolve(value, usePartSerializer);
+		return this;
+	}
+
+	/**
+	 * Identifies whether a part parser should be used for parsing this part.
+	 *
+	 * <p>
+	 * This flag is only applicable for HTTP bodies.
+	 * It specifies whether the HTTP body should be parsed using normal Juneau parser (e.g. {@link JsonParser}) or HTTP part serializers (e.g. {@link OpenApiPartParser}.
+	 *
+	 * @param value
+	 * 	The new value for this property.
+	 * 	<br>Ignored if value is <jk>null</jk>.
+	 * @return This object (for method chaining).
+	 */
+	public HttpPartSchemaBuilder usePartParser(Boolean value) {
+		usePartParser = resolve(value, usePartParser);
+		return this;
+	}
+
+	/**
 	 * Disables Swagger schema usage validation checking.
 	 *
 	 * @param value Specify <jk>true</jk> to prevent {@link ContextRuntimeException} from being thrown if invalid Swagger usage was detected.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/remoteable/RemoteMethodArg.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/remoteable/RemoteMethodArg.java
index ae08a68..71bb648 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/remoteable/RemoteMethodArg.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/remoteable/RemoteMethodArg.java
@@ -42,7 +42,7 @@ public final class RemoteMethodArg {
 	RemoteMethodArg(int index, HttpPartType partType, HttpPartSchema schema) {
 		this.index = index;
 		this.partType = partType;
-		this.serializer = newInstance(HttpPartSerializer.class, schema == null ? null : schema.getSerializer());
+		this.serializer = createSerializer(partType, schema);
 		this.schema = schema;
 		this.name = schema == null ? null : schema.getName();
 		this.skipIfEmpty = schema == null ? false : schema.isSkipIfEmpty();
@@ -51,12 +51,20 @@ public final class RemoteMethodArg {
 	RemoteMethodArg(HttpPartType partType, HttpPartSchema schema, String defaultName) {
 		this.index = -1;
 		this.partType = partType;
-		this.serializer = newInstance(HttpPartSerializer.class, schema == null ? null : schema.getSerializer());
+		this.serializer = createSerializer(partType, schema);
 		this.schema = schema;
 		this.name = StringUtils.firstNonEmpty(schema == null ? null : schema.getName(), defaultName);
 		this.skipIfEmpty = schema == null ? false : schema.isSkipIfEmpty();
 	}
 
+	private static HttpPartSerializer createSerializer(HttpPartType partType, HttpPartSchema schema) {
+		if (schema == null)
+			return null;
+		if (partType == BODY && ! schema.isUsePartSerializer())
+			return null;
+		return newInstance(HttpPartSerializer.class, schema.getSerializer());
+	}
+
 	/**
 	 * Returns the name of the HTTP part.
 	 *
diff --git a/juneau-doc/src/main/javadoc/overview.html b/juneau-doc/src/main/javadoc/overview.html
index 8e66e85..fc7e478 100644
--- a/juneau-doc/src/main/javadoc/overview.html
+++ b/juneau-doc/src/main/javadoc/overview.html
@@ -300,11 +300,11 @@
 			<li><p class='todo'><a class='doclink' href='#juneau-rest-server.RestMethod.PredefinedHelperBeans'>Helper Beans</a></p>
 			<li><p class='todo'><a class='doclink' href='#juneau-rest-server.RestMethod.PredefinedThrowables'>Predefined Throwables</a></p>
 		</ol>
-		<li><p class='todo'><a class='doclink' href='#juneau-rest-server.OpenApiSchemaPartParsing'>OpenAPI Schema Part Parsing</a></p>
-		<li><p class='todo'><a class='doclink' href='#juneau-rest-server.OpenApiSchemaPartSerializing'>OpenAPI Schema Part Serializing</a></p>
+		<li><p class='new'><a class='doclink' href='#juneau-rest-server.OpenApiSchemaPartParsing'>OpenAPI Schema Part Parsing</a></p>
+		<li><p class='new'><a class='doclink' href='#juneau-rest-server.OpenApiSchemaPartSerializing'>OpenAPI Schema Part Serializing</a></p>
 		<li><p class='todo'><a class='doclink' href='#juneau-rest-server.HttpPartAnnotations'>HTTP-Part Annotations</a></p>
 		<ol>
-			<li><p class='new'><a class='doclink' href='#juneau-rest-server.HttpPartAnnotations.Body'>@Body</a></p>
+			<li><p class='todo'><a class='doclink' href='#juneau-rest-server.HttpPartAnnotations.Body'>@Body</a></p>
 			<li><p class='new'><a class='doclink' href='#juneau-rest-server.HttpPartAnnotations.FormData'>@FormData</a></p>
 			<li><p class='todo'><a class='doclink' href='#juneau-rest-server.HttpPartAnnotations.HasFormData'>@HasFormData</a></p>
 			<li><p class='new'><a class='doclink' href='#juneau-rest-server.HttpPartAnnotations.Query'>@Query</a></p>
@@ -14053,57 +14053,27 @@ VariantAlsoNegotiates
 
 <!-- ==================================================================================================== -->
 
-<h3 class='topic todo' onclick='toggle(this)'><a href='#juneau-rest-server.OpenApiSchemaPartParsing' id='juneau-rest-server.OpenApiSchemaPartParsing'>7.7 - OpenAPI Schema Part Parsing</a></h3>
+<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-server.OpenApiSchemaPartParsing' id='juneau-rest-server.OpenApiSchemaPartParsing'>7.7 - OpenAPI Schema Part Parsing</a></h3>
 <div class='topic'><!-- START: 7.7 - juneau-rest-server.OpenApiSchemaPartParsing -->
 <p>
-	Parameters annotated with any of the following also support parsing based on Swagger-schemas:
+	Parameters annotated with any of the following are parsed using the registered {@link org.apache.juneau.httppart.OpenApiPartParser} and
+	therefore support OpenAPI syntax and validation:
 </p>
 <ul class='doctree'>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.Body Body}
 	<li class='ja'>{@link org.apache.juneau.http.annotation.Header Header}
 	<li class='ja'>{@link org.apache.juneau.http.annotation.Query Query}
 	<li class='ja'>{@link org.apache.juneau.http.annotation.FormData FormData}
 	<li class='ja'>{@link org.apache.juneau.http.annotation.Path Path}
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Body Body} ({@link org.apache.juneau.http.annotation.Body#usePartParser usePartParser} flag must be set)
 </ul>
 <p>
-	For example, the following shows how a pipe-delimited list of comma-delimited numbers (e.g. <js>"1,2,3|4,5,6|7,8,9"</js>) in an HTTP body can be converted to a 2-dimensional array of <code>Longs</code>:
+	For example, the following shows how a pipe-delimited list of comma-delimited numbers (e.g. <js>"1,2,3|4,5,6|7,8,9"</js>) in a query parameter can be converted to a 2-dimensional array of <code>Longs</code>:
 </p>
 <p class='bpcode w800'>
-	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/2dLongArray"</js>)	
-	<jk>public void</jk> post2dLongArray(
-		<ja>@Body</ja>(
-			schema=<ja>@Schema</ja>(
-				items=<ja>@Items</ja>(
-					collectionFormat=<js>"pipes"</js>,
-					items=<ja>@SubItems</ja>(
-						collectionFormat=<js>"csv"</js>,
-						type=<js>"integer"</js>, 
-						format=<js>"int64"</js>,
-						minimum=<js>"0"</js>,
-						maximum=<js>"100"</js>
-						minLength=1,
-						maxLength=10
-					)
-				)
-				minLength=1,
-				maxLength=10
-			)
-		)
-		Long[][] body
-	) {...}
-</p>
-<p>
-	Input will be converted based on the types and formats defined in the schema definition.
-	<br>Input validations such as <code>minLength/maxLength</code> that don't match the input will result in automatic <code>400 Bad Request</code> responses.
-</p>
-<p>
-	The equivalent for a form-data post entry is shown below:
-</p>
-<p class='bpcode w800'>
-	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/2dLongArray"</js>)	
-	<jk>public void</jk> post2dLongArray(
-		<ja>@FormData</ja>(
-			name=<js>"2dLongArrayEntry"</js>,
+	<ja>@RestMethod</ja>(method=<js>"GET"</js>, path=<js>"/testQuery"</js>)	
+	<jk>public void</jk> testQuery(
+		<ja>@Query</ja>(
+			name=<js>"queryParamName"</js>,
 			collectionFormat=<js>"pipes"</js>,
 			items=<ja>@SubItems</ja>(
 				collectionFormat=<js>"csv"</js>,
@@ -14122,166 +14092,44 @@ VariantAlsoNegotiates
 	) {...}
 </p>
 <p>
-	The annotations used for defining the schema for an HTTP part are:
-</p>
-<ul class='doctree'>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.Body Body}
-	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#partSerializer() partSerializer()} - Override the part serializer.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#partParser() partParser()} - Override the part parser.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#required() required()} - Input validation.  Body must be present.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#schema() schema()} - The schema.
-	</ul>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.Header Header}
-	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#_default() _default()}  - Default value if not present.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#_enum() _enum()} - Input validation.  Must match one of the values.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#allowEmptyValue() allowEmptyValue()} - Input validation.  Allow empty value.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#collectionFormat() collectionFormat()} - How collections of items are formatted.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#format() format()} - The schema type format. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#items() items()} - The schema of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#maximum() maximum()} - Input validation.  Maximum numeric value. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#maxLength() maxLength()} - Input validation.  Maximum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#minimum() minimum()} - Input validation.  Minimum numeric value. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#minItems() minItems()} - Input validation.  Minimum number of items in a collection. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#minLength() minLength()} - Input validation.  Minimum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#name() name()} - Header name.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#parser() parser()} - Override the part parser.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#pattern() pattern()} - Input validation.  Must match regular expression.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#required() required()} - Input validation.  Header must be present.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#type() type()} - The schema type.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
-	</ul>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.FormData FormData}
-	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#_default() _default()} - Default value if not present.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#_enum() _enum()} - Input validation.  Must match one of the values.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#allowEmptyValue() allowEmptyValue()} - Input validation.  Allow empty value.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#collectionFormat() collectionFormat()} - How collections of items are formatted.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#format() format()} - The schema type format. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#items() items()} - The schema of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#maximum() maximum()} - Input validation.  Maximum numeric value. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#maxLength() maxLength()} - Input validation.  Maximum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#minimum() minimum()} - Input validation.  Minimum numeric value.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#minItems() minItems()} - Input validation.  Minimum number of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#minLength() minLength()} - Input validation.  Minimum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#name() name()} - Form data entry name.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#parser() parser()} - Override the part parser.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#pattern() pattern()} - Input validation.  Must match regular expression.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#required() required()} - Input validation.  Form data entry must be present.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#type() type()} - The schema type.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
-	</ul>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.Query Query}
-	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#_default() _default()} - Default value if not present.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#_enum() _enum()} - Input validation.  Must match one of the values.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#allowEmptyValue() allowEmptyValue()} - Input validation.  Allow empty value.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#collectionFormat() collectionFormat()} - How collections of items are formatted.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#format() format()} - The schema type format. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#items() items()} - The schema of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#maximum() maximum()} - Input validation.  Maximum numeric value. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#maxLength() maxLength()} - Input validation.  Maximum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#minimum() minimum()} - Input validation.  Minimum numeric value.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#minItems() minItems()} - Input validation.  Minimum number of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#minLength() minLength()} - Input validation.  Minimum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#name() name()} - Query parameter name.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#parser() parser()} - Override the part parser.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#pattern() pattern()} - Input validation.  Must match regular expression.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#required() required()} - Input validation.  Query parameter must be present.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#type() type()} - The schema type.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
-	</ul>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.Path Path}
-	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#_enum() _enum()} - Input validation.  Must match one of the values.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#collectionFormat() collectionFormat()} - How collections of items are formatted.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#format() format()} - The schema type format. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#items() items()} - The schema of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#maximum() maximum()} - Input validation.  Maximum numeric value. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#maxLength() maxLength()} - Input validation.  Maximum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#minimum() minimum()} - Input validation.  Minimum numeric value.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#minLength() minLength()} - Input validation.  Minimum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#name() name()} - Path variable name.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#parser() parser()} - Override the part parser.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#pattern() pattern()} - Input validation.  Must match regular expression.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#type() type()} - The schema type.
-	</ul>
-</ul>
-<p>
-	The sub-annotations used in the annotation above are:
+	Input will be converted based on the types and formats defined in the schema definition.
+	<br>Input validations such as <code>minLength/maxLength</code> that don't match the input will result in automatic <code>400 Bad Request</code> responses.
 </p>
-<ul class='doctree'>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.Schema Schema}
-	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#_default() _default()} - Default value if not present.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#_enum() _enum()} - Input validation.  Must match one of the values.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#format() format()} - The schema type format. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#items() items()} - The schema of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#maximum() maximum()} - Input validation.  Maximum numeric value. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#maxLength() maxLength()} - Input validation.  Maximum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#minimum() minimum()} - Input validation.  Minimum numeric value.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#minItems() minItems()} - Input validation.  Minimum number of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#minLength() minLength()} - Input validation.  Minimum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#pattern() pattern()} - Input validation.  Must match regular expression.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#pattern() properties()} - Schema of properties of this item.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#required() required()} - Whether this value is required.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#type() type()} - The schema type.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
-	</ul>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.Items Items}
-	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#_default() _default()} - Default value if not present. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#_enum() _enum()} - Input validation.  Must match one of the values.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#collectionFormat() collectionFormat()} - How collections of items are formatted.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#format() format()} - The schema type format. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#items() items()} - The schema of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#maximum() maximum()} - Input validation.  Maximum numeric value. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#maxLength() maxLength()} - Input validation.  Maximum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#minimum() minimum()} - Input validation.  Minimum numeric value.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#minItems() minItems()} - Input validation.  Minimum number of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#minLength() minLength()} - Input validation.  Minimum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#pattern() pattern()} - Input validation.  Must match regular expression.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#type() type()} - The schema type.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
-	</ul>
-</ul>
 <p>
-	Warning....here's where things get complex (in case you weren't already confused)...
+	The following shows the same for a request body:
 </p>
-<p>
-	When using Swagger schemas to define the body of a request, the list of valid POJO types expands significantly depending on the type and format
-	of the value or items/entries of the value.
+<p class='bpcode w800'>
+	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/testBody"</js>)	
+	<jk>public void</jk> testBody(
+		<ja>@Body</ja>(
+			usePartParser=<jk>true</jk>,
+			schema=<ja>@Schema</ja>(
+				items=<ja>@Items</ja>(
+					collectionFormat=<js>"pipes"</js>,
+					items=<ja>@SubItems</ja>(
+						collectionFormat=<js>"csv"</js>,
+						type=<js>"integer"</js>, 
+						format=<js>"int64"</js>,
+						minimum=<js>"0"</js>,
+						maximum=<js>"100"</js>
+						minLength=1,
+						maxLength=10
+					)
+				)
+				minLength=1,
+				maxLength=10
+			)
+		)
+		Long[][] body
+	) {...}
 </p>
 <p>
-	For example, instead of <code>Longs</code> in the example above, we could also define a 2-dimensional array of POJOs convertible from <code>Longs</code>:
+	The list of valid POJO types for parameters depends on type and format of the value or items/entries of the value.
+	<br>For example, instead of <code>Longs</code> in the example above, we could also define a 2-dimensional array of POJOs convertible from <code>Longs</code>:
 </p>
 <p class='bpcode w800'>
 	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/2dLongArray"</js>)	
-	<jk>public void</jk> post2dLongArray(<ja>@Body</ja>(...) MyPojo[][] body) {...}
+	<jk>public void</jk> testBody(<ja>@Body</ja>(...) MyPojo[][] body) {...}
 	
 	<jc>// POJO convertible from a Long.</jc>
 	<jk>public class</jk> MyPojo {
@@ -14293,7 +14141,7 @@ VariantAlsoNegotiates
 </p>
 <p class='bpcode w800'>
 	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/2dLongArray"</js>)	
-	<jk>public void</jk> post2dLongArray(<ja>@Body</ja>(...) MyPojo[] body) {...}
+	<jk>public void</jk> testBody(<ja>@Body</ja>(...) MyPojo[] body) {...}
 	
 	<jc>// POJO convertible from a Long[].</jc>
 	<jk>public class</jk> MyPojo {
@@ -14305,7 +14153,7 @@ VariantAlsoNegotiates
 </p>
 <p class='bpcode w800'>
 	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/2dLongArray"</js>)	
-	<jk>public void</jk> post2dLongArray(<ja>@Body</ja>(...) MyPojo body) {...}
+	<jk>public void</jk> testBody(<ja>@Body</ja>(...) MyPojo body) {...}
 	
 	<jc>// POJO convertible from a Long[][].</jc>
 	<jk>public class</jk> MyPojo {
@@ -14314,190 +14162,140 @@ VariantAlsoNegotiates
 </p>
 <p>
 	As you can see, the complexity of possible input types expands significantly.
-	<br>Here are the rules of POJO types allowed for various type/format combinations:
+	<br>For more information about valid parameter types, see <a class='doclink' href='#juneau-marshall.OpenApiDetails.Parsers'>OpenAPI Parsers</a>
 </p>
-<table class='styled w800'>
-	<tr><th>Type</th><th>Format</th><th>Valid parameter types</th></tr>
-	<tr class='dark bb'>
-		<td rowspan="4"><code>string</code></td>
-		<td>
-			<code>byte<br>binary<br>binary-spaced</code>
-		</td>
-		<td>
-			<ul>
-				<li><code><jk>byte</jk>[]</code> (default)
-				<li>{@link java.io.InputStream} - Returns a {@link java.io.ByteArrayInputStream}.
-				<li>{@link java.io.Reader} - Returns a {@link java.io.InputStreamReader} wrapped around a {@link java.io.ByteArrayInputStream}.
-				<li>{@link java.lang.String} - Constructed using {@link java.lang.String#String(byte[])}.
-				<li>{@link java.lang.Object} - Returns the default <code><jk>byte</jk>[]</code>.
-				<li>Any POJO transformable from a <code><jk>byte</jk>[]</code> (via constructors or static create methods).
-			</ul>
-		</td>
-	</tr>
-	<tr class='dark bb'>
-		<td>
-			<code>date</code>
-			<br><code>date-time</code>
-		</td>
-		<td>
-			<ul>
-				<li>{@link java.util.Calendar} (default)
-				<li>{@link java.util.Date}
-				<li>{@link java.util.GregorianCalendar}
-				<li>{@link java.lang.String} - Converted using {@link java.util.Calendar#toString()}.
-				<li>{@link java.lang.Object} - Returns the default {@link java.util.Calendar}.
-				<li>Any POJO transformable from a {@link java.util.Calendar} (via constructors or static create methods).
-			</ul>
-		</td>
-	</tr>
-	<tr class='dark bb'>
-		<td><code>uon</code></td>
-		<td>
-			<ul>
-				<li>Any <a href='#juneau-marshall.PojoCategories'>parsable POJO</a>.
-			</ul>
-		</td>
-	</tr>
-	<tr class='dark bb'>
-		<td>none specified</td>
-		<td>
-			<ul>
-				<li>{@link java.lang.String} (default)
-				<li>{@link java.lang.Object} - Returns the default {@link java.lang.String}.
-				<li>Any POJO transformable from a {@link java.lang.String} (via constructors or static create methods).
-			</ul>
-		</td>
-	</tr>
-	<tr class='light bb'>
-		<td ><code>boolean</code></td>
-		<td>
-			&nbsp;
-		</td>
-		<td>
-			<ul>
-				<li>{@link java.lang.Boolean} (default)
-				<li><jk>boolean</jk>
-				<li>{@link java.lang.String}
-				<li>{@link java.lang.Object} - Returns the default {@link java.lang.Boolean}.
-				<li>Any POJO transformable from a {@link java.lang.Boolean} (via constructors, static create methods).
-			</ul>
-		</td>
-	</tr>
-	<tr class='dark bb'>
-		<td rowspan=2><code>integer</code></td>
-		<td>
-			<code>int32</code>
-		</td>
-		<td>
-			<ul>
-				<li>{@link java.lang.Integer} (default)
-				<li>Any subclass of {@link java.lang.Number} 
-				<li>Any primitive number:  (e.g <jk>int</jk>, <jk>float</jk>...)
-				<li>{@link java.lang.String}
-				<li>{@link java.lang.Object} - Returns the default {@link java.lang.Integer}.
-				<li>Any POJO transformable from an {@link java.lang.Integer} (via constructors, static create methods).
-			</ul>
-		</td>
-	</tr>
-	<tr class='dark bb'>
-		<td>
-			<code>int64</code>
-		</td>
-		<td>
-			<ul>
-				<li>{@link java.lang.Long} (default)
-				<li>Any subclass of {@link java.lang.Number} 
-				<li>Any primitive number:  (e.g <jk>int</jk>, <jk>float</jk>...)
-				<li>{@link java.lang.String}
-				<li>{@link java.lang.Object} - Returns the default {@link java.lang.Long}.
-				<li>Any POJO transformable from an {@link java.lang.Long} (via constructors, static create methods).
-			</ul>
-		</td>
-	</tr>
-	<tr class='light bb'>
-		<td rowspan=2><code>number</code></td>
-		<td>
-			<code>float</code>
-		</td>
-		<td>
-			<ul>
-				<li>{@link java.lang.Float} (default)
-				<li>Any subclass of {@link java.lang.Number} 
-				<li>Any primitive number:  (e.g <jk>int</jk>, <jk>float</jk>...)
-				<li>{@link java.lang.String}
-				<li>{@link java.lang.Object} - Returns the default {@link java.lang.Float}.
-				<li>Any POJO transformable from an {@link java.lang.Float} (via constructors, static create methods).
-			</ul>
-		</td>
-	</tr>
-	<tr class='light bb'>
-		<td>
-			<code>double</code>
-		</td>
-		<td>
-			<ul>
-				<li>{@link java.lang.Double} (default)
-				<li>Any subclass of {@link java.lang.Number} 
-				<li>Any primitive number:  (e.g <jk>int</jk>, <jk>float</jk>...)
-				<li>{@link java.lang.String}
-				<li>{@link java.lang.Object} - Returns the default {@link java.lang.Double}.
-				<li>Any POJO transformable from an {@link java.lang.Double} (via constructors, static create methods).
-			</ul>
-		</td>
-	</tr>
-	<tr class='dark bb'>
-		<td ><code>array</code></td>
-		<td>
-			&nbsp;
-		</td>
-		<td>
-			<ul>
-				<li>Arrays or Collections of anything on this list.
-				<li>Any POJO transformable from arrays of the default types (e.g. <code>Integer[]</code>, <code>Boolean[][]</code>, etc...).
-			</ul>
-		</td>
-	</tr>
-	<tr class='light bb'>
-		<td ><code>object</code></td>
-		<td>
-			&nbsp;
-		</td>
-		<td>
-			<ul>
-				<li>Beans with properties of anything on this list.
-				<li>Maps with string keys.
-			</ul>
-		</td>
-	</tr>
-</table>
+</div><!-- END: 7.7 - juneau-rest-server.OpenApiSchemaPartParsing -->
+
+<!-- ==================================================================================================== -->
+
+<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-server.OpenApiSchemaPartSerializing' id='juneau-rest-server.OpenApiSchemaPartSerializing'>7.8 - OpenAPI Schema Part Serializing</a></h3>
+<div class='topic'><!-- START: 7.8 - juneau-rest-server.OpenApiSchemaPartSerializing -->
 <p>
-	Several of the attributes on the <ja>@Body</ja> annotation are used for specifying additional information for the auto-generated Swagger documentation.
-	<br>These do not have any affects on the running code except for the generated Swagger:
+	Parameters annotated with any of the following are serialized using the registered {@link org.apache.juneau.httppart.OpenApiPartSerializer} and
+	therefore support OpenAPI syntax and validation:
+</p>
+<ul class='doctree'>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.ResponseHeader ResponseHeader}
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Response Response} ({@link org.apache.juneau.http.annotation.Response#usePartSerializer usePartSerializer} flag must be set)
+</ul>
+<p>
+	For example, the following shows how a pipe-delimited list of comma-delimited numbers (e.g. <js>"1,2,3|4,5,6|7,8,9"</js>) in a response header can be converted to a 2-dimensional array of <code>Longs</code>:
+</p>
+<p class='bpcode w800'>
+	<ja>@RestMethod</ja>(method=<js>"GET"</js>, path=<js>"/testResponseHeader"</js>)	
+	<jk>public void</jk> testResponseHeader(
+		<ja>@ResponseHeader</ja>(
+			name=<js>"My-Header"</js>,
+			collectionFormat=<js>"pipes"</js>,
+			items=<ja>@SubItems</ja>(
+				collectionFormat=<js>"csv"</js>,
+				type=<js>"integer"</js>, 
+				format=<js>"int64"</js>,
+				minimum=<js>"0"</js>,
+				maximum=<js>"100"</js>
+				minLength=1,
+				maxLength=10
+			)
+			minLength=1,
+			maxLength=10
+			)
+		)
+		Value&lt;Long[][]&gt; header
+	) {
+		header.set(<jk>new</jk> Long[][]{...});
+	}
+</p>
+<p>
+	The following shows the same for a response body:
+</p>
+<p class='bpcode w800'>
+	<ja>@RestMethod</ja>(method=<js>"GET"</js>, path=<js>"/testResponseBody"</js>)	
+	<jk>public void</jk> testResponseBody(
+		<ja>@Response</ja>(
+			usePartSerializer=<jk>true</jk>,
+			schema=<ja>@Schema</ja>(
+				items=<ja>@Items</ja>(
+					collectionFormat=<js>"pipes"</js>,
+					items=<ja>@SubItems</ja>(
+						collectionFormat=<js>"csv"</js>,
+						type=<js>"integer"</js>, 
+						format=<js>"int64"</js>,
+						minimum=<js>"0"</js>,
+						maximum=<js>"100"</js>
+						minLength=1,
+						maxLength=10
+					)
+				)
+				minLength=1,
+				maxLength=10
+			)
+		)
+		Value&lt;Long[][]&gt; responseBody
+	) {...}
+</p>
+<p>
+	For more information about the valid parameter types, see <a class='doclink' href='#juneau-marshall.OpenApiDetails.Serializers'>OpenAPI Serializers</a>
+</p>
+</div><!-- END: 7.8 - juneau-rest-server.OpenApiSchemaPartSerializing -->
+
+<!-- ==================================================================================================== -->
+
+<h3 class='topic todo' onclick='toggle(this)'><a href='#juneau-rest-server.HttpPartAnnotations' id='juneau-rest-server.HttpPartAnnotations'>7.9 - HTTP-Part Annotations</a></h3>
+<div class='topic'><!-- START: 7.9 - juneau-rest-server.HttpPartAnnotations -->
+<p>
+	The annotations used for defining the schema for an HTTP part are:
+</p>
+<ul class='doctree'>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Body Body}
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Header Header}
+	<li class='ja'>{@link org.apache.juneau.http.annotation.FormData FormData}
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Query Query}
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Path Path}
+</ul>
+<p>
+	The sub-annotations used in the annotation above are:
 </p>
 <ul class='doctree'>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.Body}
-	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#api() api()} - Free-form JSON swagger.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#description() description()} - Description
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#example() example()} - Defines a serialized POJO example (in JSON format) used to populate examples per language type.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#examples() examples()} - Map of examples per language type.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#schema() schema()} - The swagger schema ({@link org.apache.juneau.http.annotation.Schema Schema}).
-	</ul>
 	<li class='ja'>{@link org.apache.juneau.http.annotation.Schema Schema}
 	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#$ref() $ref()} - Reference to schema definition.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#description() description()} - Description
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#example() example()} - Defines a serialized POJO example (in JSON format) used to populate examples per language type. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#examples() examples()} - Map of examples per language type.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#externalDocs() externalDocs()} - External documentation.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#title() title()} - Title.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#value() value()} - Free-form JSON swagger.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#xml() xml()} - XML schema.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#_default() _default()} - Default value if not present.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#_enum() _enum()} - Input validation.  Must match one of the values.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#format() format()} - The schema type format. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#items() items()} - The schema of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#maximum() maximum()} - Input validation.  Maximum numeric value. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#maxLength() maxLength()} - Input validation.  Maximum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#minimum() minimum()} - Input validation.  Minimum numeric value.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#minItems() minItems()} - Input validation.  Minimum number of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#minLength() minLength()} - Input validation.  Minimum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#pattern() pattern()} - Input validation.  Must match regular expression.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#pattern() properties()} - Schema of properties of this item.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#required() required()} - Whether this value is required.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#type() type()} - The schema type.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
 	</ul>
 	<li class='ja'>{@link org.apache.juneau.http.annotation.Items Items}
 	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#$ref() $ref()} - Reference to schema definition. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#value() value()} - Free-form JSON swagger.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#_default() _default()} - Default value if not present. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#_enum() _enum()} - Input validation.  Must match one of the values.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#collectionFormat() collectionFormat()} - How collections of items are formatted.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#format() format()} - The schema type format. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#items() items()} - The schema of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#maximum() maximum()} - Input validation.  Maximum numeric value. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#maxLength() maxLength()} - Input validation.  Maximum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#minimum() minimum()} - Input validation.  Minimum numeric value.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#minItems() minItems()} - Input validation.  Minimum number of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#minLength() minLength()} - Input validation.  Minimum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#pattern() pattern()} - Input validation.  Must match regular expression.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#type() type()} - The schema type.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
 	</ul>
 </ul>
 
@@ -14510,48 +14308,23 @@ VariantAlsoNegotiates
 		Annotation parameter values will be aggregated when used on both POJOs and REST methods. 
 		<br>Values on methods override values on POJO classes.
 </ul>
-</div><!-- END: 7.7 - juneau-rest-server.OpenApiSchemaPartParsing -->
-
-<!-- ==================================================================================================== -->
-
-<h3 class='topic todo' onclick='toggle(this)'><a href='#juneau-rest-server.OpenApiSchemaPartSerializing' id='juneau-rest-server.OpenApiSchemaPartSerializing'>7.8 - OpenAPI Schema Part Serializing</a></h3>
-<div class='topic'><!-- START: 7.8 - juneau-rest-server.OpenApiSchemaPartSerializing -->
-<p class='bpcode w800'>
-	<jc>// Schema information about our part.</jc>
-	HttpPartSchema schema = HttpPartSchema
-		.<jsm>create</jsm>(<js>"array"</js>)
-		.collectionFormat(<js>"pipes"</js>)
-		.items(
-			HttpPartSchema
-				.<jsm>create</jsm>(<js>"array"</js>)
-				.collectionFormat(<js>"csv"</js>)
-				.items(
-					HttpPartSchema.<jsm>create</jsm>(<js>"integer"</js>,<js>"int64"</js>)
-				)
-		)
-		.build();
-
-	<jc>// Our value to serialize</jc>
-	Object value = <jk>new long</jk>[][]{{1,2,3},{4,5,6},{7,8,9}};
-
-	<jc>// Produces "1,2,3|4,5,6|7,8,9"</jc>
-	String output = OpenApiPartSerializer.<jsf>DEFAULT</jsf>.serialize(HttpPartType.<jsf>HEADER</jsf>, schema, value);
-</p>
-</div><!-- END: 7.8 - juneau-rest-server.OpenApiSchemaPartSerializing -->
-
-<!-- ==================================================================================================== -->
-
-<h3 class='topic todo' onclick='toggle(this)'><a href='#juneau-rest-server.HttpPartAnnotations' id='juneau-rest-server.HttpPartAnnotations'>7.9 - HTTP-Part Annotations</a></h3>
-<div class='topic'><!-- START: 7.9 - juneau-rest-server.HttpPartAnnotations -->
-TODO(7.2.0)
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-server.HttpPartAnnotations.Body' id='juneau-rest-server.HttpPartAnnotations.Body'>7.9.1 - @Body</a></h4>
+<h4 class='topic todo' onclick='toggle(this)'><a href='#juneau-rest-server.HttpPartAnnotations.Body' id='juneau-rest-server.HttpPartAnnotations.Body'>7.9.1 - @Body</a></h4>
 <div class='topic'><!-- START: 7.9.1 - juneau-rest-server.HttpPartAnnotations.Body -->
 <p>
 	The {@link org.apache.juneau.http.annotation.Body @Body} annotation is used to identify POJOs to be used as the body of an HTTP request.
 </p>
+<ul class='doctree'>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Body Body}
+	<ul>
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#partSerializer() partSerializer()} - Override the part serializer.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#partParser() partParser()} - Override the part parser.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#required() required()} - Input validation.  Body must be present.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#schema() schema()} - The schema.
+	</ul>
+</ul>
 <p>
 	This annotation can be applied at the following locations:
 </p>
@@ -14672,6 +14445,86 @@ TODO(7.2.0)
 	)
 </p>
 
+
+
+
+<p>
+	Several of the attributes on the <ja>@Body</ja> annotation are used for specifying additional information for the auto-generated Swagger documentation.
+	<br>These do not have any affects on the running code except for the generated Swagger:
+</p>
+<ul class='doctree'>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Body}
+	<ul>
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#api() api()} - Free-form JSON swagger.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#description() description()} - Description
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#example() example()} - Defines a serialized POJO example (in JSON format) used to populate examples per language type.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#examples() examples()} - Map of examples per language type.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#schema() schema()} - The swagger schema ({@link org.apache.juneau.http.annotation.Schema Schema}).
+	</ul>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Schema Schema}
+	<ul>
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#$ref() $ref()} - Reference to schema definition.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#description() description()} - Description
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#example() example()} - Defines a serialized POJO example (in JSON format) used to populate examples per language type. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#examples() examples()} - Map of examples per language type.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#externalDocs() externalDocs()} - External documentation.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#title() title()} - Title.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#value() value()} - Free-form JSON swagger.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#xml() xml()} - XML schema.
+	</ul>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Items Items}
+	<ul>
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#$ref() $ref()} - Reference to schema definition. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#value() value()} - Free-form JSON swagger.
+	</ul>
+</ul>
+
+
+
+
+		if (schema == null)
+			schema = HttpPartSchema.DEFAULT;
+
+		if (pm != null) {
+			Parser p = pm.getParser();
+			MediaType mediaType = pm.getMediaType();
+			req.getProperties().append("mediaType", mediaType).append("characterEncoding", req.getCharacterEncoding());
+			ParserSession session = p.createSession(new ParserSessionArgs(req.getProperties(), req.getJavaMethod(), locale, timeZone, mediaType, req.isDebug() ? true : null, req.getContext().getResource()));
+			try (Closeable in = session.isReaderParser() ? getUnbufferedReader() : getInputStream()) {
+				T o = session.parse(in, cm);
+				if (schema != null)
+					schema.validateOutput(o, cm.getBeanContext());
+				return o;
+			}
+		}
+
+		if (cm.hasReaderTransform())
+			return cm.getReaderTransform().transform(getReader());
+
+		if (cm.hasInputStreamTransform())
+			return cm.getInputStreamTransform().transform(getInputStream());
+
+		MediaType mt = getMediaType();
+		if ((isEmpty(mt) || mt.toString().startsWith("text/plain"))) {
+			if (partParser != null) {
+				String in = asString();
+				return partParser.createSession(req.getParserSessionArgs()).parse(HttpPartType.BODY, schema, isEmpty(in) ? null : in, cm);
+			} else if (cm.hasStringTransform()) {
+				return cm.getStringTransform().transform(asString());
+			}
+		}
+
+
+
+
+
+
+
+
+
+
+
+
 <h5 class='section'>Other Notes:</h5>
 <ul class='spaced-list'>
 	<li>
@@ -14682,6 +14535,10 @@ TODO(7.2.0)
 		<br>Values on methods override values on POJO classes.
 </ul>
 
+
+
+
+
 <h5 class='section'>See Also:</h5>
 <ul>
 	<li class='ja'>{@link org.apache.juneau.http.annotation.Body}
@@ -14697,6 +14554,33 @@ TODO(7.2.0)
 <p>
 	The {@link org.apache.juneau.http.annotation.FormData @FormData} annotation is used to retrieve request form post entries.
 </p>
+<ul class='doctree'>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.FormData FormData}
+	<ul>
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#_default() _default()} - Default value if not present.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#_enum() _enum()} - Input validation.  Must match one of the values.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#allowEmptyValue() allowEmptyValue()} - Input validation.  Allow empty value.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#collectionFormat() collectionFormat()} - How collections of items are formatted.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#format() format()} - The schema type format. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#items() items()} - The schema of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#maximum() maximum()} - Input validation.  Maximum numeric value. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#maxLength() maxLength()} - Input validation.  Maximum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#minimum() minimum()} - Input validation.  Minimum numeric value.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#minItems() minItems()} - Input validation.  Minimum number of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#minLength() minLength()} - Input validation.  Minimum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#name() name()} - Form data entry name.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#parser() parser()} - Override the part parser.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#pattern() pattern()} - Input validation.  Must match regular expression.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#required() required()} - Input validation.  Form data entry must be present.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#type() type()} - The schema type.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
+	</ul>
+</ul>
+
 <h5 class='figure'>Example:</h5>
 <p class='bpcode w800'>	
 	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
@@ -14754,6 +14638,33 @@ TODO(7.2.0)
 	The {@link org.apache.juneau.http.annotation.Query @Query} annotation is used to retrieve request URL query parameters.
 	<br>It's identical to {@link org.apache.juneau.http.annotation.FormData @FormData}, but only retrieves the parameter from the URL string, not URL-encoded form posts.
 </p>
+<ul class='doctree'>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Query Query}
+	<ul>
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#_default() _default()} - Default value if not present.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#_enum() _enum()} - Input validation.  Must match one of the values.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#allowEmptyValue() allowEmptyValue()} - Input validation.  Allow empty value.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#collectionFormat() collectionFormat()} - How collections of items are formatted.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#format() format()} - The schema type format. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#items() items()} - The schema of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#maximum() maximum()} - Input validation.  Maximum numeric value. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#maxLength() maxLength()} - Input validation.  Maximum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#minimum() minimum()} - Input validation.  Minimum numeric value.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#minItems() minItems()} - Input validation.  Minimum number of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#minLength() minLength()} - Input validation.  Minimum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#name() name()} - Query parameter name.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#parser() parser()} - Override the part parser.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#pattern() pattern()} - Input validation.  Must match regular expression.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#required() required()} - Input validation.  Query parameter must be present.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#type() type()} - The schema type.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
+	</ul>
+</ul>
+
 <p>
 	Unlike {@link org.apache.juneau.http.annotation.FormData @FormData}, using this annotation does not result in the servlet reading the contents of
 	URL-encoded form posts.
@@ -14808,6 +14719,32 @@ TODO(7.2.0)
 <p>
 	The {@link org.apache.juneau.http.annotation.Header @Header} annotation is used to retrieve request headers.
 </p>
+<ul class='doctree'>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Header Header}
+	<ul>
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#_default() _default()}  - Default value if not present.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#_enum() _enum()} - Input validation.  Must match one of the values.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#allowEmptyValue() allowEmptyValue()} - Input validation.  Allow empty value.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#collectionFormat() collectionFormat()} - How collections of items are formatted.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#format() format()} - The schema type format. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#items() items()} - The schema of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#maximum() maximum()} - Input validation.  Maximum numeric value. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#maxLength() maxLength()} - Input validation.  Maximum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#minimum() minimum()} - Input validation.  Minimum numeric value. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#minItems() minItems()} - Input validation.  Minimum number of items in a collection. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#minLength() minLength()} - Input validation.  Minimum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#name() name()} - Header name.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#parser() parser()} - Override the part parser.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#pattern() pattern()} - Input validation.  Must match regular expression.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#required() required()} - Input validation.  Header must be present.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#type() type()} - The schema type.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
+	</ul>
+</ul>
 <h5 class='figure'>Example:</h5>
 <p class='bpcode w800'>
 	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
@@ -14843,6 +14780,27 @@ TODO(7.2.0)
 <p>
 	The {@link org.apache.juneau.http.annotation.Header @Header} annotation is used to retrieve request headers.
 </p>
+<ul class='doctree'>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Path Path}
+	<ul>
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#_enum() _enum()} - Input validation.  Must match one of the values.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#collectionFormat() collectionFormat()} - How collections of items are formatted.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#format() format()} - The schema type format. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#items() items()} - The schema of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#maximum() maximum()} - Input validation.  Maximum numeric value. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#maxLength() maxLength()} - Input validation.  Maximum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#minimum() minimum()} - Input validation.  Minimum numeric value.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#minLength() minLength()} - Input validation.  Minimum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#name() name()} - Path variable name.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#parser() parser()} - Override the part parser.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#pattern() pattern()} - Input validation.  Must match regular expression.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#type() type()} - The schema type.
+	</ul>
+</ul>
+
 <h5 class='figure'>Example:</h5>
 <p class='bpcode w800'>
 	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
diff --git a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/07.OpenApiSchemaPartParsing.html b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/07.OpenApiSchemaPartParsing.html
index a2d30a3..c1897ff 100644
--- a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/07.OpenApiSchemaPartParsing.html
+++ b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/07.OpenApiSchemaPartParsing.html
@@ -13,57 +13,27 @@
  ***************************************************************************************************************************/
  -->
 
-{todo} OpenAPI Schema Part Parsing
+{new} OpenAPI Schema Part Parsing
 
 <p>
-	Parameters annotated with any of the following also support parsing based on Swagger-schemas:
+	Parameters annotated with any of the following are parsed using the registered {@link org.apache.juneau.httppart.OpenApiPartParser} and
+	therefore support OpenAPI syntax and validation:
 </p>
 <ul class='doctree'>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.Body Body}
 	<li class='ja'>{@link org.apache.juneau.http.annotation.Header Header}
 	<li class='ja'>{@link org.apache.juneau.http.annotation.Query Query}
 	<li class='ja'>{@link org.apache.juneau.http.annotation.FormData FormData}
 	<li class='ja'>{@link org.apache.juneau.http.annotation.Path Path}
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Body Body} ({@link org.apache.juneau.http.annotation.Body#usePartParser usePartParser} flag must be set)
 </ul>
 <p>
-	For example, the following shows how a pipe-delimited list of comma-delimited numbers (e.g. <js>"1,2,3|4,5,6|7,8,9"</js>) in an HTTP body can be converted to a 2-dimensional array of <code>Longs</code>:
+	For example, the following shows how a pipe-delimited list of comma-delimited numbers (e.g. <js>"1,2,3|4,5,6|7,8,9"</js>) in a query parameter can be converted to a 2-dimensional array of <code>Longs</code>:
 </p>
 <p class='bpcode w800'>
-	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/2dLongArray"</js>)	
-	<jk>public void</jk> post2dLongArray(
-		<ja>@Body</ja>(
-			schema=<ja>@Schema</ja>(
-				items=<ja>@Items</ja>(
-					collectionFormat=<js>"pipes"</js>,
-					items=<ja>@SubItems</ja>(
-						collectionFormat=<js>"csv"</js>,
-						type=<js>"integer"</js>, 
-						format=<js>"int64"</js>,
-						minimum=<js>"0"</js>,
-						maximum=<js>"100"</js>
-						minLength=1,
-						maxLength=10
-					)
-				)
-				minLength=1,
-				maxLength=10
-			)
-		)
-		Long[][] body
-	) {...}
-</p>
-<p>
-	Input will be converted based on the types and formats defined in the schema definition.
-	<br>Input validations such as <code>minLength/maxLength</code> that don't match the input will result in automatic <code>400 Bad Request</code> responses.
-</p>
-<p>
-	The equivalent for a form-data post entry is shown below:
-</p>
-<p class='bpcode w800'>
-	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/2dLongArray"</js>)	
-	<jk>public void</jk> post2dLongArray(
-		<ja>@FormData</ja>(
-			name=<js>"2dLongArrayEntry"</js>,
+	<ja>@RestMethod</ja>(method=<js>"GET"</js>, path=<js>"/testQuery"</js>)	
+	<jk>public void</jk> testQuery(
+		<ja>@Query</ja>(
+			name=<js>"queryParamName"</js>,
 			collectionFormat=<js>"pipes"</js>,
 			items=<ja>@SubItems</ja>(
 				collectionFormat=<js>"csv"</js>,
@@ -82,166 +52,44 @@
 	) {...}
 </p>
 <p>
-	The annotations used for defining the schema for an HTTP part are:
-</p>
-<ul class='doctree'>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.Body Body}
-	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#partSerializer() partSerializer()} - Override the part serializer.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#partParser() partParser()} - Override the part parser.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#required() required()} - Input validation.  Body must be present.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#schema() schema()} - The schema.
-	</ul>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.Header Header}
-	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#_default() _default()}  - Default value if not present.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#_enum() _enum()} - Input validation.  Must match one of the values.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#allowEmptyValue() allowEmptyValue()} - Input validation.  Allow empty value.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#collectionFormat() collectionFormat()} - How collections of items are formatted.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#format() format()} - The schema type format. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#items() items()} - The schema of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#maximum() maximum()} - Input validation.  Maximum numeric value. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#maxLength() maxLength()} - Input validation.  Maximum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#minimum() minimum()} - Input validation.  Minimum numeric value. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#minItems() minItems()} - Input validation.  Minimum number of items in a collection. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#minLength() minLength()} - Input validation.  Minimum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#name() name()} - Header name.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#parser() parser()} - Override the part parser.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#pattern() pattern()} - Input validation.  Must match regular expression.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#required() required()} - Input validation.  Header must be present.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#type() type()} - The schema type.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
-	</ul>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.FormData FormData}
-	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#_default() _default()} - Default value if not present.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#_enum() _enum()} - Input validation.  Must match one of the values.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#allowEmptyValue() allowEmptyValue()} - Input validation.  Allow empty value.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#collectionFormat() collectionFormat()} - How collections of items are formatted.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#format() format()} - The schema type format. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#items() items()} - The schema of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#maximum() maximum()} - Input validation.  Maximum numeric value. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#maxLength() maxLength()} - Input validation.  Maximum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#minimum() minimum()} - Input validation.  Minimum numeric value.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#minItems() minItems()} - Input validation.  Minimum number of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#minLength() minLength()} - Input validation.  Minimum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#name() name()} - Form data entry name.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#parser() parser()} - Override the part parser.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#pattern() pattern()} - Input validation.  Must match regular expression.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#required() required()} - Input validation.  Form data entry must be present.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#type() type()} - The schema type.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
-	</ul>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.Query Query}
-	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#_default() _default()} - Default value if not present.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#_enum() _enum()} - Input validation.  Must match one of the values.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#allowEmptyValue() allowEmptyValue()} - Input validation.  Allow empty value.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#collectionFormat() collectionFormat()} - How collections of items are formatted.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#format() format()} - The schema type format. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#items() items()} - The schema of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#maximum() maximum()} - Input validation.  Maximum numeric value. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#maxLength() maxLength()} - Input validation.  Maximum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#minimum() minimum()} - Input validation.  Minimum numeric value.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#minItems() minItems()} - Input validation.  Minimum number of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#minLength() minLength()} - Input validation.  Minimum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#name() name()} - Query parameter name.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#parser() parser()} - Override the part parser.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#pattern() pattern()} - Input validation.  Must match regular expression.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#required() required()} - Input validation.  Query parameter must be present.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#type() type()} - The schema type.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
-	</ul>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.Path Path}
-	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#_enum() _enum()} - Input validation.  Must match one of the values.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#collectionFormat() collectionFormat()} - How collections of items are formatted.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#format() format()} - The schema type format. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#items() items()} - The schema of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#maximum() maximum()} - Input validation.  Maximum numeric value. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#maxLength() maxLength()} - Input validation.  Maximum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#minimum() minimum()} - Input validation.  Minimum numeric value.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#minLength() minLength()} - Input validation.  Minimum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#name() name()} - Path variable name.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#parser() parser()} - Override the part parser.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#pattern() pattern()} - Input validation.  Must match regular expression.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#type() type()} - The schema type.
-	</ul>
-</ul>
-<p>
-	The sub-annotations used in the annotation above are:
+	Input will be converted based on the types and formats defined in the schema definition.
+	<br>Input validations such as <code>minLength/maxLength</code> that don't match the input will result in automatic <code>400 Bad Request</code> responses.
 </p>
-<ul class='doctree'>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.Schema Schema}
-	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#_default() _default()} - Default value if not present.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#_enum() _enum()} - Input validation.  Must match one of the values.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#format() format()} - The schema type format. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#items() items()} - The schema of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#maximum() maximum()} - Input validation.  Maximum numeric value. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#maxLength() maxLength()} - Input validation.  Maximum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#minimum() minimum()} - Input validation.  Minimum numeric value.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#minItems() minItems()} - Input validation.  Minimum number of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#minLength() minLength()} - Input validation.  Minimum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#pattern() pattern()} - Input validation.  Must match regular expression.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#pattern() properties()} - Schema of properties of this item.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#required() required()} - Whether this value is required.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#type() type()} - The schema type.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
-	</ul>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.Items Items}
-	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#_default() _default()} - Default value if not present. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#_enum() _enum()} - Input validation.  Must match one of the values.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#collectionFormat() collectionFormat()} - How collections of items are formatted.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#format() format()} - The schema type format. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#items() items()} - The schema of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#maximum() maximum()} - Input validation.  Maximum numeric value. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#maxLength() maxLength()} - Input validation.  Maximum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#minimum() minimum()} - Input validation.  Minimum numeric value.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#minItems() minItems()} - Input validation.  Minimum number of items in a collection.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#minLength() minLength()} - Input validation.  Minimum length of a string.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#pattern() pattern()} - Input validation.  Must match regular expression.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#type() type()} - The schema type.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
-	</ul>
-</ul>
 <p>
-	Warning....here's where things get complex (in case you weren't already confused)...
+	The following shows the same for a request body:
 </p>
-<p>
-	When using Swagger schemas to define the body of a request, the list of valid POJO types expands significantly depending on the type and format
-	of the value or items/entries of the value.
+<p class='bpcode w800'>
+	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/testBody"</js>)	
+	<jk>public void</jk> testBody(
+		<ja>@Body</ja>(
+			usePartParser=<jk>true</jk>,
+			schema=<ja>@Schema</ja>(
+				items=<ja>@Items</ja>(
+					collectionFormat=<js>"pipes"</js>,
+					items=<ja>@SubItems</ja>(
+						collectionFormat=<js>"csv"</js>,
+						type=<js>"integer"</js>, 
+						format=<js>"int64"</js>,
+						minimum=<js>"0"</js>,
+						maximum=<js>"100"</js>
+						minLength=1,
+						maxLength=10
+					)
+				)
+				minLength=1,
+				maxLength=10
+			)
+		)
+		Long[][] body
+	) {...}
 </p>
 <p>
-	For example, instead of <code>Longs</code> in the example above, we could also define a 2-dimensional array of POJOs convertible from <code>Longs</code>:
+	The list of valid POJO types for parameters depends on type and format of the value or items/entries of the value.
+	<br>For example, instead of <code>Longs</code> in the example above, we could also define a 2-dimensional array of POJOs convertible from <code>Longs</code>:
 </p>
 <p class='bpcode w800'>
 	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/2dLongArray"</js>)	
-	<jk>public void</jk> post2dLongArray(<ja>@Body</ja>(...) MyPojo[][] body) {...}
+	<jk>public void</jk> testBody(<ja>@Body</ja>(...) MyPojo[][] body) {...}
 	
 	<jc>// POJO convertible from a Long.</jc>
 	<jk>public class</jk> MyPojo {
@@ -253,7 +101,7 @@
 </p>
 <p class='bpcode w800'>
 	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/2dLongArray"</js>)	
-	<jk>public void</jk> post2dLongArray(<ja>@Body</ja>(...) MyPojo[] body) {...}
+	<jk>public void</jk> testBody(<ja>@Body</ja>(...) MyPojo[] body) {...}
 	
 	<jc>// POJO convertible from a Long[].</jc>
 	<jk>public class</jk> MyPojo {
@@ -265,7 +113,7 @@
 </p>
 <p class='bpcode w800'>
 	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/2dLongArray"</js>)	
-	<jk>public void</jk> post2dLongArray(<ja>@Body</ja>(...) MyPojo body) {...}
+	<jk>public void</jk> testBody(<ja>@Body</ja>(...) MyPojo body) {...}
 	
 	<jc>// POJO convertible from a Long[][].</jc>
 	<jk>public class</jk> MyPojo {
@@ -274,199 +122,5 @@
 </p>
 <p>
 	As you can see, the complexity of possible input types expands significantly.
-	<br>Here are the rules of POJO types allowed for various type/format combinations:
-</p>
-<table class='styled w800'>
-	<tr><th>Type</th><th>Format</th><th>Valid parameter types</th></tr>
-	<tr class='dark bb'>
-		<td rowspan="4"><code>string</code></td>
-		<td>
-			<code>byte<br>binary<br>binary-spaced</code>
-		</td>
-		<td>
-			<ul>
-				<li><code><jk>byte</jk>[]</code> (default)
-				<li>{@link java.io.InputStream} - Returns a {@link java.io.ByteArrayInputStream}.
-				<li>{@link java.io.Reader} - Returns a {@link java.io.InputStreamReader} wrapped around a {@link java.io.ByteArrayInputStream}.
-				<li>{@link java.lang.String} - Constructed using {@link java.lang.String#String(byte[])}.
-				<li>{@link java.lang.Object} - Returns the default <code><jk>byte</jk>[]</code>.
-				<li>Any POJO transformable from a <code><jk>byte</jk>[]</code> (via constructors or static create methods).
-			</ul>
-		</td>
-	</tr>
-	<tr class='dark bb'>
-		<td>
-			<code>date</code>
-			<br><code>date-time</code>
-		</td>
-		<td>
-			<ul>
-				<li>{@link java.util.Calendar} (default)
-				<li>{@link java.util.Date}
-				<li>{@link java.util.GregorianCalendar}
-				<li>{@link java.lang.String} - Converted using {@link java.util.Calendar#toString()}.
-				<li>{@link java.lang.Object} - Returns the default {@link java.util.Calendar}.
-				<li>Any POJO transformable from a {@link java.util.Calendar} (via constructors or static create methods).
-			</ul>
-		</td>
-	</tr>
-	<tr class='dark bb'>
-		<td><code>uon</code></td>
-		<td>
-			<ul>
-				<li>Any <a href='#juneau-marshall.PojoCategories'>parsable POJO</a>.
-			</ul>
-		</td>
-	</tr>
-	<tr class='dark bb'>
-		<td>none specified</td>
-		<td>
-			<ul>
-				<li>{@link java.lang.String} (default)
-				<li>{@link java.lang.Object} - Returns the default {@link java.lang.String}.
-				<li>Any POJO transformable from a {@link java.lang.String} (via constructors or static create methods).
-			</ul>
-		</td>
-	</tr>
-	<tr class='light bb'>
-		<td ><code>boolean</code></td>
-		<td>
-			&nbsp;
-		</td>
-		<td>
-			<ul>
-				<li>{@link java.lang.Boolean} (default)
-				<li><jk>boolean</jk>
-				<li>{@link java.lang.String}
-				<li>{@link java.lang.Object} - Returns the default {@link java.lang.Boolean}.
-				<li>Any POJO transformable from a {@link java.lang.Boolean} (via constructors, static create methods).
-			</ul>
-		</td>
-	</tr>
-	<tr class='dark bb'>
-		<td rowspan=2><code>integer</code></td>
-		<td>
-			<code>int32</code>
-		</td>
-		<td>
-			<ul>
-				<li>{@link java.lang.Integer} (default)
-				<li>Any subclass of {@link java.lang.Number} 
-				<li>Any primitive number:  (e.g <jk>int</jk>, <jk>float</jk>...)
-				<li>{@link java.lang.String}
-				<li>{@link java.lang.Object} - Returns the default {@link java.lang.Integer}.
-				<li>Any POJO transformable from an {@link java.lang.Integer} (via constructors, static create methods).
-			</ul>
-		</td>
-	</tr>
-	<tr class='dark bb'>
-		<td>
-			<code>int64</code>
-		</td>
-		<td>
-			<ul>
-				<li>{@link java.lang.Long} (default)
-				<li>Any subclass of {@link java.lang.Number} 
-				<li>Any primitive number:  (e.g <jk>int</jk>, <jk>float</jk>...)
-				<li>{@link java.lang.String}
-				<li>{@link java.lang.Object} - Returns the default {@link java.lang.Long}.
-				<li>Any POJO transformable from an {@link java.lang.Long} (via constructors, static create methods).
-			</ul>
-		</td>
-	</tr>
-	<tr class='light bb'>
-		<td rowspan=2><code>number</code></td>
-		<td>
-			<code>float</code>
-		</td>
-		<td>
-			<ul>
-				<li>{@link java.lang.Float} (default)
-				<li>Any subclass of {@link java.lang.Number} 
-				<li>Any primitive number:  (e.g <jk>int</jk>, <jk>float</jk>...)
-				<li>{@link java.lang.String}
-				<li>{@link java.lang.Object} - Returns the default {@link java.lang.Float}.
-				<li>Any POJO transformable from an {@link java.lang.Float} (via constructors, static create methods).
-			</ul>
-		</td>
-	</tr>
-	<tr class='light bb'>
-		<td>
-			<code>double</code>
-		</td>
-		<td>
-			<ul>
-				<li>{@link java.lang.Double} (default)
-				<li>Any subclass of {@link java.lang.Number} 
-				<li>Any primitive number:  (e.g <jk>int</jk>, <jk>float</jk>...)
-				<li>{@link java.lang.String}
-				<li>{@link java.lang.Object} - Returns the default {@link java.lang.Double}.
-				<li>Any POJO transformable from an {@link java.lang.Double} (via constructors, static create methods).
-			</ul>
-		</td>
-	</tr>
-	<tr class='dark bb'>
-		<td ><code>array</code></td>
-		<td>
-			&nbsp;
-		</td>
-		<td>
-			<ul>
-				<li>Arrays or Collections of anything on this list.
-				<li>Any POJO transformable from arrays of the default types (e.g. <code>Integer[]</code>, <code>Boolean[][]</code>, etc...).
-			</ul>
-		</td>
-	</tr>
-	<tr class='light bb'>
-		<td ><code>object</code></td>
-		<td>
-			&nbsp;
-		</td>
-		<td>
-			<ul>
-				<li>Beans with properties of anything on this list.
-				<li>Maps with string keys.
-			</ul>
-		</td>
-	</tr>
-</table>
-<p>
-	Several of the attributes on the <ja>@Body</ja> annotation are used for specifying additional information for the auto-generated Swagger documentation.
-	<br>These do not have any affects on the running code except for the generated Swagger:
+	<br>For more information about valid parameter types, see <a class='doclink' href='#juneau-marshall.OpenApiDetails.Parsers'>OpenAPI Parsers</a>
 </p>
-<ul class='doctree'>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.Body}
-	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#api() api()} - Free-form JSON swagger.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#description() description()} - Description
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#example() example()} - Defines a serialized POJO example (in JSON format) used to populate examples per language type.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#examples() examples()} - Map of examples per language type.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#schema() schema()} - The swagger schema ({@link org.apache.juneau.http.annotation.Schema Schema}).
-	</ul>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.Schema Schema}
-	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#$ref() $ref()} - Reference to schema definition.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#description() description()} - Description
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#example() example()} - Defines a serialized POJO example (in JSON format) used to populate examples per language type. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#examples() examples()} - Map of examples per language type.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#externalDocs() externalDocs()} - External documentation.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#title() title()} - Title.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#value() value()} - Free-form JSON swagger.
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#xml() xml()} - XML schema.
-	</ul>
-	<li class='ja'>{@link org.apache.juneau.http.annotation.Items Items}
-	<ul>
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#$ref() $ref()} - Reference to schema definition. 
-		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#value() value()} - Free-form JSON swagger.
-	</ul>
-</ul>
-
-<h5 class='section'>Other Notes:</h5>
-<ul class='spaced-list'>
-	<li>
-		Annotation parameter values will be aggregated when used on POJO parent and child classes. 
-		<br>Values on child classes override values on parent classes.
-	<li>
-		Annotation parameter values will be aggregated when used on both POJOs and REST methods. 
-		<br>Values on methods override values on POJO classes.
-</ul>
diff --git a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/08.OpenApiSchemaPartSerializing.html b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/08.OpenApiSchemaPartSerializing.html
index 623ec17..c614248 100644
--- a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/08.OpenApiSchemaPartSerializing.html
+++ b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/08.OpenApiSchemaPartSerializing.html
@@ -13,26 +13,71 @@
  ***************************************************************************************************************************/
  -->
 
-{todo} OpenAPI Schema Part Serializing
+{new} OpenAPI Schema Part Serializing
 
+<p>
+	Parameters annotated with any of the following are serialized using the registered {@link org.apache.juneau.httppart.OpenApiPartSerializer} and
+	therefore support OpenAPI syntax and validation:
+</p>
+<ul class='doctree'>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.ResponseHeader ResponseHeader}
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Response Response} ({@link org.apache.juneau.http.annotation.Response#usePartSerializer usePartSerializer} flag must be set)
+</ul>
+<p>
+	For example, the following shows how a pipe-delimited list of comma-delimited numbers (e.g. <js>"1,2,3|4,5,6|7,8,9"</js>) in a response header can be converted to a 2-dimensional array of <code>Longs</code>:
+</p>
 <p class='bpcode w800'>
-	<jc>// Schema information about our part.</jc>
-	HttpPartSchema schema = HttpPartSchema
-		.<jsm>create</jsm>(<js>"array"</js>)
-		.collectionFormat(<js>"pipes"</js>)
-		.items(
-			HttpPartSchema
-				.<jsm>create</jsm>(<js>"array"</js>)
-				.collectionFormat(<js>"csv"</js>)
-				.items(
-					HttpPartSchema.<jsm>create</jsm>(<js>"integer"</js>,<js>"int64"</js>)
+	<ja>@RestMethod</ja>(method=<js>"GET"</js>, path=<js>"/testResponseHeader"</js>)	
+	<jk>public void</jk> testResponseHeader(
+		<ja>@ResponseHeader</ja>(
+			name=<js>"My-Header"</js>,
+			collectionFormat=<js>"pipes"</js>,
+			items=<ja>@SubItems</ja>(
+				collectionFormat=<js>"csv"</js>,
+				type=<js>"integer"</js>, 
+				format=<js>"int64"</js>,
+				minimum=<js>"0"</js>,
+				maximum=<js>"100"</js>
+				minLength=1,
+				maxLength=10
+			)
+			minLength=1,
+			maxLength=10
+			)
+		)
+		Value&lt;Long[][]&gt; header
+	) {
+		header.set(<jk>new</jk> Long[][]{...});
+	}
+</p>
+<p>
+	The following shows the same for a response body:
+</p>
+<p class='bpcode w800'>
+	<ja>@RestMethod</ja>(method=<js>"GET"</js>, path=<js>"/testResponseBody"</js>)	
+	<jk>public void</jk> testResponseBody(
+		<ja>@Response</ja>(
+			usePartSerializer=<jk>true</jk>,
+			schema=<ja>@Schema</ja>(
+				items=<ja>@Items</ja>(
+					collectionFormat=<js>"pipes"</js>,
+					items=<ja>@SubItems</ja>(
+						collectionFormat=<js>"csv"</js>,
+						type=<js>"integer"</js>, 
+						format=<js>"int64"</js>,
+						minimum=<js>"0"</js>,
+						maximum=<js>"100"</js>
+						minLength=1,
+						maxLength=10
+					)
 				)
+				minLength=1,
+				maxLength=10
+			)
 		)
-		.build();
-
-	<jc>// Our value to serialize</jc>
-	Object value = <jk>new long</jk>[][]{{1,2,3},{4,5,6},{7,8,9}};
-
-	<jc>// Produces "1,2,3|4,5,6|7,8,9"</jc>
-	String output = OpenApiPartSerializer.<jsf>DEFAULT</jsf>.serialize(HttpPartType.<jsf>HEADER</jsf>, schema, value);
+		Value&lt;Long[][]&gt; responseBody
+	) {...}
+</p>
+<p>
+	For more information about the valid parameter types, see <a class='doclink' href='#juneau-marshall.OpenApiDetails.Serializers'>OpenAPI Serializers</a>
 </p>
diff --git a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations.html b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations.html
index abb2fe0..e89bd4b 100644
--- a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations.html
+++ b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations.html
@@ -15,4 +15,69 @@
 
 {todo} HTTP-Part Annotations
 
-TODO(7.2.0)
\ No newline at end of file
+<p>
+	The annotations used for defining the schema for an HTTP part are:
+</p>
+<ul class='doctree'>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Body Body}
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Header Header}
+	<li class='ja'>{@link org.apache.juneau.http.annotation.FormData FormData}
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Query Query}
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Path Path}
+</ul>
+<p>
+	The sub-annotations used in the annotation above are:
+</p>
+<ul class='doctree'>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Schema Schema}
+	<ul>
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#_default() _default()} - Default value if not present.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#_enum() _enum()} - Input validation.  Must match one of the values.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#format() format()} - The schema type format. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#items() items()} - The schema of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#maximum() maximum()} - Input validation.  Maximum numeric value. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#maxLength() maxLength()} - Input validation.  Maximum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#minimum() minimum()} - Input validation.  Minimum numeric value.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#minItems() minItems()} - Input validation.  Minimum number of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#minLength() minLength()} - Input validation.  Minimum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#pattern() pattern()} - Input validation.  Must match regular expression.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#pattern() properties()} - Schema of properties of this item.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#required() required()} - Whether this value is required.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#type() type()} - The schema type.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
+	</ul>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Items Items}
+	<ul>
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#_default() _default()} - Default value if not present. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#_enum() _enum()} - Input validation.  Must match one of the values.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#collectionFormat() collectionFormat()} - How collections of items are formatted.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#format() format()} - The schema type format. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#items() items()} - The schema of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#maximum() maximum()} - Input validation.  Maximum numeric value. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#maxLength() maxLength()} - Input validation.  Maximum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#minimum() minimum()} - Input validation.  Minimum numeric value.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#minItems() minItems()} - Input validation.  Minimum number of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#minLength() minLength()} - Input validation.  Minimum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#pattern() pattern()} - Input validation.  Must match regular expression.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#type() type()} - The schema type.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
+	</ul>
+</ul>
+
+<h5 class='section'>Other Notes:</h5>
+<ul class='spaced-list'>
+	<li>
+		Annotation parameter values will be aggregated when used on POJO parent and child classes. 
+		<br>Values on child classes override values on parent classes.
+	<li>
+		Annotation parameter values will be aggregated when used on both POJOs and REST methods. 
+		<br>Values on methods override values on POJO classes.
+</ul>
diff --git a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/01.Body.html b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/01.Body.html
index 51c63e9..374bca0 100644
--- a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/01.Body.html
+++ b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/01.Body.html
@@ -13,11 +13,20 @@
  ***************************************************************************************************************************/
  -->
 
-{new} @Body
+{todo} @Body
 
 <p>
 	The {@link org.apache.juneau.http.annotation.Body @Body} annotation is used to identify POJOs to be used as the body of an HTTP request.
 </p>
+<ul class='doctree'>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Body Body}
+	<ul>
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#partSerializer() partSerializer()} - Override the part serializer.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#partParser() partParser()} - Override the part parser.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#required() required()} - Input validation.  Body must be present.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#schema() schema()} - The schema.
+	</ul>
+</ul>
 <p>
 	This annotation can be applied at the following locations:
 </p>
@@ -138,6 +147,86 @@
 	)
 </p>
 
+
+
+
+<p>
+	Several of the attributes on the <ja>@Body</ja> annotation are used for specifying additional information for the auto-generated Swagger documentation.
+	<br>These do not have any affects on the running code except for the generated Swagger:
+</p>
+<ul class='doctree'>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Body}
+	<ul>
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#api() api()} - Free-form JSON swagger.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#description() description()} - Description
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#example() example()} - Defines a serialized POJO example (in JSON format) used to populate examples per language type.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#examples() examples()} - Map of examples per language type.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#schema() schema()} - The swagger schema ({@link org.apache.juneau.http.annotation.Schema Schema}).
+	</ul>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Schema Schema}
+	<ul>
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#$ref() $ref()} - Reference to schema definition.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#description() description()} - Description
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#example() example()} - Defines a serialized POJO example (in JSON format) used to populate examples per language type. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#examples() examples()} - Map of examples per language type.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#externalDocs() externalDocs()} - External documentation.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#title() title()} - Title.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#value() value()} - Free-form JSON swagger.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Schema#xml() xml()} - XML schema.
+	</ul>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Items Items}
+	<ul>
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#$ref() $ref()} - Reference to schema definition. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Items#value() value()} - Free-form JSON swagger.
+	</ul>
+</ul>
+
+
+
+
+		if (schema == null)
+			schema = HttpPartSchema.DEFAULT;
+
+		if (pm != null) {
+			Parser p = pm.getParser();
+			MediaType mediaType = pm.getMediaType();
+			req.getProperties().append("mediaType", mediaType).append("characterEncoding", req.getCharacterEncoding());
+			ParserSession session = p.createSession(new ParserSessionArgs(req.getProperties(), req.getJavaMethod(), locale, timeZone, mediaType, req.isDebug() ? true : null, req.getContext().getResource()));
+			try (Closeable in = session.isReaderParser() ? getUnbufferedReader() : getInputStream()) {
+				T o = session.parse(in, cm);
+				if (schema != null)
+					schema.validateOutput(o, cm.getBeanContext());
+				return o;
+			}
+		}
+
+		if (cm.hasReaderTransform())
+			return cm.getReaderTransform().transform(getReader());
+
+		if (cm.hasInputStreamTransform())
+			return cm.getInputStreamTransform().transform(getInputStream());
+
+		MediaType mt = getMediaType();
+		if ((isEmpty(mt) || mt.toString().startsWith("text/plain"))) {
+			if (partParser != null) {
+				String in = asString();
+				return partParser.createSession(req.getParserSessionArgs()).parse(HttpPartType.BODY, schema, isEmpty(in) ? null : in, cm);
+			} else if (cm.hasStringTransform()) {
+				return cm.getStringTransform().transform(asString());
+			}
+		}
+
+
+
+
+
+
+
+
+
+
+
+
 <h5 class='section'>Other Notes:</h5>
 <ul class='spaced-list'>
 	<li>
@@ -148,6 +237,10 @@
 		<br>Values on methods override values on POJO classes.
 </ul>
 
+
+
+
+
 <h5 class='section'>See Also:</h5>
 <ul>
 	<li class='ja'>{@link org.apache.juneau.http.annotation.Body}
diff --git a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/02.FormData.html b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/02.FormData.html
index f80e068..5f4323f 100644
--- a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/02.FormData.html
+++ b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/02.FormData.html
@@ -18,6 +18,33 @@
 <p>
 	The {@link org.apache.juneau.http.annotation.FormData @FormData} annotation is used to retrieve request form post entries.
 </p>
+<ul class='doctree'>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.FormData FormData}
+	<ul>
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#_default() _default()} - Default value if not present.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#_enum() _enum()} - Input validation.  Must match one of the values.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#allowEmptyValue() allowEmptyValue()} - Input validation.  Allow empty value.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#collectionFormat() collectionFormat()} - How collections of items are formatted.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#format() format()} - The schema type format. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#items() items()} - The schema of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#maximum() maximum()} - Input validation.  Maximum numeric value. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#maxLength() maxLength()} - Input validation.  Maximum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#minimum() minimum()} - Input validation.  Minimum numeric value.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#minItems() minItems()} - Input validation.  Minimum number of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#minLength() minLength()} - Input validation.  Minimum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#name() name()} - Form data entry name.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#parser() parser()} - Override the part parser.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#pattern() pattern()} - Input validation.  Must match regular expression.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#required() required()} - Input validation.  Form data entry must be present.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#type() type()} - The schema type.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
+	</ul>
+</ul>
+
 <h5 class='figure'>Example:</h5>
 <p class='bpcode w800'>	
 	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
diff --git a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/04.Query.html b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/04.Query.html
index 35855ef..2b48d2f 100644
--- a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/04.Query.html
+++ b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/04.Query.html
@@ -19,6 +19,33 @@
 	The {@link org.apache.juneau.http.annotation.Query @Query} annotation is used to retrieve request URL query parameters.
 	<br>It's identical to {@link org.apache.juneau.http.annotation.FormData @FormData}, but only retrieves the parameter from the URL string, not URL-encoded form posts.
 </p>
+<ul class='doctree'>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Query Query}
+	<ul>
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#_default() _default()} - Default value if not present.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#_enum() _enum()} - Input validation.  Must match one of the values.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#allowEmptyValue() allowEmptyValue()} - Input validation.  Allow empty value.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#collectionFormat() collectionFormat()} - How collections of items are formatted.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#format() format()} - The schema type format. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#items() items()} - The schema of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#maximum() maximum()} - Input validation.  Maximum numeric value. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#maxLength() maxLength()} - Input validation.  Maximum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#minimum() minimum()} - Input validation.  Minimum numeric value.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#minItems() minItems()} - Input validation.  Minimum number of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#minLength() minLength()} - Input validation.  Minimum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#name() name()} - Query parameter name.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#parser() parser()} - Override the part parser.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#pattern() pattern()} - Input validation.  Must match regular expression.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#required() required()} - Input validation.  Query parameter must be present.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#type() type()} - The schema type.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
+	</ul>
+</ul>
+
 <p>
 	Unlike {@link org.apache.juneau.http.annotation.FormData @FormData}, using this annotation does not result in the servlet reading the contents of
 	URL-encoded form posts.
diff --git a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/06.Header.html b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/06.Header.html
index c37939d..b1c1f1f 100644
--- a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/06.Header.html
+++ b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/06.Header.html
@@ -18,6 +18,32 @@
 <p>
 	The {@link org.apache.juneau.http.annotation.Header @Header} annotation is used to retrieve request headers.
 </p>
+<ul class='doctree'>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Header Header}
+	<ul>
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#_default() _default()}  - Default value if not present.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#_enum() _enum()} - Input validation.  Must match one of the values.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#allowEmptyValue() allowEmptyValue()} - Input validation.  Allow empty value.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#collectionFormat() collectionFormat()} - How collections of items are formatted.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#format() format()} - The schema type format. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#items() items()} - The schema of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#maximum() maximum()} - Input validation.  Maximum numeric value. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#maxItems() maxItems()} - Input validation.  Maximum number of items in a collection. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#maxLength() maxLength()} - Input validation.  Maximum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#minimum() minimum()} - Input validation.  Minimum numeric value. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#minItems() minItems()} - Input validation.  Minimum number of items in a collection. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#minLength() minLength()} - Input validation.  Minimum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#name() name()} - Header name.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#parser() parser()} - Override the part parser.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#pattern() pattern()} - Input validation.  Must match regular expression.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#required() required()} - Input validation.  Header must be present.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#type() type()} - The schema type.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#uniqueItems() uniqueItems()} - Input validation. Collections must contain unique items only.
+	</ul>
+</ul>
 <h5 class='figure'>Example:</h5>
 <p class='bpcode w800'>
 	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
diff --git a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/07.Path.html b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/07.Path.html
index 8d07534..d59f24c 100644
--- a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/07.Path.html
+++ b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/09.HttpPartAnnotations/07.Path.html
@@ -18,6 +18,27 @@
 <p>
 	The {@link org.apache.juneau.http.annotation.Header @Header} annotation is used to retrieve request headers.
 </p>
+<ul class='doctree'>
+	<li class='ja'>{@link org.apache.juneau.http.annotation.Path Path}
+	<ul>
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#_enum() _enum()} - Input validation.  Must match one of the values.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#collectionFormat() collectionFormat()} - How collections of items are formatted.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#exclusiveMaximum() exclusiveMaximum()} - Input validation.  Whether maximum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#exclusiveMinimum() exclusiveMinimum()} - Input validation.  Whether minimum is exclusive.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#format() format()} - The schema type format. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#items() items()} - The schema of items in a collection.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#maximum() maximum()} - Input validation.  Maximum numeric value. 
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#maxLength() maxLength()} - Input validation.  Maximum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#minimum() minimum()} - Input validation.  Minimum numeric value.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#minLength() minLength()} - Input validation.  Minimum length of a string.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#multipleOf() multipleOf()} - Input validation.  Number must be a multiple of.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#name() name()} - Path variable name.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#parser() parser()} - Override the part parser.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#pattern() pattern()} - Input validation.  Must match regular expression.
+		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#type() type()} - The schema type.
+	</ul>
+</ul>
+
 <h5 class='figure'>Example:</h5>
 <p class='bpcode w800'>
 	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCall.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCall.java
index 597fa83..00a5ef0 100644
--- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCall.java
+++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCall.java
@@ -548,6 +548,7 @@ public final class RestCall extends BeanSession implements Closeable {
 	 * 	The input to be sent to the REST resource (only valid for PUT and POST) requests. <br>
 	 * @param partSerializer
 	 * 	The part serializer to use to serialize the body of the request.
+	 * 	<br>If <jk>null</jk>, will use normal serializer.
 	 * @param schema
 	 * 	The schema information about the part being serialized.
 	 * @return This object (for method chaining).
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestBody.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestBody.java
index 1d93196..a0df444 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestBody.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RequestBody.java
@@ -471,16 +471,15 @@ public class RequestBody {
 		if (cm.hasInputStreamTransform())
 			return cm.getInputStreamTransform().transform(getInputStream());
 
-		MediaType mt = getMediaType();
-		if ((isEmpty(mt) || mt.toString().startsWith("text/plain"))) {
-			if (partParser != null) {
-				String in = asString();
-				return partParser.createSession(req.getParserSessionArgs()).parse(HttpPartType.BODY, schema, isEmpty(in) ? null : in, cm);
-			} else if (cm.hasStringTransform()) {
-				return cm.getStringTransform().transform(asString());
-			}
+		if (partParser != null) {
+			String in = asString();
+			return partParser.createSession(req.getParserSessionArgs()).parse(HttpPartType.BODY, schema, isEmpty(in) ? null : in, cm);
 		}
 
+		MediaType mt = getMediaType();
+		if ((isEmpty(mt) || mt.toString().startsWith("text/plain")) && cm.hasStringTransform())
+			return cm.getStringTransform().transform(asString());
+
 		throw new UnsupportedMediaType(
 			"Unsupported media-type in request header ''Content-Type'': ''{0}''\n\tSupported media-types: {1}",
 			headers.getContentType(), req.getParsers().getSupportedMediaTypes()
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index e6020eb..a7251de 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -4355,7 +4355,7 @@ public final class RestContext extends BeanContext {
 
 			} else if (hasAnnotation(Response.class, method, i)) {
 				s = HttpPartSchema.create(Response.class, method, i);
-				rp[i] = new RestParamDefaults.ResponseObject(method, s, t);
+				rp[i] = new RestParamDefaults.ResponseObject(method, s, t, ps);
 			} else if (hasAnnotation(ResponseHeader.class, method, i)) {
 				s = HttpPartSchema.create(ResponseHeader.class, method, i);
 				rp[i] = new RestParamDefaults.ResponseHeaderObject(method, s, t, ps);
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 2d1e87b..7156308 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
@@ -572,7 +572,7 @@ class RestParamDefaults {
 
 		protected BodyObject(Method m, HttpPartSchema s, Type t, PropertyStore ps) {
 			super(BODY, m, null, t, s.getApi());
-			this.partParser = ClassUtils.newInstance(HttpPartParser.class, s.getParser(), true, ps);
+			this.partParser = s.isUsePartParser() ? ClassUtils.newInstance(HttpPartParser.class, s.getParser(), true, ps) : null;
 			this.schema = s;
 		}
 
@@ -661,20 +661,15 @@ class RestParamDefaults {
 	}
 
 	static final class ResponseObject extends RestMethodParam {
-
+		final HttpPartSerializer partSerializer;
+		final HttpPartSchema schema;
 		private String _default;
 
-		protected ResponseObject(Method m, HttpPartSchema s, Type t) {
-			this(m, t, HttpPartSchema.getApiCodeMap(s, 200));
+		protected ResponseObject(Method m, HttpPartSchema s, Type t, PropertyStore ps) {
+			super(RESPONSE, m, s.getName(), t, HttpPartSchema.getApiCodeMap(s, 200));
+			this.partSerializer = s.isUsePartSerializer() ? ClassUtils.newInstance(HttpPartSerializer.class, s.getSerializer(), true, ps) : null;
+			this.schema = s;
 			this._default = s.getDefault();
-		}
-
-		protected ResponseObject(Method m, HttpPartSchema[] ss, Type t) {
-			this(m, t, HttpPartSchema.getApiCodeMap(ss, 200));
-		}
-
-		protected ResponseObject(Method m, Type t, ObjectMap api) {
-			super(RESPONSE, m, "body", t, api);
 
 			if (getTypeClass() == null)
 				throw new InternalServerError("Invalid type {0} specified with @Response annotation.  It must be a subclass of Value.", type);
@@ -689,7 +684,13 @@ class RestParamDefaults {
 			v.listener(new ValueListener() {
 				@Override
 				public void onSet(Object newValue) {
-					res.setOutput(newValue);
+					try {
+						if (partSerializer != null)
+							newValue = new StringReader(partSerializer.serialize(HttpPartType.BODY, schema, newValue));
+						res.setOutput(newValue);
+					} catch (SchemaValidationException | SerializeException e) {
+						throw new RuntimeException(e);
+					}
 				}
 			});
 			if (_default != null) {


Mime
View raw message