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 2016/09/10 13:40:32 UTC

[1/2] incubator-juneau git commit: Continuation of bean dictionary support.

Repository: incubator-juneau
Updated Branches:
  refs/heads/master 864893f23 -> f479285a7


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializer.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializer.java
index 948be20..8b8da03 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializer.java
@@ -343,14 +343,14 @@ public class UonSerializer extends WriterSerializer {
 		return out;
 	}
 
-	private SerializerWriter serializeBeanMap(UonSerializerSession session, UonWriter out, BeanMap<?> m, boolean addClassAttr) throws Exception {
+	private SerializerWriter serializeBeanMap(UonSerializerSession session, UonWriter out, BeanMap<?> m, boolean addTypeProperty) throws Exception {
 		int depth = session.getIndent();
 
 		out.startFlag('o');
 
 		boolean addComma = false;
 
-		for (BeanPropertyValue p : m.getValues(session.isTrimNulls(), addClassAttr ? session.createBeanTypeNameProperty(m, null) : null)) {
+		for (BeanPropertyValue p : m.getValues(session.isTrimNulls(), addTypeProperty ? session.createBeanTypeNameProperty(m) : null)) {
 			BeanPropertyMeta pMeta = p.getMeta();
 			ClassMeta<?> cMeta = p.getClassMeta();
 
@@ -452,6 +452,12 @@ public class UonSerializer extends WriterSerializer {
 	}
 
 	@Override /* CoreApi */
+	public UonSerializer addToDictionary(Class<?>...classes) throws LockedException {
+		super.addToDictionary(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
 	public <T> UonSerializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
 		super.addImplClass(interfaceClass, implClass);
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerContext.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerContext.java
index 5e0e440..cfcb1c6 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonSerializerContext.java
@@ -28,6 +28,7 @@ import org.apache.juneau.serializer.*;
  * 	<li>{@link UonSerializer#addNotBeanClasses(Class[])}
  * 	<li>{@link UonSerializer#addBeanFilters(Class[])}
  * 	<li>{@link UonSerializer#addPojoSwaps(Class[])}
+ * 	<li>{@link UonSerializer#addToDictionary(Class[])}
  * 	<li>{@link UonSerializer#addImplClass(Class,Class)}
  * </ul>
  * <p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
index cda21ba..103e16c 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java
@@ -76,6 +76,7 @@ public class UrlEncodingParser extends UonParser {
 			eType = (ClassMeta<T>)object();
 		PojoSwap<T,Object> transform = (PojoSwap<T,Object>)eType.getPojoSwap();
 		ClassMeta<?> sType = eType.getSerializedClassMeta();
+		BeanDictionary bd = bc.getBeanDictionary();
 
 		int c = r.peek();
 		if (c == '?')
@@ -89,7 +90,7 @@ public class UrlEncodingParser extends UonParser {
 			if (m.containsKey("_value"))
 				o = m.get("_value");
 			else
-				o = m.cast();
+				o = bd.cast(m);
 		} else if (sType.isMap()) {
 			Map m = (sType.canCreateNewInstance() ? (Map)sType.newInstance() : new ObjectMap(bc));
 			o = parseIntoMap(session, r, m, sType.getKeyType(), sType.getValueType());
@@ -107,7 +108,7 @@ public class UrlEncodingParser extends UonParser {
 			ClassMeta<Object> valueType = object();
 			parseIntoMap(session, r, m, string(), valueType);
 			if (m.containsKey(bc.getBeanTypePropertyName()))
-				o = m.cast();
+				o = bd.cast(m);
 			else if (m.containsKey("_value"))
 				o = session.getBeanContext().convertToType(m.get("_value"), sType);
 			else if (sType.isCollection()) {
@@ -183,7 +184,7 @@ public class UrlEncodingParser extends UonParser {
 						state = S1;
 					} else  {
 						// For performance, we bypass parseAnything for string values.
-						V value = (V)(valueType.isString() ? super.parseString(session, r.unread(), true) : super.parseAnything(session, valueType, r.unread(), m, true));
+						V value = (V)(valueType.isString() ? super.parseString(session, r.unread(), true) : super.parseAnything(session, valueType, r.unread(), m, true, null));
 
 						// If we already encountered this parameter, turn it into a list.
 						if (m.containsKey(currAttr) && valueType.isObject()) {
@@ -289,22 +290,22 @@ public class UrlEncodingParser extends UonParser {
 							BeanPropertyMeta pMeta = m.getPropertyMeta(currAttr);
 							if (pMeta == null) {
 								if (m.getMeta().isSubTyped()) {
-									Object value = parseAnything(session, object(), r.unread(), m.getBean(false), true);
+									Object value = parseAnything(session, object(), r.unread(), m.getBean(false), true, null);
 									m.put(currAttr, value);
 								} else {
 									onUnknownProperty(session, currAttr, m, currAttrLine, currAttrCol);
-									parseAnything(session, object(), r.unread(), m.getBean(false), true); // Read content anyway to ignore it
+									parseAnything(session, object(), r.unread(), m.getBean(false), true, null); // Read content anyway to ignore it
 								}
 							} else {
 								session.setCurrentProperty(pMeta);
 								if (session.shouldUseExpandedParams(pMeta)) {
 									ClassMeta et = pMeta.getClassMeta().getElementType();
-									Object value = parseAnything(session, et, r.unread(), m.getBean(false), true);
+									Object value = parseAnything(session, et, r.unread(), m.getBean(false), true, pMeta);
 									setName(et, value, currAttr);
 									pMeta.add(m, value);
 								} else {
 									ClassMeta<?> cm = pMeta.getClassMeta();
-									Object value = parseAnything(session, cm, r.unread(), m.getBean(false), true);
+									Object value = parseAnything(session, cm, r.unread(), m.getBean(false), true, pMeta);
 									setName(cm, value, currAttr);
 									pMeta.set(m, value);
 								}
@@ -431,7 +432,7 @@ public class UrlEncodingParser extends UonParser {
 			throw new ParseException(session, "Argument lengths don't match.  vals={0}, argTypes={1}", vals.length, argTypes.length);
 		for (int i = 0; i < vals.length; i++) {
 			String s = String.valueOf(vals[i]);
-			vals[i] = super.parseAnything(session, argTypes[i], new UonReader(s, false), session.getOuter(), true);
+			vals[i] = super.parseAnything(session, argTypes[i], new UonReader(s, false), session.getOuter(), true, null);
 		}
 
 		return vals;
@@ -451,7 +452,7 @@ public class UrlEncodingParser extends UonParser {
 		UonParserSession session = createParameterContext(in);
 		try {
 			UonReader r = session.getReader();
-			return super.parseAnything(session, type, r, null, true);
+			return super.parseAnything(session, type, r, null, true, null);
 		} catch (ParseException e) {
 			throw e;
 		} catch (Exception e) {
@@ -540,6 +541,12 @@ public class UrlEncodingParser extends UonParser {
 	}
 
 	@Override /* CoreApi */
+	public UrlEncodingParser addToDictionary(Class<?>...classes) throws LockedException {
+		super.addToDictionary(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
 	public <T> UrlEncodingParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
 		super.addImplClass(interfaceClass, implClass);
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserContext.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserContext.java
index b7a75c3..43f7da4 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserContext.java
@@ -27,6 +27,7 @@ import org.apache.juneau.*;
  * 	<li>{@link UrlEncodingParser#addNotBeanClasses(Class[])}
  * 	<li>{@link UrlEncodingParser#addBeanFilters(Class[])}
  * 	<li>{@link UrlEncodingParser#addPojoSwaps(Class[])}
+ * 	<li>{@link UrlEncodingParser#addToDictionary(Class[])}
  * 	<li>{@link UrlEncodingParser#addImplClass(Class,Class)}
  * </ul>
  * <p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
index 3863386..714309c 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializer.java
@@ -321,12 +321,12 @@ public class UrlEncodingSerializer extends UonSerializer {
 	}
 
 	@SuppressWarnings({ "rawtypes" })
-	private SerializerWriter serializeBeanMap(UrlEncodingSerializerSession session, UonWriter out, BeanMap<?> m, boolean addClassAttr) throws Exception {
+	private SerializerWriter serializeBeanMap(UrlEncodingSerializerSession session, UonWriter out, BeanMap<?> m, boolean addTypeProperty) throws Exception {
 		int depth = session.getIndent();
 
 		boolean addAmp = false;
 
-		for (BeanPropertyValue p : m.getValues(session.isTrimNulls(), addClassAttr ? session.createBeanTypeNameProperty(m, null) : null)) {
+		for (BeanPropertyValue p : m.getValues(session.isTrimNulls(), addTypeProperty ? session.createBeanTypeNameProperty(m) : null)) {
 			BeanPropertyMeta pMeta = p.getMeta();
 			ClassMeta<?> cMeta = p.getClassMeta();
 
@@ -444,6 +444,12 @@ public class UrlEncodingSerializer extends UonSerializer {
 	}
 
 	@Override /* CoreApi */
+	public UrlEncodingSerializer addToDictionary(Class<?>...classes) throws LockedException {
+		super.addToDictionary(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
 	public <T> UrlEncodingSerializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
 		super.addImplClass(interfaceClass, implClass);
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerContext.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerContext.java
index 6ccfb6b..6f5f7c8 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingSerializerContext.java
@@ -27,6 +27,7 @@ import org.apache.juneau.*;
  * 	<li>{@link UrlEncodingSerializer#addNotBeanClasses(Class[])}
  * 	<li>{@link UrlEncodingSerializer#addBeanFilters(Class[])}
  * 	<li>{@link UrlEncodingSerializer#addPojoSwaps(Class[])}
+ * 	<li>{@link UrlEncodingSerializer#addToDictionary(Class[])}
  * 	<li>{@link UrlEncodingSerializer#addImplClass(Class,Class)}
  * </ul>
  * <p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java
index 2311a52..f066c84 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java
@@ -62,7 +62,7 @@ public class XmlParser extends ReaderParser {
 	private static final int UNKNOWN=0, OBJECT=1, ARRAY=2, STRING=3, NUMBER=4, BOOLEAN=5, NULL=6;
 
 
-	private <T> T parseAnything(XmlParserSession session, ClassMeta<T> eType, String currAttr, XMLStreamReader r, Object outer, boolean isRoot) throws Exception {
+	private <T> T parseAnything(XmlParserSession session, ClassMeta<T> eType, String currAttr, XMLStreamReader r, Object outer, boolean isRoot, BeanPropertyMeta pMeta) throws Exception {
 
 		BeanContext bc = session.getBeanContext();
 		if (eType == null)
@@ -70,6 +70,7 @@ public class XmlParser extends ReaderParser {
 		PojoSwap<T,Object> transform = (PojoSwap<T,Object>)eType.getPojoSwap();
 		ClassMeta<?> sType = eType.getSerializedClassMeta();
 		session.setCurrentClass(sType);
+		BeanDictionary bd = (pMeta == null ? bc.getBeanDictionary() : pMeta.getBeanDictionary());
 
 		String wrapperAttr = (isRoot && session.isPreserveRootElement()) ? r.getName().getLocalPart() : null;
 		String typeAttr = r.getAttributeValue(null, "type");
@@ -108,12 +109,12 @@ public class XmlParser extends ReaderParser {
 		if (sType.isObject()) {
 			if (jsonType == OBJECT) {
 				ObjectMap m = new ObjectMap(bc);
-				parseIntoMap(session, r, m, string(), object());
+				parseIntoMap(session, r, m, string(), object(), pMeta);
 				if (wrapperAttr != null)
 					m = new ObjectMap(bc).append(wrapperAttr, m);
-				o = m.cast();
+				o = bd.cast(m);
 			} else if (jsonType == ARRAY)
-				o = parseIntoCollection(session, r, new ObjectList(bc), object());
+				o = parseIntoCollection(session, r, new ObjectList(bc), object(), pMeta);
 			else if (jsonType == STRING) {
 				o = session.decodeString(r.getElementText());
 				if (sType.isChar())
@@ -133,17 +134,17 @@ public class XmlParser extends ReaderParser {
 			o = session.decodeString(r.getElementText()).charAt(0);
 		} else if (sType.isMap()) {
 			Map m = (sType.canCreateNewInstance(outer) ? (Map)sType.newInstance(outer) : new ObjectMap(bc));
-			o = parseIntoMap(session, r, m, sType.getKeyType(), sType.getValueType());
+			o = parseIntoMap(session, r, m, sType.getKeyType(), sType.getValueType(), pMeta);
 			if (wrapperAttr != null)
 				o = new ObjectMap(bc).append(wrapperAttr, m);
 		} else if (sType.isCollection()) {
 			Collection l = (sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance(outer) : new ObjectList(bc));
-			o = parseIntoCollection(session, r, l, sType.getElementType());
+			o = parseIntoCollection(session, r, l, sType.getElementType(), pMeta);
 		} else if (sType.isNumber()) {
 			o = parseNumber(session.decodeLiteral(r.getElementText()), (Class<? extends Number>)sType.getInnerClass());
 		} else if (sType.canCreateNewInstanceFromObjectMap(outer)) {
 			ObjectMap m = new ObjectMap(bc);
-			parseIntoMap(session, r, m, string(), object());
+			parseIntoMap(session, r, m, string(), object(), pMeta);
 			o = sType.newInstanceFromObjectMap(outer, m);
 		} else if (sType.canCreateNewBean(outer)) {
 			if (sType.getExtendedMeta(XmlClassMeta.class).getFormat() == XmlFormat.COLLAPSED) {
@@ -151,7 +152,7 @@ public class XmlParser extends ReaderParser {
 				BeanMap<?> m = bc.newBeanMap(outer, sType.getInnerClass());
 				BeanPropertyMeta bpm = m.getMeta().getExtendedMeta(XmlBeanMeta.class).getPropertyMeta(fieldName);
 				ClassMeta<?> cm = m.getMeta().getClassMeta();
-				Object value = parseAnything(session, cm, currAttr, r, m.getBean(false), false);
+				Object value = parseAnything(session, cm, currAttr, r, m.getBean(false), false, null);
 				setName(cm, value, currAttr);
 				bpm.set(m, value);
 				o = m.getBean();
@@ -160,7 +161,7 @@ public class XmlParser extends ReaderParser {
 				o = parseIntoBean(session, r, m).getBean();
 			}
 		} else if (sType.isArray()) {
-			ArrayList l = (ArrayList)parseIntoCollection(session, r, new ArrayList(), sType.getElementType());
+			ArrayList l = (ArrayList)parseIntoCollection(session, r, new ArrayList(), sType.getElementType(), pMeta);
 			o = bc.toArray(sType, l);
 		} else if (sType.canCreateNewInstanceFromString(outer)) {
 			o = sType.newInstanceFromString(outer, session.decodeString(r.getElementText()));
@@ -179,7 +180,7 @@ public class XmlParser extends ReaderParser {
 		return (T)o;
 	}
 
-	private <K,V> Map<K,V> parseIntoMap(XmlParserSession session, XMLStreamReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType) throws Exception {
+	private <K,V> Map<K,V> parseIntoMap(XmlParserSession session, XMLStreamReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType, BeanPropertyMeta pMeta) throws Exception {
 		BeanContext bc = session.getBeanContext();
 		int depth = 0;
 		for (int i = 0; i < r.getAttributeCount(); i++) {
@@ -199,7 +200,7 @@ public class XmlParser extends ReaderParser {
 				depth++;
 				currAttr = session.decodeString(r.getLocalName());
 				K key = convertAttrToType(session, m, currAttr, keyType);
-				V value = parseAnything(session, valueType, currAttr, r, m, false);
+				V value = parseAnything(session, valueType, currAttr, r, m, false, pMeta);
 				setName(valueType, value, currAttr);
 				if (valueType.isObject() && m.containsKey(key)) {
 					Object o = m.get(key);
@@ -218,13 +219,13 @@ public class XmlParser extends ReaderParser {
 		return m;
 	}
 
-	private <E> Collection<E> parseIntoCollection(XmlParserSession session, XMLStreamReader r, Collection<E> l, ClassMeta<E> elementType) throws Exception {
+	private <E> Collection<E> parseIntoCollection(XmlParserSession session, XMLStreamReader r, Collection<E> l, ClassMeta<E> elementType, BeanPropertyMeta pMeta) throws Exception {
 		int depth = 0;
 		do {
 			int event = r.nextTag();
 			if (event == START_ELEMENT) {
 				depth++;
-				E value = parseAnything(session, elementType, null, r, l, false);
+				E value = parseAnything(session, elementType, null, r, l, false, pMeta);
 				l.add(value);
 			} else if (event == END_ELEMENT) {
 				depth--;
@@ -242,7 +243,7 @@ public class XmlParser extends ReaderParser {
 			int event = r.nextTag();
 			if (event == START_ELEMENT) {
 				depth++;
-				o[i] = parseAnything(session, argTypes[i], null, r, null, false);
+				o[i] = parseAnything(session, argTypes[i], null, r, null, false, null);
 				i++;
 			} else if (event == END_ELEMENT) {
 				depth--;
@@ -315,7 +316,7 @@ public class XmlParser extends ReaderParser {
 				BeanPropertyMeta pMeta = xmlMeta.getPropertyMeta(currAttr);
 				if (pMeta == null) {
 					if (m.getMeta().isSubTyped()) {
-						Object value = parseAnything(session, string(), currAttr, r, m.getBean(false), false);
+						Object value = parseAnything(session, string(), currAttr, r, m.getBean(false), false, null);
 						m.put(currAttr, value);
 					} else {
 						Location l = r.getLocation();
@@ -327,7 +328,7 @@ public class XmlParser extends ReaderParser {
 					XmlFormat xf = pMeta.getExtendedMeta(XmlBeanPropertyMeta.class).getXmlFormat();
 					if (xf == COLLAPSED) {
 						ClassMeta<?> et = pMeta.getClassMeta().getElementType();
-						Object value = parseAnything(session, et, currAttr, r, m.getBean(false), false);
+						Object value = parseAnything(session, et, currAttr, r, m.getBean(false), false, pMeta);
 						setName(et, value, currAttr);
 						pMeta.add(m, value);
 					} else if (xf == ATTR)  {
@@ -335,7 +336,7 @@ public class XmlParser extends ReaderParser {
 						r.nextTag();
 					} else {
 						ClassMeta<?> cm = pMeta.getClassMeta();
-						Object value = parseAnything(session, cm, currAttr, r, m.getBean(false), false);
+						Object value = parseAnything(session, cm, currAttr, r, m.getBean(false), false, pMeta);
 						setName(cm, value, currAttr);
 						pMeta.set(m, value);
 					}
@@ -399,7 +400,7 @@ public class XmlParser extends ReaderParser {
 						depth++;
 						currAttr = session.decodeString(r.getLocalName());
 						String key = convertAttrToType(session, null, currAttr, string());
-						Object value = parseAnything(session, object(), currAttr, r, null, false);
+						Object value = parseAnything(session, object(), currAttr, r, null, false, null);
 						if (m.containsKey(key)) {
 							Object o = m.get(key);
 							if (o instanceof ObjectList)
@@ -446,7 +447,7 @@ public class XmlParser extends ReaderParser {
 	protected <T> T doParse(ParserSession session, ClassMeta<T> type) throws Exception {
 		XmlParserSession s = (XmlParserSession)session;
 		type = s.getBeanContext().normalizeClassMeta(type);
-		return parseAnything(s, type, null, s.getXmlStreamReader(), s.getOuter(), true);
+		return parseAnything(s, type, null, s.getXmlStreamReader(), s.getOuter(), true, null);
 	}
 
 	@Override /* ReaderParser */
@@ -500,6 +501,12 @@ public class XmlParser extends ReaderParser {
 	}
 
 	@Override /* CoreApi */
+	public XmlParser addToDictionary(Class<?>...classes) throws LockedException {
+		super.addToDictionary(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
 	public <T> XmlParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
 		super.addImplClass(interfaceClass, implClass);
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/xml/XmlParserContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlParserContext.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlParserContext.java
index 09307a6..22bf648 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlParserContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlParserContext.java
@@ -31,6 +31,7 @@ import org.apache.juneau.parser.*;
  * 	<li>{@link XmlParser#addNotBeanClasses(Class[])}
  * 	<li>{@link XmlParser#addBeanFilters(Class[])}
  * 	<li>{@link XmlParser#addPojoSwaps(Class[])}
+ * 	<li>{@link XmlParser#addToDictionary(Class[])}
  * 	<li>{@link XmlParser#addImplClass(Class,Class)}
  * </ul>
  * <p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializer.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializer.java
index b848532..601e9e5 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSchemaSerializer.java
@@ -473,19 +473,11 @@ public class XmlSchemaSerializer extends XmlSerializer {
 						Namespace cNs = first(elementType.getExtendedMeta(XmlClassMeta.class).getNamespace(), cm.getExtendedMeta(XmlClassMeta.class).getNamespace(), defaultNs);
 						schemas.queueType(cNs, null, elementType);
 						w.sTag(i+1, "sequence").nl();
-						w.oTag(i+2, "choice")
-							.attr("minOccurs", 0)
+						w.oTag(i+2, "any")
+							.attr("processContents", "skip")
 							.attr("maxOccurs", "unbounded")
-							.cTag().nl();
-						w.oTag(i+3, "element")
-							.attr("name", XmlUtils.encodeElementName(getElementName(elementType)))
-							.attr("type", getXmlType(cNs, elementType))
-							.ceTag().nl();
-						w.oTag(i+3, "element")
-							.attr("name", "null")
-							.attr("type", "string")
+							.attr("minOccurs", "0")
 							.ceTag().nl();
-						w.eTag(i+2, "choice").nl();
 						w.eTag(i+1, "sequence").nl();
 					}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java
index cdc7d0e..32f618e 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java
@@ -690,6 +690,12 @@ public class XmlSerializer extends WriterSerializer {
 	}
 
 	@Override /* CoreApi */
+	public XmlSerializer addToDictionary(Class<?>...classes) throws LockedException {
+		super.addToDictionary(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
 	public <T> XmlSerializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
 		super.addImplClass(interfaceClass, implClass);
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerContext.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerContext.java
index 97704d6..c1fba2e 100644
--- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializerContext.java
@@ -28,6 +28,7 @@ import org.apache.juneau.serializer.*;
  * 	<li>{@link XmlSerializer#addNotBeanClasses(Class[])}
  * 	<li>{@link XmlSerializer#addBeanFilters(Class[])}
  * 	<li>{@link XmlSerializer#addPojoSwaps(Class[])}
+ * 	<li>{@link XmlSerializer#addToDictionary(Class[])}
  * 	<li>{@link XmlSerializer#addImplClass(Class,Class)}
  * </ul>
  * <p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/test/java/org/apache/juneau/BeanMapTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/BeanMapTest.java b/juneau-core/src/test/java/org/apache/juneau/BeanMapTest.java
index df431d5..c51757b 100755
--- a/juneau-core/src/test/java/org/apache/juneau/BeanMapTest.java
+++ b/juneau-core/src/test/java/org/apache/juneau/BeanMapTest.java
@@ -457,23 +457,23 @@ public class BeanMapTest {
 		m.put("b", new D2());
 		assertEquals("default", t.b.s);
 
-		JsonParser p = new JsonParser().setClassLoader(BeanMapTest.class.getClassLoader());
-		m.put("lb1", new ObjectList("[{_type:'"+D2.class.getName()+"',s:'foobar'}]", p));
+		JsonParser p = new JsonParser().setClassLoader(BeanMapTest.class.getClassLoader()).addToDictionary(D2.class);
+		m.put("lb1", new ObjectList("[{_type:'D2',s:'foobar'}]", p));
 		assertEquals(ObjectList.class.getName(), t.lb1.getClass().getName());
 		assertEquals(D2.class.getName(), t.lb1.get(0).getClass().getName());
 		assertEquals("foobar", (t.lb1.get(0)).s);
 
-		m.put("lb2", new ObjectList("[{_type:'"+D2.class.getName()+"',s:'foobar'}]", p));
+		m.put("lb2", new ObjectList("[{_type:'D2',s:'foobar'}]", p));
 		assertEquals(ArrayList.class.getName(), t.lb2.getClass().getName());
 		assertEquals(D2.class.getName(), t.lb2.get(0).getClass().getName());
 		assertEquals("foobar", (t.lb2.get(0)).s);
 
-		m.put("ab1", new ObjectList("[{_type:'"+D2.class.getName()+"',s:'foobar'}]", p));
+		m.put("ab1", new ObjectList("[{_type:'D2',s:'foobar'}]", p));
 		assertEquals("[L"+D2.class.getName()+";", t.ab1.getClass().getName());
 		assertEquals(D2.class.getName(), t.ab1[0].getClass().getName());
 		assertEquals("foobar", t.ab1[0].s);
 
-		m.put("ab2", new ObjectList("[{_type:'"+D2.class.getName()+"',s:'foobar'}]", p));
+		m.put("ab2", new ObjectList("[{_type:'D2',s:'foobar'}]", p));
 		assertEquals("[L"+D2.class.getName()+";", t.ab2.getClass().getName());
 		assertEquals(D2.class.getName(), t.ab2[0].getClass().getName());
 		assertEquals("foobar", t.ab2[0].s);
@@ -487,6 +487,7 @@ public class BeanMapTest {
 		public D2[] ab2 = new D2[0];
 	}
 
+	@Bean(typeName="D2")
 	public static class D2 {
 		public String s = "default";
 	}
@@ -643,8 +644,8 @@ public class BeanMapTest {
 		assertEquals(HEnum.THREE, t7.getEnum2());
 
 		// Create instance directly from JSON.
-		JsonParser p = new JsonParser().setClassLoader(BeanMapTest.class.getClassLoader());
-		t7 = (H)p.parse("{_type:'"+H.class.getName()+"',enum1:'THREE',enum2:'ONE'}", Object.class);
+		JsonParser p = new JsonParser().setClassLoader(BeanMapTest.class.getClassLoader()).addToDictionary(H.class);
+		t7 = (H)p.parse("{_type:'H',enum1:'THREE',enum2:'ONE'}", Object.class);
 		assertEquals("{enum1:'THREE',enum2:'ONE'}", serializer.serialize(t7));
 		assertEquals(HEnum.THREE, t7.enum1);
 		assertEquals(HEnum.ONE, t7.getEnum2());
@@ -654,6 +655,7 @@ public class BeanMapTest {
 		ONE, TWO, THREE
 	}
 
+	@Bean(typeName="H")
 	public static class H {
 
 		public HEnum enum1;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/test/java/org/apache/juneau/a/rttests/RoundTripAddClassAttrsTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/a/rttests/RoundTripAddClassAttrsTest.java b/juneau-core/src/test/java/org/apache/juneau/a/rttests/RoundTripAddClassAttrsTest.java
index 1f46926..a325b08 100755
--- a/juneau-core/src/test/java/org/apache/juneau/a/rttests/RoundTripAddClassAttrsTest.java
+++ b/juneau-core/src/test/java/org/apache/juneau/a/rttests/RoundTripAddClassAttrsTest.java
@@ -19,6 +19,7 @@ import static org.junit.Assert.*;
 
 import java.util.*;
 
+import org.apache.juneau.annotation.*;
 import org.apache.juneau.html.*;
 import org.apache.juneau.jena.*;
 import org.apache.juneau.json.*;
@@ -107,6 +108,11 @@ public class RoundTripAddClassAttrsTest extends RoundTripTest {
 		super(label, s, p, flags);
 	}
 
+	@Override
+	public Class<?>[] getDictionary() {
+		return new Class<?>[]{A.class, B.class, C.class, D.class, E.class, F.class};
+	}
+
 	//====================================================================================================
 	// testBean
 	//====================================================================================================
@@ -137,6 +143,7 @@ public class RoundTripAddClassAttrsTest extends RoundTripTest {
 	public static abstract class AA implements IA {
 	}
 
+	@Bean(typeName="A")
 	public static class A extends AA {
 		private String f1;
 
@@ -193,6 +200,7 @@ public class RoundTripAddClassAttrsTest extends RoundTripTest {
 		assertEquals("foo", ((A)t.f2d).getF1());
 	}
 
+	@Bean(typeName="B")
 	public static class B {
 		public A f2a;
 		public AA f2b;
@@ -223,6 +231,7 @@ public class RoundTripAddClassAttrsTest extends RoundTripTest {
 		assertEquals("foo", t.f3d.get("foo").getF1());
 	}
 
+	@Bean(typeName="C")
 	public static class C {
 		public Map<String,A> f3a = new HashMap<String,A>();
 		public Map<String,A> f3b = new HashMap<String,A>();
@@ -258,6 +267,7 @@ public class RoundTripAddClassAttrsTest extends RoundTripTest {
 		assertEquals("foo", ((A)t.f4d[0]).getF1());
 	}
 
+	@Bean(typeName="D")
 	public static class D {
 		public A[] f4a;
 		public AA[] f4b;
@@ -293,6 +303,7 @@ public class RoundTripAddClassAttrsTest extends RoundTripTest {
 		assertEquals("foo", ((A)t.f5d.get(0)).getF1());
 	}
 
+	@Bean(typeName="E")
 	public static class E {
 		public List<A> f5a = new LinkedList<A>();
 		public List<AA> f5b = new LinkedList<AA>();
@@ -328,6 +339,7 @@ public class RoundTripAddClassAttrsTest extends RoundTripTest {
 		assertEquals("foo", ((A)t.f6d.get(0)[0]).getF1());
 	}
 
+	@Bean(typeName="F")
 	public static class F {
 		public List<A[]> f6a = new LinkedList<A[]>();
 		public List<AA[]> f6b = new LinkedList<AA[]>();

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java b/juneau-core/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java
index 5cf2d81..14bb115 100755
--- a/juneau-core/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java
+++ b/juneau-core/src/test/java/org/apache/juneau/a/rttests/RoundTripTest.java
@@ -189,8 +189,8 @@ public abstract class RoundTripTest {
 	public boolean debug = false;
 
 	public RoundTripTest(String label, Serializer s, Parser p, int flags) throws Exception {
-		this.s = s.clone().addBeanFilters(getBeanFilters()).addPojoSwaps(getPojoSwaps());
-		this.p = p == null ? null : p.clone().addBeanFilters(getBeanFilters()).addPojoSwaps(getPojoSwaps());
+		this.s = s.clone().addBeanFilters(getBeanFilters()).addPojoSwaps(getPojoSwaps()).addToDictionary(getDictionary());
+		this.p = p == null ? null : p.clone().addBeanFilters(getBeanFilters()).addPojoSwaps(getPojoSwaps()).addToDictionary(getDictionary());
 		this.label = label;
 
 		Map<Class<Object>, Class<? extends Object>> m = getImplClasses();
@@ -215,6 +215,10 @@ public abstract class RoundTripTest {
 		return new Class<?>[0];
 	}
 
+	public Class<?>[] getDictionary() {
+		return new Class<?>[0];
+	}
+
 	public <T> Map<Class<T>,Class<? extends T>> getImplClasses() {
 		return null;
 	}
@@ -282,6 +286,12 @@ public abstract class RoundTripTest {
 			p.addPojoSwaps(c);
 	}
 
+	protected void addToDictionary(Class<?>...c) {
+		s.addToDictionary(c);
+		if (p != null)
+			p.addToDictionary(c);
+	}
+
 	public boolean isValidationOnly() {
 		return returnOriginalObject;
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/test/java/org/apache/juneau/html/CommonParserTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/html/CommonParserTest.java b/juneau-core/src/test/java/org/apache/juneau/html/CommonParserTest.java
index 3b8df3e..6fb6e6f 100755
--- a/juneau-core/src/test/java/org/apache/juneau/html/CommonParserTest.java
+++ b/juneau-core/src/test/java/org/apache/juneau/html/CommonParserTest.java
@@ -19,6 +19,7 @@ import static org.junit.Assert.*;
 import java.util.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.annotation.*;
 import org.apache.juneau.parser.*;
 import org.junit.*;
 
@@ -30,7 +31,7 @@ public class CommonParserTest {
 	//====================================================================================================
 	@Test
 	public void testFromSerializer() throws Exception {
-		ReaderParser p = HtmlParser.DEFAULT.clone().setClassLoader(getClass().getClassLoader());
+		ReaderParser p = HtmlParser.DEFAULT.clone().setClassLoader(getClass().getClassLoader()).addToDictionary(A1.class);
 		Map m = null;
 		String in;
 
@@ -65,6 +66,7 @@ public class CommonParserTest {
 		t2.add(new A3("name1","value1"));
 		t1.list = t2;
 		in = new HtmlSerializer().setProperty(SERIALIZER_addBeanTypeProperties, true).serialize(t1);
+		System.err.println(in);
 		t1 = (A1)p.parse(in, Object.class);
 		assertEquals("value1", t1.list.get(1).value);
 
@@ -73,6 +75,7 @@ public class CommonParserTest {
 		assertEquals("value1", t1.list.get(1).value);
 	}
 
+	@Bean(typeName="A1")
 	public static class A1 {
 		public A2 list;
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/test/java/org/apache/juneau/json/CommonParserTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/json/CommonParserTest.java b/juneau-core/src/test/java/org/apache/juneau/json/CommonParserTest.java
index f9fe1f0..f621811 100755
--- a/juneau-core/src/test/java/org/apache/juneau/json/CommonParserTest.java
+++ b/juneau-core/src/test/java/org/apache/juneau/json/CommonParserTest.java
@@ -19,6 +19,7 @@ import static org.junit.Assert.*;
 import java.util.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.annotation.*;
 import org.apache.juneau.parser.*;
 import org.junit.*;
 
@@ -30,7 +31,7 @@ public class CommonParserTest {
 	//====================================================================================================
 	@Test
 	public void testFromSerializer() throws Exception {
-		ReaderParser p = JsonParser.DEFAULT.clone().setClassLoader(getClass().getClassLoader());
+		ReaderParser p = JsonParser.DEFAULT.clone().setClassLoader(getClass().getClassLoader()).addToDictionary(A1.class);
 
 		Map m = null;
 		m = (Map)p.parse("{a:1}", Object.class);
@@ -84,7 +85,7 @@ public class CommonParserTest {
 		tl.add(new A3("name0","value0"));
 		tl.add(new A3("name1","value1"));
 		b.list = tl;
-		String json = new JsonSerializer().setProperty(SERIALIZER_addBeanTypeProperties, true).serialize(b);
+		String json = new JsonSerializer().setProperty(SERIALIZER_addBeanTypeProperties, true).addToDictionary(A1.class).serialize(b);
 		b = (A1)p.parse(json, Object.class);
 		assertEquals("value1", b.list.get(1).value);
 
@@ -93,6 +94,7 @@ public class CommonParserTest {
 		assertEquals("value1", b.list.get(1).value);
 	}
 
+	@Bean(typeName="A1")
 	public static class A1 {
 		public A2 list;
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/test/java/org/apache/juneau/urlencoding/CommonParser_UonTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/urlencoding/CommonParser_UonTest.java b/juneau-core/src/test/java/org/apache/juneau/urlencoding/CommonParser_UonTest.java
index bac9a2c..d55b456 100755
--- a/juneau-core/src/test/java/org/apache/juneau/urlencoding/CommonParser_UonTest.java
+++ b/juneau-core/src/test/java/org/apache/juneau/urlencoding/CommonParser_UonTest.java
@@ -19,13 +19,14 @@ import static org.junit.Assert.*;
 import java.util.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.annotation.*;
 import org.apache.juneau.parser.*;
 import org.junit.*;
 
 @SuppressWarnings({"rawtypes","hiding","serial","javadoc"})
 public class CommonParser_UonTest {
 
-	ReaderParser p = UonParser.DEFAULT.clone().setClassLoader(getClass().getClassLoader());
+	ReaderParser p = UonParser.DEFAULT.clone().setClassLoader(getClass().getClassLoader()).addToDictionary(A1.class);
 	ReaderParser pe = UonParser.DEFAULT_DECODING.clone().setClassLoader(getClass().getClassLoader());
 
 	//====================================================================================================
@@ -79,6 +80,7 @@ public class CommonParser_UonTest {
 		assertEquals("value1", b.list.get(1).value);
 	}
 
+	@Bean(typeName="A1")
 	public static class A1 {
 		public A2 list;
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java b/juneau-core/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java
index d33854a..1254916 100755
--- a/juneau-core/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java
+++ b/juneau-core/src/test/java/org/apache/juneau/urlencoding/CommonParser_UrlEncodingTest.java
@@ -20,6 +20,7 @@ import static org.junit.Assert.*;
 import java.util.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.annotation.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.serializer.*;
 import org.junit.*;
@@ -27,7 +28,7 @@ import org.junit.*;
 @SuppressWarnings({"rawtypes","hiding","serial","javadoc"})
 public class CommonParser_UrlEncodingTest {
 
-	ReaderParser p = UrlEncodingParser.DEFAULT.clone().setClassLoader(getClass().getClassLoader());
+	ReaderParser p = UrlEncodingParser.DEFAULT.clone().setClassLoader(getClass().getClassLoader()).addToDictionary(A1.class);
 
 	//====================================================================================================
 	// testFromSerializer
@@ -81,6 +82,7 @@ public class CommonParser_UrlEncodingTest {
 		assertEquals("value1", b.list.get(1).value);
 	}
 
+	@Bean(typeName="A1")
 	public static class A1 {
 		public A2 list;
 	}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/test/java/org/apache/juneau/utils/PojoRestTest.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/test/java/org/apache/juneau/utils/PojoRestTest.java b/juneau-core/src/test/java/org/apache/juneau/utils/PojoRestTest.java
index 5addefc..8661c71 100755
--- a/juneau-core/src/test/java/org/apache/juneau/utils/PojoRestTest.java
+++ b/juneau-core/src/test/java/org/apache/juneau/utils/PojoRestTest.java
@@ -18,6 +18,7 @@ import static org.junit.Assert.*;
 import java.util.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.annotation.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.parser.*;
 import org.junit.*;
@@ -90,18 +91,18 @@ public class PojoRestTest {
 
 		// Serialize it to JSON.
 		String s = serializer.serialize(p);
-		String expectedValue = "{_type:'org.apache.juneau.utils.PojoRestTest$Person',name:'some name',age:123,addresses:[{street:'street A',city:'city A',state:'state A',zip:12345,isCurrent:true},{street:'street B',city:'city B',state:'state B',zip:12345,isCurrent:false}]}";
+		String expectedValue = "{_type:'Person',name:'some name',age:123,addresses:[{street:'street A',city:'city A',state:'state A',zip:12345,isCurrent:true},{street:'street B',city:'city B',state:'state B',zip:12345,isCurrent:false}]}";
 		assertEquals(expectedValue, s);
 
 		// Parse it back to Java objects.
-		p = (Person)JsonParser.DEFAULT.clone().setClassLoader(getClass().getClassLoader()).parse(s, Object.class);
+		p = (Person)JsonParser.DEFAULT.clone().setClassLoader(getClass().getClassLoader()).addToDictionary(Person.class).parse(s, Object.class);
 		expectedValue = "city B";
 		s = p.addresses[1].city;
 		assertEquals(expectedValue, s);
 
 		// Parse it back into JSON again.
 		s = serializer.serialize(p);
-		expectedValue = "{_type:'org.apache.juneau.utils.PojoRestTest$Person',name:'some name',age:123,addresses:[{street:'street A',city:'city A',state:'state A',zip:12345,isCurrent:true},{street:'street B',city:'city B',state:'state B',zip:12345,isCurrent:false}]}";
+		expectedValue = "{_type:'Person',name:'some name',age:123,addresses:[{street:'street A',city:'city A',state:'state A',zip:12345,isCurrent:true},{street:'street B',city:'city B',state:'state B',zip:12345,isCurrent:false}]}";
 		assertEquals(expectedValue, s);
 
 		// Try adding an address
@@ -242,6 +243,7 @@ public class PojoRestTest {
 		}
 	}
 
+	@Bean(typeName="Person")
 	public static class Person {
 		public String name;
 		public int age;



[2/2] incubator-juneau git commit: Continuation of bean dictionary support.

Posted by ja...@apache.org.
Continuation of bean dictionary support.

Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/f479285a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/f479285a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/f479285a

Branch: refs/heads/master
Commit: f479285a7378e454ad1a2fcfac8096ffcd0856b8
Parents: 864893f
Author: jamesbognar <ja...@gmail.com>
Authored: Sat Sep 10 09:40:27 2016 -0400
Committer: jamesbognar <ja...@gmail.com>
Committed: Sat Sep 10 09:40:27 2016 -0400

----------------------------------------------------------------------
 .../org/apache/juneau/client/RestClient.java    | 12 ++++
 .../java/org/apache/juneau/BeanContext.java     |  6 +-
 .../java/org/apache/juneau/BeanDictionary.java  | 32 +++-------
 .../apache/juneau/BeanDictionaryBuilder.java    | 12 +---
 .../org/apache/juneau/BeanPropertyMeta.java     | 57 +++++++++--------
 .../java/org/apache/juneau/ContextFactory.java  | 17 +++++-
 .../main/java/org/apache/juneau/CoreApi.java    | 15 +++++
 .../java/org/apache/juneau/html/HtmlParser.java | 64 +++++++++++---------
 .../apache/juneau/html/HtmlParserContext.java   |  1 +
 .../org/apache/juneau/html/HtmlSerializer.java  | 10 ++-
 .../juneau/html/HtmlSerializerContext.java      |  1 +
 .../java/org/apache/juneau/jena/RdfParser.java  |  6 ++
 .../apache/juneau/jena/RdfParserContext.java    |  1 +
 .../org/apache/juneau/jena/RdfSerializer.java   |  6 ++
 .../juneau/jena/RdfSerializerContext.java       |  1 +
 .../java/org/apache/juneau/json/JsonParser.java | 57 +++++++++--------
 .../apache/juneau/json/JsonParserContext.java   |  1 +
 .../org/apache/juneau/json/JsonSerializer.java  | 10 ++-
 .../juneau/json/JsonSerializerContext.java      |  1 +
 .../apache/juneau/msgpack/MsgPackParser.java    | 45 ++++++++------
 .../juneau/msgpack/MsgPackParserContext.java    |  1 +
 .../juneau/msgpack/MsgPackSerializer.java       | 10 ++-
 .../msgpack/MsgPackSerializerContext.java       |  1 +
 .../java/org/apache/juneau/parser/Parser.java   |  6 ++
 .../org/apache/juneau/parser/ParserGroup.java   | 14 +++++
 .../apache/juneau/serializer/Serializer.java    |  6 ++
 .../juneau/serializer/SerializerGroup.java      | 14 +++++
 .../juneau/serializer/SerializerSession.java    |  9 +--
 .../apache/juneau/urlencoding/UonParser.java    | 62 ++++++++++---------
 .../juneau/urlencoding/UonParserContext.java    |  1 +
 .../juneau/urlencoding/UonSerializer.java       | 10 ++-
 .../urlencoding/UonSerializerContext.java       |  1 +
 .../juneau/urlencoding/UrlEncodingParser.java   | 25 +++++---
 .../urlencoding/UrlEncodingParserContext.java   |  1 +
 .../urlencoding/UrlEncodingSerializer.java      | 10 ++-
 .../UrlEncodingSerializerContext.java           |  1 +
 .../java/org/apache/juneau/xml/XmlParser.java   | 45 ++++++++------
 .../org/apache/juneau/xml/XmlParserContext.java |  1 +
 .../apache/juneau/xml/XmlSchemaSerializer.java  | 14 +----
 .../org/apache/juneau/xml/XmlSerializer.java    |  6 ++
 .../apache/juneau/xml/XmlSerializerContext.java |  1 +
 .../java/org/apache/juneau/BeanMapTest.java     | 16 ++---
 .../a/rttests/RoundTripAddClassAttrsTest.java   | 12 ++++
 .../apache/juneau/a/rttests/RoundTripTest.java  | 14 ++++-
 .../apache/juneau/html/CommonParserTest.java    |  5 +-
 .../apache/juneau/json/CommonParserTest.java    |  6 +-
 .../urlencoding/CommonParser_UonTest.java       |  4 +-
 .../CommonParser_UrlEncodingTest.java           |  4 +-
 .../org/apache/juneau/utils/PojoRestTest.java   |  8 ++-
 49 files changed, 427 insertions(+), 236 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-client/src/main/java/org/apache/juneau/client/RestClient.java
----------------------------------------------------------------------
diff --git a/juneau-client/src/main/java/org/apache/juneau/client/RestClient.java b/juneau-client/src/main/java/org/apache/juneau/client/RestClient.java
index e28e656..887dd35 100755
--- a/juneau-client/src/main/java/org/apache/juneau/client/RestClient.java
+++ b/juneau-client/src/main/java/org/apache/juneau/client/RestClient.java
@@ -926,6 +926,18 @@ public class RestClient extends CoreApi {
 	}
 
 	@Override /* CoreAPI */
+	public RestClient addToDictionary(Class<?>...classes) throws LockedException {
+		super.addToDictionary(classes);
+		if (serializer != null)
+			serializer.addToDictionary(classes);
+		if (parser != null)
+			parser.addToDictionary(classes);
+		if (urlEncodingSerializer != null)
+			urlEncodingSerializer.addToDictionary(classes);
+		return this;
+	}
+
+	@Override /* CoreAPI */
 	public <T> RestClient addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
 		super.addImplClass(interfaceClass, implClass);
 		if (serializer != null)

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanContext.java b/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
index bfa3d87..d00f029 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
@@ -646,8 +646,6 @@ public class BeanContext extends Context {
 		}
  		pojoSwaps = lpf.toArray(new PojoSwap[0]);
 
- 		beanDictionary = new BeanDictionaryBuilder().add(pm.get(BEAN_beanDictionary, Class[].class, new Class[0])).setBeanContext(this).build();
-
  		implClasses = new TreeMap<Class<?>,Class<?>>(new ClassComparator());
  		Map<Class,Class> m = pm.getMap(BEAN_implClasses, Class.class, Class.class, null);
  		if (m != null)
@@ -666,6 +664,8 @@ public class BeanContext extends Context {
 		this.cmString = cmCache.get(String.class);
 		this.cmObject = cmCache.get(Object.class);
 		this.cmClass = cmCache.get(Class.class);
+
+		beanDictionary = new BeanDictionaryBuilder().add(pm.get(BEAN_beanDictionary, Class[].class, new Class[0])).setBeanContext(this).build();
 	}
 
 	/**
@@ -1503,7 +1503,7 @@ public class BeanContext extends Context {
 	 *
 	 * @return The bean dictionary defined in this bean context.  Never <jk>null</jk>.
 	 */
-	protected BeanDictionary getBeanDictionary() {
+	public BeanDictionary getBeanDictionary() {
 		return beanDictionary;
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java b/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java
index 3b8ce26..d5dddc0 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanDictionary.java
@@ -35,15 +35,12 @@ import org.apache.juneau.annotation.*;
 public class BeanDictionary {
 
 	private final Map<String,ClassMeta<?>> map;
-	private final Map<Class<?>,String> reverseMap;
 	private final BeanContext beanContext;
 	private final String beanTypePropertyName;
-	private final BeanDictionary parent;
 
-	BeanDictionary(BeanContext beanContext, BeanDictionary parent, Map<String,Class<?>> map) {
+	BeanDictionary(BeanContext beanContext, Map<String,Class<?>> map) {
 		this.beanContext = beanContext;
 		this.beanTypePropertyName = beanContext.getBeanTypePropertyName();
-		this.parent = parent == null ? beanContext.getBeanDictionary() : parent;
 		Map<String,ClassMeta<?>> m1 = new HashMap<String,ClassMeta<?>>();
 		for (Map.Entry<String,Class<?>> e : map.entrySet()) {
 			ClassMeta<?> cm = beanContext.getClassMeta(e.getValue());
@@ -52,20 +49,6 @@ public class BeanDictionary {
 			m1.put(e.getKey(), cm);
 		}
 		this.map = Collections.unmodifiableMap(m1);
-		Map<Class<?>,String> m2 = new HashMap<Class<?>,String>();
-		for (Map.Entry<String,Class<?>> e : map.entrySet())
-			m2.put(e.getValue(), e.getKey());
-		this.reverseMap = Collections.unmodifiableMap(m2);
-	}
-
-	/**
-	 * Returns the name associated with the specified class.
-	 *
-	 * @param c The class associated with the name.
-	 * @return The name associated with the specified class, or <jk>null</jk> if no association exists.
-	 */
-	public String getNameForClass(Class<?> c) {
-		return reverseMap.get(c);
 	}
 
 	/**
@@ -79,7 +62,7 @@ public class BeanDictionary {
 		if (o == null)
 			return m;
 		String typeName = o.toString();
-		ClassMeta<?> cm = findClassMeta(typeName);
+		ClassMeta<?> cm = getClassMeta(typeName);
 		BeanMap<?> bm = beanContext.newBeanMap(cm.getInnerClass());
 
 		// Iterate through all the entries in the map and set the individual field values.
@@ -96,10 +79,15 @@ public class BeanDictionary {
 		return bm.getBean();
 	}
 
-	private ClassMeta<?> findClassMeta(String typeName) {
+	/**
+	 * Gets the class metadata for the specified bean type name.
+	 *
+	 * @param typeName The bean type name as defined by {@link Bean#typeName()}.
+	 * @return The class metadata for the bean.
+	 * @throws BeanRuntimeException If name wasn't found in this dictionary.
+	 */
+	public ClassMeta<?> getClassMeta(String typeName) {
 		ClassMeta<?> cm = map.get(typeName);
-		if (cm == null && parent != null)
-			cm = parent.findClassMeta(typeName);
 		if (cm == null)
 			throw new BeanRuntimeException("Could not find bean type ''{0}'' in dictionary.", typeName);
 		return cm;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryBuilder.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryBuilder.java b/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryBuilder.java
index a56dd84..5900b53 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryBuilder.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanDictionaryBuilder.java
@@ -28,7 +28,6 @@ import org.apache.juneau.internal.*;
 public class BeanDictionaryBuilder {
 
 	private Map<String,Class<?>> map = new HashMap<String,Class<?>>();
-	private BeanDictionary parent;
 	private BeanContext beanContext;
 
 	/**
@@ -57,7 +56,7 @@ public class BeanDictionaryBuilder {
 				} else {
 					Bean b = c.getAnnotation(Bean.class);
 					if (b == null || b.typeName().isEmpty())
-						throw new BeanRuntimeException("Class ''{0}'' was passed to TypeDictionaryBuilder but it doesn't have a @Bean.typeName() annotation defined.");
+						throw new BeanRuntimeException("Class ''{0}'' was passed to TypeDictionaryBuilder but it doesn't have a @Bean.typeName() annotation defined.", c.getName());
 					map.put(b.typeName(), c);
 				}
 			}
@@ -65,19 +64,12 @@ public class BeanDictionaryBuilder {
 		return this;
 	}
 
-	BeanDictionaryBuilder setParent(BeanDictionary parent) {
-		this.parent = parent;
-		return this;
-	}
-
 	BeanDictionaryBuilder setBeanContext(BeanContext beanContext) {
 		this.beanContext = beanContext;
 		return this;
 	}
 
 	BeanDictionary build() {
-		if (map.isEmpty())
-			return parent;
-		return new BeanDictionary(beanContext, parent, map);
+		return new BeanDictionary(beanContext, map);
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index 5a3dc5d..434ef46 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -49,6 +49,7 @@ public class BeanPropertyMeta {
 	private boolean isConstructorArg, isUri;
 
 	private final BeanMeta<?> beanMeta;
+	private final BeanContext beanContext;
 
 	private String name;
 	private ClassMeta<?>
@@ -68,6 +69,7 @@ public class BeanPropertyMeta {
 	 */
 	protected BeanPropertyMeta(BeanMeta<?> beanMeta, String name) {
 		this.beanMeta = beanMeta;
+		this.beanContext = beanMeta.ctx;
 		this.name = name;
 	}
 
@@ -139,7 +141,7 @@ public class BeanPropertyMeta {
 	 */
 	public ClassMeta<?> getClassMeta() {
 		if (typeMeta == null)
-			typeMeta = (swap != null ? swap.getSwapClassMeta(beanMeta.ctx) : rawTypeMeta == null ? beanMeta.ctx.object() : rawTypeMeta.getSerializedClassMeta());
+			typeMeta = (swap != null ? swap.getSwapClassMeta(beanContext) : rawTypeMeta == null ? beanContext.object() : rawTypeMeta.getSerializedClassMeta());
 		return typeMeta;
 	}
 
@@ -154,7 +156,7 @@ public class BeanPropertyMeta {
 	 * @return The bean dictionary in use for this bean property.  Never <jk>null</jk>.
 	 */
 	public BeanDictionary getBeanDictionary() {
-		return beanDictionary;
+		return beanDictionary == null ? beanContext.getBeanDictionary() : beanDictionary;
 	}
 
 	/**
@@ -256,7 +258,7 @@ public class BeanPropertyMeta {
 				if (p.properties().length != 0)
 					properties = p.properties();
 				if (p.beanDictionary().length > 0)
-					this.beanDictionary = new BeanDictionaryBuilder().add(p.beanDictionary()).setBeanContext(this.beanMeta.ctx).build();
+					this.beanDictionary = new BeanDictionaryBuilder().add(p.beanDictionary()).setBeanContext(beanContext).build();
 			}
 		}
 
@@ -271,7 +273,7 @@ public class BeanPropertyMeta {
 				if (properties != null && p.properties().length != 0)
 					properties = p.properties();
 				if (p.beanDictionary().length > 0)
-					this.beanDictionary = new BeanDictionaryBuilder().add(p.beanDictionary()).setBeanContext(this.beanMeta.ctx).build();
+					this.beanDictionary = new BeanDictionaryBuilder().add(p.beanDictionary()).setBeanContext(beanContext).build();
 			}
 		}
 
@@ -286,7 +288,7 @@ public class BeanPropertyMeta {
 				if (properties != null && p.properties().length != 0)
 					properties = p.properties();
 				if (p.beanDictionary().length > 0)
-					this.beanDictionary = new BeanDictionaryBuilder().add(p.beanDictionary()).setBeanContext(this.beanMeta.ctx).build();
+					this.beanDictionary = new BeanDictionaryBuilder().add(p.beanDictionary()).setBeanContext(beanContext).build();
 			}
 		}
 
@@ -369,7 +371,7 @@ public class BeanPropertyMeta {
 		} catch (SerializeException e) {
 			throw new BeanRuntimeException(e);
 		} catch (Throwable e) {
-			if (beanMeta.ctx.ignoreInvocationExceptionsOnGetters) {
+			if (beanContext.ignoreInvocationExceptionsOnGetters) {
 				if (rawTypeMeta.isPrimitive())
 					return rawTypeMeta.getPrimitiveDefault();
 				return null;
@@ -391,7 +393,6 @@ public class BeanPropertyMeta {
 		try {
 			// Comvert to raw form.
 			value = unswap(value);
-			BeanContext bc = this.beanMeta.ctx;
 
 		if (m.bean == null) {
 
@@ -411,7 +412,7 @@ public class BeanPropertyMeta {
 			boolean isCollection = rawTypeMeta.isCollection();
 
 		if (field == null && setter == null && ! (isMap || isCollection)) {
-			if ((value == null && bc.ignoreUnknownNullBeanProperties) || bc.ignorePropertiesWithoutSetters)
+			if ((value == null && beanContext.ignoreUnknownNullBeanProperties) || beanContext.ignorePropertiesWithoutSetters)
 				return null;
 			throw new BeanRuntimeException(beanMeta.c, "Setter or public field not defined on property ''{0}''", name);
 		}
@@ -420,7 +421,7 @@ public class BeanPropertyMeta {
 
 		try {
 
-			Object r = beanMeta.ctx.beanMapPutReturnsOldValue || isMap || isCollection ? get(m) : null;
+			Object r = beanContext.beanMapPutReturnsOldValue || isMap || isCollection ? get(m) : null;
 				Class<?> propertyClass = rawTypeMeta.getInnerClass();
 
 			if (value == null && (isMap || isCollection)) {
@@ -438,7 +439,7 @@ public class BeanPropertyMeta {
 
 				if (! (value instanceof Map)) {
 					if (value instanceof CharSequence)
-						value = new ObjectMap((CharSequence)value).setBeanContext(beanMeta.ctx);
+						value = new ObjectMap((CharSequence)value).setBeanContext(beanContext);
 					else
 						throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}''", name, propertyClass.getName(), findClassName(value));
 				}
@@ -489,7 +490,7 @@ public class BeanPropertyMeta {
 					Object k = e.getKey();
 					Object v = e.getValue();
 					if (! valueType.isObject())
-						v = beanMeta.ctx.convertToType(v, valueType);
+						v = beanContext.convertToType(v, valueType);
 					propMap.put(k, v);
 				}
 
@@ -497,7 +498,7 @@ public class BeanPropertyMeta {
 
 				if (! (value instanceof Collection)) {
 					if (value instanceof CharSequence)
-						value = new ObjectList((CharSequence)value).setBeanContext(beanMeta.ctx);
+						value = new ObjectList((CharSequence)value).setBeanContext(beanContext);
 					else
 						throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}''", name, propertyClass.getName(), findClassName(value));
 				}
@@ -519,7 +520,7 @@ public class BeanPropertyMeta {
 									for (ListIterator<Object> i = l.listIterator(); i.hasNext(); ) {
 										Object v = i.next();
 										if (v != null && (! elementType.getInnerClass().isInstance(v))) {
-											i.set(bc.convertToType(v, elementType));
+											i.set(beanContext.convertToType(v, elementType));
 										}
 									}
 									valueList = l;
@@ -550,15 +551,15 @@ public class BeanPropertyMeta {
 				// Set the values.
 				for (Object v : valueList) {
 					if (! elementType.isObject())
-						v = beanMeta.ctx.convertToType(v, elementType);
+						v = beanContext.convertToType(v, elementType);
 					propList.add(v);
 				}
 
 			} else {
 				if (swap != null && value != null && isParentClass(swap.getSwapClass(), value.getClass())) {
-						value = swap.unswap(value, rawTypeMeta, beanMeta.ctx);
+						value = swap.unswap(value, rawTypeMeta, beanContext);
 				} else {
-						value = beanMeta.ctx.convertToType(value, rawTypeMeta);
+						value = beanContext.convertToType(value, rawTypeMeta);
 					}
 				if (setter != null)
 					setter.invoke(bean, new Object[] { value });
@@ -572,7 +573,7 @@ public class BeanPropertyMeta {
 			throw e;
 		} catch (Exception e) {
 			e.printStackTrace();
-			if (beanMeta.ctx.ignoreInvocationExceptionsOnSetters) {
+			if (beanContext.ignoreInvocationExceptionsOnSetters) {
 					if (rawTypeMeta.isPrimitive())
 						return rawTypeMeta.getPrimitiveDefault();
 				return null;
@@ -615,12 +616,10 @@ public class BeanPropertyMeta {
 	 */
 	public void add(BeanMap<?> m, Object value) throws BeanRuntimeException {
 
-		BeanContext bc = beanMeta.ctx;
-
 		// Read-only beans get their properties stored in a cache.
 		if (m.bean == null) {
 			if (! m.propertyCache.containsKey(name))
-				m.propertyCache.put(name, new ObjectList(bc));
+				m.propertyCache.put(name, new ObjectList(beanContext));
 			((ObjectList)m.propertyCache.get(name)).add(value);
 			return;
 		}
@@ -636,7 +635,7 @@ public class BeanPropertyMeta {
 		ClassMeta<?> elementType = rawTypeMeta.getElementType();
 
 		try {
-			Object v = bc.convertToType(value, elementType);
+			Object v = beanContext.convertToType(value, elementType);
 
 			if (isCollection) {
 				Collection c = null;
@@ -656,7 +655,7 @@ public class BeanPropertyMeta {
 				if (rawTypeMeta.canCreateNewInstance())
 					c = (Collection)rawTypeMeta.newInstance();
 				else
-					c = new ObjectList(bc);
+					c = new ObjectList(beanContext);
 
 				c.add(v);
 
@@ -729,31 +728,31 @@ public class BeanPropertyMeta {
 	private Object transform(Object o) throws SerializeException {
 		// First use swap defined via @BeanProperty.
 		if (swap != null)
-			return swap.swap(o, beanMeta.ctx);
+			return swap.swap(o, beanContext);
 		if (o == null)
 			return null;
 		// Otherwise, look it up via bean context.
 		if (rawTypeMeta.hasChildPojoSwaps()) {
 			Class c = o.getClass();
-			ClassMeta<?> cm = rawTypeMeta.innerClass == c ? rawTypeMeta : beanMeta.ctx.getClassMeta(c);
+			ClassMeta<?> cm = rawTypeMeta.innerClass == c ? rawTypeMeta : beanContext.getClassMeta(c);
 			PojoSwap f = cm.getPojoSwap();
 			if (f != null)
-				return f.swap(o, beanMeta.ctx);
+				return f.swap(o, beanContext);
 		}
 		return o;
 	}
 
 	private Object unswap(Object o) throws ParseException {
 		if (swap != null)
-			return swap.unswap(o, rawTypeMeta, beanMeta.ctx);
+			return swap.unswap(o, rawTypeMeta, beanContext);
 		if (o == null)
 			return null;
 		if (rawTypeMeta.hasChildPojoSwaps()) {
 			Class c = o.getClass();
-			ClassMeta<?> cm = rawTypeMeta.innerClass == c ? rawTypeMeta : beanMeta.ctx.getClassMeta(c);
+			ClassMeta<?> cm = rawTypeMeta.innerClass == c ? rawTypeMeta : beanContext.getClassMeta(c);
 			PojoSwap f = cm.getPojoSwap();
 			if (f != null)
-				return f.unswap(o, rawTypeMeta, beanMeta.ctx);
+				return f.unswap(o, rawTypeMeta, beanContext);
 		}
 		return o;
 	}
@@ -768,7 +767,7 @@ public class BeanPropertyMeta {
 		if (cm.isObject()) {
 			if (o instanceof Map)
 				return new FilteredMap((Map)o, properties);
-			BeanMeta bm = this.getBeanMeta().ctx.getBeanMeta(o.getClass());
+			BeanMeta bm = beanContext.getBeanMeta(o.getClass());
 			if (bm != null)
 				return new BeanMap(o, new BeanMetaFiltered(cm.getBeanMeta(), properties));
 		}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/ContextFactory.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/ContextFactory.java b/juneau-core/src/main/java/org/apache/juneau/ContextFactory.java
index ba2f909..f0b0b14 100644
--- a/juneau-core/src/main/java/org/apache/juneau/ContextFactory.java
+++ b/juneau-core/src/main/java/org/apache/juneau/ContextFactory.java
@@ -711,7 +711,7 @@ public final class ContextFactory extends Lockable {
 	}
 
 	/**
-	 * Shortcut for calling <code>addTo(<jsf>BEAN_transforms</jsf>, <jf>classes</jf>)</code>.
+	 * Shortcut for calling <code>addTo(<jsf>BEAN_pojoSwaps</jsf>, <jf>classes</jf>)</code>.
 	 *
 	 * @param classes The new setting value for the bean context.
 	 * @throws LockedException If {@link ContextFactory#lock()} was called on this class or the bean context.
@@ -726,6 +726,21 @@ public final class ContextFactory extends Lockable {
 	}
 
 	/**
+	 * Shortcut for calling <code>addTo(<jsf>BEAN_beanDictionary</jsf>, <jf>classes</jf>)</code>.
+	 *
+	 * @param classes The new setting value for the bean context.
+	 * @throws LockedException If {@link ContextFactory#lock()} was called on this class or the bean context.
+	 * @return This object (for method chaining).
+	 * @see ContextFactory#addToProperty(String, Object)
+	 * @see BeanContext#BEAN_beanDictionary
+	 */
+	public ContextFactory addToDictionary(Class<?>...classes) throws LockedException {
+		checkLock();
+		addToProperty(BEAN_beanDictionary, classes);
+		return this;
+	}
+
+	/**
 	 * Shortcut for calling <code>putTo(<jsf>BEAN_implCLasses</jsf>, <jf>interfaceClass</jf>, <jf>implClass</jf>)</code>.
 	 *
 	 * @param interfaceClass The interface class.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/CoreApi.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/CoreApi.java b/juneau-core/src/main/java/org/apache/juneau/CoreApi.java
index af66833..7a9d9a3 100644
--- a/juneau-core/src/main/java/org/apache/juneau/CoreApi.java
+++ b/juneau-core/src/main/java/org/apache/juneau/CoreApi.java
@@ -146,6 +146,21 @@ public abstract class CoreApi extends Lockable {
 	}
 
 	/**
+	 * Shortcut for calling <code>getContextFactory().addToDictionary(<jf>classes</jf>)</code>.
+	 *
+	 * @param classes The bean classes (or BeanDictionaryBuilder) classes to add to the bean dictionary.
+	 * @throws LockedException If {@link ContextFactory#lock()} was called on this class or the bean context.
+	 * @return This object (for method chaining).
+	 * @see ContextFactory#addToProperty(String, Object)
+	 * @see BeanContext#BEAN_beanDictionary
+	 */
+	public CoreApi addToDictionary(Class<?>...classes) throws LockedException {
+		checkLock();
+		contextFactory.addToDictionary(classes);
+		return this;
+	}
+
+	/**
 	 * Shortcut for calling <code>getContextFactory().addImplClass(<jf>interfaceClass</jf>, <jf>implClass</jf>)</code>.
 	 *
 	 * @param interfaceClass The interface class.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
index 52180eb..2c04a79 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
@@ -67,7 +67,7 @@ public final class HtmlParser extends ReaderParser {
 	 * 	Precondition:  Must be pointing at START_ELEMENT or CHARACTERS event.
 	 * 	Postcondition:  Pointing at next event to be processed.
 	 */
-	private <T> T parseAnything(HtmlParserSession session, ClassMeta<T> eType, XMLEventReader r, Object outer) throws Exception {
+	private <T> T parseAnything(HtmlParserSession session, ClassMeta<T> eType, XMLEventReader r, Object outer, BeanPropertyMeta pMeta) throws Exception {
 
 		BeanContext bc = session.getBeanContext();
 		if (eType == null)
@@ -75,6 +75,7 @@ public final class HtmlParser extends ReaderParser {
 		PojoSwap<T,Object> transform = (PojoSwap<T,Object>)eType.getPojoSwap();
 		ClassMeta<?> sType = eType.getSerializedClassMeta();
 		session.setCurrentClass(sType);
+		BeanDictionary bd = (pMeta == null ? bc.getBeanDictionary() : pMeta.getBeanDictionary());
 
 		Object o = null;
 
@@ -117,7 +118,7 @@ public final class HtmlParser extends ReaderParser {
 				tableType = attrs.get("type");
 				String c = attrs.get(bc.getBeanTypePropertyName());
 				if (c != null)
-					sType = eType = (ClassMeta<T>)bc.getClassMetaFromString(c);
+					sType = eType = (ClassMeta<T>)bd.getClassMeta(c);
 			}
 
 			boolean isValid = true;
@@ -135,14 +136,14 @@ public final class HtmlParser extends ReaderParser {
 					o = Boolean.parseBoolean(text);
 				else if (tag == TABLE) {
 					if (tableType.equals("object")) {
-						o = parseIntoMap(session, r, (Map)new ObjectMap(bc), sType.getKeyType(), sType.getValueType());
+						o = parseIntoMap(session, r, (Map)new ObjectMap(bc), sType.getKeyType(), sType.getValueType(), pMeta);
 					} else if (tableType.equals("array")) {
-						o = parseTableIntoCollection(session, r, (Collection)new ObjectList(bc), sType.getElementType());
+						o = parseTableIntoCollection(session, r, (Collection)new ObjectList(bc), sType.getElementType(), pMeta);
 					} else
 						isValid = false;
 				}
 				else if (tag == UL)
-					o = parseIntoCollection(session, r, new ObjectList(bc), null);
+					o = parseIntoCollection(session, r, new ObjectList(bc), null, pMeta);
 			}
 			else if (tag == STRING && sType.isCharSequence())
 				o = text;
@@ -159,10 +160,10 @@ public final class HtmlParser extends ReaderParser {
 			else if (tag == TABLE) {
 				if (tableType.equals("object")) {
 					if (sType.isMap()) {
-						o = parseIntoMap(session, r, (Map)(sType.canCreateNewInstance(outer) ? sType.newInstance(outer) : new ObjectMap(bc)), sType.getKeyType(), sType.getValueType());
+						o = parseIntoMap(session, r, (Map)(sType.canCreateNewInstance(outer) ? sType.newInstance(outer) : new ObjectMap(bc)), sType.getKeyType(), sType.getValueType(), pMeta);
 					} else if (sType.canCreateNewInstanceFromObjectMap(outer)) {
 						ObjectMap m = new ObjectMap(bc);
-						parseIntoMap(session, r, m, string(), object());
+						parseIntoMap(session, r, m, string(), object(), pMeta);
 						o = sType.newInstanceFromObjectMap(outer, m);
 					} else if (sType.canCreateNewBean(outer)) {
 						BeanMap m = bc.newBeanMap(outer, sType.getInnerClass());
@@ -172,18 +173,18 @@ public final class HtmlParser extends ReaderParser {
 						isValid = false;
 				} else if (tableType.equals("array")) {
 					if (sType.isCollection())
-						o = parseTableIntoCollection(session, r, (Collection)(sType.canCreateNewInstance(outer) ? sType.newInstance(outer) : new ObjectList(bc)), sType.getElementType());
+						o = parseTableIntoCollection(session, r, (Collection)(sType.canCreateNewInstance(outer) ? sType.newInstance(outer) : new ObjectList(bc)), sType.getElementType(), pMeta);
 					else if (sType.isArray())
-						o = bc.toArray(sType, parseTableIntoCollection(session, r, new ArrayList(), sType.getElementType()));
+						o = bc.toArray(sType, parseTableIntoCollection(session, r, new ArrayList(), sType.getElementType(), pMeta));
 					else
 						isValid = false;
 				} else
 					isValid = false;
 			} else if (tag == UL) {
 				if (sType.isCollection())
-					o = parseIntoCollection(session, r, (Collection)(sType.canCreateNewInstance(outer) ? sType.newInstance(outer) : new ObjectList(bc)), sType.getElementType());
+					o = parseIntoCollection(session, r, (Collection)(sType.canCreateNewInstance(outer) ? sType.newInstance(outer) : new ObjectList(bc)), sType.getElementType(), pMeta);
 				else if (sType.isArray())
-					o = bc.toArray(sType, parseIntoCollection(session, r, new ArrayList(), sType.getElementType()));
+					o = bc.toArray(sType, parseIntoCollection(session, r, new ArrayList(), sType.getElementType(), pMeta));
 				else
 					isValid = false;
 			} else
@@ -235,7 +236,7 @@ public final class HtmlParser extends ReaderParser {
 	 * Precondition:  Must be pointing at <table> event.
 	 * Postcondition:  Pointing at next START_ELEMENT or END_DOCUMENT event.
 	 */
-	private <K,V> Map<K,V> parseIntoMap(HtmlParserSession session, XMLEventReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType) throws Exception {
+	private <K,V> Map<K,V> parseIntoMap(HtmlParserSession session, XMLEventReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType, BeanPropertyMeta pMeta) throws Exception {
 		Tag tag = nextTag(r, TR);
 
 		// Skip over the column headers.
@@ -250,10 +251,10 @@ public final class HtmlParser extends ReaderParser {
 			if (tag == xTABLE)
 				break;
 			nextTag(r, TD);
-			K key = parseAnything(session, keyType, r, m);
+			K key = parseAnything(session, keyType, r, m, pMeta);
 			nextTag(r, xTD);
 			nextTag(r, TD);
-			V value = parseAnything(session, valueType, r, m);
+			V value = parseAnything(session, valueType, r, m, pMeta);
 			setName(valueType, value, key);
 			m.put(key, value);
 			nextTag(r, xTD);
@@ -268,12 +269,12 @@ public final class HtmlParser extends ReaderParser {
 	 * Precondition:  Must be pointing at event following <ul> event.
 	 * Postcondition:  Pointing at next START_ELEMENT or END_DOCUMENT event.
 	 */
-	private <E> Collection<E> parseIntoCollection(HtmlParserSession session, XMLEventReader r, Collection<E> l, ClassMeta<E> elementType) throws Exception {
+	private <E> Collection<E> parseIntoCollection(HtmlParserSession session, XMLEventReader r, Collection<E> l, ClassMeta<E> elementType, BeanPropertyMeta pMeta) throws Exception {
 		while (true) {
 			Tag tag = nextTag(r, LI, xUL);
 			if (tag == xUL)
 				break;
-			l.add(parseAnything(session, elementType, r, l));
+			l.add(parseAnything(session, elementType, r, l, pMeta));
 			nextTag(r, xLI);
 		}
 		return l;
@@ -291,7 +292,7 @@ public final class HtmlParser extends ReaderParser {
 			Tag tag = nextTag(r, LI, xUL);
 			if (tag == xUL)
 				break;
-			o[i] = parseAnything(session, argTypes[i], r, session.getOuter());
+			o[i] = parseAnything(session, argTypes[i], r, session.getOuter(), null);
 			i++;
 			nextTag(r, xLI);
 		}
@@ -303,11 +304,12 @@ public final class HtmlParser extends ReaderParser {
 	 * Precondition:  Must be pointing at event following <ul> event.
 	 * Postcondition:  Pointing at next START_ELEMENT or END_DOCUMENT event.
 	 */
-	private <E> Collection<E> parseTableIntoCollection(HtmlParserSession session, XMLEventReader r, Collection<E> l, ClassMeta<E> elementType) throws Exception {
+	private <E> Collection<E> parseTableIntoCollection(HtmlParserSession session, XMLEventReader r, Collection<E> l, ClassMeta<E> elementType, BeanPropertyMeta pMeta) throws Exception {
 
 		BeanContext bc = session.getBeanContext();
 		if (elementType == null)
 			elementType = (ClassMeta<E>)object();
+		BeanDictionary bd = (pMeta == null ? bc.getBeanDictionary() : pMeta.getBeanDictionary());
 
 		Tag tag = nextTag(r, TR);
 		List<String> keys = new ArrayList<String>();
@@ -336,11 +338,11 @@ public final class HtmlParser extends ReaderParser {
 					BeanMapEntry e = m.getProperty(key);
 					if (e == null) {
 						//onUnknownProperty(key, m, -1, -1);
-						parseAnything(session, object(), r, l);
+						parseAnything(session, object(), r, l, null);
 					} else {
 						BeanPropertyMeta bpm = e.getMeta();
 						ClassMeta<?> cm = bpm.getClassMeta();
-						Object value = parseAnything(session, cm, r, m.getBean(false));
+						Object value = parseAnything(session, cm, r, m.getBean(false), bpm);
 						setName(cm, value, key);
 						bpm.set(m, value);
 					}
@@ -360,7 +362,7 @@ public final class HtmlParser extends ReaderParser {
 					String key = keys.get(i);
 					if (m != null) {
 						ClassMeta<?> et = elementType.getElementType();
-						Object value = parseAnything(session, et, r, l);
+						Object value = parseAnything(session, et, r, l, pMeta);
 						setName(et, value, key);
 						m.put(key, value);
 					}
@@ -369,7 +371,7 @@ public final class HtmlParser extends ReaderParser {
 				if (m != null && c != null) {
 					ObjectMap m2 = (m instanceof ObjectMap ? (ObjectMap)m : new ObjectMap(m).setBeanContext(session.getBeanContext()));
 					m2.put(bc.getBeanTypePropertyName(), c);
-					l.add((E)m2.cast());
+					l.add((E)bd.cast(m2));
 				} else {
 					l.add((E)m);
 				}
@@ -404,15 +406,15 @@ public final class HtmlParser extends ReaderParser {
 			BeanPropertyMeta pMeta = m.getPropertyMeta(key);
 			if (pMeta == null) {
 				if (m.getMeta().isSubTyped()) {
-					Object value = parseAnything(session, object(), r, m.getBean(false));
+					Object value = parseAnything(session, object(), r, m.getBean(false), null);
 					m.put(key, value);
 				} else {
 					onUnknownProperty(session, key, m, -1, -1);
-					parseAnything(session, object(), r, null);
+					parseAnything(session, object(), r, null, null);
 				}
 			} else {
 				ClassMeta<?> cm = pMeta.getClassMeta();
-				Object value = parseAnything(session, cm, r, m.getBean(false));
+				Object value = parseAnything(session, cm, r, m.getBean(false), pMeta);
 				setName(cm, value, key);
 				pMeta.set(m, value);
 			}
@@ -658,19 +660,19 @@ public final class HtmlParser extends ReaderParser {
 	protected <T> T doParse(ParserSession session, ClassMeta<T> type) throws Exception {
 		type = session.getBeanContext().normalizeClassMeta(type);
 		HtmlParserSession s = (HtmlParserSession)session;
-		return parseAnything(s, type, s.getXmlEventReader(), session.getOuter());
+		return parseAnything(s, type, s.getXmlEventReader(), session.getOuter(), null);
 	}
 
 	@Override /* ReaderParser */
 	protected <K,V> Map<K,V> doParseIntoMap(ParserSession session, Map<K,V> m, Type keyType, Type valueType) throws Exception {
 		HtmlParserSession s = (HtmlParserSession)session;
-		return parseIntoMap(s, s.getXmlEventReader(), m, s.getBeanContext().getClassMeta(keyType), s.getBeanContext().getClassMeta(valueType));
+		return parseIntoMap(s, s.getXmlEventReader(), m, s.getBeanContext().getClassMeta(keyType), s.getBeanContext().getClassMeta(valueType), null);
 	}
 
 	@Override /* ReaderParser */
 	protected <E> Collection<E> doParseIntoCollection(ParserSession session, Collection<E> c, Type elementType) throws Exception {
 		HtmlParserSession s = (HtmlParserSession)session;
-		return parseIntoCollection(s, s.getXmlEventReader(), c, s.getBeanContext().getClassMeta(elementType));
+		return parseIntoCollection(s, s.getXmlEventReader(), c, s.getBeanContext().getClassMeta(elementType), null);
 	}
 
 	@Override /* ReaderParser */
@@ -710,6 +712,12 @@ public final class HtmlParser extends ReaderParser {
 	}
 
 	@Override /* CoreApi */
+	public HtmlParser addToDictionary(Class<?>...classes) throws LockedException {
+		super.addToDictionary(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
 	public <T> HtmlParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
 		super.addImplClass(interfaceClass, implClass);
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserContext.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserContext.java
index f354526..44fe215 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserContext.java
@@ -30,6 +30,7 @@ import org.apache.juneau.parser.*;
  * 	<li>{@link HtmlParser#addNotBeanClasses(Class[])}
  * 	<li>{@link HtmlParser#addBeanFilters(Class[])}
  * 	<li>{@link HtmlParser#addPojoSwaps(Class[])}
+ * 	<li>{@link HtmlParser#addToDictionary(Class[])}
  * 	<li>{@link HtmlParser#addImplClass(Class,Class)}
  * </ul>
  * <p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
index 0ae595c..bb31659 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
@@ -219,7 +219,7 @@ public class HtmlSerializer extends XmlSerializer {
 			sType = aType.getSerializedClassMeta();
 			String typeName = null;
 			if (session.isAddBeanTypeProperties() && ! eType.equals(aType))
-				typeName = aType.toString();
+				typeName = aType.getDictionaryName();
 
 			// Swap if necessary
 			PojoSwap swap = aType.getPojoSwap();
@@ -414,7 +414,7 @@ public class HtmlSerializer extends XmlSerializer {
 				}
 
 				if (cm != null && session.isAddBeanTypeProperties() && elementType.getInnerClass() != o.getClass())
-					out.oTag(i+1, "tr").attr(bc.getBeanTypePropertyName(), o.getClass().getName()).append('>').nl();
+					out.oTag(i+1, "tr").attr(bc.getBeanTypePropertyName(), cm.getDictionaryName()).append('>').nl();
 				else
 					out.sTag(i+1, "tr").nl();
 
@@ -616,6 +616,12 @@ public class HtmlSerializer extends XmlSerializer {
 	}
 
 	@Override /* CoreApi */
+	public HtmlSerializer addToDictionary(Class<?>...classes) throws LockedException {
+		super.addToDictionary(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
 	public <T> HtmlSerializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
 		super.addImplClass(interfaceClass, implClass);
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerContext.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerContext.java
index 940c797..b634645 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerContext.java
@@ -28,6 +28,7 @@ import org.apache.juneau.xml.*;
  * 	<li>{@link HtmlSerializer#addNotBeanClasses(Class[])}
  * 	<li>{@link HtmlSerializer#addBeanFilters(Class[])}
  * 	<li>{@link HtmlSerializer#addPojoSwaps(Class[])}
+ * 	<li>{@link HtmlSerializer#addToDictionary(Class[])}
  * 	<li>{@link HtmlSerializer#addImplClass(Class,Class)}
  * </ul>
  * <p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/jena/RdfParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/jena/RdfParser.java b/juneau-core/src/main/java/org/apache/juneau/jena/RdfParser.java
index a237d0a..7a8b741 100644
--- a/juneau-core/src/main/java/org/apache/juneau/jena/RdfParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/jena/RdfParser.java
@@ -476,6 +476,12 @@ public class RdfParser extends ReaderParser {
 	}
 
 	@Override /* CoreApi */
+	public RdfParser addToDictionary(Class<?>...classes) throws LockedException {
+		super.addToDictionary(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
 	public <T> RdfParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
 		super.addImplClass(interfaceClass, implClass);
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/jena/RdfParserContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/jena/RdfParserContext.java b/juneau-core/src/main/java/org/apache/juneau/jena/RdfParserContext.java
index a172999..91aa7c9 100644
--- a/juneau-core/src/main/java/org/apache/juneau/jena/RdfParserContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/jena/RdfParserContext.java
@@ -31,6 +31,7 @@ import org.apache.juneau.xml.*;
  * 	<li>{@link RdfParser#addNotBeanClasses(Class[])}
  * 	<li>{@link RdfParser#addBeanFilters(Class[])}
  * 	<li>{@link RdfParser#addPojoSwaps(Class[])}
+ * 	<li>{@link RdfParser#addToDictionary(Class[])}
  * 	<li>{@link RdfParser#addImplClass(Class,Class)}
  * </ul>
  * <p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializer.java b/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializer.java
index 568716f..0ac2a62 100644
--- a/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializer.java
@@ -439,6 +439,12 @@ public class RdfSerializer extends WriterSerializer {
 	}
 
 	@Override /* CoreApi */
+	public RdfSerializer addToDictionary(Class<?>...classes) throws LockedException {
+		super.addToDictionary(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
 	public <T> RdfSerializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
 		super.addImplClass(interfaceClass, implClass);
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializerContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializerContext.java b/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializerContext.java
index f7f749c..5dd4bfa 100644
--- a/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializerContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/jena/RdfSerializerContext.java
@@ -31,6 +31,7 @@ import org.apache.juneau.xml.*;
  * 	<li>{@link RdfSerializer#addNotBeanClasses(Class[])}
  * 	<li>{@link RdfSerializer#addBeanFilters(Class[])}
  * 	<li>{@link RdfSerializer#addPojoSwaps(Class[])}
+ * 	<li>{@link RdfSerializer#addToDictionary(Class[])}
  * 	<li>{@link RdfSerializer#addImplClass(Class,Class)}
  * </ul>
  * <p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java b/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java
index 4ea926f..af4d5a6 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonParser.java
@@ -99,7 +99,7 @@ public final class JsonParser extends ReaderParser {
 	/** Default parser, all default settings.*/
 	public static final JsonParser DEFAULT_STRICT = new JsonParser().setProperty(JSON_strictMode, true).lock();
 
-	private <T> T parseAnything(JsonParserSession session, ClassMeta<T> eType, ParserReader r, Object outer) throws Exception {
+	private <T> T parseAnything(JsonParserSession session, ClassMeta<T> eType, ParserReader r, Object outer, BeanPropertyMeta pMeta) throws Exception {
 
 		BeanContext bc = session.getBeanContext();
 		if (eType == null)
@@ -108,6 +108,7 @@ public final class JsonParser extends ReaderParser {
 		ClassMeta<?> sType = eType.getSerializedClassMeta();
 		session.setCurrentClass(sType);
 		String wrapperAttr = sType.getExtendedMeta(JsonClassMeta.class).getWrapperAttr();
+		BeanDictionary bd = pMeta == null ? bc.getBeanDictionary() : pMeta.getBeanDictionary();
 
 		Object o = null;
 
@@ -127,10 +128,10 @@ public final class JsonParser extends ReaderParser {
 		} else if (sType.isObject()) {
 			if (c == '{') {
 				ObjectMap m2 = new ObjectMap(bc);
-				parseIntoMap2(session, r, m2, string(), object());
-				o = m2.cast();
+				parseIntoMap2(session, r, m2, string(), object(), pMeta);
+				o = bd.cast(m2);
 			} else if (c == '[')
-				o = parseIntoCollection2(session, r, new ObjectList(bc), object());
+				o = parseIntoCollection2(session, r, new ObjectList(bc), object(), pMeta);
 			else if (c == '\'' || c == '"') {
 				o = parseString(session, r);
 				if (sType.isChar())
@@ -155,19 +156,19 @@ public final class JsonParser extends ReaderParser {
 			o = parseNumber(session, r, (Class<? extends Number>)sType.getInnerClass());
 		} else if (sType.isMap()) {
 			Map m = (sType.canCreateNewInstance(outer) ? (Map)sType.newInstance(outer) : new ObjectMap(bc));
-			o = parseIntoMap2(session, r, m, sType.getKeyType(), sType.getValueType());
+			o = parseIntoMap2(session, r, m, sType.getKeyType(), sType.getValueType(), pMeta);
 		} else if (sType.isCollection()) {
 			if (c == '{') {
 				ObjectMap m = new ObjectMap(bc);
-				parseIntoMap2(session, r, m, string(), object());
-				o = m.cast();
+				parseIntoMap2(session, r, m, string(), object(), pMeta);
+				o = bd.cast(m);
 			} else {
 				Collection l = (sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance() : new ObjectList(bc));
-				o = parseIntoCollection2(session, r, l, sType.getElementType());
+				o = parseIntoCollection2(session, r, l, sType.getElementType(), pMeta);
 			}
 		} else if (sType.canCreateNewInstanceFromObjectMap(outer)) {
 			ObjectMap m = new ObjectMap(bc);
-			parseIntoMap2(session, r, m, string(), object());
+			parseIntoMap2(session, r, m, string(), object(), pMeta);
 			o = sType.newInstanceFromObjectMap(outer, m);
 		} else if (sType.canCreateNewBean(outer)) {
 			BeanMap m = bc.newBeanMap(outer, sType.getInnerClass());
@@ -179,17 +180,17 @@ public final class JsonParser extends ReaderParser {
 		} else if (sType.isArray()) {
 			if (c == '{') {
 				ObjectMap m = new ObjectMap(bc);
-				parseIntoMap2(session, r, m, string(), object());
-				o = m.cast();
+				parseIntoMap2(session, r, m, string(), object(), pMeta);
+				o = bd.cast(m);
 			} else {
-				ArrayList l = (ArrayList)parseIntoCollection2(session, r, new ArrayList(), sType.getElementType());
+				ArrayList l = (ArrayList)parseIntoCollection2(session, r, new ArrayList(), sType.getElementType(), pMeta);
 				o = bc.toArray(sType, l);
 			}
 		} else if (c == '{') {
 			Map m = new ObjectMap(bc);
-			parseIntoMap2(session, r, m, sType.getKeyType(), sType.getValueType());
+			parseIntoMap2(session, r, m, sType.getKeyType(), sType.getValueType(), pMeta);
 			if (m.containsKey(bc.getBeanTypePropertyName()))
-				o = ((ObjectMap)m).cast();
+				o = bd.cast((ObjectMap)m);
 			else
 				throw new ParseException(session, "Class ''{0}'' could not be instantiated.  Reason: ''{1}''", sType.getInnerClass().getName(), sType.getNotABeanReason());
 		} else if (sType.canCreateNewInstanceFromString(outer) && ! session.isStrictMode()) {
@@ -247,7 +248,7 @@ public final class JsonParser extends ReaderParser {
 	}
 
 
-	private <K,V> Map<K,V> parseIntoMap2(JsonParserSession session, ParserReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType) throws Exception {
+	private <K,V> Map<K,V> parseIntoMap2(JsonParserSession session, ParserReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType, BeanPropertyMeta pMeta) throws Exception {
 
 		if (keyType == null)
 			keyType = (ClassMeta<K>)string();
@@ -283,7 +284,7 @@ public final class JsonParser extends ReaderParser {
 					skipCommentsAndSpace(session, r.unread());
 				} else if (! Character.isWhitespace(c)) {
 					K key = convertAttrToType(session, m, currAttr, keyType);
-					V value = parseAnything(session, valueType, r.unread(), m);
+					V value = parseAnything(session, valueType, r.unread(), m, pMeta);
 					setName(valueType, value, key);
 					m.put(key, value);
 					state = S5;
@@ -335,7 +336,7 @@ public final class JsonParser extends ReaderParser {
 		throw new ParseException(session, "Could not find the end of the field name.");
 	}
 
-	private <E> Collection<E> parseIntoCollection2(JsonParserSession session, ParserReader r, Collection<E> l, ClassMeta<E> elementType) throws Exception {
+	private <E> Collection<E> parseIntoCollection2(JsonParserSession session, ParserReader r, Collection<E> l, ClassMeta<E> elementType, BeanPropertyMeta pMeta) throws Exception {
 
 		int S0=0; // Looking for outermost [
 		int S1=1; // Looking for starting [ or { or " or ' or LITERAL
@@ -354,7 +355,7 @@ public final class JsonParser extends ReaderParser {
 				} else if (c == '/') {
 					skipCommentsAndSpace(session, r.unread());
 				} else if (! Character.isWhitespace(c)) {
-					l.add(parseAnything(session, elementType, r.unread(), l));
+					l.add(parseAnything(session, elementType, r.unread(), l, pMeta));
 					state = S2;
 				}
 			} else if (state == S2) {
@@ -399,7 +400,7 @@ public final class JsonParser extends ReaderParser {
 				} else if (c == '/') {
 					skipCommentsAndSpace(session, r.unread());
 				} else if (! Character.isWhitespace(c)) {
-					o[i] = parseAnything(session, argTypes[i], r.unread(), session.getOuter());
+					o[i] = parseAnything(session, argTypes[i], r.unread(), session.getOuter(), null);
 					i++;
 					state = S2;
 				}
@@ -466,15 +467,15 @@ public final class JsonParser extends ReaderParser {
 						session.setCurrentProperty(pMeta);
 						if (pMeta == null) {
 							if (m.getMeta().isSubTyped()) {
-								Object value = parseAnything(session, object(), r.unread(), m.getBean(false));
+								Object value = parseAnything(session, object(), r.unread(), m.getBean(false), null);
 								m.put(currAttr, value);
 							} else {
 								onUnknownProperty(session, currAttr, m, currAttrLine, currAttrCol);
-								parseAnything(session, object(), r.unread(), m.getBean(false)); // Read content anyway to ignore it
+								parseAnything(session, object(), r.unread(), m.getBean(false), null); // Read content anyway to ignore it
 							}
 						} else {
 							ClassMeta<?> cm = pMeta.getClassMeta();
-							Object value = parseAnything(session, cm, r.unread(), m.getBean(false));
+							Object value = parseAnything(session, cm, r.unread(), m.getBean(false), pMeta);
 							setName(cm, value, currAttr);
 							pMeta.set(m, value);
 						}
@@ -740,7 +741,7 @@ public final class JsonParser extends ReaderParser {
 		ParserReader r = s.getReader();
 		if (r == null)
 			return null;
-		T o = parseAnything(s, type, r, s.getOuter());
+		T o = parseAnything(s, type, r, s.getOuter(), null);
 		validateEnd(s, r);
 		return o;
 	}
@@ -749,7 +750,7 @@ public final class JsonParser extends ReaderParser {
 	protected <K,V> Map<K,V> doParseIntoMap(ParserSession session, Map<K,V> m, Type keyType, Type valueType) throws Exception {
 		JsonParserSession s = (JsonParserSession)session;
 		ParserReader r = s.getReader();
-		m = parseIntoMap2(s, r, m, s.getBeanContext().getClassMeta(keyType), s.getBeanContext().getClassMeta(valueType));
+		m = parseIntoMap2(s, r, m, s.getBeanContext().getClassMeta(keyType), s.getBeanContext().getClassMeta(valueType), null);
 		validateEnd(s, r);
 		return m;
 	}
@@ -758,7 +759,7 @@ public final class JsonParser extends ReaderParser {
 	protected <E> Collection<E> doParseIntoCollection(ParserSession session, Collection<E> c, Type elementType) throws Exception {
 		JsonParserSession s = (JsonParserSession)session;
 		ParserReader r = s.getReader();
-		c = parseIntoCollection2(s, r, c, s.getBeanContext().getClassMeta(elementType));
+		c = parseIntoCollection2(s, r, c, s.getBeanContext().getClassMeta(elementType), null);
 		validateEnd(s, r);
 		return c;
 	}
@@ -803,6 +804,12 @@ public final class JsonParser extends ReaderParser {
 	}
 
 	@Override /* CoreApi */
+	public JsonParser addToDictionary(Class<?>...classes) throws LockedException {
+		super.addToDictionary(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
 	public <T> JsonParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
 		super.addImplClass(interfaceClass, implClass);
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/json/JsonParserContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/json/JsonParserContext.java b/juneau-core/src/main/java/org/apache/juneau/json/JsonParserContext.java
index cf0b1cd..5a37d4a 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/JsonParserContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonParserContext.java
@@ -28,6 +28,7 @@ import org.apache.juneau.parser.*;
  * 	<li>{@link JsonParser#addNotBeanClasses(Class[])}
  * 	<li>{@link JsonParser#addBeanFilters(Class[])}
  * 	<li>{@link JsonParser#addPojoSwaps(Class[])}
+ * 	<li>{@link JsonParser#addToDictionary(Class[])}
  * 	<li>{@link JsonParser#addImplClass(Class,Class)}
  * </ul>
  * <p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
index 1b1598f..ee0b138 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializer.java
@@ -271,12 +271,12 @@ public class JsonSerializer extends WriterSerializer {
 		return out;
 	}
 
-	private SerializerWriter serializeBeanMap(JsonSerializerSession session, JsonWriter out, BeanMap<?> m, boolean addClassAttr) throws Exception {
+	private SerializerWriter serializeBeanMap(JsonSerializerSession session, JsonWriter out, BeanMap<?> m, boolean addTypeProperty) throws Exception {
 		int depth = session.getIndent();
 		out.append('{');
 
 		boolean addComma = false;
-		for (BeanPropertyValue p : m.getValues(session.isTrimNulls(), addClassAttr ? session.createBeanTypeNameProperty(m, null) : null)) {
+		for (BeanPropertyValue p : m.getValues(session.isTrimNulls(), addTypeProperty ? session.createBeanTypeNameProperty(m) : null)) {
 			BeanPropertyMeta pMeta = p.getMeta();
 			ClassMeta<?> cMeta = p.getClassMeta();
 			String key = p.getName();
@@ -381,6 +381,12 @@ public class JsonSerializer extends WriterSerializer {
 	}
 
 	@Override /* CoreApi */
+	public JsonSerializer addToDictionary(Class<?>...classes) throws LockedException {
+		super.addToDictionary(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
 	public <T> JsonSerializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
 		super.addImplClass(interfaceClass, implClass);
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java
index 67c3e65..cf41764 100644
--- a/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/json/JsonSerializerContext.java
@@ -28,6 +28,7 @@ import org.apache.juneau.serializer.*;
  * 	<li>{@link JsonSerializer#addNotBeanClasses(Class[])}
  * 	<li>{@link JsonSerializer#addBeanFilters(Class[])}
  * 	<li>{@link JsonSerializer#addPojoSwaps(Class[])}
+ * 	<li>{@link JsonSerializer#addToDictionary(Class[])}
  * 	<li>{@link JsonSerializer#addImplClass(Class,Class)}
  * </ul>
  * <p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
index 2cd8fb9..e066d3a 100644
--- a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParser.java
@@ -51,7 +51,7 @@ public final class MsgPackParser extends InputStreamParser {
 	/**
 	 * Workhorse method.
 	 */
-	private <T> T parseAnything(MsgPackParserSession session, ClassMeta<T> eType, MsgPackInputStream is, Object outer) throws Exception {
+	private <T> T parseAnything(MsgPackParserSession session, ClassMeta<T> eType, MsgPackInputStream is, Object outer, BeanPropertyMeta pMeta) throws Exception {
 
 		BeanContext bc = session.getBeanContext();
 		if (eType == null)
@@ -59,6 +59,7 @@ public final class MsgPackParser extends InputStreamParser {
 		PojoSwap<T,Object> transform = (PojoSwap<T,Object>)eType.getPojoSwap();
 		ClassMeta<?> sType = eType.getSerializedClassMeta();
 		session.setCurrentClass(sType);
+		BeanDictionary bd = (pMeta == null ? bc.getBeanDictionary() : pMeta.getBeanDictionary());
 
 		Object o = null;
 		DataType dt = is.readDataType();
@@ -82,13 +83,13 @@ public final class MsgPackParser extends InputStreamParser {
 			else if (dt == ARRAY && sType.isObject()) {
 				ObjectList ol = new ObjectList(bc);
 				for (int i = 0; i < length; i++)
-					ol.add(parseAnything(session, object(), is, outer));
+					ol.add(parseAnything(session, object(), is, outer, pMeta));
 				o = ol;
 			} else if (dt == MAP && sType.isObject()) {
 				ObjectMap om = new ObjectMap(bc);
 				for (int i = 0; i < length; i++)
-					om.put(parseAnything(session, string(), is, outer), parseAnything(session, object(), is, om));
-				o = om.cast();
+					om.put(parseAnything(session, string(), is, outer, pMeta), parseAnything(session, object(), is, om, pMeta));
+				o = bd.cast(om);
 			}
 
 			if (sType.isObject()) {
@@ -99,9 +100,9 @@ public final class MsgPackParser extends InputStreamParser {
 				if (dt == MAP) {
 					Map m = (sType.canCreateNewInstance(outer) ? (Map)sType.newInstance(outer) : new ObjectMap(bc));
 					for (int i = 0; i < length; i++) {
-						Object key = parseAnything(session, sType.getKeyType(), is, outer);
+						Object key = parseAnything(session, sType.getKeyType(), is, outer, pMeta);
 						ClassMeta<?> vt = sType.getValueType();
-						Object value = parseAnything(session, vt, is, m);
+						Object value = parseAnything(session, vt, is, m, pMeta);
 						setName(vt, value, key);
 						m.put(key, value);
 					}
@@ -112,22 +113,22 @@ public final class MsgPackParser extends InputStreamParser {
 			} else if (sType.canCreateNewInstanceFromObjectMap(outer)) {
 				ObjectMap m = new ObjectMap(bc);
 				for (int i = 0; i < length; i++)
-					m.put(parseAnything(session, string(), is, outer), parseAnything(session, object(), is, m));
+					m.put(parseAnything(session, string(), is, outer, pMeta), parseAnything(session, object(), is, m, pMeta));
 				o = sType.newInstanceFromObjectMap(outer, m);
 			} else if (sType.canCreateNewBean(outer)) {
 				if (dt == MAP) {
 					BeanMap m = bc.newBeanMap(outer, sType.getInnerClass());
 					for (int i = 0; i < length; i++) {
-						String pName = parseAnything(session, string(), is, m.getBean(false));
+						String pName = parseAnything(session, string(), is, m.getBean(false), null);
 						BeanPropertyMeta bpm = m.getPropertyMeta(pName);
 						if (bpm == null) {
 							if (pName.equals(bc.getBeanTypePropertyName()))
-								parseAnything(session, bc.string(), is, null);
+								parseAnything(session, bc.string(), is, null, null);
 							else
 								onUnknownProperty(session, pName, m, 0, is.getPosition());
 						} else {
 							ClassMeta<?> cm = bpm.getClassMeta();
-							Object value = parseAnything(session, cm, is, m.getBean(false));
+							Object value = parseAnything(session, cm, is, m.getBean(false), bpm);
 							setName(cm, value, pName);
 							bpm.set(m, value);
 						}
@@ -144,12 +145,12 @@ public final class MsgPackParser extends InputStreamParser {
 				if (dt == MAP) {
 					ObjectMap m = new ObjectMap(bc);
 					for (int i = 0; i < length; i++)
-						m.put(parseAnything(session, string(), is, outer), parseAnything(session, object(), is, m));
-					o = m.cast();
+						m.put(parseAnything(session, string(), is, outer, pMeta), parseAnything(session, object(), is, m, pMeta));
+					o = bd.cast(m);
 				} else if (dt == ARRAY) {
 					Collection l = (sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance() : new ObjectList(bc));
 					for (int i = 0; i < length; i++)
-						l.add(parseAnything(session, sType.getElementType(), is, l));
+						l.add(parseAnything(session, sType.getElementType(), is, l, pMeta));
 					o = l;
 				} else {
 					throw new ParseException(session, "Invalid data type {0} encountered for parse type {1}", dt, sType);
@@ -158,12 +159,12 @@ public final class MsgPackParser extends InputStreamParser {
 				if (dt == MAP) {
 					ObjectMap m = new ObjectMap(bc);
 					for (int i = 0; i < length; i++)
-						m.put(parseAnything(session, string(), is, outer), parseAnything(session, object(), is, m));
-					o = m.cast();
+						m.put(parseAnything(session, string(), is, outer, pMeta), parseAnything(session, object(), is, m, pMeta));
+					o = bd.cast(m);
 				} else if (dt == ARRAY) {
 					Collection l = (sType.isCollection() && sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance() : new ObjectList(bc));
 					for (int i = 0; i < length; i++)
-						l.add(parseAnything(session, sType.getElementType(), is, l));
+						l.add(parseAnything(session, sType.getElementType(), is, l, pMeta));
 					o = bc.toArray(sType, l);
 				} else {
 					throw new ParseException(session, "Invalid data type {0} encountered for parse type {1}", dt, sType);
@@ -171,9 +172,9 @@ public final class MsgPackParser extends InputStreamParser {
 			} else if (dt == MAP) {
 				ObjectMap m = new ObjectMap(bc);
 				for (int i = 0; i < length; i++)
-					m.put(parseAnything(session, string(), is, outer), parseAnything(session, object(), is, m));
+					m.put(parseAnything(session, string(), is, outer, pMeta), parseAnything(session, object(), is, m, pMeta));
 				if (m.containsKey(bc.getBeanTypePropertyName()))
-					o = m.cast();
+					o = bd.cast(m);
 				else
 					throw new ParseException(session, "Class ''{0}'' could not be instantiated.  Reason: ''{1}''", sType.getInnerClass().getName(), sType.getNotABeanReason());
 			} else {
@@ -204,7 +205,7 @@ public final class MsgPackParser extends InputStreamParser {
 		MsgPackParserSession s = (MsgPackParserSession)session;
 		type = s.getBeanContext().normalizeClassMeta(type);
 		MsgPackInputStream is = s.getInputStream();
-		T o = parseAnything(s, type, is, s.getOuter());
+		T o = parseAnything(s, type, is, s.getOuter(), null);
 		return o;
 	}
 
@@ -239,6 +240,12 @@ public final class MsgPackParser extends InputStreamParser {
 	}
 
 	@Override /* CoreApi */
+	public MsgPackParser addToDictionary(Class<?>...classes) throws LockedException {
+		super.addToDictionary(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
 	public <T> MsgPackParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
 		super.addImplClass(interfaceClass, implClass);
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParserContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParserContext.java b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParserContext.java
index 56265dc..2d7d4dc 100644
--- a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParserContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackParserContext.java
@@ -28,6 +28,7 @@ import org.apache.juneau.parser.*;
  * 	<li>{@link MsgPackParser#addNotBeanClasses(Class[])}
  * 	<li>{@link MsgPackParser#addBeanFilters(Class[])}
  * 	<li>{@link MsgPackParser#addPojoSwaps(Class[])}
+ * 	<li>{@link MsgPackParser#addToDictionary(Class[])}
  * 	<li>{@link MsgPackParser#addImplClass(Class,Class)}
  * </ul>
  * <p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
index 6923ecd..b8cd99c 100644
--- a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializer.java
@@ -144,9 +144,9 @@ public class MsgPackSerializer extends OutputStreamSerializer {
 		}
 	}
 
-	private void serializeBeanMap(MsgPackSerializerSession session, MsgPackOutputStream out, final BeanMap<?> m, boolean addClassAttr) throws Exception {
+	private void serializeBeanMap(MsgPackSerializerSession session, MsgPackOutputStream out, final BeanMap<?> m, boolean addTypeProperty) throws Exception {
 
-		List<BeanPropertyValue> values = m.getValues(session.isTrimNulls(), addClassAttr ? session.createBeanTypeNameProperty(m, null) : null);
+		List<BeanPropertyValue> values = m.getValues(session.isTrimNulls(), addTypeProperty ? session.createBeanTypeNameProperty(m) : null);
 
 		int size = values.size();
 		for (BeanPropertyValue p : values)
@@ -241,6 +241,12 @@ public class MsgPackSerializer extends OutputStreamSerializer {
 	}
 
 	@Override /* CoreApi */
+	public MsgPackSerializer addToDictionary(Class<?>...classes) throws LockedException {
+		super.addToDictionary(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
 	public <T> MsgPackSerializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
 		super.addImplClass(interfaceClass, implClass);
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerContext.java b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerContext.java
index f730f01..fcc9f0d 100644
--- a/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/msgpack/MsgPackSerializerContext.java
@@ -28,6 +28,7 @@ import org.apache.juneau.serializer.*;
  * 	<li>{@link MsgPackSerializer#addNotBeanClasses(Class[])}
  * 	<li>{@link MsgPackSerializer#addBeanFilters(Class[])}
  * 	<li>{@link MsgPackSerializer#addPojoSwaps(Class[])}
+ * 	<li>{@link MsgPackSerializer#addToDictionary(Class[])}
  * 	<li>{@link MsgPackSerializer#addImplClass(Class,Class)}
  * </ul>
  * <p>

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java b/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
index ef6e4a1..fcbb007 100644
--- a/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/parser/Parser.java
@@ -710,6 +710,12 @@ public abstract class Parser extends CoreApi {
 	}
 
 	@Override /* CoreApi */
+	public Parser addToDictionary(Class<?>...classes) throws LockedException {
+		super.addToDictionary(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
 	public <T> Parser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
 		super.addImplClass(interfaceClass, implClass);
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroup.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroup.java b/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroup.java
index 86caf2f..71797ce 100644
--- a/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroup.java
+++ b/juneau-core/src/main/java/org/apache/juneau/parser/ParserGroup.java
@@ -280,6 +280,20 @@ public final class ParserGroup extends Lockable {
 	}
 
 	/**
+	 * Shortcut for calling {@link Parser#addToDictionary(Class[])} on all parsers in this group.
+	 *
+	 * @param classes The classes to add to the bean dictionary on the underlying bean context of all parsers in this group.
+	 * @throws LockedException If {@link #lock()} was called on this object.
+	 * @return This object (for method chaining).
+	 */
+	public ParserGroup addToDictionary(Class<?>...classes) throws LockedException {
+		checkLock();
+		for (Parser p : parsers)
+			p.addToDictionary(classes);
+		return this;
+	}
+
+	/**
 	 * Shortcut for calling {@link Parser#addImplClass(Class, Class)} on all parsers in this group.
 	 *
 	 * @param <T> The interface or abstract class type.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java b/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java
index 60086a9..6895668 100644
--- a/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/serializer/Serializer.java
@@ -316,6 +316,12 @@ public abstract class Serializer extends CoreApi {
 	}
 
 	@Override /* CoreApi */
+	public Serializer addToDictionary(Class<?>...classes) throws LockedException {
+		super.addToDictionary(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
 	public <T> Serializer addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
 		super.addImplClass(interfaceClass, implClass);
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
index fd450e8..d18e7c9 100644
--- a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
+++ b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerGroup.java
@@ -303,6 +303,20 @@ public final class SerializerGroup extends Lockable {
 	}
 
 	/**
+	 * Shortcut for calling {@link Serializer#addToDictionary(Class[])} on all serializers in this group.
+	 *
+	 * @param classes The classes to add to the bean dictionary on the underlying bean context of all serializers in this group.
+	 * @throws LockedException If {@link #lock()} was called on this object.
+	 * @return This object (for method chaining).
+	 */
+	public SerializerGroup addToDictionary(Class<?>...classes) throws LockedException {
+		checkLock();
+		for (Serializer s : serializers)
+			s.addToDictionary(classes);
+		return this;
+	}
+
+	/**
 	 * Shortcut for calling {@link Serializer#addImplClass(Class, Class)} on all serializers in this group.
 	 *
 	 * @param <T> The interface or abstract class type.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
index 052a8de..49aefe7 100644
--- a/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/serializer/SerializerSession.java
@@ -746,17 +746,14 @@ public class SerializerSession extends Session {
 	 *
 	 * @param m
 	 * 	The bean map to create a class property on.
-	 * @param beanDictionary
-	 * 	The bean dictionary map to use to resolve the name of the bean class.
 	 * @return
 	 * 	A new bean property value.
 	 */
-	public BeanPropertyValue createBeanTypeNameProperty(BeanMap<?> m, BeanDictionary beanDictionary) {
+	public BeanPropertyValue createBeanTypeNameProperty(BeanMap<?> m) {
 		BeanMeta<?> bm = m.getMeta();
-		Class<?> c = bm.getClassMeta().getInnerClass();
-		String name = (beanDictionary == null ? null : beanDictionary.getNameForClass(c));
+		String name = bm.getClassMeta().getDictionaryName();
 		if (name == null)
-			name = c.getName();
+			return null;
 		return new BeanPropertyValue(bm.getTypeProperty(), name, null);
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParser.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParser.java
index 3a51c03..41f340f 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParser.java
@@ -85,16 +85,18 @@ public class UonParser extends ReaderParser {
 	 * @param r The reader being parsed.
 	 * @param outer The outer object (for constructing nested inner classes).
 	 * @param isUrlParamValue If <jk>true</jk>, then we're parsing a top-level URL-encoded value which is treated a bit different than the default case.
+	 * @param pMeta The current bean property being parsed.
 	 * @return The parsed object.
 	 * @throws Exception
 	 */
-	protected <T> T parseAnything(UonParserSession session, ClassMeta<T> eType, ParserReader r, Object outer, boolean isUrlParamValue) throws Exception {
+	protected <T> T parseAnything(UonParserSession session, ClassMeta<T> eType, ParserReader r, Object outer, boolean isUrlParamValue, BeanPropertyMeta pMeta) throws Exception {
 
 		BeanContext bc = session.getBeanContext();
 		if (eType == null)
 			eType = (ClassMeta<T>)object();
 		PojoSwap<T,Object> transform = (PojoSwap<T,Object>)eType.getPojoSwap();
 		ClassMeta<?> sType = eType.getSerializedClassMeta();
+		BeanDictionary bd = (pMeta == null ? bc.getBeanDictionary() : pMeta.getBeanDictionary());
 
 		Object o = null;
 
@@ -121,11 +123,11 @@ public class UonParser extends ReaderParser {
 				o = parseNumber(session, r, null);
 			} else if (flag == 'o') {
 				ObjectMap m = new ObjectMap(bc);
-				parseIntoMap(session, r, m, string(), object());
-				o = m.cast();
+				parseIntoMap(session, r, m, string(), object(), pMeta);
+				o = bd.cast(m);
 			} else if (flag == 'a') {
 				Collection l = new ObjectList(bc);
-				o = parseIntoCollection(session, r, l, sType.getElementType(), isUrlParamValue);
+				o = parseIntoCollection(session, r, l, sType.getElementType(), isUrlParamValue, pMeta);
 			} else {
 				throw new ParseException(session, "Unexpected flag character ''{0}''.", flag);
 			}
@@ -140,14 +142,14 @@ public class UonParser extends ReaderParser {
 			o = parseNumber(session, r, (Class<? extends Number>)sType.getInnerClass());
 		} else if (sType.isMap()) {
 			Map m = (sType.canCreateNewInstance(outer) ? (Map)sType.newInstance(outer) : new ObjectMap(bc));
-			o = parseIntoMap(session, r, m, sType.getKeyType(), sType.getValueType());
+			o = parseIntoMap(session, r, m, sType.getKeyType(), sType.getValueType(), pMeta);
 		} else if (sType.isCollection()) {
 			if (flag == 'o') {
 				ObjectMap m = new ObjectMap(bc);
-				parseIntoMap(session, r, m, string(), object());
+				parseIntoMap(session, r, m, string(), object(), pMeta);
 				// Handle case where it's a collection, but serialized as a map with a _type or _value key.
 				if (m.containsKey(bc.getBeanTypePropertyName()))
-					o = m.cast();
+					o = bd.cast(m);
 				// Handle case where it's a collection, but only a single value was specified.
 				else {
 					Collection l = (sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance(outer) : new ObjectList(bc));
@@ -156,11 +158,11 @@ public class UonParser extends ReaderParser {
 				}
 			} else {
 				Collection l = (sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance(outer) : new ObjectList(bc));
-				o = parseIntoCollection(session, r, l, sType.getElementType(), isUrlParamValue);
+				o = parseIntoCollection(session, r, l, sType.getElementType(), isUrlParamValue, pMeta);
 			}
 		} else if (sType.canCreateNewInstanceFromObjectMap(outer)) {
 			ObjectMap m = new ObjectMap(bc);
-			parseIntoMap(session, r, m, string(), object());
+			parseIntoMap(session, r, m, string(), object(), pMeta);
 			o = sType.newInstanceFromObjectMap(outer, m);
 		} else if (sType.canCreateNewBean(outer)) {
 			BeanMap m = bc.newBeanMap(outer, sType.getInnerClass());
@@ -175,10 +177,10 @@ public class UonParser extends ReaderParser {
 		} else if (sType.isArray()) {
 			if (flag == 'o') {
 				ObjectMap m = new ObjectMap(bc);
-				parseIntoMap(session, r, m, string(), object());
+				parseIntoMap(session, r, m, string(), object(), pMeta);
 				// Handle case where it's an array, but serialized as a map with a _type or _value key.
 				if (m.containsKey(bc.getBeanTypePropertyName()))
-					o = m.cast();
+					o = bd.cast(m);
 				// Handle case where it's an array, but only a single value was specified.
 				else {
 					ArrayList l = new ArrayList(1);
@@ -186,15 +188,15 @@ public class UonParser extends ReaderParser {
 					o = bc.toArray(sType, l);
 				}
 			} else {
-				ArrayList l = (ArrayList)parseIntoCollection(session, r, new ArrayList(), sType.getElementType(), isUrlParamValue);
+				ArrayList l = (ArrayList)parseIntoCollection(session, r, new ArrayList(), sType.getElementType(), isUrlParamValue, pMeta);
 				o = bc.toArray(sType, l);
 			}
 		} else if (flag == 'o') {
 			// It could be a non-bean with _type attribute.
 			ObjectMap m = new ObjectMap(bc);
-			parseIntoMap(session, r, m, string(), object());
+			parseIntoMap(session, r, m, string(), object(), pMeta);
 			if (m.containsKey(bc.getBeanTypePropertyName()))
-				o = m.cast();
+				o = bd.cast(m);
 			else
 				throw new ParseException(session, "Class ''{0}'' could not be instantiated.  Reason: ''{1}''", sType.getInnerClass().getName(), sType.getNotABeanReason());
 		} else {
@@ -210,7 +212,7 @@ public class UonParser extends ReaderParser {
 		return (T)o;
 	}
 
-	private <K,V> Map<K,V> parseIntoMap(UonParserSession session, ParserReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType) throws Exception {
+	private <K,V> Map<K,V> parseIntoMap(UonParserSession session, ParserReader r, Map<K,V> m, ClassMeta<K> keyType, ClassMeta<V> valueType, BeanPropertyMeta pMeta) throws Exception {
 
 		if (keyType == null)
 			keyType = (ClassMeta<K>)string();
@@ -266,7 +268,7 @@ public class UonParser extends ReaderParser {
 							return m;
 						state = S1;
 					} else  {
-						V value = parseAnything(session, valueType, r.unread(), m, false);
+						V value = parseAnything(session, valueType, r.unread(), m, false, pMeta);
 						setName(valueType, value, currAttr);
 						m.put(currAttr, value);
 						state = S4;
@@ -294,7 +296,7 @@ public class UonParser extends ReaderParser {
 		return null; // Unreachable.
 	}
 
-	private <E> Collection<E> parseIntoCollection(UonParserSession session, ParserReader r, Collection<E> l, ClassMeta<E> elementType, boolean isUrlParamValue) throws Exception {
+	private <E> Collection<E> parseIntoCollection(UonParserSession session, ParserReader r, Collection<E> l, ClassMeta<E> elementType, boolean isUrlParamValue, BeanPropertyMeta pMeta) throws Exception {
 
 		int c = r.read();
 		if (c == -1 || c == NUL || c == AMP)
@@ -320,14 +322,14 @@ public class UonParser extends ReaderParser {
 				if (state == S1 || state == S2) {
 					if (c == ')') {
 						if (state == S2) {
-							l.add(parseAnything(session, elementType, r.unread(), l, false));
+							l.add(parseAnything(session, elementType, r.unread(), l, false, pMeta));
 							r.read();
 						}
 						return l;
 					} else if ((c == '\n' || c == '\r') && session.isWhitespaceAware()) {
 						skipSpace(r);
 					} else {
-						l.add(parseAnything(session, elementType, r.unread(), l, false));
+						l.add(parseAnything(session, elementType, r.unread(), l, false, pMeta));
 						state = S3;
 					}
 				} else if (state == S3) {
@@ -354,7 +356,7 @@ public class UonParser extends ReaderParser {
 					if ((c == '\n' || c == '\r') && session.isWhitespaceAware()) {
 						skipSpace(r);
 					} else {
-						l.add(parseAnything(session, elementType, r.unread(), l, false));
+						l.add(parseAnything(session, elementType, r.unread(), l, false, pMeta));
 						state = S2;
 					}
 				} else if (state == S2) {
@@ -442,16 +444,16 @@ public class UonParser extends ReaderParser {
 							BeanPropertyMeta pMeta = m.getPropertyMeta(currAttr);
 							if (pMeta == null) {
 								if (m.getMeta().isSubTyped()) {
-									Object value = parseAnything(session, object(), r.unread(), m.getBean(false), false);
+									Object value = parseAnything(session, object(), r.unread(), m.getBean(false), false, null);
 									m.put(currAttr, value);
 								} else {
 									onUnknownProperty(session, currAttr, m, currAttrLine, currAttrCol);
-									parseAnything(session, object(), r.unread(), m.getBean(false), false); // Read content anyway to ignore it
+									parseAnything(session, object(), r.unread(), m.getBean(false), false, null); // Read content anyway to ignore it
 								}
 							} else {
 								session.setCurrentProperty(pMeta);
 								ClassMeta<?> cm = pMeta.getClassMeta();
-								Object value = parseAnything(session, cm, r.unread(), m.getBean(false), false);
+								Object value = parseAnything(session, cm, r.unread(), m.getBean(false), false, pMeta);
 								setName(cm, value, currAttr);
 								pMeta.set(m, value);
 								session.setCurrentProperty(null);
@@ -700,7 +702,7 @@ public class UonParser extends ReaderParser {
 			if (state == S1) {
 				if (c == ')')
 					return o;
-				o[i] = parseAnything(session, argTypes[i], r.unread(), session.getOuter(), false);
+				o[i] = parseAnything(session, argTypes[i], r.unread(), session.getOuter(), false, null);
 				i++;
 				state = S2;
 			} else if (state == S2) {
@@ -743,7 +745,7 @@ public class UonParser extends ReaderParser {
 		UonParserSession s = (UonParserSession)session;
 		type = s.getBeanContext().normalizeClassMeta(type);
 		UonReader r = s.getReader();
-		T o = parseAnything(s, type, r, s.getOuter(), true);
+		T o = parseAnything(s, type, r, s.getOuter(), true, null);
 		validateEnd(s, r);
 		return o;
 	}
@@ -753,7 +755,7 @@ public class UonParser extends ReaderParser {
 		UonParserSession s = (UonParserSession)session;
 		UonReader r = s.getReader();
 		readFlag(s, r, 'o');
-		m = parseIntoMap(s, r, m, s.getBeanContext().getClassMeta(keyType), s.getBeanContext().getClassMeta(valueType));
+		m = parseIntoMap(s, r, m, s.getBeanContext().getClassMeta(keyType), s.getBeanContext().getClassMeta(valueType), null);
 		validateEnd(s, r);
 		return m;
 	}
@@ -763,7 +765,7 @@ public class UonParser extends ReaderParser {
 		UonParserSession s = (UonParserSession)session;
 		UonReader r = s.getReader();
 		readFlag(s, r, 'a');
-		c = parseIntoCollection(s, r, c, s.getBeanContext().getClassMeta(elementType), false);
+		c = parseIntoCollection(s, r, c, s.getBeanContext().getClassMeta(elementType), false, null);
 		validateEnd(s, r);
 		return c;
 	}
@@ -808,6 +810,12 @@ public class UonParser extends ReaderParser {
 	}
 
 	@Override /* CoreApi */
+	public UonParser addToDictionary(Class<?>...classes) throws LockedException {
+		super.addToDictionary(classes);
+		return this;
+	}
+
+	@Override /* CoreApi */
 	public <T> UonParser addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException {
 		super.addImplClass(interfaceClass, implClass);
 		return this;

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f479285a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserContext.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserContext.java
index d220cf1..f64b800 100644
--- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UonParserContext.java
@@ -28,6 +28,7 @@ import org.apache.juneau.parser.*;
  * 	<li>{@link UonParser#addNotBeanClasses(Class[])}
  * 	<li>{@link UonParser#addBeanFilters(Class[])}
  * 	<li>{@link UonParser#addPojoSwaps(Class[])}
+ * 	<li>{@link UonParser#addToDictionary(Class[])}
  * 	<li>{@link UonParser#addImplClass(Class,Class)}
  * </ul>
  * <p>