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

[juneau] branch master updated: Swagger UI improvements.

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 52a3864  Swagger UI improvements.
52a3864 is described below

commit 52a3864ede759019b6d2cfa44b3752e1ca60b4a6
Author: JamesBognar <ja...@apache.org>
AuthorDate: Wed Apr 4 20:56:42 2018 -0400

    Swagger UI improvements.
---
 .../juneau/json/JsonSchemaSerializerTest.java      | 244 ++++++++++-----------
 .../org/apache/juneau/dto/swagger/HeaderInfo.java  |  17 +-
 .../java/org/apache/juneau/dto/swagger/Items.java  |  28 ++-
 .../org/apache/juneau/dto/swagger/Operation.java   |  21 --
 .../apache/juneau/dto/swagger/ParameterInfo.java   |  11 +-
 .../apache/juneau/dto/swagger/ResponseInfo.java    |   7 +-
 .../org/apache/juneau/dto/swagger/SchemaInfo.java  |  23 +-
 .../org/apache/juneau/dto/swagger/Swagger.java     |  23 --
 .../apache/juneau/dto/swagger/SwaggerElement.java  |  11 +-
 .../apache/juneau/dto/swagger/ui/SwaggerUI.java    |  31 +--
 .../src/main/java/org/apache/juneau/BeanMap.java   |  11 +-
 .../src/main/java/org/apache/juneau/ClassMeta.java |   8 -
 .../jsonschema/JsonSchemaSerializerSession.java    |  19 +-
 juneau-doc/src/main/javadoc/overview.html          |   3 +
 .../juneau/examples/rest/petstore/Order.java       |   1 +
 .../apache/juneau/examples/rest/petstore/Pet.java  |   1 +
 .../examples/rest/petstore/PetStoreResource.java   | 119 +++++++---
 .../apache/juneau/examples/rest/petstore/User.java |  11 +
 .../apache/juneau/rest/BasicRestInfoProvider.java  | 157 ++++++++-----
 .../org/apache/juneau/rest/RestParamDefaults.java  |   5 +
 .../org/apache/juneau/rest/annotation/Body.java    |  20 ++
 .../apache/juneau/rest/annotation/FormData.java    |  18 ++
 .../org/apache/juneau/rest/annotation/Header.java  |  19 ++
 .../org/apache/juneau/rest/annotation/Path.java    |  19 ++
 .../org/apache/juneau/rest/annotation/Query.java   |  18 ++
 .../apache/juneau/rest/labels/NameDescription.java |  89 --------
 .../juneau/rest/labels/ResourceDescription.java    |  51 ++++-
 27 files changed, 570 insertions(+), 415 deletions(-)

diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/json/JsonSchemaSerializerTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/json/JsonSchemaSerializerTest.java
index 639e224..1cfcd7d 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/json/JsonSchemaSerializerTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/json/JsonSchemaSerializerTest.java
@@ -419,7 +419,7 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void addExample_BEAN_exampleMethod() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("bean").build().createSession();
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},example:{f1:'foobar'}}", s.getSchema(SimpleBeanWithExampleMethod.class));
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(SimpleBeanWithExampleMethod.class));
 	}
 
 	@Test
@@ -427,13 +427,13 @@ public class JsonSchemaSerializerTest {
 		SimpleBeanWithExampleMethod b = new SimpleBeanWithExampleMethod();
 		b.f1 = "baz";
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("bean").example(SimpleBeanWithExampleMethod.class, b).build().createSession();
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},example:{f1:'baz'}}", s.getSchema(SimpleBeanWithExampleMethod.class));
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'baz'}}", s.getSchema(SimpleBeanWithExampleMethod.class));
 	}
 
 	@Test
 	public void addExample_BEAN_exampleMethod_array2d() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("bean").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},example:{f1:'foobar'}}}}", s.getSchema(SimpleBeanWithExampleMethod[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(SimpleBeanWithExampleMethod[][].class));
 	}
 
 	public static class SimpleBeanWithExampleMethod extends SimpleBean {
@@ -449,13 +449,13 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void addExample_BEAN_exampleField() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("bean").build().createSession();
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},example:{f1:'foobar'}}", s.getSchema(SimpleBeanWithExampleField.class));
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(SimpleBeanWithExampleField.class));
 	}
 
 	@Test
 	public void addExample_BEAN_exampleField_array2d() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("bean").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},example:{f1:'foobar'}}}}", s.getSchema(SimpleBeanWithExampleField[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(SimpleBeanWithExampleField[][].class));
 	}
 
 	public static class SimpleBeanWithExampleField extends SimpleBean {
@@ -473,13 +473,13 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void addExample_BEAN_exampleBeanAnnotation() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("bean").build().createSession();
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},example:{f1:'foobar'}}", s.getSchema(SimpleBeanWithExampleAnnotation.class));
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(SimpleBeanWithExampleAnnotation.class));
 	}
 
 	@Test
 	public void addExample_BEAN_exampleBeanAnnotation_2darray() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("bean").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},example:{f1:'foobar'}}}}", s.getSchema(SimpleBeanWithExampleAnnotation[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(SimpleBeanWithExampleAnnotation[][].class));
 	}
 
 	@Example("{f1:'foobar'}")
@@ -490,7 +490,7 @@ public class JsonSchemaSerializerTest {
 		SimpleBean b = new SimpleBean();
 		b.f1 = "foobar";
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("bean").example(SimpleBean.class, b).build().createSession();
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},example:{f1:'foobar'}}", s.getSchema(SimpleBean.class));
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(SimpleBean.class));
 	}
 
 	@Test
@@ -498,7 +498,7 @@ public class JsonSchemaSerializerTest {
 		SimpleBean b = new SimpleBean();
 		b.f1 = "foobar";
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("bean").example(SimpleBean.class, b).build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},example:{f1:'foobar'}}}}", s.getSchema(SimpleBean[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(SimpleBean[][].class));
 	}
 	
 	//====================================================================================================
@@ -514,7 +514,7 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void addExample_MAP_exampleMethod() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("map").build().createSession();
-		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},example:{'123':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleMethod.class));
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleMethod.class));
 	}
 	
 	@Test
@@ -522,7 +522,7 @@ public class JsonSchemaSerializerTest {
 		BeanMapWithExampleMethod b = new BeanMapWithExampleMethod();
 		b.put(456, SimpleBeanWithExampleMethod.example());
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("map").example(BeanMapWithExampleMethod.class, b).build().createSession();
-		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},example:{'456':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleMethod.class));
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'456':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleMethod.class));
 	}
 
 	@SuppressWarnings("serial")
@@ -539,13 +539,13 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void addExample_MAP_exampleField() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("map").build().createSession();
-		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},example:{'123':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleField.class));
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleField.class));
 	}
 
 	@Test
 	public void addExample_MAP_exampleField_array2d() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("map").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},example:{'123':{f1:'foobar'}}}}}", s.getSchema(BeanMapWithExampleField[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}}}", s.getSchema(BeanMapWithExampleField[][].class));
 	}
 
 	@SuppressWarnings("serial")
@@ -564,13 +564,13 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void addExample_MAP_exampleBeanAnnotation() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("map").build().createSession();
-		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},example:{'123':{f1:'baz'}}}", s.getSchema(BeanMapWithExampleAnnotation.class));
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'baz'}}}", s.getSchema(BeanMapWithExampleAnnotation.class));
 	}
 
 	@Test
 	public void addExample_MAP_exampleBeanAnnotation_2darray() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("map").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},example:{'123':{f1:'baz'}}}}}", s.getSchema(BeanMapWithExampleAnnotation[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'baz'}}}}}", s.getSchema(BeanMapWithExampleAnnotation[][].class));
 	}
 
 	@SuppressWarnings("serial")
@@ -580,13 +580,13 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void addExample_MAP_exampleBeanProperty() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("map").example(BeanMap.class, BeanMapWithExampleMethod.example()).build().createSession();
-		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},example:{'123':{f1:'foobar'}}}", s.getSchema(BeanMap.class));
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(BeanMap.class));
 	}
 
 	@Test
 	public void addExample_MAP_exampleBeanProperty_2darray() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("map").example(BeanMap.class, BeanMapWithExampleMethod.example()).build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},example:{'123':{f1:'foobar'}}}}}", s.getSchema(BeanMap[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}}}", s.getSchema(BeanMap[][].class));
 	}
 	
 	//====================================================================================================
@@ -602,7 +602,7 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void addExample_COLLECTION_exampleMethod() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("collection").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},example:[{f1:'foobar'}]}", s.getSchema(BeanListWithExampleMethod.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(BeanListWithExampleMethod.class));
 	}
 
 	@Test
@@ -612,7 +612,7 @@ public class JsonSchemaSerializerTest {
 		sb.f1 = "baz";
 		b.add(sb);
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("collection").example(BeanListWithExampleMethod.class, b).build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},example:[{f1:'baz'}]}", s.getSchema(BeanListWithExampleMethod.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'baz'}]}", s.getSchema(BeanListWithExampleMethod.class));
 	}
 
 	@SuppressWarnings("serial")
@@ -629,13 +629,13 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void addExample_COLLECTION_exampleField() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("collection").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},example:[{f1:'foobar'}]}", s.getSchema(BeanListWithExampleField.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(BeanListWithExampleField.class));
 	}
 
 	@Test
 	public void addExample_ARRAY_exampleField_array2d() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("array").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},example:[[[{f1:'foobar'}]]]}", s.getSchema(BeanListWithExampleField[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'foobar'}]]]}", s.getSchema(BeanListWithExampleField[][].class));
 	}
 
 	@SuppressWarnings("serial")
@@ -654,13 +654,13 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void addExample_COLLECTION_exampleBeanAnnotation() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("collection").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},example:[{f1:'baz'}]}", s.getSchema(BeanListWithExampleAnnotation.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'baz'}]}", s.getSchema(BeanListWithExampleAnnotation.class));
 	}
 
 	@Test
 	public void addExample_ARRAY_exampleBeanAnnotation_2darray() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("array").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},example:[[[{f1:'baz'}]]]}", s.getSchema(BeanListWithExampleAnnotation[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'baz'}]]]}", s.getSchema(BeanListWithExampleAnnotation[][].class));
 	}
 
 	@SuppressWarnings("serial")
@@ -670,13 +670,13 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void addExample_COLLECTION_exampleBeanProperty() throws Exception {
 		JsonSchemaSerializerSession s =JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("collection").example(BeanList.class, BeanListWithExampleMethod.example()).build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},example:[{f1:'foobar'}]}", s.getSchema(BeanList.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(BeanList.class));
 	}
 
 	@Test
 	public void addExample_ARRAY_exampleBeanProperty_2darray() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("array").example(BeanList.class, BeanListWithExampleMethod.example()).build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},example:[[[{f1:'foobar'}]]]}", s.getSchema(BeanList[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'foobar'}]]]}", s.getSchema(BeanList[][].class));
 	}
 
 	//====================================================================================================
@@ -685,8 +685,8 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void addExample_BOOLEAN() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("boolean").build().createSession();
-		assertObjectEquals("{type:'boolean',example:true}", s.getSchema(boolean.class));
-		assertObjectEquals("{type:'boolean',example:true}", s.getSchema(Boolean.class));
+		assertObjectEquals("{type:'boolean','x-example':true}", s.getSchema(boolean.class));
+		assertObjectEquals("{type:'boolean','x-example':true}", s.getSchema(Boolean.class));
 	}
 	
 	@Test
