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 87d6b56  Context API refactoring.
87d6b56 is described below

commit 87d6b567c6752fcc8484679cf0eb7dd630ce0312
Author: JamesBognar <[email protected]>
AuthorDate: Sat Sep 11 09:43:23 2021 -0400

    Context API refactoring.
---
 .../apache/juneau/cp/BeanCreateMethodFinder.java   |  10 +
 .../src/main/java/org/apache/juneau/svl/Var.java   |   2 +-
 .../java/org/apache/juneau/svl/VarResolver.java    | 253 ++++++++++++++++--
 .../org/apache/juneau/svl/VarResolverBuilder.java  | 170 ------------
 .../org/apache/juneau/svl/VarResolverContext.java  |  85 ------
 .../org/apache/juneau/svl/VarResolverSession.java  |   4 +-
 .../apache/juneau/microservice/Microservice.java   |   5 +-
 .../juneau/microservice/MicroserviceBuilder.java   |   8 +-
 .../apache/juneau/rest/mock/MockRestClient.java    |   2 +-
 .../java/org/apache/juneau/rest/RestContext.java   |  75 ++++--
 .../org/apache/juneau/rest/RestContextBuilder.java | 295 ++++++++++++---------
 .../java/org/apache/juneau/rest/RestServlet.java   |   2 +-
 .../org/apache/juneau/rest/annotation/Rest.java    |  19 ++
 .../juneau/rest/annotation/RestAnnotation.java     |   8 +
 .../java/org/apache/juneau/config/ConfigTest.java  |   2 +-
 .../java/org/apache/juneau/rest/Swagger_Test.java  |   4 +-
 .../rest/annotation/RestAnnotation_Test.java       |   1 +
 .../apache/juneau/rest/testutils/TestUtils.java    |   2 +-
 .../org/apache/juneau/svl/ResolvingOMapTest.java   |   8 +-
 .../java/org/apache/juneau/svl/vars/IfVarTest.java |   2 +-
 .../org/apache/juneau/svl/vars/LenVarTest.java     |   2 +-
 .../apache/juneau/svl/vars/LowerCaseVarTest.java   |   2 +-
 .../apache/juneau/svl/vars/NotEmptyVarTest.java    |   2 +-
 .../juneau/svl/vars/PatternExtractVarTest.java     |   2 +-
 .../juneau/svl/vars/PatternMatchVarTest.java       |   2 +-
 .../juneau/svl/vars/PatternReplaceVarTest.java     |   2 +-
 .../apache/juneau/svl/vars/RestrictedVarsTest.java |   6 +-
 .../apache/juneau/svl/vars/SubstringVarTest.java   |   2 +-
 .../org/apache/juneau/svl/vars/SwitchVarTest.java  |   2 +-
 .../juneau/svl/vars/SystemPropertiesVarTest.java   |   2 +-
 .../apache/juneau/svl/vars/UpperCaseVarTest.java   |   2 +-
 .../apache/juneau/utils/StringVarResolverTest.java |  12 +-
 32 files changed, 531 insertions(+), 464 deletions(-)

diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java
index d52596f..ee75c47 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java
@@ -132,4 +132,14 @@ public class BeanCreateMethodFinder<T> {
                        return (T)method.invoke(resource, args);
                return def.get();
        }
+
+       /**
+        * Executes the matched method and returns the result as an optional.
+        *
+        * @return The object returned by the method invocation, or the default 
value if method was not found, or {@link Optional#empty()}.
+        * @throws ExecutableException If method invocation threw an exception.
+        */
+       public Optional<T> execute() throws ExecutableException {
+               return Optional.ofNullable(run());
+       }
 }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/Var.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/Var.java
index 3c08ab4..b41de77 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/Var.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/Var.java
@@ -32,7 +32,7 @@ import java.io.*;
  *
  * <p>
  * Subclasses MUST implement a no-arg constructor so that class names can be 
