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 2021/08/07 16:01:21 UTC

[juneau] branch master updated: Move bean traverse settings in @Bean to @Serializer.

This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 5e8c6a2  Move bean traverse settings in @Bean to @Serializer.
5e8c6a2 is described below

commit 5e8c6a230a610ebfafde7e4e1aafccc36af7547f
Author: JamesBognar <ja...@salesforce.com>
AuthorDate: Sat Aug 7 12:01:00 2021 -0400

    Move bean traverse settings in @Bean to @Serializer.
---
 .../org/apache/juneau/BeanTraverseContext.java     |  12 ++-
 .../org/apache/juneau/annotation/BeanConfig.java   | 118 ---------------------
 .../juneau/annotation/BeanConfigAnnotation.java    |   5 -
 .../jsonschema/annotation/JsonSchemaConfig.java    | 118 +++++++++++++++++++++
 .../annotation/JsonSchemaConfigAnnotation.java     |   5 +
 .../serializer/annotation/SerializerConfig.java    | 118 +++++++++++++++++++++
 .../annotation/SerializerConfigAnnotation.java     |   5 +
 .../juneau/examples/rest/RequestEchoResource.java  |   7 +-
 .../annotation/BeanConfigAnnotation_Test.java      |  10 +-
 .../serializer/SerializerConfigAnnotationTest.java |  12 +++
 10 files changed, 272 insertions(+), 138 deletions(-)

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseContext.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseContext.java
index ce64d10..a85a297 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseContext.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanTraverseContext.java
@@ -50,7 +50,8 @@ public abstract class BeanTraverseContext extends BeanContext {
 	 * 	<li><b>Session property:</b>  <jk>false</jk>
 	 * 	<li><b>Annotations:</b>
 	 * 		<ul>
-	 * 			<li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#detectRecursions()}
+	 * 			<li class='ja'>{@link org.apache.juneau.serializer.annotation.SerializerConfig#detectRecursions()}
+	 * 			<li class='ja'>{@link org.apache.juneau.jsonschema.annotation.JsonSchemaConfig#detectRecursions()}
 	 * 		</ul>
 	 * 	<li><b>Methods:</b>
 	 * 		<ul>
@@ -77,7 +78,8 @@ public abstract class BeanTraverseContext extends BeanContext {
 	 * 	<li><b>Session property:</b>  <jk>false</jk>
 	 * 	<li><b>Annotations:</b>
 	 * 		<ul>
-	 * 			<li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#ignoreRecursions()}
+	 * 			<li class='ja'>{@link org.apache.juneau.serializer.annotation.SerializerConfig#ignoreRecursions()}
+	 * 			<li class='ja'>{@link org.apache.juneau.jsonschema.annotation.JsonSchemaConfig#ignoreRecursions()}
 	 * 		</ul>
 	 * 	<li><b>Methods:</b>
 	 * 		<ul>
@@ -104,7 +106,8 @@ public abstract class BeanTraverseContext extends BeanContext {
 	 * 	<li><b>Session property:</b>  <jk>false</jk>
 	 * 	<li><b>Annotations:</b>
 	 * 		<ul>
-	 * 			<li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#initialDepth()}
+	 * 			<li class='ja'>{@link org.apache.juneau.serializer.annotation.SerializerConfig#initialDepth()}
+	 * 			<li class='ja'>{@link org.apache.juneau.jsonschema.annotation.JsonSchemaConfig#initialDepth()}
 	 * 		</ul>
 	 * 	<li><b>Methods:</b>
 	 * 		<ul>
@@ -132,7 +135,8 @@ public abstract class BeanTraverseContext extends BeanContext {
 	 * 	<li><b>Session property:</b>  <jk>false</jk>
 	 * 	<li><b>Annotations:</b>
 	 * 		<ul>
-	 * 			<li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#maxDepth()}
+	 * 			<li class='ja'>{@link org.apache.juneau.serializer.annotation.SerializerConfig#maxDepth()}
+	 * 			<li class='ja'>{@link org.apache.juneau.jsonschema.annotation.JsonSchemaConfig#maxDepth()}
 	 * 		</ul>
 	 * 	<li><b>Methods:</b>
 	 * 		<ul>
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfig.java
index 6418e47..b0164f4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfig.java
@@ -22,7 +22,6 @@ import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.http.header.*;
-import org.apache.juneau.parser.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.transform.*;
 
@@ -931,121 +930,4 @@ public @interface BeanConfig {
 	 * </ul>
 	 */
 	String useJavaBeanIntrospector() default "";
-
-	//-----------------------------------------------------------------------------------------------------------------
-	// BeanTraverseContext
-	//-----------------------------------------------------------------------------------------------------------------
-
-	/**
-	 * Configuration property:  Automatically detect POJO recursions.
-	 *
-	 * <p>
-	 * Specifies that recursions should be checked for during traversal.
-	 *
-	 * <p>
-	 * Recursions can occur when traversing models that aren't true trees but rather contain loops.
-	 * <br>In general, unchecked recursions cause stack-overflow-errors.
-	 * <br>These show up as {@link ParseException ParseExceptions} with the message <js>"Depth too deep.  Stack overflow occurred."</js>.
-	 *
-	 * <p>
-	 * The behavior when recursions are detected depends on the value for {@link BeanTraverseContext#BEANTRAVERSE_ignoreRecursions}.
-	 *
-	 * <p>
-	 * For example, if a model contains the links A-&gt;B-&gt;C-&gt;A, then the JSON generated will look like
-	 * 	the following when <jsf>BEANTRAVERSE_ignoreRecursions</jsf> is <jk>true</jk>...
-	 *
-	 * <p class='bcode w800'>
-	 * 	{A:{B:{C:<jk>null</jk>}}}
-	 * </p>
-	 *
-	 * <ul class='notes'>
-	 * 	<li>
-	 * 		Checking for recursion can cause a small performance penalty.
-	 * 	<li>
-	 *		Possible values:
-	 * 		<ul>
-	 * 			<li><js>"true"</js>
-	 * 			<li><js>"false"</js> (default)
-	 * 		</ul>
-	 * 	<li>
-	 * 		Supports {@doc DefaultVarResolver} (e.g. <js>"$C{myConfigVar}"</js>).
-	 * </ul>
-	 *
-	 * <ul class='seealso'>
-	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_detectRecursions}
-	 * </ul>
-	 */
-	String detectRecursions() default "";
-
-	/**
-	 * Configuration property:  Ignore recursion errors.
-	 *
-	 * <p>
-	 * Used in conjunction with {@link BeanTraverseContext#BEANTRAVERSE_detectRecursions}.
-	 * <br>Setting is ignored if <jsf>BEANTRAVERSE_detectRecursions</jsf> is <js>"false"</js>.
-	 *
-	 * <p>
-	 * If <js>"true"</js>, when we encounter the same object when traversing a tree, we set the value to <jk>null</jk>.
-	 * <br>Otherwise, a {@link BeanRecursionException} is thrown with the message <js>"Recursion occurred, stack=..."</js>.
-	 *
-	 * <ul class='notes'>
-	 * 	<li>
-	 *		Possible values:
-	 * 		<ul>
-	 * 			<li><js>"true"</js>
-	 * 			<li><js>"false"</js> (default)
-	 * 		</ul>
-	 * 	<li>
-	 * 		Supports {@doc DefaultVarResolver} (e.g. <js>"$C{myConfigVar}"</js>).
-	 * </ul>
-	 *
-	 * <ul class='seealso'>
-	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_ignoreRecursions}
-	 * </ul>
-	 */
-	String ignoreRecursions() default "";
-
-	/**
-	 * Configuration property:  Initial depth.
-	 *
-	 * <p>
-	 * The initial indentation level at the root.
-	 * <br>Useful when constructing document fragments that need to be indented at a certain level.
-	 *
-	 * <ul class='notes'>
-	 * 	<li>
-	 * 		Format: integer
-	 *	<li>
-	 * 		Default value: <js>"0"</js>
-	 * 	<li>
-	 * 		Supports {@doc DefaultVarResolver} (e.g. <js>"$C{myConfigVar}"</js>).
-	 * </ul>
-	 *
-	 * <ul class='seealso'>
-	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_initialDepth}
-	 * </ul>
-	 */
-	String initialDepth() default "";
-
-	/**
-	 * Configuration property:  Max traversal depth.
-	 *
-	 * <p>
-	 * Abort traversal if specified depth is reached in the POJO tree.
-	 * <br>If this depth is exceeded, an exception is thrown.
-	 *
-	 * <ul class='notes'>
-	 * 	<li>
-	 * 		Format: integer
-	 * 	<li>
-	 * 		Default value: <js>"100"</js>
-	 * 	<li>
-	 * 		Supports {@doc DefaultVarResolver} (e.g. <js>"$C{myConfigVar}"</js>).
-	 * </ul>
-	 *
-	 * <ul class='seealso'>
-	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_maxDepth}
-	 * </ul>
-	 */
-	String maxDepth() default "";
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfigAnnotation.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfigAnnotation.java
index 1fdefc5..fdf7f76 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfigAnnotation.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfigAnnotation.java
@@ -13,7 +13,6 @@
 package org.apache.juneau.annotation;
 
 import static org.apache.juneau.BeanContext.*;
-import static org.apache.juneau.BeanTraverseContext.*;
 import static java.util.Arrays.*;
 
 import java.util.*;
@@ -82,10 +81,6 @@ public class BeanConfigAnnotation {
 			cpb.setIfNotEmpty(BEAN_useEnumNames, bool(a.useEnumNames()));
 			cpb.setIfNotEmpty(BEAN_disableInterfaceProxies, bool(a.disableInterfaceProxies()));
 			cpb.setIfNotEmpty(BEAN_useJavaBeanIntrospector, bool(a.useJavaBeanIntrospector()));
-			cpb.setIfNotEmpty(BEANTRAVERSE_detectRecursions, bool(a.detectRecursions()));
-			cpb.setIfNotEmpty(BEANTRAVERSE_ignoreRecursions, bool(a.ignoreRecursions()));
-			cpb.setIfNotEmpty(BEANTRAVERSE_initialDepth, integer(a.initialDepth(), "initialDepth"));
-			cpb.setIfNotEmpty(BEANTRAVERSE_maxDepth, integer(a.maxDepth(), "maxDepth"));
 		}
 
 		private Locale locale(String in) {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java
index a53458d..50fa7df 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java
@@ -21,6 +21,7 @@ import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.collections.*;
 import org.apache.juneau.jsonschema.*;
+import org.apache.juneau.parser.*;
 
 /**
  * Annotation for specifying config properties defined in {@link JsonSchemaGenerator}.
@@ -237,4 +238,121 @@ public @interface JsonSchemaConfig {
 	 * </ul>
 	 */
 	String useBeanDefs() default "";
+	
+	//-----------------------------------------------------------------------------------------------------------------
+	// BeanTraverseContext
+	//-----------------------------------------------------------------------------------------------------------------
+
+	/**
+	 * Configuration property:  Automatically detect POJO recursions.
+	 *
+	 * <p>
+	 * Specifies that recursions should be checked for during traversal.
+	 *
+	 * <p>
+	 * Recursions can occur when traversing models that aren't true trees but rather contain loops.
+	 * <br>In general, unchecked recursions cause stack-overflow-errors.
+	 * <br>These show up as {@link ParseException ParseExceptions} with the message <js>"Depth too deep.  Stack overflow occurred."</js>.
+	 *
+	 * <p>
+	 * The behavior when recursions are detected depends on the value for {@link BeanTraverseContext#BEANTRAVERSE_ignoreRecursions}.
+	 *
+	 * <p>
+	 * For example, if a model contains the links A-&gt;B-&gt;C-&gt;A, then the JSON generated will look like
+	 * 	the following when <jsf>BEANTRAVERSE_ignoreRecursions</jsf> is <jk>true</jk>...
+	 *
+	 * <p class='bcode w800'>
+	 * 	{A:{B:{C:<jk>null</jk>}}}
+	 * </p>
+	 *
+	 * <ul class='notes'>
+	 * 	<li>
+	 * 		Checking for recursion can cause a small performance penalty.
+	 * 	<li>
+	 *		Possible values:
+	 * 		<ul>
+	 * 			<li><js>"true"</js>
+	 * 			<li><js>"false"</js> (default)
+	 * 		</ul>
+	 * 	<li>
+	 * 		Supports {@doc DefaultVarResolver} (e.g. <js>"$C{myConfigVar}"</js>).
+	 * </ul>
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_detectRecursions}
+	 * </ul>
+	 */
+	String detectRecursions() default "";
+
+	/**
+	 * Configuration property:  Ignore recursion errors.
+	 *
+	 * <p>
+	 * Used in conjunction with {@link BeanTraverseContext#BEANTRAVERSE_detectRecursions}.
+	 * <br>Setting is ignored if <jsf>BEANTRAVERSE_detectRecursions</jsf> is <js>"false"</js>.
+	 *
+	 * <p>
+	 * If <js>"true"</js>, when we encounter the same object when traversing a tree, we set the value to <jk>null</jk>.
+	 * <br>Otherwise, a {@link BeanRecursionException} is thrown with the message <js>"Recursion occurred, stack=..."</js>.
+	 *
+	 * <ul class='notes'>
+	 * 	<li>
+	 *		Possible values:
+	 * 		<ul>
+	 * 			<li><js>"true"</js>
+	 * 			<li><js>"false"</js> (default)
+	 * 		</ul>
+	 * 	<li>
+	 * 		Supports {@doc DefaultVarResolver} (e.g. <js>"$C{myConfigVar}"</js>).
+	 * </ul>
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_ignoreRecursions}
+	 * </ul>
+	 */
+	String ignoreRecursions() default "";
+
+	/**
+	 * Configuration property:  Initial depth.
+	 *
+	 * <p>
+	 * The initial indentation level at the root.
+	 * <br>Useful when constructing document fragments that need to be indented at a certain level.
+	 *
+	 * <ul class='notes'>
+	 * 	<li>
+	 * 		Format: integer
+	 *	<li>
+	 * 		Default value: <js>"0"</js>
+	 * 	<li>
+	 * 		Supports {@doc DefaultVarResolver} (e.g. <js>"$C{myConfigVar}"</js>).
+	 * </ul>
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_initialDepth}
+	 * </ul>
+	 */
+	String initialDepth() default "";
+
+	/**
+	 * Configuration property:  Max traversal depth.
+	 *
+	 * <p>
+	 * Abort traversal if specified depth is reached in the POJO tree.
+	 * <br>If this depth is exceeded, an exception is thrown.
+	 *
+	 * <ul class='notes'>
+	 * 	<li>
+	 * 		Format: integer
+	 * 	<li>
+	 * 		Default value: <js>"100"</js>
+	 * 	<li>
+	 * 		Supports {@doc DefaultVarResolver} (e.g. <js>"$C{myConfigVar}"</js>).
+	 * </ul>
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_maxDepth}
+	 * </ul>
+	 */
+	String maxDepth() default "";
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfigAnnotation.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfigAnnotation.java
index ed02a7c..dc03450 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfigAnnotation.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfigAnnotation.java
@@ -12,6 +12,7 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.jsonschema.annotation;
 
+import static org.apache.juneau.BeanTraverseContext.*;
 import static org.apache.juneau.jsonschema.JsonSchemaGenerator.*;
 
 import org.apache.juneau.*;
@@ -50,6 +51,10 @@ public class JsonSchemaConfigAnnotation {
 			cpb.setIf(a.beanDefMapper() != BeanDefMapper.Null.class, JSONSCHEMA_beanDefMapper, a.beanDefMapper());
 			cpb.setIfNotEmpty(JSONSCHEMA_ignoreTypes, string(a.ignoreTypes()));
 			cpb.setIfNotEmpty(JSONSCHEMA_useBeanDefs, bool(a.useBeanDefs()));
+			cpb.setIfNotEmpty(BEANTRAVERSE_detectRecursions, bool(a.detectRecursions()));
+			cpb.setIfNotEmpty(BEANTRAVERSE_ignoreRecursions, bool(a.ignoreRecursions()));
+			cpb.setIfNotEmpty(BEANTRAVERSE_initialDepth, integer(a.initialDepth(), "initialDepth"));
+			cpb.setIfNotEmpty(BEANTRAVERSE_maxDepth, integer(a.maxDepth(), "maxDepth"));
 		}
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java
index 1d6daba..e9890e20 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfig.java
@@ -19,6 +19,7 @@ import java.lang.annotation.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
+import org.apache.juneau.parser.*;
 import org.apache.juneau.serializer.*;
 
 /**
@@ -528,4 +529,121 @@ public @interface SerializerConfig {
 	 * </ul>
 	 */
 	String useWhitespace() default "";
+
+	//-----------------------------------------------------------------------------------------------------------------
+	// BeanTraverseContext
+	//-----------------------------------------------------------------------------------------------------------------
+
+	/**
+	 * Configuration property:  Automatically detect POJO recursions.
+	 *
+	 * <p>
+	 * Specifies that recursions should be checked for during traversal.
+	 *
+	 * <p>
+	 * Recursions can occur when traversing models that aren't true trees but rather contain loops.
+	 * <br>In general, unchecked recursions cause stack-overflow-errors.
+	 * <br>These show up as {@link ParseException ParseExceptions} with the message <js>"Depth too deep.  Stack overflow occurred."</js>.
+	 *
+	 * <p>
+	 * The behavior when recursions are detected depends on the value for {@link BeanTraverseContext#BEANTRAVERSE_ignoreRecursions}.
+	 *
+	 * <p>
+	 * For example, if a model contains the links A-&gt;B-&gt;C-&gt;A, then the JSON generated will look like
+	 * 	the following when <jsf>BEANTRAVERSE_ignoreRecursions</jsf> is <jk>true</jk>...
+	 *
+	 * <p class='bcode w800'>
+	 * 	{A:{B:{C:<jk>null</jk>}}}
+	 * </p>
+	 *
+	 * <ul class='notes'>
+	 * 	<li>
+	 * 		Checking for recursion can cause a small performance penalty.
+	 * 	<li>
+	 *		Possible values:
+	 * 		<ul>
+	 * 			<li><js>"true"</js>
+	 * 			<li><js>"false"</js> (default)
+	 * 		</ul>
+	 * 	<li>
+	 * 		Supports {@doc DefaultVarResolver} (e.g. <js>"$C{myConfigVar}"</js>).
+	 * </ul>
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_detectRecursions}
+	 * </ul>
+	 */
+	String detectRecursions() default "";
+
+	/**
+	 * Configuration property:  Ignore recursion errors.
+	 *
+	 * <p>
+	 * Used in conjunction with {@link BeanTraverseContext#BEANTRAVERSE_detectRecursions}.
+	 * <br>Setting is ignored if <jsf>BEANTRAVERSE_detectRecursions</jsf> is <js>"false"</js>.
+	 *
+	 * <p>
+	 * If <js>"true"</js>, when we encounter the same object when traversing a tree, we set the value to <jk>null</jk>.
+	 * <br>Otherwise, a {@link BeanRecursionException} is thrown with the message <js>"Recursion occurred, stack=..."</js>.
+	 *
+	 * <ul class='notes'>
+	 * 	<li>
+	 *		Possible values:
+	 * 		<ul>
+	 * 			<li><js>"true"</js>
+	 * 			<li><js>"false"</js> (default)
+	 * 		</ul>
+	 * 	<li>
+	 * 		Supports {@doc DefaultVarResolver} (e.g. <js>"$C{myConfigVar}"</js>).
+	 * </ul>
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_ignoreRecursions}
+	 * </ul>
+	 */
+	String ignoreRecursions() default "";
+
+	/**
+	 * Configuration property:  Initial depth.
+	 *
+	 * <p>
+	 * The initial indentation level at the root.
+	 * <br>Useful when constructing document fragments that need to be indented at a certain level.
+	 *
+	 * <ul class='notes'>
+	 * 	<li>
+	 * 		Format: integer
+	 *	<li>
+	 * 		Default value: <js>"0"</js>
+	 * 	<li>
+	 * 		Supports {@doc DefaultVarResolver} (e.g. <js>"$C{myConfigVar}"</js>).
+	 * </ul>
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_initialDepth}
+	 * </ul>
+	 */
+	String initialDepth() default "";
+
+	/**
+	 * Configuration property:  Max traversal depth.
+	 *
+	 * <p>
+	 * Abort traversal if specified depth is reached in the POJO tree.
+	 * <br>If this depth is exceeded, an exception is thrown.
+	 *
+	 * <ul class='notes'>
+	 * 	<li>
+	 * 		Format: integer
+	 * 	<li>
+	 * 		Default value: <js>"100"</js>
+	 * 	<li>
+	 * 		Supports {@doc DefaultVarResolver} (e.g. <js>"$C{myConfigVar}"</js>).
+	 * </ul>
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='jf'>{@link BeanTraverseContext#BEANTRAVERSE_maxDepth}
+	 * </ul>
+	 */
+	String maxDepth() default "";
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfigAnnotation.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfigAnnotation.java
index a692a90..28f3391 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfigAnnotation.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/annotation/SerializerConfigAnnotation.java
@@ -12,6 +12,7 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.serializer.annotation;
 
+import static org.apache.juneau.BeanTraverseContext.*;
 import static org.apache.juneau.serializer.OutputStreamSerializer.*;
 import static org.apache.juneau.serializer.WriterSerializer.*;
 
@@ -64,6 +65,10 @@ public class SerializerConfigAnnotation {
 			cpb.setIfNotEmpty(WSERIALIZER_quoteChar, character(a.quoteChar(), "quoteChar"));
 			cpb.setIfNotEmpty(WSERIALIZER_streamCharset, charset(a.streamCharset()));
 			cpb.setIfNotEmpty(WSERIALIZER_useWhitespace, bool(a.useWhitespace()));
+			cpb.setIfNotEmpty(BEANTRAVERSE_detectRecursions, bool(a.detectRecursions()));
+			cpb.setIfNotEmpty(BEANTRAVERSE_ignoreRecursions, bool(a.ignoreRecursions()));
+			cpb.setIfNotEmpty(BEANTRAVERSE_initialDepth, integer(a.initialDepth(), "initialDepth"));
+			cpb.setIfNotEmpty(BEANTRAVERSE_maxDepth, integer(a.maxDepth(), "maxDepth"));
 		}
 
 		private Object charset(String in) {
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java
index 2f8bbed..8f787b1 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java
@@ -23,6 +23,7 @@ import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
 import org.apache.juneau.rest.converters.*;
 import org.apache.juneau.rest.widget.*;
+import org.apache.juneau.serializer.annotation.*;
 import org.apache.juneau.transforms.*;
 
 /**
@@ -67,13 +68,15 @@ import org.apache.juneau.transforms.*;
 	nowrap="false"
 )
 @BeanConfig(
-	maxDepth="5",
-	detectRecursions="true",
 	swaps={
 		// Add a special filter for Enumerations
 		EnumerationSwap.class
 	}
 )
+@SerializerConfig(
+	maxDepth="5",
+	detectRecursions="true"
+)
 @Bean(on="HttpServletRequest",interfaceClass=HttpServletRequest.class)
 @Bean(on="HttpSession",interfaceClass=HttpSession.class)
 @Bean(on="ServletContext",interfaceClass=ServletContext.class)
diff --git a/juneau-utest/src/test/java/org/apache/juneau/annotation/BeanConfigAnnotation_Test.java b/juneau-utest/src/test/java/org/apache/juneau/annotation/BeanConfigAnnotation_Test.java
index f8b82ef..7576772 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/annotation/BeanConfigAnnotation_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/annotation/BeanConfigAnnotation_Test.java
@@ -119,18 +119,14 @@ public class BeanConfigAnnotation_Test {
 		disableBeansRequireSomeProperties="$X{true}",
 		typePropertyName="$X{foo}",
 		debug="$X{true}",
-		detectRecursions="$X{true}",
 		disableIgnoreUnknownNullBeanProperties="$X{true}",
 		disableIgnoreMissingSetters="$X{true}",
 		disableInterfaceProxies="$X{true}",
 		findFluentSetters="$X{true}",
 		ignoreInvocationExceptionsOnGetters="$X{true}",
 		ignoreInvocationExceptionsOnSetters="$X{true}",
-		ignoreRecursions="$X{true}",
 		ignoreUnknownBeanProperties="$X{true}",
-		initialDepth="$X{1}",
 		locale="$X{en-US}",
-		maxDepth="$X{1}",
 		mediaType="$X{text/foo}",
 		notBeanClasses={A1.class,A2.class},
 		notBeanClasses_replace={A1.class,A2.class,A3.class},
@@ -150,7 +146,7 @@ public class BeanConfigAnnotation_Test {
 	@Test
 	public void a01_basic() throws Exception {
 		AnnotationList al = a.getAnnotationList();
-		BeanTraverseSession bc = JsonSerializer.create().applyAnnotations(al, sr).build().createSession();
+		BeanSession bc = JsonSerializer.create().applyAnnotations(al, sr).build().createSession();
 
 		check("PRIVATE", bc.getBeanClassVisibility());
 		check("PRIVATE", bc.getBeanConstructorVisibility());
@@ -164,17 +160,13 @@ public class BeanConfigAnnotation_Test {
 		check("false", bc.isBeansRequireSomeProperties());
 		check("foo", bc.getBeanTypePropertyName());
 		check("true", bc.isDebug());
-		check("true", bc.isDetectRecursions());
 		check("true", bc.isFindFluentSetters());
 		check("true", bc.isIgnoreInvocationExceptionsOnGetters());
 		check("true", bc.isIgnoreInvocationExceptionsOnSetters());
 		check("false", bc.isIgnoreMissingSetters());
-		check("true", bc.isIgnoreRecursions());
 		check("true", bc.isIgnoreUnknownBeanProperties());
 		check("false", bc.isIgnoreUnknownNullBeanProperties());
-		check("1", bc.getInitialDepth());
 		check("en_US", bc.getLocale());
-		check("1", bc.getMaxDepth());
 		check("application/json", bc.getMediaType());
 		check("A1,A2,A3", bc.getNotBeanClasses());
 		check("foo1,foo2,foo3", bc.getNotBeanPackagesNames());
diff --git a/juneau-utest/src/test/java/org/apache/juneau/serializer/SerializerConfigAnnotationTest.java b/juneau-utest/src/test/java/org/apache/juneau/serializer/SerializerConfigAnnotationTest.java
index cb93827..6caee18 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/serializer/SerializerConfigAnnotationTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/serializer/SerializerConfigAnnotationTest.java
@@ -58,7 +58,11 @@ public class SerializerConfigAnnotationTest {
 		addBeanTypes="$X{true}",
 		addRootType="$X{true}",
 		binaryFormat="$X{HEX}",
+		detectRecursions="$X{true}",
+		ignoreRecursions="$X{true}",
+		initialDepth="$X{1}",
 		listener=AA.class,
+		maxDepth="$X{1}",
 		maxIndent="$X{1}",
 		quoteChar="$X{'}",
 		sortCollections="$X{true}",
@@ -81,7 +85,11 @@ public class SerializerConfigAnnotationTest {
 		JsonSerializerSession x = JsonSerializer.create().applyAnnotations(al, sr).build().createSession();
 		check("true", ((SerializerSession)x).isAddBeanTypes());
 		check("true", x.isAddRootType());
+		check("true", x.isDetectRecursions());
+		check("true", x.isIgnoreRecursions());
+		check("1", x.getInitialDepth());
 		check("AA", x.getListener());
+		check("1", x.getMaxDepth());
 		check("1", x.getMaxIndent());
 		check("'", x.getQuoteChar());
 		check("true", x.isSortCollections());
@@ -103,7 +111,11 @@ public class SerializerConfigAnnotationTest {
 		check("true", ((SerializerSession)x).isAddBeanTypes());
 		check("true", x.isAddRootType());
 		check("HEX", x.getBinaryFormat());
+		check("true", x.isDetectRecursions());
+		check("true", x.isIgnoreRecursions());
+		check("1", x.getInitialDepth());
 		check("AA", x.getListener());
+		check("1", x.getMaxDepth());
 		check("true", x.isSortCollections());
 		check("true", x.isSortMaps());
 		check("true", x.isTrimEmptyCollections());