@@ -695,15 +695,15 @@ public class JsonSchemaSerializerTest {
 			.example(boolean.class, false)
 			.example(Boolean.class, false)
 			.build().createSession();
-		assertObjectEquals("{type:'boolean',example:false}", s.getSchema(boolean.class));
-		assertObjectEquals("{type:'boolean',example:false}", s.getSchema(Boolean.class));
+		assertObjectEquals("{type:'boolean','x-example':false}", s.getSchema(boolean.class));
+		assertObjectEquals("{type:'boolean','x-example':false}", s.getSchema(Boolean.class));
 	}
 
 	@Test
 	public void addExample_BOOLEAN_2darray() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("boolean").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'boolean',example:true}}}", s.getSchema(boolean[][].class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'boolean',example:true}}}", s.getSchema(Boolean[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'boolean','x-example':true}}}", s.getSchema(boolean[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'boolean','x-example':true}}}", s.getSchema(Boolean[][].class));
 	}
 
 	//====================================================================================================
@@ -712,16 +712,16 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void addExample_NUMBER() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("number").build().createSession();
-		assertObjectEquals("{type:'integer',format:'int16',example:1}", s.getSchema(short.class));
-		assertObjectEquals("{type:'integer',format:'int16',example:1}", s.getSchema(Short.class));
-		assertObjectEquals("{type:'integer',format:'int32',example:1}", s.getSchema(int.class));
-		assertObjectEquals("{type:'integer',format:'int32',example:1}", s.getSchema(Integer.class));
-		assertObjectEquals("{type:'integer',format:'int64',example:1}", s.getSchema(long.class));
-		assertObjectEquals("{type:'integer',format:'int64',example:1}", s.getSchema(Long.class));
-		assertObjectEquals("{type:'number',format:'float',example:1.0}", s.getSchema(float.class));
-		assertObjectEquals("{type:'number',format:'float',example:1.0}", s.getSchema(Float.class));
-		assertObjectEquals("{type:'number',format:'double',example:1.0}", s.getSchema(double.class));
-		assertObjectEquals("{type:'number',format:'double',example:1.0}", s.getSchema(Double.class));
+		assertObjectEquals("{type:'integer',format:'int16','x-example':1}", s.getSchema(short.class));
+		assertObjectEquals("{type:'integer',format:'int16','x-example':1}", s.getSchema(Short.class));
+		assertObjectEquals("{type:'integer',format:'int32','x-example':1}", s.getSchema(int.class));
+		assertObjectEquals("{type:'integer',format:'int32','x-example':1}", s.getSchema(Integer.class));
+		assertObjectEquals("{type:'integer',format:'int64','x-example':1}", s.getSchema(long.class));
+		assertObjectEquals("{type:'integer',format:'int64','x-example':1}", s.getSchema(Long.class));
+		assertObjectEquals("{type:'number',format:'float','x-example':1.0}", s.getSchema(float.class));
+		assertObjectEquals("{type:'number',format:'float','x-example':1.0}", s.getSchema(Float.class));
+		assertObjectEquals("{type:'number',format:'double','x-example':1.0}", s.getSchema(double.class));
+		assertObjectEquals("{type:'number',format:'double','x-example':1.0}", s.getSchema(Double.class));
 	}
 
 	@Test
@@ -738,31 +738,31 @@ public class JsonSchemaSerializerTest {
 			.example(double.class, 10d)
 			.example(Double.class, 11d)
 			.build().createSession();
-		assertObjectEquals("{type:'integer',format:'int16',example:2}", s.getSchema(short.class));
-		assertObjectEquals("{type:'integer',format:'int16',example:3}", s.getSchema(Short.class));
-		assertObjectEquals("{type:'integer',format:'int32',example:4}", s.getSchema(int.class));
-		assertObjectEquals("{type:'integer',format:'int32',example:5}", s.getSchema(Integer.class));
-		assertObjectEquals("{type:'integer',format:'int64',example:6}", s.getSchema(long.class));
-		assertObjectEquals("{type:'integer',format:'int64',example:7}", s.getSchema(Long.class));
-		assertObjectEquals("{type:'number',format:'float',example:8.0}", s.getSchema(float.class));
-		assertObjectEquals("{type:'number',format:'float',example:9.0}", s.getSchema(Float.class));
-		assertObjectEquals("{type:'number',format:'double',example:10.0}", s.getSchema(double.class));
-		assertObjectEquals("{type:'number',format:'double',example:11.0}", s.getSchema(Double.class));
+		assertObjectEquals("{type:'integer',format:'int16','x-example':2}", s.getSchema(short.class));
+		assertObjectEquals("{type:'integer',format:'int16','x-example':3}", s.getSchema(Short.class));
+		assertObjectEquals("{type:'integer',format:'int32','x-example':4}", s.getSchema(int.class));
+		assertObjectEquals("{type:'integer',format:'int32','x-example':5}", s.getSchema(Integer.class));
+		assertObjectEquals("{type:'integer',format:'int64','x-example':6}", s.getSchema(long.class));
+		assertObjectEquals("{type:'integer',format:'int64','x-example':7}", s.getSchema(Long.class));
+		assertObjectEquals("{type:'number',format:'float','x-example':8.0}", s.getSchema(float.class));
+		assertObjectEquals("{type:'number',format:'float','x-example':9.0}", s.getSchema(Float.class));
+		assertObjectEquals("{type:'number',format:'double','x-example':10.0}", s.getSchema(double.class));
+		assertObjectEquals("{type:'number',format:'double','x-example':11.0}", s.getSchema(Double.class));
 	}
 
 	@Test
 	public void addExample_NUMBER_2darray() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("number").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16',example:1}}}", s.getSchema(short[][].class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16',example:1}}}", s.getSchema(Short[][].class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int32',example:1}}}", s.getSchema(int[][].class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int32',example:1}}}", s.getSchema(Integer[][].class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int64',example:1}}}", s.getSchema(long[][].class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int64',example:1}}}", s.getSchema(Long[][].class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'number',format:'float',example:1.0}}}", s.getSchema(float[][].class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'number',format:'float',example:1.0}}}", s.getSchema(Float[][].class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'number',format:'double',example:1.0}}}", s.getSchema(double[][].class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'number',format:'double',example:1.0}}}", s.getSchema(Double[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16','x-example':1}}}", s.getSchema(short[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int16','x-example':1}}}", s.getSchema(Short[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int32','x-example':1}}}", s.getSchema(int[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int32','x-example':1}}}", s.getSchema(Integer[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int64','x-example':1}}}", s.getSchema(long[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'integer',format:'int64','x-example':1}}}", s.getSchema(Long[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'number',format:'float','x-example':1.0}}}", s.getSchema(float[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'number',format:'float','x-example':1.0}}}", s.getSchema(Float[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'number',format:'double','x-example':1.0}}}", s.getSchema(double[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'number',format:'double','x-example':1.0}}}", s.getSchema(Double[][].class));
 	}
 
 	//====================================================================================================
@@ -772,10 +772,10 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void addExample_STRING() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("string").build().createSession();
-		assertObjectEquals("{type:'string',example:'foo'}", s.getSchema(String.class));
-		assertObjectEquals("{type:'string',example:'foo'}", s.getSchema(StringBuilder.class));
-		assertObjectEquals("{type:'string',example:'a'}", s.getSchema(Character.class));
-		assertObjectEquals("{type:'string',example:'a'}", s.getSchema(char.class));
+		assertObjectEquals("{type:'string','x-example':'foo'}", s.getSchema(String.class));
+		assertObjectEquals("{type:'string','x-example':'foo'}", s.getSchema(StringBuilder.class));
+		assertObjectEquals("{type:'string','x-example':'a'}", s.getSchema(Character.class));
+		assertObjectEquals("{type:'string','x-example':'a'}", s.getSchema(char.class));
 	}
 
 	@Test
@@ -786,19 +786,19 @@ public class JsonSchemaSerializerTest {
 			.example(Character.class, 'b')
 			.example(char.class, 'c')
 			.build().createSession();
-		assertObjectEquals("{type:'string',example:'bar1'}", s.getSchema(String.class));
-		assertObjectEquals("{type:'string',example:'bar2'}", s.getSchema(StringBuilder.class));
-		assertObjectEquals("{type:'string',example:'b'}", s.getSchema(Character.class));
-		assertObjectEquals("{type:'string',example:'c'}", s.getSchema(char.class));
+		assertObjectEquals("{type:'string','x-example':'bar1'}", s.getSchema(String.class));
+		assertObjectEquals("{type:'string','x-example':'bar2'}", s.getSchema(StringBuilder.class));
+		assertObjectEquals("{type:'string','x-example':'b'}", s.getSchema(Character.class));
+		assertObjectEquals("{type:'string','x-example':'c'}", s.getSchema(char.class));
 	}
 
 	@Test
 	public void addExample_STRING_2darray() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("string").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string',example:'foo'}}}", s.getSchema(String[][].class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string',example:'foo'}}}", s.getSchema(StringBuilder[][].class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string',example:'a'}}}", s.getSchema(Character[][].class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string',example:'a'}}}", s.getSchema(char[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','x-example':'foo'}}}", s.getSchema(String[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','x-example':'foo'}}}", s.getSchema(StringBuilder[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','x-example':'a'}}}", s.getSchema(Character[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','x-example':'a'}}}", s.getSchema(char[][].class));
 	}
 
 	@Test
@@ -809,10 +809,10 @@ public class JsonSchemaSerializerTest {
 			.example(Character.class, 'b')
 			.example(char.class, 'c')
 			.build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string',example:'bar1'}}}", s.getSchema(String[][].class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string',example:'bar2'}}}", s.getSchema(StringBuilder[][].class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string',example:'b'}}}", s.getSchema(Character[][].class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string',example:'c'}}}", s.getSchema(char[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','x-example':'bar1'}}}", s.getSchema(String[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','x-example':'bar2'}}}", s.getSchema(StringBuilder[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','x-example':'b'}}}", s.getSchema(Character[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','x-example':'c'}}}", s.getSchema(char[][].class));
 	}
 
 	//====================================================================================================
@@ -822,37 +822,37 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void addExample_ENUM() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("enum").build().createSession();
-		assertObjectEquals("{type:'string','enum':['one','two','three'],example:'one'}", s.getSchema(TestEnum.class));
+		assertObjectEquals("{type:'string','enum':['one','two','three'],'x-example':'one'}", s.getSchema(TestEnum.class));
 	}
 
 	@Test
 	public void addExample_ENUM_wDefault() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("enum").example(TestEnum.class, TestEnum.TWO).build().createSession();
-		assertObjectEquals("{type:'string','enum':['one','two','three'],example:'two'}", s.getSchema(TestEnum.class));
+		assertObjectEquals("{type:'string','enum':['one','two','three'],'x-example':'two'}", s.getSchema(TestEnum.class));
 	}
 
 	@Test
 	public void addExample_ENUM_2darray() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("enum").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','enum':['one','two','three'],example:'one'}}}", s.getSchema(TestEnum[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','enum':['one','two','three'],'x-example':'one'}}}", s.getSchema(TestEnum[][].class));
 	}
 
 	@Test
 	public void addExample_ENUM_useEnumNames() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().useEnumNames().addExamplesTo("enum").build().createSession();
-		assertObjectEquals("{type:'string','enum':['ONE','TWO','THREE'],example:'ONE'}", s.getSchema(TestEnum.class));
+		assertObjectEquals("{type:'string','enum':['ONE','TWO','THREE'],'x-example':'ONE'}", s.getSchema(TestEnum.class));
 	}
 
 	@Test
 	public void addExample_ENUM_wDefault_useEnumNames() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().useEnumNames().addExamplesTo("enum").example(TestEnum.class, TestEnum.TWO).build().createSession();