passed to the
- * {@link VarResolverBuilder#vars(Class...)} method.
+ * {@link VarResolver.Builder#vars(Class...)} method.
  * <br><b>They must also be thread safe!</b>
  *
  * <p>
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolver.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolver.java
index 1f55dd4..bbdbab7 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolver.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolver.java
@@ -12,8 +12,13 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.svl;
 
+import static org.apache.juneau.internal.ClassUtils.*;
+
 import java.io.*;
+import java.util.*;
+import java.util.concurrent.*;
 
+import org.apache.juneau.collections.*;
 import org.apache.juneau.cp.*;
 import org.apache.juneau.svl.vars.*;
 
@@ -25,7 +30,7 @@ import org.apache.juneau.svl.vars.*;
  * <br>The variable key can contain anything, even nested variables that get 
recursively resolved.
  *
  * <p>
- * Variables are defined through the {@link VarResolverBuilder#vars(Class[])} 
method.
+ * Variables are defined through the {@link Builder#vars(Class[])} method.
  *
  * <p>
  * The {@link Var} interface defines how variables are converted to values.
@@ -79,30 +84,35 @@ public class VarResolver {
         *      <li><c>$ST{arg,start[,end]}</c> - {@link SubstringVar}
         * </ul>
         */
-       public static final VarResolver DEFAULT = new 
VarResolverBuilder().defaultVars().build();
+       public static final VarResolver DEFAULT = 
create().defaultVars().build();
 
-       final VarResolverContext ctx;
+       final Var[] vars;
+       private final Map<String,Var> varMap;
+       final BeanStore beanStore;
 
        /**
-        * Instantiates a new clean-slate {@link VarResolverBuilder} object.
-        *
-        * <p>
-        * This is equivalent to simply calling <code><jk>new</jk> 
VarResolverBuilder()</code>.
+        * Instantiates a new clean-slate {@link Builder} object.
         *
-        * @return A new {@link VarResolverBuilder} object.
+        * @return A new {@link Builder} object.
         */
-       public static VarResolverBuilder create() {
-               return new VarResolverBuilder();
+       public static Builder create() {
+               return new Builder();
        }
 
        /**
         * Constructor.
         *
-        * @param vars The var classes
-        * @param contextObjects
+        * @param builder The builder for this object.
         */
-       VarResolver(Var[] vars, BeanStore beanStore) {
-               this.ctx = new VarResolverContext(vars, beanStore);
+       protected VarResolver(Builder builder) {
+               this.vars = builder.vars.toArray(new Var[builder.vars.size()]);
+
+               Map<String,Var> m = new ConcurrentSkipListMap<>();
+               for (Var v : vars)
+                       m.put(v.getName(), v);
+
+               this.varMap = AMap.unmodifiable(m);
+               this.beanStore = BeanStore.of(builder.beanStore);
        }
 
        /**
@@ -110,17 +120,216 @@ public class VarResolver {
         *
         * @return A new var resolver builder.
         */
-       public VarResolverBuilder copy() {
-               return new VarResolverBuilder(this);
+       public Builder copy() {
+               return new Builder(this);
+       }
+
+       /**
+        * Builder class for building instances of {@link VarResolver}.
+        */
+       public static class Builder {
+
+               final List<Var> vars;
+               BeanStore beanStore;
+               VarResolver impl;
+
+               /**
+                * Constructor.
+                */
+               protected Builder() {
+                       vars = AList.create();
+                       beanStore = BeanStore.create().build();
+               }
+
+               /**
+                * Copy constructor.
+                *
+                * @param copyFrom The bean to copy from.
+                */
+               protected Builder(VarResolver copyFrom) {
+                       vars = new ArrayList<>(Arrays.asList(copyFrom.vars));
+                       beanStore = BeanStore.of(copyFrom.beanStore);
+               }
+
+               /**
+                * Copy constructor.
+                *
+                * @param copyFrom The builder to copy from.
+                */
+               protected Builder(Builder copyFrom) {
+                       vars = new ArrayList<>(copyFrom.vars);
+                       beanStore = BeanStore.of(copyFrom.beanStore);
+                       impl = copyFrom.impl;
+               }
+
+               /**
+                * Register new variables with this resolver.
+                *
+                * @param values
+                *      The variable resolver classes.
+                *      These classes must subclass from {@link Var} and have 
no-arg constructors.
+                * @return This object .
+                */
+               public Builder vars(Class<?>...values) {
+                       for (Class<?> v : values)
+                               vars.add(castOrCreate(Var.class, v));
+                       return this;
+               }
+
+               /**
+                * Register new variables with this resolver.
+                *
+                * @param values
+                *      The variable resolver classes.
+                *      These classes must subclass from {@link Var} and have 
no-arg constructors.
+                * @return This object .
+                */
+               public Builder vars(Var...values) {
+                       vars.addAll(Arrays.asList(values));
+                       return this;
+               }
+
+               /**
+                * Register new variables with this resolver.
+                *
+                * @param values
+                *      The variable resolver classes.
+                *      These classes must subclass from {@link Var} and have 
no-arg constructors.
+                * @return This object .
+                */
+               public Builder vars(VarList values) {
+                       for (Object o : values)
+                               vars.add(castOrCreate(Var.class, o));
+                       return this;
+               }
+
+               /**
+                * Specify a pre-instantiated bean for the {@link #build()} 
method to return.
+                *
+                * @param value The pre-instantiated bean.
+                * @return This object.
+                */
+               public Builder impl(VarResolver value) {
+                       this.impl = value;
+                       return this;
+               }
+
+               /**
+                * Adds the default variables to this builder.
+                *
+                * <p>
+                * The default variables are:
+                * <ul>
+                *      <li>{@link SystemPropertiesVar}
+                *      <li>{@link EnvVariablesVar}
+                *      <li>{@link ArgsVar}
+                *      <li>{@link ManifestFileVar}
+                *      <li>{@link SwitchVar}
+                *      <li>{@link IfVar}
+                *      <li>{@link CoalesceVar}
+                *      <li>{@link PatternMatchVar}
+                *      <li>{@link PatternReplaceVar}
+                *      <li>{@link PatternExtractVar}
+                *      <li>{@link UpperCaseVar}
+                *      <li>{@link LowerCaseVar}
+                *      <li>{@link NotEmptyVar}
+                *      <li>{@link LenVar}
+                *      <li>{@link SubstringVar}
+                * </ul>
+                *
+                * @return This object .
+                */
+               public Builder defaultVars() {
+                       return vars(
+                               SystemPropertiesVar.class,
+                               EnvVariablesVar.class,
+                               ManifestFileVar.class,
+                               ArgsVar.class,
+                               SwitchVar.class,
+                               IfVar.class,
+                               CoalesceVar.class,
+                               PatternMatchVar.class,
+                               PatternReplaceVar.class,
+                               PatternExtractVar.class,
+                               UpperCaseVar.class,
+                               LowerCaseVar.class,
+                               NotEmptyVar.class,
+                               LenVar.class,
+                               SubstringVar.class);
+               }
+
+               /**
+                * Associates a bean store with this builder.
+                *
+                * @param value The bean store to associate with this var 
resolver.
+                * @return This object .
+                */
+               public Builder beanStore(BeanStore value) {
+                       this.beanStore = BeanStore.of(value);
+                       return this;
+               }
+
+               /**
+                * Adds a bean to the bean store in this session.
+                *
+                * @param <T> The bean type.
+                * @param c The bean type.
+                * @param value The bean.
+                * @return This object .
+                */
+               public <T> Builder bean(Class<T> c, T value) {
+                       beanStore.addBean(c, value);
+                       return this;
+               }
+
+               /**
+                * Create a new var resolver using the settings in this builder.
+                *
+                * @return A new var resolver.
+                */
+               public VarResolver build() {
+                       return impl != null ? impl : new VarResolver(this);
+               }
+
+               /**
+                * Creates a copy of this builder.
+                *
+                * @return A new copy of this builder.
+                */
+               public Builder copy() {
+                       return new Builder(this);
+               }
+       }
+
+       /**
+        * Returns an unmodifiable map of {@link Var Vars} associated with this 
context.
+        *
+        * @return A map whose keys are var names (e.g. <js>"S"</js>) and 
values are {@link Var} instances.
+        */
+       protected Map<String,Var> getVarMap() {
+               return varMap;
+       }
+
+       /**
+        * Returns an array of variables define in this variable resolver 
context.
+        *
+        * @return A new array containing the variables in this context.
+        */
+       protected Var[] getVars() {
+               return Arrays.copyOf(vars, vars.length);
        }
 
        /**
-        * Returns the read-only properties on this variable resolver.
+        * Adds a bean to this session.
         *
-        * @return The read-only properties on this variable resolver.
+        * @param <T> The bean type.
+        * @param c The bean type.
+        * @param value The bean.
+        * @return This object .
         */
-       public VarResolverContext getContext() {
-               return ctx;
+       public <T> VarResolver addBean(Class<T> c, T value) {
+               beanStore.addBean(c, value);
+               return this;
        }
 
        /**
@@ -129,7 +338,7 @@ public class VarResolver {
         * @return A new resolver session.
         */
        public VarResolverSession createSession() {
-               return new VarResolverSession(ctx, null);
+               return new VarResolverSession(this, null);
        }
 
        /**
@@ -139,7 +348,7 @@ public class VarResolver {
         * @return A new resolver session.
         */
        public VarResolverSession createSession(BeanStore beanStore) {
-               return new VarResolverSession(ctx, beanStore);
+               return new VarResolverSession(this, beanStore);
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverBuilder.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverBuilder.java
deleted file mode 100644
index 54ae243..0000000
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverBuilder.java
+++ /dev/null
@@ -1,170 +0,0 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-package org.apache.juneau.svl;
-
-import static org.apache.juneau.internal.ClassUtils.*;
-
-import java.util.*;
-
-import org.apache.juneau.collections.*;
-import org.apache.juneau.cp.*;
-import org.apache.juneau.svl.vars.*;
-
-/**
- * Builder class for building instances of {@link VarResolver}.
- *
- * <ul class='seealso'>
- *     <li class='link'>{@doc VarResolvers}
- * </ul>
- */
-public class VarResolverBuilder {
-
-       private final List<Var> vars;
-       private BeanStore beanStore;
-
-       /**
-        * Constructor.
-        */
-       public VarResolverBuilder() {
-               vars = AList.create();
-               beanStore = BeanStore.create().build();
-       }
-
-       /**
-        * Copy constructor.
-        *
-        * @param copyFrom The bean to copy from.
-        */
-       public VarResolverBuilder(VarResolver copyFrom) {
-               vars = new ArrayList<>(Arrays.asList(copyFrom.ctx.vars));
-               beanStore = BeanStore.of(copyFrom.ctx.beanStore);
-       }
-
-       /**
-        * Create a new var resolver using the settings in this builder.
-        *
-        * @return A new var resolver.
-        */
-       public VarResolver build() {
-               return new VarResolver(vars.toArray(new Var[vars.size()]), 
beanStore);
-       }
-
-       /**
-        * Register new variables with this resolver.
-        *
-        * @param vars
-        *      The variable resolver classes.
-        *      These classes must subclass from {@link Var} and have no-arg 
constructors.
-        * @return This object (for method chaining).
-        */
-       public VarResolverBuilder vars(Class<?>...vars) {
-               for (Class<?> v : vars)
-                       this.vars.add(castOrCreate(Var.class, v));
-               return this;
-       }
-
-       /**
-        * Register new variables with this resolver.
-        *
-        * @param vars
-        *      The variable resolver classes.
-        *      These classes must subclass from {@link Var} and have no-arg 
constructors.
-        * @return This object (for method chaining).
-        */
-       public VarResolverBuilder vars(Var...vars) {
-               this.vars.addAll(Arrays.asList(vars));
-               return this;
-       }
-
-       /**
-        * Register new variables with this resolver.
-        *
-        * @param vars
-        *      The variable resolver classes.
-        *      These classes must subclass from {@link Var} and have no-arg 
constructors.
-        * @return This object (for method chaining).
-        */
-       public VarResolverBuilder vars(VarList vars) {
-               for (Object o : vars)
-                       this.vars.add(castOrCreate(Var.class, o));
-               return this;
-       }
-
-       /**
-        * Adds the default variables to this builder.
-        *
-        * <p>
-        * The default variables are:
-        * <ul>
-        *      <li>{@link SystemPropertiesVar}
-        *      <li>{@link EnvVariablesVar}
-        *      <li>{@link ArgsVar}
-        *      <li>{@link ManifestFileVar}
-        *      <li>{@link SwitchVar}
-        *      <li>{@link IfVar}
-        *      <li>{@link CoalesceVar}
-        *      <li>{@link PatternMatchVar}
-        *      <li>{@link PatternReplaceVar}
-        *      <li>{@link PatternExtractVar}
-        *      <li>{@link UpperCaseVar}
-        *      <li>{@link LowerCaseVar}
-        *      <li>{@link NotEmptyVar}
-        *      <li>{@link LenVar}
-        *      <li>{@link SubstringVar}
-        * </ul>
-        *
-        * @return This object (for method chaining).
-        */
-       public VarResolverBuilder defaultVars() {
-               return vars(
-                       SystemPropertiesVar.class,
-                       EnvVariablesVar.class,
-                       ManifestFileVar.class,
-                       ArgsVar.class,
-                       SwitchVar.class,
-                       IfVar.class,
-                       CoalesceVar.class,
-                       PatternMatchVar.class,
-                       PatternReplaceVar.class,
-                       PatternExtractVar.class,
-                       UpperCaseVar.class,
-                       LowerCaseVar.class,
-                       NotEmptyVar.class,
-                       LenVar.class,
-                       SubstringVar.class);
-       }
-
-       /**
-        * Associates a bean store with this builder.
-        *
-        * @param value The bean store to associate with this var resolver.
-        * @return This object (for method chaining).
-        */
-       public VarResolverBuilder beanStore(BeanStore value) {
-               this.beanStore = BeanStore.of(value);
-               return this;
-       }
-
-       /**
-        * Adds a bean to the bean store in this session.
-        *
-        * @param <T> The bean type.
-        * @param c The bean type.
-        * @param value The bean.
-        * @return This object (for method chaining).
-        */
-       public <T> VarResolverBuilder bean(Class<T> c, T value) {
-               beanStore.addBean(c, value);
-               return this;
-       }
-}
\ No newline at end of file
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverContext.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverContext.java
deleted file mode 100644
index 48d1e86..0000000
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverContext.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// 
***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
-// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
-// * with the License.  You may obtain a copy of the License at                
                                              *
-// *                                                                           
                                              *
-// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
-// *                                                                           
                                              *
-// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
-// * specific language governing permissions and limitations under the 
License.                                              *
-// 
***************************************************************************************************************************
-package org.apache.juneau.svl;
-
-import java.util.*;
-import java.util.concurrent.*;
-
-import org.apache.juneau.collections.*;
-import org.apache.juneau.cp.*;
-
-/**
- * Configurable properties on the {@link VarResolver} class.
- *
- * <p>
- * Used to associate {@link Var Vars} and context objects with {@link 
VarResolver VarResolvers}.
- *
- * <ul class='seealso'>
- *     <li class='link'>{@doc VarResolvers}
- * </ul>
- */
-public class VarResolverContext {
-
-       final Var[] vars;
-       private final Map<String,Var> varMap;
-       final BeanStore beanStore;
-
-       /**
-        * Constructor.
-        *
-        * @param vars The Var classes used for resolving string variables.
-        * @param beanStore Used to resolve beans needed by individual vars.
-        */
-       public VarResolverContext(Var[] vars, BeanStore beanStore) {
-
-               this.vars = vars;
-
-               Map<String,Var> m = new ConcurrentSkipListMap<>();
-               for (Var v : vars)
-                       m.put(v.getName(), v);
-
-               this.varMap = AMap.unmodifiable(m);
-               this.beanStore = BeanStore.of(beanStore);
-       }
-
-       /**
-        * Returns an unmodifiable map of {@link Var Vars} associated with this 
context.
-        *
-        * @return A map whose keys are var names (e.g. <js>"S"</js>) and 
values are {@link Var} instances.
-        */
-       protected Map<String,Var> getVarMap() {
-               return varMap;
-       }
-
-       /**
-        * Returns an array of variables define in this variable resolver 
context.
-        *
-        * @return A new array containing the variables in this context.
-        */
-       protected Var[] getVars() {
-               return Arrays.copyOf(vars, vars.length);
-       }
-
-       /**
-        * Adds a bean to this session.
-        *
-        * @param <T> The bean type.
-        * @param c The bean type.
-        * @param value The bean.
-        * @return This object (for method chaining).
-        */
-       public <T> VarResolverContext addBean(Class<T> c, T value) {
-               beanStore.addBean(c, value);
-               return this;
-       }
-}
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
index 6912579..3205647 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
@@ -44,7 +44,7 @@ import org.apache.juneau.internal.*;
  */
 public class VarResolverSession {
 
-       private final VarResolverContext context;
+       private final VarResolver context;
        private final BeanStore beanStore;
 
        /**
@@ -56,7 +56,7 @@ public class VarResolverSession {
         * @param beanStore The bean store to use for resolving beans needed by 
vars.
         *
         */
-       public VarResolverSession(VarResolverContext context, BeanStore 
beanStore) {
+       public VarResolverSession(VarResolver context, BeanStore beanStore) {
                this.context = context;
                this.beanStore = BeanStore.of(beanStore);
        }
diff --git 
a/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/Microservice.java
 
b/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/Microservice.java
index cb928a5..abe770b 100755
--- 
a/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/Microservice.java
+++ 
b/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/Microservice.java
@@ -195,7 +195,7 @@ public class Microservice implements ConfigEventListener {
                // Try to resolve the configuration if not specified.
                // 
--------------------------------------------------------------------------------
                Config config = builder.config;
-               ConfigBuilder configBuilder = 
builder.configBuilder.varResolver(builder.varResolverBuilder.build()).store(ConfigMemoryStore.DEFAULT);
+               ConfigBuilder configBuilder = 
builder.configBuilder.varResolver(builder.varResolver.build()).store(ConfigMemoryStore.DEFAULT);
                if (config == null) {
                        ConfigStore store = builder.configStore;
                        ConfigFileStore cfs = workingDir == null ? 
ConfigFileStore.DEFAULT : 
ConfigFileStore.create().directory(workingDir).build();
@@ -225,8 +225,7 @@ public class Microservice implements ConfigEventListener {
                
//-------------------------------------------------------------------------------------------------------------
                // Var resolver.
                
//-------------------------------------------------------------------------------------------------------------
-               VarResolverBuilder varResolverBuilder = 
builder.varResolverBuilder;
-               this.varResolver = varResolverBuilder.bean(Config.class, 
config).build();
+               this.varResolver = builder.varResolver.bean(Config.class, 
config).build();
 
                // 
--------------------------------------------------------------------------------
                // Initialize console commands.
diff --git 
a/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/MicroserviceBuilder.java
 
b/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/MicroserviceBuilder.java
index ca5f255..5319a1a 100644
--- 
a/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/MicroserviceBuilder.java
+++ 
b/juneau-microservice/juneau-microservice-core/src/main/java/org/apache/juneau/microservice/MicroserviceBuilder.java
@@ -48,7 +48,7 @@ public class MicroserviceBuilder {
        ConfigBuilder configBuilder = Config.create();
        Boolean consoleEnabled;
        List<ConsoleCommand> consoleCommands = new ArrayList<>();
-       VarResolverBuilder varResolverBuilder = 
VarResolver.create().defaultVars().vars(ConfigVar.class);
+       VarResolver.Builder varResolver = 
VarResolver.create().defaultVars().vars(ConfigVar.class);
        Scanner consoleReader;
        PrintWriter consoleWriter;
        MicroserviceListener listener;
@@ -72,7 +72,7 @@ public class MicroserviceBuilder {
                this.logConfig = copyFrom.logConfig == null ? null : 
copyFrom.logConfig.copy();
                this.consoleEnabled = copyFrom.consoleEnabled;
                this.configBuilder = copyFrom.configBuilder;
-               this.varResolverBuilder = copyFrom.varResolverBuilder;
+               this.varResolver = copyFrom.varResolver;
                this.consoleReader = copyFrom.consoleReader;
                this.consoleWriter = copyFrom.consoleWriter;
                this.workingDir = copyFrom.workingDir;
@@ -367,7 +367,7 @@ public class MicroserviceBuilder {
         */
        @SuppressWarnings("unchecked")
        public MicroserviceBuilder vars(Class<? extends Var>...vars) {
-               varResolverBuilder.vars(vars);
+               varResolver.vars(vars);
                return this;
        }
 
@@ -384,7 +384,7 @@ public class MicroserviceBuilder {
         * @return This object (for method chaining).
         */
        public <T> MicroserviceBuilder varBean(Class<T> c, T value) {
-               varResolverBuilder.bean(c, value);
+               varResolver.bean(c, value);
                return this;
        }
 
diff --git 
a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockRestClient.java
 
b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockRestClient.java
index 240e6e6..ca9436f 100644
--- 
a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockRestClient.java
+++ 
b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock/MockRestClient.java
@@ -280,7 +280,7 @@ public class MockRestClient extends RestClient implements 
HttpClientConnection {
                                boolean isClass = restBean instanceof Class;
                                Object o = isClass ? 
((Class<?>)restBean).newInstance() : restBean;
                                RestContext rc = RestContext
-                                       .create(null, null, null, o)
+                                       .create(o.getClass(), null, null)
                                        .init(o)
                                        
.callLoggerDefault(BasicTestRestLogger.class)
                                        .debugDefault(CONDITIONAL)
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index 60be7c5..c29107e 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -103,6 +103,52 @@ public class RestContext extends Context {
                return Collections.unmodifiableMap(REGISTRY);
        }
 
+       /**
+        * Static create method.
+        *
+        * <p>
+        * This is the primary method for creating {@link RestContextBuilder} 
objects.
+        *
+        * <p>
+        * The builder class can be subclassed by using the {@link 
Rest#builder()} annotation.
+        * This can be useful when you want to perform any customizations on 
the builder class, typically by overriding protected methods that create
+        *      the various builders used in the created {@link RestContext} 
object (which itself can be overridden via {@link 
RestContextBuilder#contextClass(Class)}).
+        * The subclass must contain a public constructor that takes in the 
same arguments passed in to this method.
+        *
+        * @param resourceClass
+        *      The class annotated with <ja>@Rest</ja>.
+        *      <br>Must not be <jk>null</jk>.
+        * @param parentContext
+        *      The parent context if the REST bean was registered via {@link 
Rest#children()}.
+        *      <br>Can be <jk>null</jk> if the bean is a top-level resource.
+        * @param servletConfig
+        *      The servlet config passed into the servlet by the servlet 
container.
+        *      <br>Can be <jk>null</jk> if not available.
+        *      <br>If <jk>null</jk>, then some features (such as access to 
servlet init params) will not be available.
+        *
+        * @return A new builder object.
+        * @throws ServletException Something bad happened.
+        */
+       public static RestContextBuilder create(Class<?> resourceClass, 
RestContext parentContext, ServletConfig servletConfig) throws ServletException 
{
+
+               Value<Class<? extends RestContextBuilder>> v = 
Value.of(RestContextBuilder.class);
+               ClassInfo.of(resourceClass)
+                       .getAnnotations(Rest.class)
+                       .stream()
+                       .filter(x -> x.builder() != 
RestContextBuilder.Null.class)
+                       .forEach(x -> v.set(x.builder()));
+
+               if (v.get() == RestContextBuilder.class)
+                       return new RestContextBuilder(resourceClass, 
parentContext, servletConfig);
+
+               return BeanStore
+                       .of(parentContext == null ? null : 
parentContext.getRootBeanStore())
+                       .addBean(Class.class, resourceClass)
+                       .addBean(RestContext.class, parentContext)
+                       .addBean(ServletConfig.class, servletConfig)
+                       .createBean(v.get());
+       }
+
        
//-------------------------------------------------------------------------------------------------------------------
        // Instance
        
//-------------------------------------------------------------------------------------------------------------------
@@ -181,27 +227,6 @@ public class RestContext extends Context {
        final StaticFiles staticFilesDefault;
        final FileFinder fileFinderDefault;
 
-       /**
-        * Constructor.
-        *
-        * @param parentContext
-        *      The parent context if the REST bean was registered via {@link 
Rest#children()}.
-        *      <br>Can be <jk>null</jk> if the bean is a top-level resource.
-        * @param servletConfig
-        *      The servlet config passed into the servlet by the servlet 
container.
-        *      <br>Can be null if not available.,
-        * @param resourceClass
-        *      The class annotated with <ja>@Rest</ja>.
-        *      <br>Can be <jk>null</jk> if the resource bean is provided.
-        * @param resource
-        *      The resource bean.
-        *      <br>Can be <jk>null</jk> if not instantiated at the time of 
this method call.
-        * @return A new builder object.
-        * @throws ServletException Something bad happened.
-        */
-       public static RestContextBuilder create(RestContext parentContext, 
ServletConfig servletConfig, Class<?> resourceClass, Object resource) throws 
ServletException {
-               return new 
RestContextBuilder(Optional.ofNullable(parentContext), 
Optional.ofNullable(servletConfig), resource == null ? resourceClass : 
resource.getClass(), Optional.ofNullable(resource));
-       }
 
        /**
         * Constructor.
@@ -1377,7 +1402,7 @@ public class RestContext extends Context {
                VarResolver x = 
beanStore.getBean(VarResolver.class).orElse(null);
 
                if (x == null)
-                       x = builder.varResolverBuilder
+                       x = builder.varResolver
                                .vars(createVars(resource, builder, beanStore))
                                .bean(Messages.class, messages)
                                .build();
@@ -2047,7 +2072,7 @@ public class RestContext extends Context {
                                // Don't allow specifying yourself as a child.  
Causes an infinite loop.
                                if (oc == builder.resourceClass)
                                        continue;
-                               cb = RestContext.create(this, servletConfig, 
oc, null);
+                               cb = RestContext.create(oc, this, 
servletConfig);
                                BeanStore bf = BeanStore.of(beanStore, 
resource).addBean(RestContextBuilder.class, cb);
                                if (bf.getBean(oc).isPresent()) {
                                        o = 
(Supplier<?>)()->bf.getBean(oc).get();  // If we resolved via injection, always 
get it this way.
@@ -2055,7 +2080,7 @@ public class RestContext extends Context {
                                        o = bf.createBean(oc);
                                }
                        } else {
-                               cb = RestContext.create(this, servletConfig, 
o.getClass(), o);
+                               cb = RestContext.create(o.getClass(), this, 
servletConfig);
                        }
 
                        if (path != null)
@@ -2387,8 +2412,6 @@ public class RestContext extends Context {
         * </p>
         *
         * <ul class='seealso'>
-        *      <li class='jm'>{@link 
org.apache.juneau.rest.RestContextBuilder#vars(Class...)} - For adding custom 
vars.
-        *      <li class='link'>{@doc RestSvlVariables}
         *      <li class='link'>{@doc RestSvlVariables}
         * </ul>
         *
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
index 0a634d1..42500b6 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
@@ -20,6 +20,7 @@ import static org.apache.juneau.parser.Parser.*;
 import static org.apache.juneau.rest.HttpRuntimeException.*;
 import static org.apache.juneau.serializer.Serializer.*;
 import static java.util.Arrays.*;
+import static java.util.Optional.*;
 
 import java.lang.annotation.*;
 import java.lang.reflect.Method;
@@ -64,7 +65,7 @@ import org.apache.juneau.utils.*;
  * Provides access to the following initialized resources:
  * <ul>
  *     <li>{@link #getConfig()} - The external configuration for this resource.
- *     <li>{@link #getVarResolverBuilder()} - The variable resolver for this 
resource.
+ *     <li>{@link #varResolver()} - The variable resolver for this resource.
  * </ul>
  *
  * <p>
@@ -98,6 +99,16 @@ import org.apache.juneau.utils.*;
 @FluentSetters(ignore={"set"})
 public class RestContextBuilder extends ContextBuilder implements 
ServletConfig {
 
+       /**
+        * Represents a <jk>null</jk> value for the {@link Rest#builder()} 
annotation.
+        */
+       @SuppressWarnings("javadoc")
+       public static final class Null extends RestContextBuilder {
+               protected Null(Class<?> resourceClass, RestContext 
parentContext, ServletConfig servletConfig) throws ServletException {
+                       super(resourceClass, parentContext, servletConfig);
+               }
+       }
+
        final ServletConfig inner;
        final Class<?> resourceClass;
        final RestContext parentContext;
@@ -113,7 +124,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
        ServletContext servletContext;
 
        Config config;
-       VarResolverBuilder varResolverBuilder;
+       VarResolver.Builder varResolver;
        String
                allowedHeaderParams = env("RestContext.allowedHeaderParams", 
"Accept,Content-Type"),
                allowedMethodHeaders = env("RestContext.allowedMethodHeaders", 
""),
@@ -217,44 +228,38 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
 
        /**
         * Constructor.
-        *
+        * @param resourceClass The resource class.
         * @param parentContext The parent context if this is a child of 
another resource.
         * @param servletConfig The servlet config if available.
-        * @param resourceClass The resource class.
-        * @param resource The resource object if available.
+        *
         * @throws ServletException Initialization failed.
         */
-       protected RestContextBuilder(Optional<RestContext> parentContext, 
Optional<ServletConfig> servletConfig, Class<?> resourceClass, Optional<Object> 
resource) throws ServletException {
+       protected RestContextBuilder(Class<?> resourceClass, RestContext 
parentContext, ServletConfig servletConfig) throws ServletException {
                try {
                        contextClass(RestContext.class);
 
                        this.resourceClass = resourceClass;
-                       this.inner = servletConfig.orElse(null);
-                       this.parentContext = parentContext.orElse(null);
+                       this.inner = servletConfig;
+                       this.parentContext = parentContext;
 
                        ClassInfo rci = ClassInfo.of(resourceClass);
 
                        // Pass-through default values.
-                       if (parentContext.isPresent()) {
-                               RestContext pc = parentContext.get();
-                               callLoggerDefault = pc.callLoggerDefault;
-                               debugDefault = pc.debugDefault;
-                               staticFilesDefault.value(pc.staticFilesDefault);
-                               fileFinderDefault.value(pc.fileFinderDefault);
+                       if (parentContext != null) {
+                               callLoggerDefault = 
parentContext.callLoggerDefault;
+                               debugDefault = parentContext.debugDefault;
+                               
staticFilesDefault.value(parentContext.staticFilesDefault);
+                               
fileFinderDefault.value(parentContext.fileFinderDefault);
                        }
 
-                       beanStore = createBeanStore(parentContext, resource);
+                       beanStore = createBeanStore(resourceClass, 
parentContext);
                        beanStore.addBean(RestContextBuilder.class, this);
-                       beanStore.addBean(ServletConfig.class, 
servletConfig.orElse(this));
-                       beanStore.addBean(ServletContext.class, 
servletConfig.orElse(this).getServletContext());
+                       beanStore.addBean(ServletConfig.class, 
ofNullable(servletConfig).orElse(this));
+                       beanStore.addBean(ServletContext.class, 
ofNullable(servletConfig).orElse(this).getServletContext());
 
-                       varResolverBuilder = new VarResolverBuilder()
-                               .defaultVars()
-                               .vars(ConfigVar.class)
-                               .vars(FileVar.class)
-                               .bean(FileFinder.class, 
FileFinder.create().cp(resourceClass,null,true).build());
+                       varResolver = createVarResolver(resourceClass, 
beanStore);
 
-                       VarResolver vr = varResolverBuilder.build();
+                       VarResolver vr = varResolver.build();
                        beanStore.addBean(VarResolver.class, vr);
 
                        // Find our config file.  It's the last non-empty 
@RestResource(config).
@@ -262,16 +267,15 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                        beanStore.addBean(Config.class, config);
 
                        // Add our config file to the variable resolver.
-                       varResolverBuilder.bean(Config.class, config);
-                       vr = varResolverBuilder.build();
+                       varResolver.bean(Config.class, config);
+                       vr = varResolver.build();
                        beanStore.addBean(VarResolver.class, vr);
 
                        // Add the servlet init parameters to our properties.
-                       if (servletConfig.isPresent()) {
-                               ServletConfig sc = servletConfig.get();
-                               for (Enumeration<String> ep = 
sc.getInitParameterNames(); ep.hasMoreElements();) {
+                       if (servletConfig != null) {
+                               for (Enumeration<String> ep = 
servletConfig.getInitParameterNames(); ep.hasMoreElements();) {
                                        String p = ep.nextElement();
-                                       String initParam = 
sc.getInitParameter(p);
+                                       String initParam = 
servletConfig.getInitParameter(p);
                                        set(vr.resolve(p), 
vr.resolve(initParam));
                                }
                        }
@@ -300,27 +304,152 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
        }
 
        /**
+        * Returns access to the bean store being used by this builder.
+        *
+        * <p>
+        * Can be used to add more beans to the bean store.
+        *
+        * <p>
+        * The bean store is created by the constructor using the {@link 
#createBeanStore(Class,RestContext)} method and is initialized with the 
following beans:
+        * <ul>
+        *      <li>{@link RestContextBuilder}
+        *      <li>{@link ServletConfig}
+        *      <li>{@link ServletContext}
+        *      <li>{@link VarResolver}
+        *      <li>{@link Config}
+        * </ul>
+        *
+        * @return The bean store being used by this builder.
+        */
+       protected BeanStore beanStore() {
+               return beanStore;
+       }
+
+       /**
         * Creates the bean store for this builder.
         *
+        * <p>
+        * Gets called in the constructor to create the bean store used for 
finding other beans.
+        *
+        * <p>
+        * The bean store is created with the parent root bean store as the 
parent, allowing any beans in the root bean store to be available
+        * in this builder.  The root bean store typically pulls from an 
injection framework such as Spring to allow injected beans to be used.
+        *
+        * The resource class can optionally define a <c><jk>public static</jk> 
BeanStore <jsm>createBeanStore</jk>(...);</c> method to override
+        * the default bean store created by this method.  The parameters can 
be any beans available in the root bean store (such as any available
+        * Spring beans if the top level resource is an instance of 
SpringRestServlet).
+        *
+        * @param resourceClass The resource class.
         * @param parentContext The parent context if there is one.
-        * @param resource The resource object if it's instantiated at this 
time.
         * @return A new bean store.
-        * @throws Exception If bean store could not be instantiated.
         */
-       protected BeanStore createBeanStore(Optional<RestContext> 
parentContext, Optional<Object> resource) throws Exception {
-               BeanStore x = null;
-               if (resource.isPresent()) {
-                       Object r = resource.get();
-                       x = BeanStore
-                               .of(parentContext.isPresent() ? 
parentContext.get().getRootBeanStore() : null, r)
-                               .beanCreateMethodFinder(BeanStore.class, 
resource)
-                               .find("createBeanStore")
-                               .run();
+       protected BeanStore createBeanStore(Class<?> resourceClass, RestContext 
parentContext) {
+
+               BeanStore x = BeanStore
+                       .of(parentContext == null ? null : 
parentContext.getRootBeanStore())
+                       .beanCreateMethodFinder(BeanStore.class, resourceClass)
+                       .find("createBeanStore")
+                       .run();
+
+               if (x == null && parentContext != null)
+                       x = parentContext.getRootBeanStore();
+
+               if (x == null)
+                       x = BeanStore.create().build();
+
+               return x;
+       }
+
+       /**
+        * Returns access to the variable resolver builder.
+        *
+        * <p>
+        * Can be used to add more variables or context objects to the variable 
resolver.
+        * These variables affect the variable resolver returned by {@link 
RestRequest#getVarResolverSession()} which is
+        * used to resolve string variables of the form <js>"$X{...}"</js> in 
various places such as annotations on the REST class and methods.
+        *
+        * <p>
+        * The var resolver is created by the constructor using the {@link 
#createVarResolver(Class,BeanStore)} method and is initialized with the 
following beans:
+        * <ul>
+        *      <li>{@link ConfigVar}
+        *      <li>{@link FileVar}
+        *      <li>{@link SystemPropertiesVar}
+        *      <li>{@link EnvVariablesVar}
+        *      <li>{@link ArgsVar}
+        *      <li>{@link ManifestFileVar}
+        *      <li>{@link SwitchVar}
+        *      <li>{@link IfVar}
+        *      <li>{@link CoalesceVar}
+        *      <li>{@link PatternMatchVar}
+        *      <li>{@link PatternReplaceVar}
+        *      <li>{@link PatternExtractVar}
+        *      <li>{@link UpperCaseVar}
+        *      <li>{@link LowerCaseVar}
+        *      <li>{@link NotEmptyVar}
+        *      <li>{@link LenVar}
+        *      <li>{@link SubstringVar}
+        * </ul>
+        *
+        * @return The var resolver builder.
+        */
+       protected VarResolver.Builder varResolver() {
+               return varResolver;
+       }
+
+       /**
+        * Creates the var resolver builder.
+        *
+        * <p>
+        * Gets called in the constructor to create the var resolver for 
performing variable resolution in strings.
+        *
+        * <p>
+        * Instantiates based on the following logic:
+        * <ol>
+        *      <li>Looks for the following method on the resource class and 
sets it as the implementation bean:
+        *              <br><c><jk>public static</jk> VarResolver 
createVarResolver(<any-bean-types-in-bean-store>) {}</c>
+        *      <li>Looks for bean of type {@link 
org.apache.juneau.svl.VarResolver} in bean store and sets it as the 
implementation bean.
+        *      <li>Looks for the following method on the resource class:
+        *              <br><c><jk>public static</jk> VarResolver.Builder 
createVarResolver(<any-bean-types-in-bean-store>) {}</c>
+        *      <li>Looks for bean of type {@link 
org.apache.juneau.svl.VarResolver.Builder} in bean store and returns a copy of 
it.
+        *      <li>Creates a default builder with default variables.
+        * </ol>
+        *
+        * @param resourceClass The resource class.
+        * @param beanStore The bean store containing injected beans.
+        * @return A new bean store.
+        */
+       protected VarResolver.Builder createVarResolver(Class<?> resourceClass, 
BeanStore beanStore) {
+
+               VarResolver.Builder x = BeanStore
+                       .of(beanStore)
+                       .beanCreateMethodFinder(VarResolver.Builder.class, 
resourceClass)
+                       .find("createVarResolver")
+                       .run();
+
+               if (x == null) {
+                       x = beanStore.getBean(VarResolver.Builder.class).map(y 
-> y.copy()).orElse(null);
                }
-               if (x == null && parentContext.isPresent()) {
-                       x = parentContext.get().getRootBeanStore();
+
+               if (x == null) {
+                       x = VarResolver.create()
+                               .defaultVars()
+                               .vars(ConfigVar.class)
+                               .vars(FileVar.class)
+                               .bean(FileFinder.class, 
FileFinder.create().cp(resourceClass,null,true).build());
                }
-               return BeanStore.of(x, resource.orElse(null));
+
+               VarResolver.Builder x2 = x;
+
+               beanStore.getBean(VarResolver.class).ifPresent(y -> x2.impl(y));
+
+               BeanStore
+                       .of(beanStore)
+                       .beanCreateMethodFinder(VarResolver.class, 
resourceClass)
+                       .find("createVarResolver")
+                       .execute()
+                       .ifPresent(y -> x2.impl(y));
+
+               return x2;
        }
 
        /**
@@ -371,9 +500,9 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
 
        /**
         * Performs initialization on this builder.
-        * 
+        *
         * Calls all @RestHook(INIT) methods on the specified resource object.
-        * 
+        *
         * @param resource The resource bean. Required.
         * @return This object.
         * @throws ServletException If hook method calls failed.
@@ -409,49 +538,6 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
        }
 
        /**
-        * Adds the specified {@link Var} classes to this config.
-        *
-        * <p>
-        * These variables affect the variable resolver returned by {@link 
RestRequest#getVarResolverSession()} which is
-        * used to resolve string variables of the form <js>"$X{...}"</js>.
-        *
-        * <p>
-        * See {@link RestContext#getVarResolver()} for a list of predefined 
variables.
-        *
-        * @param vars The {@link Var} classes to add to this config.
-        * @return This object (for method chaining).
-        */
-       public RestContextBuilder vars(Class<?>...vars) {
-               this.varResolverBuilder.vars(vars);
-               return this;
-       }
-
-       /**
-        * Adds a var context object to this config.
-        *
-        * <p>
-        * Var context objects are read-only objects associated with the 
variable resolver for vars that require external
-        * information.
-        *
-        * <p>
-        * For example, the {@link ConfigVar} needs access to this resource's 
{@link Config} object
-        *
-        * In this case, we call the following code to add it to the context 
map:
-        * <p class='bcode w800'>
-        *      config.varBean(Config.<jk>class</jk>, configFile);
-        * </p>
-        *
-        * @param beanType The bean type being added.
-        * @param bean The bean being added.
-        * @param <T> The bean type being added.
-        * @return This object (for method chaining).
-        */
-       public <T> RestContextBuilder varBean(Class<T> beanType, T bean) {
-               this.varResolverBuilder.bean(beanType, bean);
-               return this;
-       }
-
-       /**
         * Overwrites the default config file with a custom config file.
         *
         * <p>
@@ -467,16 +553,6 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                return this;
        }
 
-       /**
-        * Creates a new {@link ContextProperties} object initialized with the 
properties defined in this config.
-        *
-        * @return A new property store.
-        */
-       protected ContextPropertiesBuilder createContextPropertiesBuilder() {
-               return ContextProperties.create();
-       }
-
-
        
//----------------------------------------------------------------------------------------------------
        // Methods that give access to the config file, var resolver, and 
properties.
        
//----------------------------------------------------------------------------------------------------
@@ -504,29 +580,6 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
        }
 
        /**
-        * Creates the variable resolver for this resource.
-        *
-        * <p>
-        * The variable resolver returned by this method can resolve the 
following variables:
-        * <ul>
-        *      <li>{@link SystemPropertiesVar}
-        *      <li>{@link EnvVariablesVar}
-        *      <li>{@link ConfigVar}
-        *      <li>{@link IfVar}
-        *      <li>{@link SwitchVar}
-        * </ul>
-        *
-        * <p>
-        * Note that the variables supported here are only a subset of those 
returned by
-        * {@link RestRequest#getVarResolverSession()}.
-        *
-        * @return The variable resolver for this resource.  Never 
<jk>null</jk>.
-        */
-       public VarResolverBuilder getVarResolverBuilder() {
-               return varResolverBuilder;
-       }
-
-       /**
         * Returns the serializer group builder containing the serializers for 
marshalling POJOs into response bodies.
         *
         * <p>
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServlet.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServlet.java
index 352c7f5..faaada2 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServlet.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServlet.java
@@ -55,7 +55,7 @@ public abstract class RestServlet extends HttpServlet {
                        if (context.get() != null)
                                return;
                        super.init(servletConfig);
-                       context.set(RestContext.create(null, servletConfig, 
this.getClass(), this).init(this).build());
+                       context.set(RestContext.create(this.getClass(), null, 
servletConfig).init(this).build());
                        context.get().postInit();
                        context.get().postInitChildFirst();
                } catch (ServletException e) {
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
index 55c3715..89c83cb 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/Rest.java
@@ -19,6 +19,8 @@ import java.lang.annotation.*;
 import java.nio.charset.*;
 import java.util.*;
 
+import javax.servlet.*;
+
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.config.*;
@@ -52,6 +54,23 @@ import org.apache.juneau.serializer.*;
 public @interface Rest {
 
        /**
+        * Override the builder class used for creating the {@link RestContext} 
bean for this resource.
+        *
+        * <p>
+        * Can be used when you want to override any of the protected methods 
in the {@link RestContextBuilder} to provide
+        * customized behavior.
+        *
+        * <p>
+        * The subclass must contain a public constructor that takes in the 
following arguments that should be passed to the parent constructor:
+        * <ul>
+        *      <li>{@link Class} - The resource class.
+        *      <li>{@link RestContext} - The parent context if this is a child 
of another resource.  Can be <jk>null</jk..
+        *      <li>{@link ServletConfig} - The servlet config passed in during 
servlet initialization.
+        * </ul>
+        */
+       Class<? extends RestContextBuilder> builder() default 
RestContextBuilder.Null.class;
+
+       /**
         * Disable body URL parameter.
         *
         * <p>
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
index da281c1..12c7225 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
@@ -77,6 +77,7 @@ public class RestAnnotation {
        @SuppressWarnings("unchecked")
        public static class Builder extends TargetedAnnotationTBuilder {
 
+               Class<? extends RestContextBuilder> builder = 
RestContextBuilder.Null.class;
                Class<? extends Encoder>[] encoders = new Class[0];
                Class<? extends HttpPartParser> partParser = 
HttpPartParser.Null.class;
                Class<? extends HttpPartSerializer> partSerializer = 
HttpPartSerializer.Null.class;
@@ -691,6 +692,7 @@ public class RestAnnotation {
 
        private static class Impl extends TargetedAnnotationTImpl implements 
Rest {
 
+               private final Class<? extends RestContextBuilder> builder;
                private final Class<? extends Encoder>[] encoders;
                private final Class<? extends HttpPartParser> partParser;
                private final Class<? extends HttpPartSerializer> 
partSerializer;
@@ -716,6 +718,7 @@ public class RestAnnotation {
 
                Impl(Builder b) {
                        super(b);
+                       this.builder = b.builder;
                        this.disableBodyParam = b.disableBodyParam;
                        this.allowedHeaderParams = b.allowedHeaderParams;
                        this.allowedMethodHeaders = b.allowedMethodHeaders;
@@ -770,6 +773,11 @@ public class RestAnnotation {
                }
 
                @Override /* Rest */
+               public Class<? extends RestContextBuilder> builder() {
+                       return builder;
+               }
+
+               @Override /* Rest */
                public String disableBodyParam() {
                        return disableBodyParam;
                }
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/config/ConfigTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/config/ConfigTest.java
index 28bcca0..6cf9fe0 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/config/ConfigTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/config/ConfigTest.java
@@ -1462,7 +1462,7 @@ public class ConfigTest {
                cf.set("d", "$B{$A{X}}");
                cf.set("e", "$D{X}");
 
-               VarResolver vr = new 
VarResolverBuilder().defaultVars().vars(ALVar.class, BLVar.class).build();
+               VarResolver vr = 
VarResolver.create().defaultVars().vars(ALVar.class, BLVar.class).build();
 
                cf = cf.resolving(vr.createSession());
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/Swagger_Test.java 
b/juneau-utest/src/test/java/org/apache/juneau/rest/Swagger_Test.java
index b238e37..9e7c82d 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/rest/Swagger_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/rest/Swagger_Test.java
@@ -45,7 +45,7 @@ public class Swagger_Test {
        public void testMethod() {}
 
        private org.apache.juneau.dto.swagger.Swagger getSwaggerWithFile(Object 
resource) throws Exception {
-               RestContext rc = 
RestContext.create(null,null,null,resource).init(resource).fileFinder(TestClasspathFileFinder.class).build();
+               RestContext rc = 
RestContext.create(resource.getClass(),null,null).init(resource).fileFinder(TestClasspathFileFinder.class).build();
                RestOpContext roc = 
RestOpContext.create(Swagger_Test.class.getMethod("testMethod"), rc).build();
                RestRequest req = rc.createRequest(new RestCall(resource, rc, 
new MockServletRequest(), new MockServletResponse()).restOpContext(roc));
                SwaggerProvider ip = rc.getSwaggerProvider();
@@ -53,7 +53,7 @@ public class Swagger_Test {
        }
 
        private static org.apache.juneau.dto.swagger.Swagger getSwagger(Object 
resource) throws Exception {
-               RestContext rc = 
RestContext.create(null,null,null,resource).init(resource).build();
+               RestContext rc = 
RestContext.create(resource.getClass(),null,null).init(resource).build();
                RestOpContext roc = 
RestOpContext.create(Swagger_Test.class.getMethod("testMethod"), rc).build();
                RestRequest req = rc.createRequest(new RestCall(resource, rc, 
new MockServletRequest(), new MockServletResponse()).restOpContext(roc));
                SwaggerProvider ip = rc.getSwaggerProvider();
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/RestAnnotation_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/RestAnnotation_Test.java
index 0ed1e2c..69e3024 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/RestAnnotation_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/RestAnnotation_Test.java
@@ -154,6 +154,7 @@ public class RestAnnotation_Test {
                                + "allowedMethodHeaders:'allowedMethodHeaders',"
                                + "allowedMethodParams:'allowedMethodParams',"
                                + "beanStore:'org.apache.juneau.cp.BeanStore',"
+                               + 
"builder:'org.apache.juneau.rest.RestContextBuilder$Null',"
                                + 
"callLogger:'org.apache.juneau.rest.logging.BasicRestLogger',"
                                + "children:['"+CNAME+"'],"
                                + "clientVersionHeader:'clientVersionHeader',"
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java 
b/juneau-utest/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java
index 1cb6b2a..5fcd8e0 100755
--- a/juneau-utest/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java
@@ -27,7 +27,7 @@ public class TestUtils extends 
org.apache.juneau.testutils.TestUtils {
        public static Swagger getSwagger(Class<?> c) {
                try {
                        Object r = c.newInstance();
-                       RestContext rc = 
RestContext.create(null,null,null,r).init(r).build();
+                       RestContext rc = 
RestContext.create(r.getClass(),null,null).init(r).build();
                        RestOpContext ctx = 
RestOpContext.create(TestUtils.class.getMethod("getSwagger", Class.class), 
rc).build();
                        RestRequest req = rc.createRequest(new RestCall(r, rc, 
new MockServletRequest(), new MockServletResponse()).restOpContext(ctx));
                        SwaggerProvider ip = rc.getSwaggerProvider();
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/svl/ResolvingOMapTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/svl/ResolvingOMapTest.java
index 55d0641..8c873f7 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/svl/ResolvingOMapTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/svl/ResolvingOMapTest.java
@@ -27,7 +27,7 @@ public class ResolvingOMapTest {
        
//====================================================================================================
        @Test
        public void testBasic() throws Exception {
-               VarResolver vr = new 
VarResolverBuilder().defaultVars().vars(XVar.class).build();
+               VarResolver vr = 
VarResolver.create().defaultVars().vars(XVar.class).build();
                OMap m = new ResolvingOMap(vr.createSession());
 
                m.put("foo", "$X{a}");
@@ -54,7 +54,7 @@ public class ResolvingOMapTest {
        
//====================================================================================================
        @Test
        public void testNulls() throws Exception {
-               VarResolver vr = new 
VarResolverBuilder().defaultVars().vars(XVar.class).build();
+               VarResolver vr = 
VarResolver.create().defaultVars().vars(XVar.class).build();
                OMap m = new ResolvingOMap(vr.createSession());
 
                m.put("foo", null);
@@ -75,7 +75,7 @@ public class ResolvingOMapTest {
        
//====================================================================================================
        @Test
        public void testNonStrings() throws Exception {
-               VarResolver vr = new 
VarResolverBuilder().defaultVars().vars(XVar.class).build();
+               VarResolver vr = 
VarResolver.create().defaultVars().vars(XVar.class).build();
                OMap m = new ResolvingOMap(vr.createSession());
 
                m.put("foo", FooEnum.ONE);
@@ -100,7 +100,7 @@ public class ResolvingOMapTest {
        
//====================================================================================================
        @Test
        public void testInner() throws Exception {
-               VarResolver vr = new 
VarResolverBuilder().defaultVars().vars(XVar.class).build();
+               VarResolver vr = 
VarResolver.create().defaultVars().vars(XVar.class).build();
                OMap m = new ResolvingOMap(vr.createSession());
                OMap m2 = new OMap();
                OMap m3 = new OMap();
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/IfVarTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/IfVarTest.java
index b18d720..182df96 100755
--- a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/IfVarTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/IfVarTest.java
@@ -26,7 +26,7 @@ public class IfVarTest {
        
//====================================================================================================
        @Test
        public void test() throws Exception {
-               VarResolver vr = new VarResolverBuilder().vars(IfVar.class, 
SystemPropertiesVar.class).build();
+               VarResolver vr = VarResolver.create().vars(IfVar.class, 
SystemPropertiesVar.class).build();
 
                for (String test : new 
String[]{"","0","false","FALSE","f","F","foobar"}) {
                        System.setProperty("IfVarTest.test", test);
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/LenVarTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/LenVarTest.java
index 17bc565..c6e4f52 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/LenVarTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/LenVarTest.java
@@ -26,7 +26,7 @@ public class LenVarTest {
        
//====================================================================================================
        @Test
        public void test() throws Exception {
-               VarResolver vr = new VarResolverBuilder().vars(LenVar.class, 
SystemPropertiesVar.class).build();
+               VarResolver vr = VarResolver.create().vars(LenVar.class, 
SystemPropertiesVar.class).build();
 
                System.setProperty("LenVarTest.test", "foo bar");
                System.setProperty("LenVarTest.test2", "1.2.3.4.5");
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/LowerCaseVarTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/LowerCaseVarTest.java
index 7b211e2..609a285 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/LowerCaseVarTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/LowerCaseVarTest.java
@@ -26,7 +26,7 @@ public class LowerCaseVarTest {
        
//====================================================================================================
        @Test
        public void test() throws Exception {
-               VarResolver vr = new 
VarResolverBuilder().vars(LowerCaseVar.class, 
SystemPropertiesVar.class).build();
+               VarResolver vr = VarResolver.create().vars(LowerCaseVar.class, 
SystemPropertiesVar.class).build();
 
                System.setProperty("LowerCaseVar.test", "fooBAR");
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/NotEmptyVarTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/NotEmptyVarTest.java
index b0b2a00..968245e 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/NotEmptyVarTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/NotEmptyVarTest.java
@@ -26,7 +26,7 @@ public class NotEmptyVarTest {
        
//====================================================================================================
        @Test
        public void test() throws Exception {
-               VarResolver vr = new 
VarResolverBuilder().vars(NotEmptyVar.class, SystemPropertiesVar.class).build();
+               VarResolver vr = VarResolver.create().vars(NotEmptyVar.class, 
SystemPropertiesVar.class).build();
 
                assertEquals("false", vr.resolve("$NE{}"));
                assertEquals("false", vr.resolve("$NE{ }"));
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/PatternExtractVarTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/PatternExtractVarTest.java
index e5fa0c8..ffc5ffa 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/PatternExtractVarTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/PatternExtractVarTest.java
@@ -26,7 +26,7 @@ public class PatternExtractVarTest {
        
//====================================================================================================
        @Test
        public void test() throws Exception {
-               VarResolver vr = new 
VarResolverBuilder().vars(PatternExtractVar.class, 
SystemPropertiesVar.class).build();
+               VarResolver vr = 
VarResolver.create().vars(PatternExtractVar.class, 
SystemPropertiesVar.class).build();
 
                System.setProperty("PatternExtractVarTest.test", "foo bar");
                System.setProperty("PatternExtractVarTest.test2", "size=23");
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/PatternMatchVarTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/PatternMatchVarTest.java
index 87ddeb3..fb9c277 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/PatternMatchVarTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/PatternMatchVarTest.java
@@ -26,7 +26,7 @@ public class PatternMatchVarTest {
        
//====================================================================================================
        @Test
        public void test() throws Exception {
-               VarResolver vr = new 
VarResolverBuilder().vars(PatternMatchVar.class, 
SystemPropertiesVar.class).build();
+               VarResolver vr = 
VarResolver.create().vars(PatternMatchVar.class, 
SystemPropertiesVar.class).build();
 
                System.setProperty("PatternMatchVarTest.test", "foobar");
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/PatternReplaceVarTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/PatternReplaceVarTest.java
index cfa437c..3775245 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/PatternReplaceVarTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/PatternReplaceVarTest.java
@@ -26,7 +26,7 @@ public class PatternReplaceVarTest {
        
//====================================================================================================
        @Test
        public void test() throws Exception {
-               VarResolver vr = new 
VarResolverBuilder().vars(PatternReplaceVar.class, 
SystemPropertiesVar.class).build();
+               VarResolver vr = 
VarResolver.create().vars(PatternReplaceVar.class, 
SystemPropertiesVar.class).build();
 
                System.setProperty("PatternReplaceVarTest.test", "foo bar");
                System.setProperty("PatternReplaceVarTest.test2", 
"size=23;display=none;");
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/RestrictedVarsTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/RestrictedVarsTest.java
index e051280..eed2cf3 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/RestrictedVarsTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/RestrictedVarsTest.java
@@ -25,7 +25,7 @@ public class RestrictedVarsTest {
 
        @Test
        public void testNoNest() throws Exception {
-               VarResolver vr = new 
VarResolverBuilder().vars(NoNestVar.class).build();
+               VarResolver vr = 
VarResolver.create().vars(NoNestVar.class).build();
 
                test(vr, "$NoNest{foo}", "foo");
                test(vr, "$NoNest{$NoNest{foo}}", "$NoNest{foo}");
@@ -63,7 +63,7 @@ public class RestrictedVarsTest {
 
        @Test
        public void testNoRecurse() throws Exception {
-               VarResolver vr = new VarResolverBuilder().vars(XVar.class, 
NoRecurseVar.class).build();
+               VarResolver vr = VarResolver.create().vars(XVar.class, 
NoRecurseVar.class).build();
 
                test(vr, "$NoRecurse{foo}", "$X{foo}");
                test(vr, "$NoRecurse{$NoRecurse{foo}}", "$X{$X{foo}}");
@@ -89,7 +89,7 @@ public class RestrictedVarsTest {
 
        @Test
        public void testNoNestOrRecurse() throws Exception {
-               VarResolver vr = new VarResolverBuilder().vars(XVar.class, 
NoEitherVar.class).build();
+               VarResolver vr = VarResolver.create().vars(XVar.class, 
NoEitherVar.class).build();
 
                test(vr, "$NoEither{foo}", "$X{foo}");
                test(vr, "$NoEither{$NoEither{foo}}", "$X{$NoEither{foo}}");
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/SubstringVarTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/SubstringVarTest.java
index ba368ed..49f0e83 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/SubstringVarTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/SubstringVarTest.java
@@ -26,7 +26,7 @@ public class SubstringVarTest {
        
//====================================================================================================
        @Test
        public void test() throws Exception {
-               VarResolver vr = new 
VarResolverBuilder().vars(SubstringVar.class, 
SystemPropertiesVar.class).build();
+               VarResolver vr = VarResolver.create().vars(SubstringVar.class, 
SystemPropertiesVar.class).build();
 
                System.setProperty("SubstringVarTest.test", "foo bar");
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
index 2ae2ebf..ff62e61 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
@@ -26,7 +26,7 @@ public class SwitchVarTest {
        
//====================================================================================================
        @Test
        public void test() throws Exception {
-               VarResolver vr = new VarResolverBuilder().vars(SwitchVar.class, 
SystemPropertiesVar.class).build();
+               VarResolver vr = VarResolver.create().vars(SwitchVar.class, 
SystemPropertiesVar.class).build();
 
                System.setProperty("SwitchVarTest.test", "foobar");
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/SystemPropertiesVarTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/SystemPropertiesVarTest.java
index af02878..aff12b6 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/SystemPropertiesVarTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/SystemPropertiesVarTest.java
@@ -26,7 +26,7 @@ public class SystemPropertiesVarTest {
        
//====================================================================================================
        @Test
        public void test() throws Exception {
-               VarResolver vr = new 
VarResolverBuilder().vars(SystemPropertiesVar.class).build();
+               VarResolver vr = 
VarResolver.create().vars(SystemPropertiesVar.class).build();
 
                System.setProperty("SystemPropertiesVar.x", "foo");
                assertEquals("foo", vr.resolve("$S{SystemPropertiesVar.x}"));
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/UpperCaseVarTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/UpperCaseVarTest.java
index 6ffb869..13ea61f 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/svl/vars/UpperCaseVarTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/svl/vars/UpperCaseVarTest.java
@@ -26,7 +26,7 @@ public class UpperCaseVarTest {
        
//====================================================================================================
        @Test
        public void test() throws Exception {
-               VarResolver vr = new 
VarResolverBuilder().vars(UpperCaseVar.class, 
SystemPropertiesVar.class).build();
+               VarResolver vr = VarResolver.create().vars(UpperCaseVar.class, 
SystemPropertiesVar.class).build();
 
                System.setProperty("UpperCaseVar.test", "fooBAR");
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/utils/StringVarResolverTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/utils/StringVarResolverTest.java
index be2f2fe..d0a0716 100755
--- 
a/juneau-utest/src/test/java/org/apache/juneau/utils/StringVarResolverTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/utils/StringVarResolverTest.java
@@ -28,7 +28,7 @@ public class StringVarResolverTest {
        
//====================================================================================================
        @Test
        public void test() throws Exception {
-               VarResolver vr = new 
VarResolverBuilder().vars(XVar.class).build();
+               VarResolver vr = VarResolver.create().vars(XVar.class).build();
                String t;
 
                t = null;
@@ -101,7 +101,7 @@ public class StringVarResolverTest {
        
//====================================================================================================
        @Test
        public void test2() throws Exception {
-               VarResolver vr = new 
VarResolverBuilder().vars(BlankVar.class).build();
+               VarResolver vr = 
VarResolver.create().vars(BlankVar.class).build();
                String t;
 
                t = "${y}";
@@ -132,7 +132,7 @@ public class StringVarResolverTest {
        
//====================================================================================================
        @Test
        public void testEscaped$() throws Exception {
-               VarResolver vr = new 
VarResolverBuilder().vars(BlankVar.class).build();
+               VarResolver vr = 
VarResolver.create().vars(BlankVar.class).build();
                String t;
 
                t = "${y}";
@@ -153,7 +153,7 @@ public class StringVarResolverTest {
        
//====================================================================================================
        @Test
        public void testEscapedSequences() throws Exception {
-               VarResolver vr = new 
VarResolverBuilder().vars(XVar.class).build();
+               VarResolver vr = VarResolver.create().vars(XVar.class).build();
                String t;
                char b = '\\';
 
@@ -193,7 +193,7 @@ public class StringVarResolverTest {
        
//====================================================================================================
        @Test
        public void testParent() throws Exception {
-               VarResolver vr = new 
VarResolverBuilder().defaultVars().vars(XMultipartVar.class).build();
+               VarResolver vr = 
VarResolver.create().defaultVars().vars(XMultipartVar.class).build();
                String t;
                System.setProperty("a", "a1");
                System.setProperty("b", "b1");
@@ -219,7 +219,7 @@ public class StringVarResolverTest {
        
//====================================================================================================
        @Test
        public void testFalseTriggers() throws Exception {
-               VarResolverBuilder vrb = new VarResolverBuilder().defaultVars();
+               VarResolver.Builder vrb = VarResolver.create().defaultVars();
                String in = null;
 
                // Should reject names with characters outside A-Za-z

Reply via email to