-		assertObjectEquals("{type:'string','enum':['ONE','TWO','THREE'],example:'TWO'}", s.getSchema(TestEnum.class));
+		assertObjectEquals("{type:'string','enum':['ONE','TWO','THREE'],'x-example':'TWO'}", s.getSchema(TestEnum.class));
 	}
 
 	@Test
 	public void addExample_ENUM_2darray_useEnumNames() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().useEnumNames().addExamplesTo("enum").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','enum':['ONE','TWO','THREE'],example:'ONE'}}}", s.getSchema(TestEnum[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'string','enum':['ONE','TWO','THREE'],'x-example':'ONE'}}}", s.getSchema(TestEnum[][].class));
 	}
 
 	//====================================================================================================
@@ -861,26 +861,26 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void addExample_ANY() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addExamplesTo("any").build().createSession();
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string',example:'foo'}}}", s.getSchema(SimpleBean.class));
-		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},example:{'123':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleMethod.class));
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},example:[{f1:'foobar'}]}", s.getSchema(BeanListWithExampleMethod.class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},example:[[[{f1:'foobar'}]]]}", s.getSchema(BeanListWithExampleField[][].class));
-		assertObjectEquals("{type:'boolean',example:true}", s.getSchema(boolean.class));
-		assertObjectEquals("{type:'integer',format:'int16',example:1}", s.getSchema(short.class));
-		assertObjectEquals("{type:'integer',format:'int16',example:1}", s.getSchema(Short.class));
-		assertObjectEquals("{type:'integer',format:'int32',example:1}", s.getSchema(int.class));
-		assertObjectEquals("{type:'integer',format:'int32',example:1}", s.getSchema(Integer.class));
-		assertObjectEquals("{type:'integer',format:'int64',example:1}", s.getSchema(long.class));
-		assertObjectEquals("{type:'integer',format:'int64',example:1}", s.getSchema(Long.class));
-		assertObjectEquals("{type:'number',format:'float',example:1.0}", s.getSchema(float.class));
-		assertObjectEquals("{type:'number',format:'float',example:1.0}", s.getSchema(Float.class));
-		assertObjectEquals("{type:'number',format:'double',example:1.0}", s.getSchema(double.class));
-		assertObjectEquals("{type:'number',format:'double',example:1.0}", s.getSchema(Double.class));
-		assertObjectEquals("{type:'string',example:'foo'}", s.getSchema(String.class));
-		assertObjectEquals("{type:'string',example:'foo'}", s.getSchema(StringBuilder.class));
-		assertObjectEquals("{type:'string',example:'a'}", s.getSchema(Character.class));
-		assertObjectEquals("{type:'string',example:'a'}", s.getSchema(char.class));
-		assertObjectEquals("{type:'string','enum':['one','two','three'],example:'one'}", s.getSchema(TestEnum.class));
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string','x-example':'foo'}}}", s.getSchema(SimpleBean.class));
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleMethod.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(BeanListWithExampleMethod.class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'foobar'}]]]}", s.getSchema(BeanListWithExampleField[][].class));
+		assertObjectEquals("{type:'boolean','x-example':true}", s.getSchema(boolean.class));
+		assertObjectEquals("{type:'integer',format:'int16','x-example':1}", s.getSchema(short.class));
+		assertObjectEquals("{type:'integer',format:'int16','x-example':1}", s.getSchema(Short.class));
+		assertObjectEquals("{type:'integer',format:'int32','x-example':1}", s.getSchema(int.class));
+		assertObjectEquals("{type:'integer',format:'int32','x-example':1}", s.getSchema(Integer.class));
+		assertObjectEquals("{type:'integer',format:'int64','x-example':1}", s.getSchema(long.class));
+		assertObjectEquals("{type:'integer',format:'int64','x-example':1}", s.getSchema(Long.class));
+		assertObjectEquals("{type:'number',format:'float','x-example':1.0}", s.getSchema(float.class));
+		assertObjectEquals("{type:'number',format:'float','x-example':1.0}", s.getSchema(Float.class));
+		assertObjectEquals("{type:'number',format:'double','x-example':1.0}", s.getSchema(double.class));
+		assertObjectEquals("{type:'number',format:'double','x-example':1.0}", s.getSchema(Double.class));
+		assertObjectEquals("{type:'string','x-example':'foo'}", s.getSchema(String.class));
+		assertObjectEquals("{type:'string','x-example':'foo'}", s.getSchema(StringBuilder.class));
+		assertObjectEquals("{type:'string','x-example':'a'}", s.getSchema(Character.class));
+		assertObjectEquals("{type:'string','x-example':'a'}", s.getSchema(char.class));
+		assertObjectEquals("{type:'string','enum':['one','two','three'],'x-example':'one'}", s.getSchema(TestEnum.class));
 	}
 	
 	//====================================================================================================
@@ -906,13 +906,13 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void addDescription_MAP() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addDescriptionsTo("map").build().createSession();
-		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanMap'}", s.getSchema(BeanMap.class));
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanMap<java.lang.Integer,org.apache.juneau.json.JsonSchemaSerializerTest$SimpleBean>'}", s.getSchema(BeanMap.class));
 	}
 
 	@Test
 	public void addDescription_MAP_2darray() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addDescriptionsTo("map").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanMap'}}}", s.getSchema(BeanMap[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanMap<java.lang.Integer,org.apache.juneau.json.JsonSchemaSerializerTest$SimpleBean>'}}}", s.getSchema(BeanMap[][].class));
 	}
 
 	//====================================================================================================
@@ -922,19 +922,19 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void addDescription_COLLECTION() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addDescriptionsTo("collection").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanList'}", s.getSchema(BeanList.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanList<org.apache.juneau.json.JsonSchemaSerializerTest$SimpleBean>'}", s.getSchema(BeanList.class));
 	}
 
 	@Test
 	public void addDescription_COLLECTION_2darray() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addDescriptionsTo("collection").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanList'}}}", s.getSchema(BeanList[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanList<org.apache.juneau.json.JsonSchemaSerializerTest$SimpleBean>'}}}", s.getSchema(BeanList[][].class));
 	}
 	
 	@Test
 	public void addDescription_ARRAY() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addDescriptionsTo("array").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanList[][]'}", s.getSchema(BeanList[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanList<org.apache.juneau.json.JsonSchemaSerializerTest$SimpleBean>[][]'}", s.getSchema(BeanList[][].class));
 	}
 
 	//====================================================================================================
@@ -1032,9 +1032,9 @@ public class JsonSchemaSerializerTest {
 	public void addDescription_ANY() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().addDescriptionsTo("any").build().createSession();
 		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$SimpleBean'}", s.getSchema(SimpleBean.class));
-		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanMap'}", s.getSchema(BeanMap.class));
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanList'}", s.getSchema(BeanList.class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanList[][]'}", s.getSchema(BeanList[][].class));
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanMap<java.lang.Integer,org.apache.juneau.json.JsonSchemaSerializerTest$SimpleBean>'}", s.getSchema(BeanMap.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanList<org.apache.juneau.json.JsonSchemaSerializerTest$SimpleBean>'}", s.getSchema(BeanList.class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanList<org.apache.juneau.json.JsonSchemaSerializerTest$SimpleBean>[][]'}", s.getSchema(BeanList[][].class));
 		assertObjectEquals("{type:'boolean',description:'boolean'}", s.getSchema(boolean.class));
 		assertObjectEquals("{type:'boolean',description:'java.lang.Boolean'}", s.getSchema(Boolean.class));
 		assertObjectEquals("{type:'integer',format:'int16',description:'short'}", s.getSchema(short.class));
@@ -1169,7 +1169,7 @@ public class JsonSchemaSerializerTest {
 			.addExamplesTo("collection,bean")
 			.build().createSession();
 		
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}},example:{}},example:[]}", s.getSchema(BeanList.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{}},'x-example':[]}", s.getSchema(BeanList.class));
 	}
 	
 	@Test
@@ -1180,7 +1180,7 @@ public class JsonSchemaSerializerTest {
 			.addExamplesTo("collection,bean")
 			.build().createSession();
 		
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},example:[]}", s.getSchema(BeanList.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[]}", s.getSchema(BeanList.class));
 	}
 
 	//====================================================================================================
@@ -1194,7 +1194,7 @@ public class JsonSchemaSerializerTest {
 			.addDescriptionsTo("collection,bean")
 			.build().createSession();
 		
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$SimpleBean'},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanList'}", s.getSchema(BeanList.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$SimpleBean'},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanList<org.apache.juneau.json.JsonSchemaSerializerTest$SimpleBean>'}", s.getSchema(BeanList.class));
 	}
 	
 	@Test
@@ -1203,7 +1203,7 @@ public class JsonSchemaSerializerTest {
 			.addDescriptionsTo("collection,bean")
 			.build().createSession();
 		
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanList'}", s.getSchema(BeanList.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},description:'org.apache.juneau.json.JsonSchemaSerializerTest$BeanList<org.apache.juneau.json.JsonSchemaSerializerTest$SimpleBean>'}", s.getSchema(BeanList.class));
 	}
 
 	//====================================================================================================
@@ -1229,7 +1229,7 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void jsonSchema_onclass() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().build().createSession();
-		assertObjectEquals("{type:'foo',format:'bar',properties:{f1:{type:'integer',format:'int32'}},description:'baz',example:{f1:123}}", s.getSchema(A1.class));
+		assertObjectEquals("{type:'foo',format:'bar',properties:{f1:{type:'integer',format:'int32'}},description:'baz','x-example':{f1:123}}", s.getSchema(A1.class));
 	}
 	
 	@JsonSchema(type="foo",format="bar",description="baz",example="{f1:123}")
@@ -1240,7 +1240,7 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void jsonSchema_onbeanfield() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().build().createSession();
-		assertObjectEquals("{type:'object',properties:{f1:{type:'foo',format:'bar',description:'baz',example:123}}}", s.getSchema(A2.class));
+		assertObjectEquals("{type:'object',properties:{f1:{type:'foo',format:'bar',description:'baz','x-example':123}}}", s.getSchema(A2.class));
 	}
 	
 	public static class A2 {
@@ -1251,7 +1251,7 @@ public class JsonSchemaSerializerTest {
 	@Test
 	public void jsonSchema_onbeangetter() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().build().createSession();
-		assertObjectEquals("{type:'object',properties:{f1:{type:'foo',format:'bar',description:'baz',example:123}}}", s.getSchema(A3.class));
+		assertObjectEquals("{type:'object',properties:{f1:{type:'foo',format:'bar',description:'baz','x-example':123}}}", s.getSchema(A3.class));
 	}
 	
 	public static class A3 {
@@ -1264,7 +1264,7 @@ public class JsonSchemaSerializerTest {
 
 	public void jsonSchema_onbeansetter() throws Exception {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder().build().createSession();
-		assertObjectEquals("{type:'object',properties:{f1:{type:'foo',format:'bar',description:'baz',example:123}}}", s.getSchema(A4.class));
+		assertObjectEquals("{type:'object',properties:{f1:{type:'foo',format:'bar',description:'baz','x-example':123}}}", s.getSchema(A4.class));
 	}
 	
 	public static class A4 {
@@ -1285,9 +1285,9 @@ public class JsonSchemaSerializerTest {
 		JsonSchemaSerializerSession s = JsonSchemaSerializer.DEFAULT_LAX.builder()
 			.pojoSwaps(SwapWithAnnotation.class)
 			.build().createSession();
-		assertObjectEquals("{type:'foo',format:'bar',description:'baz',example:123}", s.getSchema(SimpleBean.class));
-		assertObjectEquals("{type:'array',items:{type:'foo',format:'bar',description:'baz',example:123}}", s.getSchema(BeanList.class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'foo',format:'bar',description:'baz',example:123}}}", s.getSchema(SimpleBean[][].class));
+		assertObjectEquals("{type:'foo',format:'bar',description:'baz','x-example':123}", s.getSchema(SimpleBean.class));
+		assertObjectEquals("{type:'array',items:{type:'foo',format:'bar',description:'baz','x-example':123}}", s.getSchema(BeanList.class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'foo',format:'bar',description:'baz','x-example':123}}}", s.getSchema(SimpleBean[][].class));
 	}
 	
 	@JsonSchema(type="foo",format="bar",description="baz",example="123")
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/HeaderInfo.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/HeaderInfo.java
index 242a58c..98bd49c 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/HeaderInfo.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/HeaderInfo.java
@@ -1141,17 +1141,24 @@ public class HeaderInfo extends SwaggerElement {
 	 * Resolves any <js>"$ref"</js> attributes in this element.
 	 * 
 	 * @param swagger The swagger document containing the definitions.
+	 * @param refStack Keeps track of previously-visited references so that we don't cause recursive loops.
 	 * @return 
 	 * 	This object with references resolved.
 	 * 	<br>May or may not be the same object.
 	 */
-	public HeaderInfo resolveRefs(Swagger swagger) {
-		
-		if (ref != null)
-			return swagger.findRef(ref, HeaderInfo.class);
+	public HeaderInfo resolveRefs(Swagger swagger, Deque<String> refStack) {
 		
+		if (ref != null) {
+			if (refStack.contains(ref) || refStack.size() > 2)
+				return this;
+			refStack.addLast(ref);
+			HeaderInfo r = swagger.findRef(ref, HeaderInfo.class).resolveRefs(swagger, refStack);
+			refStack.removeLast();
+			return r;
+		}
+
 		if (items != null)
-			items = items.resolveRefs(swagger);
+			items = items.resolveRefs(swagger, refStack);
 		
 		return this;
 	}
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Items.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Items.java
index 56c7b5b..35c63bf 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Items.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Items.java
@@ -96,7 +96,6 @@ public class Items extends SwaggerElement {
 		this.format = copyFrom.format;
 		this.collectionFormat = copyFrom.collectionFormat;
 		this.pattern = copyFrom.pattern;
-		this.ref = copyFrom.ref;
 		this.maximum = copyFrom.maximum;
 		this.minimum = copyFrom.minimum;
 		this.multipleOf = copyFrom.multipleOf;
@@ -110,6 +109,7 @@ public class Items extends SwaggerElement {
 		this.items = copyFrom.items == null ? null : copyFrom.items.copy();
 		this._default = copyFrom._default;
 		this._enum = newList(copyFrom._enum);
+		this.ref = copyFrom.ref;
 	}
 	
 	/**
@@ -1039,7 +1039,6 @@ public class Items extends SwaggerElement {
 			case "format": return toType(getFormat(), type);
 			case "items": return toType(getItems(), type);
 			case "collectionFormat": return toType(getCollectionFormat(), type);
-			case "$ref": return toType(getRef(), type);
 			case "default": return toType(getDefault(), type);
 			case "maximum": return toType(getMaximum(), type);
 			case "exclusiveMaximum": return toType(getExclusiveMaximum(), type);
@@ -1053,6 +1052,7 @@ public class Items extends SwaggerElement {
 			case "uniqueItems": return toType(getUniqueItems(), type);
 			case "enum": return toType(getEnum(), type);
 			case "multipleOf": return toType(getMultipleOf(), type);
+			case "$ref": return toType(getRef(), type);
 			default: return super.get(property, type);
 		}
 	}
@@ -1066,7 +1066,6 @@ public class Items extends SwaggerElement {
 			case "format": return format(value);
 			case "items": return items(value);
 			case "collectionFormat": return collectionFormat(value);
-			case "$ref": return ref(value);
 			case "default": return _default(value);
 			case "maximum": return maximum(value);
 			case "exclusiveMaximum": return exclusiveMaximum(value);
@@ -1080,6 +1079,7 @@ public class Items extends SwaggerElement {
 			case "uniqueItems": return uniqueItems(value);
 			case "enum": return setEnum(null)._enum(value);
 			case "multipleOf": return multipleOf(value);
+			case "$ref": return ref(value);
 			default: 
 				super.set(property, value);
 				return this;
@@ -1093,7 +1093,6 @@ public class Items extends SwaggerElement {
 			.appendIf(format != null, "format")
 			.appendIf(items != null, "items")
 			.appendIf(collectionFormat != null, "collectionFormat")
-			.appendIf(ref != null, "$ref")
 			.appendIf(_default != null, "default")
 			.appendIf(maximum != null, "maximum")
 			.appendIf(exclusiveMaximum != null, "exclusiveMaximum")
@@ -1106,7 +1105,8 @@ public class Items extends SwaggerElement {
 			.appendIf(minItems != null, "minItems")
 			.appendIf(uniqueItems != null, "uniqueItems")
 			.appendIf(_enum != null, "enum")
-			.appendIf(multipleOf != null, "multipleOf");
+			.appendIf(multipleOf != null, "multipleOf")
+			.appendIf(ref != null, "$ref");
 		return new MultiSet<>(s, super.keySet());
 	}
 
@@ -1114,19 +1114,27 @@ public class Items extends SwaggerElement {
 	 * Resolves any <js>"$ref"</js> attributes in this element.
 	 * 
 	 * @param swagger The swagger document containing the definitions.
+	 * @param refStack Keeps track of previously-visited references so that we don't cause recursive loops.
 	 * @return 
 	 * 	This object with references resolved.
 	 * 	<br>May or may not be the same object.
 	 */
-	public Items resolveRefs(Swagger swagger) {
+	public Items resolveRefs(Swagger swagger, Deque<String> refStack) {
 		
-		if (ref != null)
-			return swagger.findRef(ref, Items.class);
+		if (ref != null) {
+			if (refStack.contains(ref) || refStack.size() > 2)
+				return this;
+			refStack.addLast(ref);
+			Items r = swagger.findRef(ref, Items.class).resolveRefs(swagger, refStack);
+			refStack.removeLast();
+			return r;
+		}
 		
 		if (items != null)
-			items = items.resolveRefs(swagger);
+			items = items.resolveRefs(swagger, refStack);
+		
+		set("example", null);
 
 		return this;
 	}
-
 }
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Operation.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Operation.java
index e5df4c2..1affb33 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Operation.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Operation.java
@@ -1171,25 +1171,4 @@ public class Operation extends SwaggerElement {
 			.appendIf(security != null, "security");
 		return new MultiSet<>(s, super.keySet());
 	}
-
-	/**
-	 * Resolves any <js>"$ref"</js> attributes in this element.
-	 * 
-	 * @param swagger The swagger document containing the definitions.
-	 * @return 
-	 * 	This object with references resolved.
-	 * 	<br>May or may not be the same object.
-	 */
-	public Operation resolveRefs(Swagger swagger) {
-		
-		if (parameters != null)
-			for (ListIterator<ParameterInfo> i = parameters.listIterator(); i.hasNext();)
-				i.set(i.next().resolveRefs(swagger));
-
-		if (responses != null)
-			for (Map.Entry<String,ResponseInfo> e : responses.entrySet())
-				e.setValue(e.getValue().resolveRefs(swagger));
-		
-		return this;
-	}
 }
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ParameterInfo.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ParameterInfo.java
index b1fe506..3be783a 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ParameterInfo.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ParameterInfo.java
@@ -1507,7 +1507,7 @@ public class ParameterInfo extends SwaggerElement {
 			case "uniqueItems": return toType(getUniqueItems(), type);
 			case "enum": return toType(getEnum(), type);
 			case "multipleOf": return toType(getMultipleOf(), type);
-			case "examples": return toType(getExamples(), type);
+			case "x-examples": return toType(getExamples(), type);
 			default: return super.get(property, type);
 		}
 	}
@@ -1573,7 +1573,7 @@ public class ParameterInfo extends SwaggerElement {
 			.appendIf(uniqueItems != null, "uniqueItems")
 			.appendIf(_enum != null, "enum")
 			.appendIf(multipleOf != null, "multipleOf")
-			.appendIf(examples != null, "examples");
+			.appendIf(examples != null, "x-examples");
 		return new MultiSet<>(s, super.keySet());
 	}
 
@@ -1581,17 +1581,18 @@ public class ParameterInfo extends SwaggerElement {
 	 * Resolves any <js>"$ref"</js> attributes in this element.
 	 * 
 	 * @param swagger The swagger document containing the definitions.
+	 * @param refStack Keeps track of previously-visited references so that we don't cause recursive loops.
 	 * @return 
 	 * 	This object with references resolved.
 	 * 	<br>May or may not be the same object.
 	 */
-	public ParameterInfo resolveRefs(Swagger swagger) {
+	public ParameterInfo resolveRefs(Swagger swagger, Deque<String> refStack) {
 		
 		if (schema != null)
-			schema = schema.resolveRefs(swagger);
+			schema = schema.resolveRefs(swagger, refStack);
 		
 		if (items != null)
-			items = items.resolveRefs(swagger);
+			items = items.resolveRefs(swagger, refStack);
 
 		return this;
 	}
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ResponseInfo.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ResponseInfo.java
index afec0ce..6923368 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ResponseInfo.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ResponseInfo.java
@@ -440,18 +440,19 @@ public class ResponseInfo extends SwaggerElement {
 	 * Resolves any <js>"$ref"</js> attributes in this element.
 	 * 
 	 * @param swagger The swagger document containing the definitions.
+	 * @param refStack Keeps track of previously-visited references so that we don't cause recursive loops.
 	 * @return 
 	 * 	This object with references resolved.
 	 * 	<br>May or may not be the same object.
 	 */
-	public ResponseInfo resolveRefs(Swagger swagger) {
+	public ResponseInfo resolveRefs(Swagger swagger, Deque<String> refStack) {
 
 		if (schema != null)
-			schema = schema.resolveRefs(swagger);
+			schema = schema.resolveRefs(swagger, refStack);
 		
 		if (headers != null)
 			for (Map.Entry<String,HeaderInfo> e : headers.entrySet()) 
-				e.setValue(e.getValue().resolveRefs(swagger));
+				e.setValue(e.getValue().resolveRefs(swagger, refStack));
 
 		return this;
 	}
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/SchemaInfo.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/SchemaInfo.java
index ca5260f..4ec8abb 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/SchemaInfo.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/SchemaInfo.java
@@ -1509,24 +1509,33 @@ public class SchemaInfo extends SwaggerElement {
 	 * Resolves any <js>"$ref"</js> attributes in this element.
 	 * 
 	 * @param swagger The swagger document containing the definitions.
+	 * @param refStack Keeps track of previously-visited references so that we don't cause recursive loops.
 	 * @return 
 	 * 	This object with references resolved.
 	 * 	<br>May or may not be the same object.
 	 */
-	public SchemaInfo resolveRefs(Swagger swagger) {
-		
-		if (ref != null) 
-			return swagger.findRef(ref, SchemaInfo.class);
+	public SchemaInfo resolveRefs(Swagger swagger, Deque<String> refStack) {
 		
+		if (ref != null) {
+			if (refStack.contains(ref) || refStack.size() > 2)
+				return this;
+			refStack.addLast(ref);
+			SchemaInfo r = swagger.findRef(ref, SchemaInfo.class).resolveRefs(swagger, refStack);
+			refStack.removeLast();
+			return r;
+		}
+
 		if (items != null)
-			items = items.resolveRefs(swagger);
+			items = items.resolveRefs(swagger, refStack);
 		
 		if (properties != null) 
 			for (Map.Entry<String,SchemaInfo> e : properties.entrySet())
-				e.setValue(e.getValue().resolveRefs(swagger));
+				e.setValue(e.getValue().resolveRefs(swagger, refStack));
 			
 		if (additionalProperties != null) 
-			additionalProperties = additionalProperties.resolveRefs(swagger);
+			additionalProperties = additionalProperties.resolveRefs(swagger, refStack);
+		
+		this.example = null;
 
 		return this;
 	}
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Swagger.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Swagger.java
index c498e44..27afa97 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Swagger.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Swagger.java
@@ -1365,27 +1365,4 @@ public class Swagger extends SwaggerElement {
 			throw new BeanRuntimeException("Reference ''{0}'' could not be converted to type ''{1}''.", ref, c.getName()).initCause(e); 
 		}
 	}
-
-	/**
-	 * Resolves any <js>"$ref"</js> attributes in this document.
-	 * 
-	 * @return This object (for method chaining).
-	 */
-	public Swagger resolveRefs() {
-		
-		if (parameters != null)
-			for (Map.Entry<String,ParameterInfo> e : parameters.entrySet())
-				e.setValue(e.getValue().resolveRefs(this));
-		
-		if (responses != null)
-			for (Map.Entry<String,ResponseInfo> e : responses.entrySet())
-				e.setValue(e.getValue().resolveRefs(this));
-
-		if (paths != null)
-			for (Map.Entry<String,Map<String,Operation>> e : paths.entrySet())
-				for (Map.Entry<String,Operation> e2 : e.getValue().entrySet())
-					e2.setValue(e2.getValue().resolveRefs(this));
-		
-		return this;
-	}
 }
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/SwaggerElement.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/SwaggerElement.java
index 8fa663d..b5aef00 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/SwaggerElement.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/SwaggerElement.java
@@ -89,8 +89,8 @@ public abstract class SwaggerElement {
 	 */
 	@BeanProperty("*")
 	public Map<String,Object> getExtraProperties() {
-		if (extra == null)
-			extra = new LinkedHashMap<>();
+		if (extra == null || extra.isEmpty())
+			return null;
 		return extra;
 	}
 	
@@ -109,7 +109,7 @@ public abstract class SwaggerElement {
 			return null;
 		switch (property) {
 			case "strict": return toType(isStrict(), type);
-			default: return toType(getExtraProperties().get(property), type);
+			default: return extra == null ? null : toType(getExtraProperties().get(property), type);
 		}
 	};
 	
@@ -123,13 +123,16 @@ public abstract class SwaggerElement {
 	 * @param value The new value for the property.
 	 * @return This object (for method chaining).
 	 */
+	@BeanProperty("*")
 	public SwaggerElement set(String property, Object value) {
 		if (property == null)
 			return this;
 		switch (property) {
 			case "strict": return strict(value);
 			default: 
-				getExtraProperties().put(property, value);
+				if (extra == null)
+					extra = new LinkedHashMap<>();
+				extra.put(property, value);
 				return this;
 		}
 	}
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ui/SwaggerUI.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ui/SwaggerUI.java
index da757f1..af8c9fc 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ui/SwaggerUI.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ui/SwaggerUI.java
@@ -14,6 +14,7 @@ package org.apache.juneau.dto.swagger.ui;
 
 import static org.apache.juneau.dto.html5.HtmlBuilder.*;
 
+import java.util.*;
 import java.util.Map;
 
 import org.apache.juneau.*;
@@ -39,7 +40,7 @@ public class SwaggerUI extends PojoSwap<Swagger,Div> {
 	@Override
 	public Div swap(BeanSession session, Swagger s) throws Exception {
 		
-		s = s.copy().resolveRefs();
+		s = s.copy();
 		
 		Div outer = div(
 			style(RESOURCES.getString("SwaggerUI.css")),
@@ -178,7 +179,7 @@ public class SwaggerUI extends PojoSwap<Swagger,Div> {
 				
 				Td parameterValue = td(
 					div(pi.getDescription())._class("description"),
-					examples(pi.getSchema(), pi.getExamples())
+					examples(s, pi.getSchema(), pi.getExamples())
 				)._class("parameter-value");
 				
 				parameters.child(tr(parameterKey, parameterValue));
@@ -200,7 +201,7 @@ public class SwaggerUI extends PojoSwap<Swagger,Div> {
 
 				Td codeValue = td(
 					div(ri.getDescription())._class("description"),
-					examples(ri.getSchema(), ri.getExamples()),
+					examples(s, ri.getSchema(), ri.getExamples()),
 					headers(s, ri)
 				)._class("response-value");
 				
@@ -237,21 +238,25 @@ public class SwaggerUI extends PojoSwap<Swagger,Div> {
 		return headers;
 	}
 
-	private Div examples(SchemaInfo si, Map<String,?> examples) {
-		if (examples == null || si == null)
+	private Div examples(Swagger swagger, SchemaInfo si, Map<String,?> examples) {
+		if (si == null && examples == null)
 			return null;
 		
 		Select select = (Select)select().onchange("selectExample(this)")._class("example-select");
-		select.child(option("model","model"));
 		Div div = div(select)._class("examples");
 		
-		div.child(div(si.copy().setExample(null))._class("model active").attr("data-name", "model"));
-
-		for (Map.Entry<String,?> e : examples.entrySet()) {
-			String name = e.getKey();
-			String value = e.getValue().toString();
-			select.child(option(name, name));
-			div.child(div(value.replaceAll("\\n", "\n"))._class("example").attr("data-name", name));
+		if (si != null) {
+			select.child(option("model","model"));
+			div.child(div(si.copy().resolveRefs(swagger, new ArrayDeque<String>()))._class("model active").attr("data-name", "model"));
+		}
+		
+		if (examples != null) {
+			for (Map.Entry<String,?> e : examples.entrySet()) {
+				String name = e.getKey();
+				String value = e.getValue().toString();
+				select.child(option(name, name));
+				div.child(div(value.replaceAll("\\n", "\n"))._class("example").attr("data-name", name));
+			}
 		}
 		
 		return div;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java
index 9e92f9e..810effd 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java
@@ -453,10 +453,13 @@ public class BeanMap<T> extends AbstractMap<String,Object> implements Delegate<T
 			if (bpm.canRead()) {
 				try {
 					if (bpm.isDyna()) {
-						for (String pName : bpm.getDynaMap(bean).keySet()) {
-							Object val = bpm.get(this, pName);
-							if (val != null || ! ignoreNulls)
-								l.add(new BeanPropertyValue(bpm, pName, val, null));
+						Map<String,Object> dynaMap = bpm.getDynaMap(bean);
+						if (dynaMap != null) {
+							for (String pName : bpm.getDynaMap(bean).keySet()) {
+								Object val = bpm.get(this, pName);
+								if (val != null || ! ignoreNulls)
+									l.add(new BeanPropertyValue(bpm, pName, val, null));
+							}
 						}
 					} else {
 						Object val = bpm.get(this, null);
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
index 02427e4..45c6800 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
@@ -1941,14 +1941,6 @@ public final class ClassMeta<T> implements Type {
 			return sb.append(BeanMap.class.getName()).append('<').append(n).append('>');
 		if (cc == COLLECTION)
 			return sb.append(n).append(elementType.isObject() ? "" : "<"+elementType.toString(simple)+">");
-		if (cc == OTHER && beanMeta == null) {
-			if (simple)
-				return sb.append(n);
-			sb.append("OTHER-").append(n).append(",notABeanReason=").append(notABeanReason);
-			if (initException != null)
-				sb.append(",initException=").append(initException);
-			return sb;
-		}
 		return sb.append(n);
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializerSession.java
index af574af..e078030 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaSerializerSession.java
@@ -62,7 +62,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
 		defaultSchemas = getProperty(JSONSCHEMA_defaultSchemas, Map.class, ctx.defaultSchemas);
 		addExamplesTo = hasProperty(JSONSCHEMA_addExamplesTo) ? TypeCategory.parse(getProperty(JSONSCHEMA_addExamplesTo, String.class)) : ctx.addExamplesTo;
 		addDescriptionsTo = hasProperty(JSONSCHEMA_addDescriptionsTo) ? TypeCategory.parse(getProperty(JSONSCHEMA_addDescriptionsTo, String.class)) : ctx.addDescriptionsTo;
-		defs = useBeanDefs ? new LinkedHashMap<String,ObjectMap>() : null;
+		defs = useBeanDefs ? new TreeMap<String,ObjectMap>() : null;
 	}
 
 	@Override /* SerializerSession */
@@ -108,6 +108,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
 		aType = push(attrName, eType, null);
 
 		sType = eType.getSerializedClassMeta(this);
+
 		String type = null, format = null;
 		Object example = null, description = null;
 
@@ -118,8 +119,8 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
 			
 			// If we previously encountered this bean in a collection/array, then it may not have
 			// the example and description associated with it, so add it now.
-			if (! schema.containsKey("example")) 
-				schema.appendIf(true, true, true, "example", getExample(sType, BEAN, exampleAdded));
+			if (! schema.containsKey("x-example")) 
+				schema.appendIf(true, true, true, "x-example", getExample(sType, BEAN, exampleAdded));
 			if (! schema.containsKey("description")) 
 				schema.appendIf(true, true, true, "description", getDescription(sType, BEAN, exampleAdded));
 			
@@ -178,6 +179,10 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
 		} else if (sType.isCharSequence() || sType.isChar()) {
 			tc = STRING;
 			type = "string";
+		} else if (sType.isUri()) {
+			tc = STRING;
+			type = "string";
+			format = "uri";
 		}
 
 		// Add info from @JsonSchema on bean property.
@@ -237,14 +242,14 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
 		// Add info from @JsonSchema on bean property.
 		if (jsbpm != null) {
 			out.appendIf(false, true, true, "description", jsbpm.getDescription());
-			out.appendIf(false, true, true, "example", jsbpm.getExample());
+			out.appendIf(false, true, true, "x-example", jsbpm.getExample());
 		}
 
 		out.appendIf(false, true, true, "description", jscm.getDescription());
-		out.appendIf(false, true, true, "example", jscm.getExample());
+		out.appendIf(false, true, true, "x-example", jscm.getExample());
 
 		out.appendIf(false, true, true, "description", description);
-		out.appendIf(false, true, true, "example", example);
+		out.appendIf(false, true, true, "x-example", example);
 
 		if (ds != null)
 			out.appendAll(ds);
@@ -279,7 +284,7 @@ public class JsonSchemaSerializerSession extends JsonSerializerSession {
 	private Object getDescription(ClassMeta<?> sType, TypeCategory t, boolean descriptionAdded) {
 		boolean canAdd = allowNestedDescriptions || ! descriptionAdded;
 		if (canAdd && (addDescriptionsTo.contains(t) || addDescriptionsTo.contains(ANY)))
-			return sType.getReadableName();
+			return sType.toString();
 		return null;
 	}
 	
diff --git a/juneau-doc/src/main/javadoc/overview.html b/juneau-doc/src/main/javadoc/overview.html
index 9f3e1fc..087ee05 100644
--- a/juneau-doc/src/main/javadoc/overview.html
+++ b/juneau-doc/src/main/javadoc/overview.html
@@ -21341,6 +21341,9 @@
 				<ul>
 					<li>New {@link org.apache.juneau.jsonschema.annotation.JsonSchema @JsonSchema} annotation.
 				</ul>
+			<li>
+				Fixed <code>NullPointerException</code> when serializing beans with a dyna-property (i.e. <code><ja>@Bean</ja>(<js>"*"</js>)</code>)
+				which returns a <jk>null</jk> value.
 		</ul>
 		
 		<h5 class='topic w800'>juneau-dto</h5>
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/Order.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/Order.java
index 724ce07..1ecaf39 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/Order.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/Order.java
@@ -15,6 +15,7 @@ package org.apache.juneau.examples.rest.petstore;
 import org.apache.juneau.annotation.*;
 
 @Bean(fluentSetters=true)
+@Example("{id:123,petId:456,quantity:100,shipDate:'2012-12-21',status:'APPROVED'}")
 public class Order {
 	private long id, petId;
 	private int quantity;
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/Pet.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/Pet.java
index c883e96..4817903 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/Pet.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/Pet.java
@@ -29,6 +29,7 @@ public class Pet {
 	private List<Tag> tags;
 	private PetStatus status;
 	
+	// This shows an example generated from a static method.
 	@Example
 	public static Pet example() {
 		return new Pet()
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/PetStoreResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/PetStoreResource.java
index 68ee990..16658f7 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/PetStoreResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/PetStoreResource.java
@@ -89,7 +89,7 @@ public class PetStoreResource extends BasicRestServletJena {
 			"security:[ { api_key:[] } ]"
 		}
 	)
-	public Pet getPet(@Path(description="ID of pet to return") long petId) throws IdNotFoundException {
+	public Pet getPet(@Path(description="ID of pet to return", example="123") long petId) throws IdNotFoundException {
 		return db.getPet(petId);
 	}
 	
@@ -100,10 +100,13 @@ public class PetStoreResource extends BasicRestServletJena {
 		swagger={
 			"tags:['pet'],",
 			"security:[ { petstore_auth:['write:pets','read:pets'] } ],",
-			"responses: { 200: { description: 'OK', schema:{ type:'string' } } }"
+			"responses: { 200: { 'x-example':'OK' } }"
 		}
 	)
-	public String addPet(@Body(description="Pet object that needs to be added to the store") Pet pet) throws IdConflictException {
+	public String addPet(
+			@Body(description="Pet object that needs to be added to the store") Pet pet
+		) throws IdConflictException {
+		
 		db.add(pet);
 		return "OK";
 	}
@@ -115,7 +118,7 @@ public class PetStoreResource extends BasicRestServletJena {
 		swagger={
 			"tags:['pet'],",
 			"security:[ { petstore_auth: ['write:pets','read:pets'] } ],",
-			"responses: { 200: { description: 'OK', schema:{ type:'string' } } }"
+			"responses: { 200: { 'x-example':'OK' } }"
 		}
 	)
 	public String updatePet(@Body(description="Pet object that needs to be added to the store") Pet pet) throws IdNotFoundException {
@@ -133,7 +136,16 @@ public class PetStoreResource extends BasicRestServletJena {
 			"security:[{ petstore_auth:[ 'write:pets','read:pets' ] } ]"
 		}
 	)
-	public Collection<Pet> findPetsByStatus(@Query(name="status", description="Status values that need to be considered for filter", required="true") PetStatus[] status) {
+	public Collection<Pet> findPetsByStatus(
+			@Query(
+				name="status", 
+				description="Status values that need to be considered for filter", 
+				required="true", 
+				example="['AVAILABLE','PENDING']"
+			) 
+			PetStatus[] status
+		) {
+		
 		return db.getPetsByStatus(status);
 	}
 	
@@ -148,7 +160,16 @@ public class PetStoreResource extends BasicRestServletJena {
 		}
 	)
 	@Deprecated
-	public Collection<Pet> findPetsByTags(@Query(name="tags", description="Tags to filter by", required="true") String[] tags) throws InvalidTagException {
+	public Collection<Pet> findPetsByTags(
+			@Query(
+				name="tags", 
+				description="Tags to filter by", 
+				required="true", 
+				example="['tag1','tag2']"
+			) 
+			String[] tags
+		) throws InvalidTagException {
+		
 		return db.getPetsByTags(tags);
 	}
 
@@ -159,14 +180,15 @@ public class PetStoreResource extends BasicRestServletJena {
 		swagger={
 			"tags:[ 'pet' ],",
 			"security:[ { petstore_auth:[ 'write:pets', 'read:pets' ] } ],",
-			"responses: { 200: { description: 'OK', schema:{ type:'string' } } }"
+			"responses: { 200: { 'x-example':'OK' } }"
 		}
 	)
 	public String updatePetForm(
-			@Path(description="ID of pet that needs to be updated") long petId, 
-			@FormData(name="name", description="Updated name of the pet") String name, 
-			@FormData(name="status", description="Updated status of the pet") PetStatus status
+			@Path(description="ID of pet that needs to be updated", example="123") long petId, 
+			@FormData(name="name", description="Updated name of the pet", example="'Scruffy'") String name, 
+			@FormData(name="status", description="Updated status of the pet", example="'AVAILABLE'") PetStatus status
 		) throws IdNotFoundException {
+		
 		Pet pet = db.getPet(petId);
 		pet.name(name);
 		pet.status(status);
@@ -181,12 +203,12 @@ public class PetStoreResource extends BasicRestServletJena {
 		swagger={
 			"tags:[ 'pet' ],",
 			"security:[ { petstore_auth:[ 'write:pets','read:pets' ] } ],",
-			"responses: { 200: { description: 'OK', schema:{ type:'string' } } }"
+			"responses: { 200: { 'x-example':'OK' } }"
 		}
 	)
 	public String deletePet(
-			@Header("api_key") String apiKey, 
-			@Path(description="Pet id to delete") long petId
+			@Header(name="api_key", example="foobar") String apiKey, 
+			@Path(description="Pet id to delete", example="123") long petId
 		) throws IdNotFoundException {
 		db.removePet(petId);
 		return "OK";
@@ -199,12 +221,12 @@ public class PetStoreResource extends BasicRestServletJena {
 		swagger={
 			"tags:[ 'pet' ],",
 			"security:[ { petstore_auth:[ 'write:pets','read:pets' ] } ],",
-			"responses: { 200: { description: 'OK', schema:{ type:'string' } } }"
+			"responses: { 200: { 'x-example':'OK' } }"
 		}
 	)
 	public String uploadImage(
-			@Path(description="ID of pet to update") long petId, 
-			@FormData(name="additionalMetadata", description="Additional data to pass to server") String additionalMetadata, 
+			@Path(description="ID of pet to update", example="123") long petId, 
+			@FormData(name="additionalMetadata", description="Additional data to pass to server", example="Foobar") String additionalMetadata, 
 			@FormData(name="file", description="file to upload", required="true", type="file") byte[] file
 		) {
 		return "OK";
@@ -236,8 +258,15 @@ public class PetStoreResource extends BasicRestServletJena {
 		}
 	)
 	public Order getOrder(
-			@Path(description="ID of order to fetch", maximum="10.0", minimum="1.0") long orderId
+			@Path(
+				description="ID of order to fetch", 
+				maximum="10", 
+				minimum="1",
+				example="5"
+			) 
+			long orderId
 		) throws InvalidIdException, IdNotFoundException {
+		
 		if (orderId < 0 || orderId > 10)
 			throw new InvalidIdException();
 		return db.getOrder(orderId);
@@ -251,7 +280,14 @@ public class PetStoreResource extends BasicRestServletJena {
 			"tags:[ 'store' ]"
 		}
 	)
-	public Order placeOrder(@Body(description="Order placed for purchasing the pet") Order order) throws IdConflictException {
+	public Order placeOrder(
+			@Body(
+				description="Order placed for purchasing the pet", 
+				example="{petId:456,quantity:100}"
+			) 
+			Order order
+		) throws IdConflictException {
+		
 		return db.add(order);
 	}
 
@@ -262,12 +298,18 @@ public class PetStoreResource extends BasicRestServletJena {
 		description="For valid response try integer IDs with positive integer value. Negative or non-integer values will generate API errors.",
 		swagger={
 			"tags:[ 'store' ],",
-			"responses: { 200: { description: 'OK', schema:{ type:'string' } } }"
+			"responses: { 200: { 'x-example':'OK' } }"
 		}
 	)
 	public String deletePurchaseOrder(
-			@Path(description="ID of the order that needs to be deleted", minimum="1.0") long orderId
+			@Path(
+				description="ID of the order that needs to be deleted", 
+				minimum="1",
+				example="5"
+			) 
+			long orderId
 		) throws InvalidIdException, IdNotFoundException {
+		
 		if (orderId < 0)
 			throw new InvalidIdException();
 		db.removeOrder(orderId);
@@ -282,7 +324,7 @@ public class PetStoreResource extends BasicRestServletJena {
 		swagger={
 			"tags:[ 'store' ],",
 			"responses:{",
-				"200:{ description:'successful operation', schema:{ type:'object', additionalProperties:{ type:'integer', format:'int32' } } }",
+				"200:{ 'x-example':{AVAILABLE:123} }",
 			"},",
 			"security:[ { api_key:[] } ]"
 		}
@@ -326,7 +368,7 @@ public class PetStoreResource extends BasicRestServletJena {
 		description="This can only be done by the logged in user.",
 		swagger={
 			"tags:[ 'user' ],",
-			"responses: { 200: { description: 'OK', schema:{ type:'string' } } }"
+			"responses: { 200: { 'x-example':'OK' } }"
 		}
 	)
 	public String createUser(@Body(description="Created user object") User user) throws InvalidUsernameException, IdConflictException {
@@ -340,7 +382,7 @@ public class PetStoreResource extends BasicRestServletJena {
 		summary="Creates list of users with given input array",
 		swagger={
 			"tags:[ 'user' ],",
-			"responses: { 200: { description: 'OK', schema:{ type:'string' } } }"
+			"responses: { 200: { 'x-example':'OK' } }"
 		}
 	)
 	public String createUsers(@Body(description="List of user objects") User[] users) throws InvalidUsernameException, IdConflictException {
@@ -356,7 +398,7 @@ public class PetStoreResource extends BasicRestServletJena {
 		description="This can only be done by the logged in user.",
 		swagger={
 			"tags:[ 'user' ],",
-			"responses: { 200: { description: 'OK', schema:{ type:'string' } } }"
+			"responses: { 200: { 'x-example':'OK' } }"
 		}
 	)
 	public String updateUser(
@@ -376,7 +418,7 @@ public class PetStoreResource extends BasicRestServletJena {
 		description="This can only be done by the logged in user.",
 		swagger={
 			"tags:[ 'user' ],",
-			"responses: { 200: { description: 'OK', schema:{ type:'string' } } }"
+			"responses: { 200: { 'x-example':'OK' } }"
 		}
 	)
 	public String deleteUser(@Path(description="The name that needs to be deleted") String username) throws InvalidUsernameException, IdNotFoundException {
@@ -393,23 +435,38 @@ public class PetStoreResource extends BasicRestServletJena {
 			"tags:[ 'user' ],",
 			"responses:{",
 				"200:{",
-					"description: 'OK', schema:{ type:'string' },",
+					"'x-example':'OK',",
+					"schema:{ type:'string' },",
 					"headers:{",
-						"X-Rate-Limit:{ type:'integer', format:'int32', description:'calls per hour allowed by the user' },",
-						"X-Expires-After:{ type:'string', format:'date-time', description:'date in UTC when token expires' }",
+						"X-Rate-Limit:{ type:'integer', format:'int32', description:'calls per hour allowed by the user', 'x-example':123},",
+						"X-Expires-After:{ type:'string', format:'date-time', description:'date in UTC when token expires', 'x-example':'2012-10-21'}",
 					"}",
 				"}",
 			"}"
 		}
 	)
 	public String login(
-			@Query(name="username", description="The username for login", required="true") String username, 
-			@Query(name="password", description="The password for login in clear text", required="true") String password, 
+			@Query(
+				name="username", 
+				description="The username for login", 
+				required="true", 
+				example="myuser"
+			) 
+			String username, 
+			@Query(
+				name="password", 
+				description="The password for login in clear text", 
+				required="true", 
+				example="abc123"
+			) 
+			String password, 
 			RestRequest req, 
 			RestResponse res
 		) throws LoginException {
+		
 		if (! db.isValid(username, password))
 			throw new LoginException();
+		
 		Date d = new Date(System.currentTimeMillis() + 30 * 60 * 1000);
 		req.getSession().setAttribute("login-expires", d);
 		res.setHeader("X-Rate-Limit", "1000");
@@ -423,7 +480,7 @@ public class PetStoreResource extends BasicRestServletJena {
 		summary="Logs out current logged in user session",
 		swagger={
 			"tags:[ 'user' ],",
-			"responses: { 200: { description: 'OK', schema:{ type:'string' } } }"
+			"responses: { 200: { 'x-example':'OK' } }"
 		}
 	)
 	public String logout(RestRequest req) {
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/User.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/User.java
index d6978cc..9722010 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/User.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/User.java
@@ -20,6 +20,17 @@ public class User {
 	private String username, firstName, lastName, email, password, phone;
 	private int userStatus;
 	
+	// This shows an example provided as a static field.
+	@Example
+	public static User EXAMPLE = new User()
+		.username("billy")
+		.firstName("Billy")
+		.lastName("Bob")
+		.email("billy@apache.org")
+		.id(123)
+		.userStatus(1)
+		.phone("111-222-3333");
+	
 	public long getId() {
 		return id;
 	}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
index f907702..1788f15 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
@@ -334,49 +334,51 @@ public class BasicRestInfoProvider implements RestInfoProvider {
 				if (in != BODY)
 					param.append("name", mp.name);
 				
-				ObjectMap pm = mp.getMetaData();
-				if (pm.containsKeyNotEmpty("required"))
-					param.put("required", vr.resolve(pm.getString("required")));
-				if (pm.containsKeyNotEmpty("description"))
-					param.put("description", vr.resolve(pm.getString("description")));
-				if (pm.containsKeyNotEmpty("type"))
-					param.put("type", vr.resolve(pm.getString("type")));
-				if (pm.containsKeyNotEmpty("format"))
-					param.put("format", vr.resolve(pm.getString("format")));
-				if (pm.containsKeyNotEmpty("pattern"))
-					param.put("pattern", vr.resolve(pm.getString("pattern")));
-				if (pm.containsKeyNotEmpty("collectionFormat"))
-					param.put("collectionFormat", vr.resolve(pm.getString("collectionFormat")));
-				if (pm.containsKeyNotEmpty("maximum"))
-					param.put("maximum", vr.resolve(pm.getString("maximum")));
-				if (pm.containsKeyNotEmpty("minimum"))
-					param.put("minimum", vr.resolve(pm.getString("minimum")));
-				if (pm.containsKeyNotEmpty("multipleOf"))
-					param.put("multipleOf", vr.resolve(pm.getString("multipleOf")));
-				if (pm.containsKeyNotEmpty("maxLength"))
-					param.put("maxLength", vr.resolve(pm.getString("maxLength")));
-				if (pm.containsKeyNotEmpty("minLength"))
-					param.put("minLength", vr.resolve(pm.getString("minLength")));
-				if (pm.containsKeyNotEmpty("maxItems"))
-					param.put("maxItems", vr.resolve(pm.getString("maxItems")));
-				if (pm.containsKeyNotEmpty("minItems"))
-					param.put("minItems", vr.resolve(pm.getString("minItems")));
-				if (pm.containsKeyNotEmpty("allowEmptyVals"))
-					param.put("allowEmptyVals", vr.resolve(pm.getString("allowEmptyVals")));
-				if (pm.containsKeyNotEmpty("exclusiveMaximum"))
-					param.put("exclusiveMaximum", vr.resolve(pm.getString("exclusiveMaximum")));
-				if (pm.containsKeyNotEmpty("exclusiveMimimum"))
-					param.put("exclusiveMimimum", vr.resolve(pm.getString("exclusiveMimimum")));
-				if (pm.containsKeyNotEmpty("uniqueItems"))
-					param.put("uniqueItems", vr.resolve(pm.getString("uniqueItems")));
-				if (pm.containsKeyNotEmpty("schema"))
-					param.put("schema", new ObjectMap(vr.resolve(pm.getString("schema"))));
-				if (pm.containsKeyNotEmpty("default"))
-					param.put("default", JsonParser.DEFAULT.parse(vr.resolve(pm.getString("default")), Object.class));
-				if (pm.containsKeyNotEmpty("enum"))
-					param.put("enum", new ObjectList(vr.resolve(pm.getString("enum"))));
-				if (pm.containsKeyNotEmpty("items"))
-					param.put("items", new ObjectMap(vr.resolve(pm.getString("items"))));
+				ObjectMap pi = mp.getMetaData();
+				if (pi.containsKeyNotEmpty("required"))
+					param.put("required", vr.resolve(pi.getString("required")));
+				if (pi.containsKeyNotEmpty("description"))
+					param.put("description", vr.resolve(pi.getString("description")));
+				if (pi.containsKeyNotEmpty("type"))
+					param.put("type", vr.resolve(pi.getString("type")));
+				if (pi.containsKeyNotEmpty("format"))
+					param.put("format", vr.resolve(pi.getString("format")));
+				if (pi.containsKeyNotEmpty("pattern"))
+					param.put("pattern", vr.resolve(pi.getString("pattern")));
+				if (pi.containsKeyNotEmpty("collectionFormat"))
+					param.put("collectionFormat", vr.resolve(pi.getString("collectionFormat")));
+				if (pi.containsKeyNotEmpty("maximum"))
+					param.put("maximum", vr.resolve(pi.getString("maximum")));
+				if (pi.containsKeyNotEmpty("minimum"))
+					param.put("minimum", vr.resolve(pi.getString("minimum")));
+				if (pi.containsKeyNotEmpty("multipleOf"))
+					param.put("multipleOf", vr.resolve(pi.getString("multipleOf")));
+				if (pi.containsKeyNotEmpty("maxLength"))
+					param.put("maxLength", vr.resolve(pi.getString("maxLength")));
+				if (pi.containsKeyNotEmpty("minLength"))
+					param.put("minLength", vr.resolve(pi.getString("minLength")));
+				if (pi.containsKeyNotEmpty("maxItems"))
+					param.put("maxItems", vr.resolve(pi.getString("maxItems")));
+				if (pi.containsKeyNotEmpty("minItems"))
+					param.put("minItems", vr.resolve(pi.getString("minItems")));
+				if (pi.containsKeyNotEmpty("allowEmptyVals"))
+					param.put("allowEmptyVals", vr.resolve(pi.getString("allowEmptyVals")));
+				if (pi.containsKeyNotEmpty("exclusiveMaximum"))
+					param.put("exclusiveMaximum", vr.resolve(pi.getString("exclusiveMaximum")));
+				if (pi.containsKeyNotEmpty("exclusiveMimimum"))
+					param.put("exclusiveMimimum", vr.resolve(pi.getString("exclusiveMimimum")));
+				if (pi.containsKeyNotEmpty("uniqueItems"))
+					param.put("uniqueItems", vr.resolve(pi.getString("uniqueItems")));
+				if (pi.containsKeyNotEmpty("schema"))
+					param.put("schema", new ObjectMap(vr.resolve(pi.getString("schema"))));
+				if (pi.containsKeyNotEmpty("default"))
+					param.put("default", JsonParser.DEFAULT.parse(vr.resolve(pi.getString("default")), Object.class));
+				if (pi.containsKeyNotEmpty("enum"))
+					param.put("enum", new ObjectList(vr.resolve(pi.getString("enum"))));
+				if (pi.containsKeyNotEmpty("items"))
+					param.put("items", new ObjectMap(vr.resolve(pi.getString("items"))));
+				if (pi.containsKeyNotEmpty("example"))
+					param.put("x-example", parse(vr.resolve(pi.getString("example"))));
 				
 				if ((in == BODY || in == PATH) && ! param.containsKeyNotEmpty("required"))
 					param.put("required", true);
@@ -411,14 +413,23 @@ public class BasicRestInfoProvider implements RestInfoProvider {
 				}
 			}
 			
-			if (! responses.containsKey("200"))
-				responses.put("200", new ObjectMap().append("description", "Success"));
-			
 			ObjectMap okResponse = responses.getObjectMap("200");
+			if (okResponse == null)
+				okResponse = new ObjectMap();
 			
 			okResponse.put("schema", getSchema(req, okResponse.getObjectMap("schema", true), js, m.getGenericReturnType()));
 			addXExamples(req, sm, okResponse, "ok", js, m.getGenericReturnType());
 			
+			responses.put("200", okResponse);
+
+			// Add default response descriptions.
+			for (Map.Entry<String,Object> e : responses.entrySet()) {
+				String key = e.getKey();
+				Object val = e.getValue();
+				if (StringUtils.isDecimal(key) && val instanceof ObjectMap) 
+					responses.getObjectMap(key).appendIf(false, true, true, "description", RestUtils.getHttpResponseText(Integer.parseInt(key)));
+			}
+			
 			if (responses.isEmpty())
 				op.remove("responses");
 			else
@@ -437,7 +448,8 @@ public class BasicRestInfoProvider implements RestInfoProvider {
 			}
 		}
 		
-		definitions.putAll(js.getBeanDefs());
+		for (Map.Entry<String,ObjectMap> e : js.getBeanDefs().entrySet())
+			definitions.put(e.getKey(), fixSwaggerExtensions(e.getValue()));
 		
 		if (definitions.isEmpty())
 			omSwagger.remove("definitions");		
@@ -458,6 +470,13 @@ public class BasicRestInfoProvider implements RestInfoProvider {
 		return swagger;
 	}
 	
+	private Object parse(String s) throws ParseException {
+		char c1 = StringUtils.firstNonWhitespaceChar(s), c2 = StringUtils.lastNonWhitespaceChar(s);
+		if (c1 == '{' && c2 == '}' || c1 == '[' && c2 == ']' || c1 == '\'' && c2 == '\'')
+			return JsonParser.DEFAULT.parse(s, Object.class);
+		return s;
+	}
+
 	private ObjectMap getSchema(RestRequest req, ObjectMap schema, JsonSchemaSerializerSession js, Type type) throws Exception {
 		BeanSession bs = req.getBeanSession();
 		ClassMeta<?> cm = bs.getClassMeta(type);
@@ -465,19 +484,31 @@ public class BasicRestInfoProvider implements RestInfoProvider {
 		if (schema.containsKey("type") || schema.containsKey("$ref")) 
 			return schema;
 		
-		schema.putAll(js.getSchema(cm));
-
-		return schema;
+		return fixSwaggerExtensions(schema.appendAll(js.getSchema(cm)));
 	}
 	
+	/** 
+	 * Replaces non-standard JSON-Schema attributes with standard Swagger attributes. 
+	 */
+	private ObjectMap fixSwaggerExtensions(ObjectMap om) {
+		om.appendSkipNull("discriminator", om.remove("x-discriminator"));
+		om.appendSkipNull("readOnly", om.remove("x-readOnly"));
+		om.appendSkipNull("xml", om.remove("x-xml"));
+		om.appendSkipNull("externalDocs", om.remove("x-externalDocs"));
+		om.appendSkipNull("example", om.remove("x-example"));
+		return om;
+	}
 	
-	private void addXExamples(RestRequest req, RestJavaMethod sm, ObjectMap m, String in, JsonSchemaSerializerSession js, Type type) throws Exception {
+	private void addXExamples(RestRequest req, RestJavaMethod sm, ObjectMap piri, String in, JsonSchemaSerializerSession js, Type type) throws Exception {
 		
-		ObjectMap schema = resolve(js, m.getObjectMap("schema"));
-		if (schema == null)
-			return;
+		Object example = piri.get("x-example");
+
+		if (example == null) {
+			ObjectMap schema = resolve(js, piri.getObjectMap("schema"));
+			if (schema != null)
+				example = schema.get("x-example");
+		}
 
-		Object example = schema.get("example", Object.class);
 		if (example == null)
 			return;
 		
@@ -487,7 +518,7 @@ public class BasicRestInfoProvider implements RestInfoProvider {
 		
 		String examplesKey = isOk ? "examples" : "x-examples";  // Parameters don't have an examples attribute.
 
-		ObjectMap examples = schema.getObjectMap(examplesKey);
+		ObjectMap examples = piri.getObjectMap(examplesKey);
 		if (examples == null)
 			examples = new ObjectMap();
 
@@ -506,11 +537,21 @@ public class BasicRestInfoProvider implements RestInfoProvider {
 				}
 			}
 		} else {
-			examples.put("example", req.getPartSerializer().serialize(HttpPartType.valueOf(in.toUpperCase()), example));
+			String paramName = piri.getString("name");
+			String s = req.getPartSerializer().serialize(HttpPartType.valueOf(in.toUpperCase()), example);
+			if ("query".equals(in))
+				s = "?" + paramName + "=" + s;
+			else if ("formData".equals(in))
+				s = paramName + "=" + s;
+			else if ("header".equals(in))
+				s = paramName + ": " + s;
+			else if ("path".equals(in))
+				s = sm.getPathPattern().replace("{"+paramName+"}", s);
+ 			examples.put("example", s);
 		}
 		
 		if (! examples.isEmpty())
-			m.put(examplesKey, examples);
+			piri.put(examplesKey, examples);
 	}
 	
 	private ObjectMap resolve(JsonSchemaSerializerSession js, ObjectMap m) {
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 c960cd4..f59cfb8 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
@@ -570,6 +570,7 @@ class RestParamDefaults {
 				.appendSkipEmpty("exclusiveMimimum", a.exclusiveMimimum())
 				.appendSkipEmpty("schema", a.schema())
 				.appendSkipEmpty("enum", a._enum())
+				.appendSkipEmpty("example", a.example())
 			;
 		}
 	}
@@ -610,6 +611,7 @@ class RestParamDefaults {
 				.appendSkipEmpty("default", a._default())
 				.appendSkipEmpty("enum", a._enum())
 				.appendSkipEmpty("items", a.items())
+				.appendSkipEmpty("example", a.example())
 			;
 		}
 	}
@@ -652,6 +654,7 @@ class RestParamDefaults {
 				.appendSkipEmpty("default", a._default())
 				.appendSkipEmpty("enum", a._enum())
 				.appendSkipEmpty("items", a.items())
+				.appendSkipEmpty("example", a.example())
 			;
 		}
 	}
@@ -714,6 +717,7 @@ class RestParamDefaults {
 				.appendSkipEmpty("default", a._default())
 				.appendSkipEmpty("enum", a._enum())
 				.appendSkipEmpty("items", a.items())
+				.appendSkipEmpty("example", a.example())
 			;
 		}
 	}
@@ -762,6 +766,7 @@ class RestParamDefaults {
 				.appendSkipEmpty("default", a._default())
 				.appendSkipEmpty("enum", a._enum())
 				.appendSkipEmpty("items", a.items())
+				.appendSkipEmpty("example", a.example())
 			;
 		}
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Body.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Body.java
index 4b79903..d3187ff 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Body.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Body.java
@@ -18,6 +18,8 @@ import static java.lang.annotation.RetentionPolicy.*;
 import java.io.*;
 import java.lang.annotation.*;
 
+import org.apache.juneau.rest.*;
+
 /**
  * Annotation that can be applied to a parameter of a {@link RestMethod @RestMethod} annotated method to identify it as the HTTP
  * request body converted to a POJO.
@@ -369,4 +371,22 @@ public @interface Body {
 	 * </ul>
 	 */
 	String items() default "";	
+	
+	/**
+	 * Defines the swagger value <code>/paths/{path}/{method}/parameters/#/x-example</code>.
+	 * 
+	 * <p>
+	 * This attribute defines a JSON representation of the body value that is used by {@link BasicRestInfoProvider} to construct
+	 * media-type-based examples of the body of the request.
+	 * 
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		The format of the value is a JSON object or plain-text string.
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
+	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * </ul>
+	 */
+	String example() default "";
 }
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/FormData.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/FormData.java
index 5dbf0c3..d9c1bfa 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/FormData.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/FormData.java
@@ -415,4 +415,22 @@ public @interface FormData {
 	 * </ul>
 	 */
 	String items() default "";	
+	
+	/**
+	 * Defines the swagger value <code>/paths/{path}/{method}/parameters/#/x-example</code>.
+	 * 
+	 * <p>
+	 * This attribute defines a JSON representation of the value that is used by {@link BasicRestInfoProvider} to construct
+	 * an example of the form data entry.
+	 * 
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		The format of the value is a JSON object or plain-text string.
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
+	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * </ul>
+	 */
+	String example() default "";
 }
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Header.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Header.java
index a25019c..01ad591 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Header.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Header.java
@@ -18,6 +18,7 @@ import static java.lang.annotation.RetentionPolicy.*;
 import java.lang.annotation.*;
 
 import org.apache.juneau.httppart.*;
+import org.apache.juneau.rest.*;
 
 /**
  * Annotation that can be applied to a parameter of a {@link RestMethod @RestMethod} annotated method to identify it as a HTTP
@@ -387,4 +388,22 @@ public @interface Header {
 	 * </ul>
 	 */
 	String items() default "";	
+	
+	/**
+	 * Defines the swagger value <code>/paths/{path}/{method}/parameters/#/x-example</code>.
+	 * 
+	 * <p>
+	 * This attribute defines a JSON representation of the value that is used by {@link BasicRestInfoProvider} to construct
+	 * an example of the header entry.
+	 * 
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		The format of the value is a JSON object or plain-text string.
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
+	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * </ul>
+	 */
+	String example() default "";
 }
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Path.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Path.java
index 690ab29..fa30b8e 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Path.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Path.java
@@ -18,6 +18,7 @@ import static java.lang.annotation.RetentionPolicy.*;
 import java.lang.annotation.*;
 
 import org.apache.juneau.httppart.*;
+import org.apache.juneau.rest.*;
 
 /**
  * Annotation that can be applied to a parameter of a {@link RestMethod @RestMethod} annotated method to identify it as a variable
@@ -307,4 +308,22 @@ public @interface Path {
 	 * </ul>
 	 */
 	String _enum() default "";
+	
+	/**
+	 * Defines the swagger value <code>/paths/{path}/{method}/parameters/#/x-example</code>.
+	 * 
+	 * <p>
+	 * This attribute defines a JSON representation of the value that is used by {@link BasicRestInfoProvider} to construct
+	 * an example of the path.
+	 * 
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		The format of the value is a JSON object or plain-text string.
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
+	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * </ul>
+	 */
+	String example() default "";
 }
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Query.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Query.java
index 6fe9d1d..c3c60e7 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Query.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Query.java
@@ -411,4 +411,22 @@ public @interface Query {
 	 * </ul>
 	 */
 	String items() default "";	
+	
+	/**
+	 * Defines the swagger value <code>/paths/{path}/{method}/parameters/#/x-example</code>.
+	 * 
+	 * <p>
+	 * This attribute defines a JSON representation of the value that is used by {@link BasicRestInfoProvider} to construct
+	 * an example of the query entry.
+	 * 
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		The format of the value is a JSON object or plain-text string.
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
+	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * </ul>
+	 */
+	String example() default "";
 }
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/labels/NameDescription.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/labels/NameDescription.java
deleted file mode 100644
index b0e120a..0000000
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/labels/NameDescription.java
+++ /dev/null
@@ -1,89 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                                                              *
-// *                                                                                                                         *
-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
-// *                                                                                                                         *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the License.                                              *
-// ***************************************************************************************************************************
-package org.apache.juneau.rest.labels;
-
-import org.apache.juneau.annotation.*;
-
-/**
- * Simple bean with {@code name} and {@code description} properties.
- * 
- * <p>
- * Primarily used for constructing tables with name/description columns on REST OPTIONS requests.
- * 
- * <h5 class='section'>See Also:</h5>
- * <ul>
- * 	<li class='link'><a class="doclink" href="../../../../../overview-summary.html#juneau-rest-server.PredefinedLabelBeans">Overview &gt; juneau-rest-server &gt; Predefined Label Beans</a>
- * </ul>
- */
-@Bean(properties="name,description")
-public class NameDescription {
-
-	private Object name;
-	private Object description;
-
-	/** No-arg constructor.  Used for JUnit testing of OPTIONS pages. */
-	public NameDescription() {}
-
-	/**
-	 * Constructor.
-	 * 
-	 * @param name A name.
-	 * @param description A description.
-	 */
-	public NameDescription(Object name, Object description) {
-		this.name = name;
-		this.description = description;
-	}
-
-	/**
-	 * Returns the name field on this label.
-	 * 
-	 * @return The name.
-	 */
-	public Object getName() {
-		return name;
-	}
-
-	/**
-	 * Sets the name field on this label to a new value.
-	 * 
-	 * @param name The new name.
-	 * @return This object (for method chaining).
-	 */
-	@BeanProperty
-	public NameDescription name(Object name) {
-		this.name = name;
-		return this;
-	}
-
-	/**
-	 * Returns the description field on this label.
-	 * 
-	 * @return The description.
-	 */
-	public Object getDescription() {
-		return description;
-	}
-
-	/**
-	 * Sets the description field on this label to a new value.
-	 * 
-	 * @param description The new description.
-	 * @return This object (for method chaining).
-	 */
-	@BeanProperty
-	public NameDescription description(Object description) {
-		this.description = description;
-		return this;
-	}
-}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/labels/ResourceDescription.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/labels/ResourceDescription.java
index e496edd..68376b0 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/labels/ResourceDescription.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/labels/ResourceDescription.java
@@ -12,6 +12,7 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest.labels;
 
+import org.apache.juneau.annotation.*;
 import org.apache.juneau.html.annotation.*;
 
 /**
@@ -27,7 +28,10 @@ import org.apache.juneau.html.annotation.*;
  * 	<li class='link'><a class="doclink" href="../../../../../overview-summary.html#juneau-rest-server.PredefinedLabelBeans">Overview &gt; juneau-rest-server &gt; Predefined Label Beans</a>
  * </ul>
  */
-public final class ResourceDescription extends NameDescription implements Comparable<ResourceDescription> {
+@Bean(properties="name,description", fluentSetters=true)
+public final class ResourceDescription implements Comparable<ResourceDescription> {
+
+	private String name, description;
 
 	/**
 	 * Constructor.
@@ -36,18 +40,55 @@ public final class ResourceDescription extends NameDescription implements Compar
 	 * @param description The description of the child resource.
 	 */
 	public ResourceDescription(String name, String description) {
-		super(name, description);
+		this.name = name;
+		this.description = description;
 	}
 
 	/** No-arg constructor.  Used for JUnit testing of OPTIONS pages. */
 	public ResourceDescription() {}
 
-	@Override /* NameDescription */
+	/**
+	 * Returns the name field on this label.
+	 * 
+	 * @return The name.
+	 */
 	@Html(link="servlet:/{name}")
-	public Object getName() {
-		return super.getName();
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * Sets the name field on this label to a new value.
+	 * 
+	 * @param name The new name.
+	 * @return This object (for method chaining).
+	 */
+	public ResourceDescription name(String name) {
+		this.name = name;
+		return this;
 	}
 
+	/**
+	 * Returns the description field on this label.
+	 * 
+	 * @return The description.
+	 */
+	public String getDescription() {
+		return description;
+	}
+
+	/**
+	 * Sets the description field on this label to a new value.
+	 * 
+	 * @param description The new description.
+	 * @return This object (for method chaining).
+	 */
+	public ResourceDescription description(String description) {
+		this.description = description;
+		return this;
+	}
+	
+	
 	@Override /* Comparable */
 	public int compareTo(ResourceDescription o) {
 		return getName().toString().compareTo(o.getName().toString());

-- 
To stop receiving notification emails like this one, please contact
jamesbognar@apache.org.