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 7926fc5  VarResolvers should use BeanFactories.
7926fc5 is described below

commit 7926fc54a33c3d736345ae019b7439de058e967b
Author: JamesBognar <james.bog...@salesforce.com>
AuthorDate: Sat Jan 30 13:58:19 2021 -0500

    VarResolvers should use BeanFactories.
---
 .../main/java/org/apache/juneau/config/Config.java |  2 +-
 .../org/apache/juneau/config/vars/ConfigVar.java   | 26 +++----
 .../org/apache/juneau/html/HtmlDocSerializer.java  | 12 ++--
 .../juneau/html/HtmlDocSerializerSession.java      |  2 +-
 .../java/org/apache/juneau/html/HtmlWidgetMap.java | 57 ++++-----------
 .../java/org/apache/juneau/html/HtmlWidgetVar.java | 14 +---
 .../juneau/serializer/SerializerSession.java       |  8 +--
 .../java/org/apache/juneau/svl/VarResolver.java    | 20 +++---
 .../org/apache/juneau/svl/VarResolverBuilder.java  | 32 ++++-----
 .../org/apache/juneau/svl/VarResolverContext.java  | 31 ++++----
 .../org/apache/juneau/svl/VarResolverSession.java  | 83 +++++++---------------
 .../apache/juneau/microservice/Microservice.java   |  5 +-
 .../juneau/microservice/MicroserviceBuilder.java   | 13 ++--
 .../jetty/JettyMicroserviceBuilder.java            |  4 +-
 .../java/org/apache/juneau/rest/RestContext.java   | 18 +----
 .../org/apache/juneau/rest/RestContextBuilder.java | 20 +++---
 .../java/org/apache/juneau/rest/RestRequest.java   |  7 +-
 .../org/apache/juneau/rest/SwaggerProvider.java    |  2 +-
 .../java/org/apache/juneau/rest/vars/FileVar.java  | 32 ++++-----
 .../apache/juneau/rest/vars/LocalizationVar.java   | 15 ++--
 .../juneau/rest/vars/RequestAttributeVar.java      | 15 ++--
 .../juneau/rest/vars/RequestFormDataVar.java       | 16 ++---
 .../apache/juneau/rest/vars/RequestHeaderVar.java  | 15 ++--
 .../apache/juneau/rest/vars/RequestPathVar.java    | 14 ++--
 .../apache/juneau/rest/vars/RequestQueryVar.java   | 15 ++--
 .../apache/juneau/rest/vars/RequestSwaggerVar.java | 13 ++--
 .../org/apache/juneau/rest/vars/RequestVar.java    | 15 ++--
 .../juneau/rest/vars/SerializedRequestAttrVar.java | 24 +++----
 .../juneau/rest/vars/ServletInitParamVar.java      | 10 ++-
 .../org/apache/juneau/rest/vars/SwaggerVar.java    | 10 ++-
 .../java/org/apache/juneau/rest/vars/UrlVar.java   | 11 +--
 .../java/org/apache/juneau/rest/widget/Widget.java |  8 +--
 32 files changed, 219 insertions(+), 350 deletions(-)

diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Config.java 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Config.java
index ca94200..90476bd 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Config.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Config.java
@@ -457,7 +457,7 @@ public final class Config extends Context implements 
ConfigEventListener, Writab
                varSession = getInstanceProperty(CONFIG_varResolver, 
VarResolver.class, VarResolver.DEFAULT)
                        .builder()
                        .vars(ConfigVar.class)
-                       .contextObject(ConfigVar.SESSION_config, this)
+                       .bean(Config.class, this)
                        .build()
                        .createSession();
                binaryLineLength = getIntegerProperty(CONFIG_binaryLineLength);
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/vars/ConfigVar.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/vars/ConfigVar.java
index 0e14b01..f52c2d2 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/vars/ConfigVar.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/vars/ConfigVar.java
@@ -23,20 +23,22 @@ import org.apache.juneau.svl.*;
  * See {@link Config#getString(String)} for the format of the key.
  *
  * <p>
- * This variable resolver requires that a {@link Config} object be set as a 
context object on the resolver or a
- * session object on the resolver session.
+ * This variable resolver requires that a {@link Config} bean be available in 
the resolver session bean factory.
  *
  * <h5 class='section'>Example:</h5>
  * <p class='bcode w800'>
  *     <jc>// Create a config object.</jc>
- *     Config config = 
Config.<jsm>create</jsm>().name(<js>"MyConfig.cfg"</js>).build();
+ *     Config <jv>config</jv> = 
Config.<jsm>create</jsm>().name(<js>"MyConfig.cfg"</js>).build();
  *
  *     <jc>// Create a variable resolver that resolves config file entries 
(e.g. "$C{MySection/myKey}")</jc>
- *     VarResolver r = <jk>new</jk> 
VarResolver().addVars(ConfigVar.<jk>class</jk>)
- *             .addContextObject(<jsf>SESSION_config</jsf>, configFile);
+ *     VarResolver <jv>resolver<jv> = VarResolver
+ *             .<jsm>create</jsm>()
+ *             .vars(ConfigVar.<jk>class</jk>)
+ *             .bean(Config.<jk>class</jk>, <jv>config</jv>)
+ *             .build();
  *
  *     <jc>// Use it!</jc>
- *     System.<jsf>out</jsf>.println(r.resolve(<js>"Value for myKey in section 
MySection is $C{MySection/myKey}"</js>));
+ *     System.<jsf>out</jsf>.println(<jv>resolver<jv>.resolve(<js>"Value for 
myKey in section MySection is $C{MySection/myKey}"</js>));
  * </p>
  *
  * <p>
@@ -50,11 +52,6 @@ import org.apache.juneau.svl.*;
  */
 public class ConfigVar extends DefaultingVar {
 
-       /**
-        * The name of the session or context object that identifies the {@link 
Config} object.
-        */
-       public static final String SESSION_config = "config";
-
        /** The name of this variable. */
        public static final String NAME = "C";
 
@@ -67,6 +64,11 @@ public class ConfigVar extends DefaultingVar {
 
        @Override /* Var */
        public String resolve(VarResolverSession session, String key) {
-               return session.getSessionObject(Config.class, SESSION_config, 
true).getString(key);
+               return session.getBean(Config.class).get().getString(key);
+       }
+
+       @Override /* Var */
+       public boolean canResolve(VarResolverSession session) {
+               return session.getBean(Config.class).isPresent();
        }
 }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
index 5bc31c5..deab185 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
@@ -12,8 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.html;
 
-import java.util.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.collections.*;
@@ -723,7 +721,7 @@ public class HtmlDocSerializer extends 
HtmlStrippedDocSerializer {
        private final String noResultsMessage;
        private final boolean nowrap;
        private final HtmlDocTemplate template;
-       private final Map<String,HtmlWidget> widgets;
+       private final HtmlWidgetMap widgets;
 
        private volatile HtmlSchemaDocSerializer schemaSerializer;
 
@@ -779,10 +777,8 @@ public class HtmlDocSerializer extends 
HtmlStrippedDocSerializer {
                noResultsMessage = getStringProperty(HTMLDOC_noResultsMessage, 
"<p>no results</p>");
                template = getInstanceProperty(HTMLDOC_template, 
HtmlDocTemplate.class, BasicHtmlDocTemplate.class);
 
-               Map<String,HtmlWidget> widgets = new HashMap<>();
-               for (HtmlWidget w : getInstanceArrayProperty(HTMLDOC_widgets, 
HtmlWidget.class))
-                       widgets.put(w.getName(), w);
-               this.widgets = Collections.unmodifiableMap(widgets);
+               widgets = new HtmlWidgetMap();
+               widgets.append(getInstanceArrayProperty(HTMLDOC_widgets, 
HtmlWidget.class));
        }
 
        @Override /* Context */
@@ -977,7 +973,7 @@ public class HtmlDocSerializer extends 
HtmlStrippedDocSerializer {
         * @return
         *      Widgets defined on this serializers.
         */
-       protected final Map<String,HtmlWidget> getWidgets() {
+       protected final HtmlWidgetMap getWidgets() {
                return widgets;
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
index 21bc892..1120fe6 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
@@ -69,7 +69,7 @@ public class HtmlDocSerializerSession extends 
HtmlStrippedDocSerializerSession {
                head = getProperty(HTMLDOC_head, String[].class, ctx.getHead());
                nowrap = getProperty(HTMLDOC_nowrap, boolean.class, 
ctx.isNowrap());
 
-               varSessionObject(HtmlWidgetVar.SESSION_htmlWidgets, 
ctx.getWidgets());
+               addVarBean(HtmlWidgetMap.class, ctx.getWidgets());
        }
 
        @Override /* SerializerSession */
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/UrlVar.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlWidgetMap.java
similarity index 56%
copy from 
juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/UrlVar.java
copy to 
juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlWidgetMap.java
index 7240bdf..3132f43 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/UrlVar.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlWidgetMap.java
@@ -10,54 +10,25 @@
 // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
 // * specific language governing permissions and limitations under the 
License.                                              *
 // 
***************************************************************************************************************************
-package org.apache.juneau.rest.vars;
+package org.apache.juneau.html;
 
-import org.apache.juneau.*;
-import org.apache.juneau.rest.*;
-import org.apache.juneau.svl.*;
+import org.apache.juneau.collections.*;
 
 /**
- * URL variable resolver.
- *
- * <p>
- * The format for this var is <js>"$U{uri}"</js>.
- *
- * <p>
- * The advantage of using this variable is that you can resolve URLs with 
special protocols such as
- * <js>"servlet:/xxx"</js>.
- *
- * <p>
- * See {@link UriResolver} for the kinds of URIs that can be resolved.
- *
- * <p>
- * Uses the URI resolver returned by {@link RestRequest#getUriResolver()}.
- *
- * <ul class='seealso'>
- *     <li class='link'>{@doc RestSvlVariables}
- * </ul>
+ * A collection of {@link HtmlWidget} objects keyed by their names.
  */
-public class UrlVar extends SimpleVar {
-
-       private static final String SESSION_req = "req";
-
-       /** The name of this variable. */
-       public static final String NAME = "U";
+public class HtmlWidgetMap extends AMap<String,HtmlWidget> {
+       private static final long serialVersionUID = 1L;
 
        /**
-        * Constructor.
+        * Adds the specified widgets to this map.
+        *
+        * @param w The widgets to add to this map.
+        * @return This object (for method chaining).
         */
-       public UrlVar() {
-               super(NAME);
-       }
-
-       @Override /* Var */
-       public String resolve(VarResolverSession session, String key) {
-               RestRequest req = session.getSessionObject(RestRequest.class, 
SESSION_req, true);
-               return req.getUriResolver().resolve(key);
-       }
-
-       @Override /* Var */
-       public boolean canResolve(VarResolverSession session) {
-               return session.hasSessionObject(SESSION_req);
+       public HtmlWidgetMap append(HtmlWidget...w) {
+               for (HtmlWidget ww : w)
+                       put(ww.getName(), ww);
+               return this;
        }
-}
\ No newline at end of file
+}
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlWidgetVar.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlWidgetVar.java
index 3f4ed9b..983c5cb 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlWidgetVar.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlWidgetVar.java
@@ -12,8 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.html;
 
-import java.util.*;
-
 import org.apache.juneau.html.annotation.*;
 import org.apache.juneau.svl.*;
 
@@ -39,11 +37,6 @@ import org.apache.juneau.svl.*;
 public class HtmlWidgetVar extends SimpleVar {
 
        /**
-        * The name of the session or context object that identifies the object 
containing the widgets to resolve.
-        */
-       public static final String SESSION_htmlWidgets = "htmlWidgets";
-
-       /**
         * The name of this variable.
         */
        public static final String NAME = "W";
@@ -55,12 +48,11 @@ public class HtmlWidgetVar extends SimpleVar {
                super(NAME);
        }
 
-       @SuppressWarnings("unchecked")
        @Override /* Parameter */
        public String resolve(VarResolverSession session, String key) throws 
Exception {
-               Map<String,HtmlWidget> widgets = 
(Map<String,HtmlWidget>)session.getSessionObject(Object.class, 
SESSION_htmlWidgets, false);
+               HtmlWidgetMap m = 
session.getBean(HtmlWidgetMap.class).orElseThrow(RuntimeException::new);
 
-               HtmlWidget w = widgets.get(key);
+               HtmlWidget w = m.get(key);
                if (w == null)
                        return "unknown-widget-"+key;
 
@@ -69,6 +61,6 @@ public class HtmlWidgetVar extends SimpleVar {
 
        @Override
        public boolean canResolve(VarResolverSession session) {
-               return session.hasSessionObject(SESSION_htmlWidgets);
+               return session.getBean(HtmlWidgetMap.class).isPresent();
        }
 }
\ No newline at end of file
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
index 47a3c59..90fa7d1 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
@@ -86,12 +86,12 @@ public abstract class SerializerSession extends 
BeanTraverseSession {
        /**
         * Adds a session object to the {@link VarResolverSession} in this 
session.
         *
-        * @param name The session object key.
-        * @param value The session object.
+        * @param c The bean type being added.
+        * @param value The bean being added.
         * @return This object (for method chaining).
         */
-       public SerializerSession varSessionObject(String name, Object value) {
-               getVarResolver().sessionObject(name, value);
+       public <T> SerializerSession addVarBean(Class<T> c, T value) {
+               getVarResolver().bean(c, value);
                return this;
        }
 
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 bf3d01c..e43c90a 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
@@ -13,8 +13,8 @@
 package org.apache.juneau.svl;
 
 import java.io.*;
-import java.util.*;
 
+import org.apache.juneau.cp.*;
 import org.apache.juneau.svl.vars.*;
 
 /**
@@ -101,8 +101,8 @@ public class VarResolver {
         * @param vars The var classes
         * @param contextObjects
         */
-       VarResolver(Var[] vars, Map<String,Object> contextObjects) {
-               this.ctx = new VarResolverContext(vars, contextObjects);
+       VarResolver(Var[] vars, BeanFactory beanFactory) {
+               this.ctx = new VarResolverContext(vars, beanFactory);
        }
 
        /**
@@ -113,7 +113,7 @@ public class VarResolver {
        public VarResolverBuilder builder() {
                return new VarResolverBuilder()
                        .vars(ctx.getVars())
-                       .contextObjects(ctx.getContextObjects());
+                       .beanFactory(ctx.beanFactory);
        }
 
        /**
@@ -128,10 +128,6 @@ public class VarResolver {
        /**
         * Creates a new resolver session with no session objects.
         *
-        * <p>
-        * Session objects can be associated with the specified session using 
the {@link VarResolverSession#sessionObject(String, Object)}
-        * method.
-        *
         * @return A new resolver session.
         */
        public VarResolverSession createSession() {
@@ -139,13 +135,13 @@ public class VarResolver {
        }
 
        /**
-        * Same as {@link #createSession()} except allows you to specify 
session objects as a map.
+        * Same as {@link #createSession()} except allows you to specify a bean 
factory for resolving beans.
         *
-        * @param sessionObjects The session objects to associate with the 
session.
+        * @param beanFactory The bean factory to associate with this session.
         * @return A new resolver session.
         */
-       public VarResolverSession createSession(Map<String,Object> 
sessionObjects) {
-               return new VarResolverSession(ctx, sessionObjects);
+       public VarResolverSession createSession(BeanFactory beanFactory) {
+               return new VarResolverSession(ctx, beanFactory);
        }
 
        /**
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
index 0f1fba6..bdf13fa 100644
--- 
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
@@ -17,6 +17,7 @@ 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.*;
 
 /**
@@ -29,7 +30,7 @@ import org.apache.juneau.svl.vars.*;
 public class VarResolverBuilder {
 
        private final List<Var> vars = AList.create();
-       private final Map<String,Object> contextObjects = new HashMap<>();
+       private BeanFactory beanFactory = new BeanFactory();
 
        /**
         * Create a new var resolver using the settings in this builder.
@@ -37,7 +38,7 @@ public class VarResolverBuilder {
         * @return A new var resolver.
         */
        public VarResolver build() {
-               return new VarResolver(vars.toArray(new Var[vars.size()]), 
contextObjects);
+               return new VarResolver(vars.toArray(new Var[vars.size()]), 
beanFactory);
        }
 
        /**
@@ -126,33 +127,26 @@ public class VarResolverBuilder {
        }
 
        /**
-        * Associates a context object with this resolver.
+        * Associates a bean factory with this builder.
         *
-        * <p>
-        * A context object is essentially some environmental object that 
doesn't change but is used by vars to customize
-        * output.
-        *
-        * @param name The name of the context object.
-        * @param object The context object.
+        * @param value The bean factory to associate with this var resolver.
         * @return This object (for method chaining).
         */
-       public VarResolverBuilder contextObject(String name, Object object) {
-               contextObjects.put(name, object);
+       public VarResolverBuilder beanFactory(BeanFactory value) {
+               this.beanFactory = BeanFactory.of(value);
                return this;
        }
 
        /**
-        * Associates multiple context objects with this resolver.
-        *
-        * <p>
-        * A context object is essentially some environmental object that 
doesn't change but is used by vars to customize
-        * output.
+        * Adds a bean to the bean factory in this session.
         *
-        * @param map A map of context objects keyed by their name.
+        * @param <T> The bean type.
+        * @param c The bean type.
+        * @param value The bean.
         * @return This object (for method chaining).
         */
-       public VarResolverBuilder contextObjects(Map<String,Object> map) {
-               contextObjects.putAll(map);
+       public <T> VarResolverBuilder bean(Class<T> c, T value) {
+               beanFactory.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
index 97cb057..0645a37 100644
--- 
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
@@ -16,6 +16,7 @@ import java.util.*;
 import java.util.concurrent.*;
 
 import org.apache.juneau.collections.*;
+import org.apache.juneau.cp.*;
 
 /**
  * Configurable properties on the {@link VarResolver} class.
@@ -31,15 +32,15 @@ public class VarResolverContext {
 
        private final Var[] vars;
        private final Map<String,Var> varMap;
-       private final Map<String,Object> contextObjects;
+       final BeanFactory beanFactory;
 
        /**
         * Constructor.
         *
         * @param vars The Var classes used for resolving string variables.
-        * @param contextObjects Read-only context objects.
+        * @param beanFactory Used to resolve beans needed by individual vars.
         */
-       public VarResolverContext(Var[] vars, Map<String,Object> 
contextObjects) {
+       public VarResolverContext(Var[] vars, BeanFactory beanFactory) {
 
                this.vars = vars;
 
@@ -48,7 +49,7 @@ public class VarResolverContext {
                        m.put(v.getName(), v);
 
                this.varMap = AMap.unmodifiable(m);
-               this.contextObjects = AMap.unmodifiable(contextObjects);
+               this.beanFactory = BeanFactory.of(beanFactory);
        }
 
        /**
@@ -70,21 +71,15 @@ public class VarResolverContext {
        }
 
        /**
-        * Returns the context object with the specified name.
+        * Adds a bean to this session.
         *
-        * @param name The name of the context object.
-        * @return The context object, or <jk>null</jk> if no context object is 
specified with that name.
+        * @param <T> The bean type.
+        * @param c The bean type.
+        * @param value The bean.
+        * @return This object (for method chaining).
         */
-       protected Object getContextObject(String name) {
-               return contextObjects == null ? null : contextObjects.get(name);
-       }
-
-       /**
-        * Returns the context map of this variable resolver context.
-        *
-        * @return An unmodifiable map of the context objects of this variable 
resolver context.
-        */
-       protected Map<String,Object> getContextObjects() {
-               return contextObjects;
+       public <T> VarResolverContext addBean(Class<T> c, T value) {
+               beanFactory.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 2af9030..e3e6e77 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
@@ -18,6 +18,7 @@ import java.io.*;
 import java.lang.reflect.*;
 import java.util.*;
 
+import org.apache.juneau.cp.*;
 import org.apache.juneau.internal.*;
 
 /**
@@ -31,7 +32,7 @@ import org.apache.juneau.internal.*;
  *
  * <p>
  * Instances of this class are created through the {@link 
VarResolver#createSession()} and
- * {@link VarResolver#createSession(Map)} methods.
+ * {@link VarResolver#createSession(BeanFactory)} methods.
  *
  * <p>
  * Instances of this class are NOT guaranteed to be thread safe.
@@ -43,7 +44,7 @@ import org.apache.juneau.internal.*;
 public class VarResolverSession {
 
        private final VarResolverContext context;
-       private final Map<String,Object> sessionObjects;
+       private final BeanFactory beanFactory;
 
        /**
         * Constructor.
@@ -51,27 +52,12 @@ public class VarResolverSession {
         * @param context
         *      The {@link VarResolver} context object that contains the {@link 
Var Vars} and context objects associated with
         *      that resolver.
-        * @param sessionObjects The session objects.
+        * @param beanFactory The bean factory to use for resolving beans 
needed by vars.
         *
         */
-       public VarResolverSession(VarResolverContext context, 
Map<String,Object> sessionObjects) {
+       public VarResolverSession(VarResolverContext context, BeanFactory 
beanFactory) {
                this.context = context;
-               if (sessionObjects != null)
-                       this.sessionObjects = sessionObjects;
-               else
-                       this.sessionObjects = new HashMap<>();
-       }
-
-       /**
-        * Adds a session object to this session.
-        *
-        * @param name The name of the session object.
-        * @param o The session object.
-        * @return This method (for method chaining).
-        */
-       public VarResolverSession sessionObject(String name, Object o) {
-               sessionObjects.put(name, o);
-               return this;
+               this.beanFactory = BeanFactory.of(beanFactory, null);
        }
 
        /**
@@ -380,49 +366,21 @@ public class VarResolverSession {
        ;
 
        /**
-        * Returns the session object with the specified name.
+        * Returns the bean from the registered bean factory.
         *
-        * <p>
-        * Casts it to the specified class type for you.
-        *
-        * @param c The class type to cast to.
-        * @param name The name of the session object.
-        * @param throwNotSetException Throw a {@link VarResolverException} if 
the session object is not set.
+        * @param c The bean type.
         * @return
-        *      The session object.
+        *      The bean.
         *      <br>Never <jk>null</jk>.
-        * @throws VarResolverException If session object with specified name 
does not exist.
         */
-       @SuppressWarnings("unchecked")
-       public <T> T getSessionObject(Class<T> c, String name, boolean 
throwNotSetException) {
-               T t = null;
-               try {
-                       t = (T)sessionObjects.get(name);
-                       if (t == null) {
-                               sessionObjects.put(name, 
this.context.getContextObject(name));
-                               t = (T)sessionObjects.get(name);
-                       }
-               } catch (Exception e) {
-                       throw new VarResolverException(e,
-                               "Session object ''{0}'' or context object 
''SvlContext.{0}'' could not be converted to type ''{1}''.", name, c);
-               }
-               if (t == null && throwNotSetException)
-                       throw new VarResolverException(
-                               "Session object ''{0}'' or context object 
''SvlContext.{0}'' not found.", name);
+       public <T> Optional<T> getBean(Class<T> c) {
+               Optional<T> t = beanFactory.getBean(c);
+               if (! t.isPresent())
+                       t = context.beanFactory.getBean(c);
                return t;
        }
 
        /**
-        * Returns <jk>true</jk> if this session has the specified session 
object.
-        *
-        * @param name Session object name.
-        * @return <jk>true</jk> if this session has the specified session 
object
-        */
-       public boolean hasSessionObject(String name) {
-               return getSessionObject(Object.class, name, false) != null;
-       }
-
-       /**
         * Returns the {@link Var} with the specified name.
         *
         * @param name The var name (e.g. <js>"S"</js>).
@@ -446,8 +404,21 @@ public class VarResolverSession {
                return out;
        }
 
+       /**
+        * 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> VarResolverSession bean(Class<T> c, T value) {
+               beanFactory.addBean(c, value);
+               return this;
+       }
+
        @Override /* Object */
        public String toString() {
-               return "var=" + this.context.getVarMap().keySet() + ", 
contextObjects=" + this.context.getContextObjects().keySet() + ", 
sessionObjects=" + this.sessionObjects.keySet();
+               return "var=" + this.context.getVarMap().keySet() + ", 
context.beanFactory=" + this.context.beanFactory + ", session.beanFactory=" + 
beanFactory;
        }
 }
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 dff54ec..0134a75 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
@@ -31,7 +31,6 @@ import org.apache.juneau.collections.*;
 import org.apache.juneau.config.*;
 import org.apache.juneau.config.event.*;
 import org.apache.juneau.config.store.*;
-import org.apache.juneau.config.vars.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.microservice.console.*;
 import org.apache.juneau.microservice.resources.*;
@@ -226,7 +225,7 @@ public class Microservice implements ConfigEventListener {
                // Var resolver.
                
//-------------------------------------------------------------------------------------------------------------
                VarResolverBuilder varResolverBuilder = 
builder.varResolverBuilder;
-               this.varResolver = 
varResolverBuilder.contextObject(ConfigVar.SESSION_config, config).build();
+               this.varResolver = varResolverBuilder.bean(Config.class, 
config).build();
 
                // 
--------------------------------------------------------------------------------
                // Initialize console commands.
@@ -601,7 +600,7 @@ public class Microservice implements ConfigEventListener {
         * Variables can be controlled by the following methods:
         * <ul class='javatree'>
         *      <li class='jm'>{@link MicroserviceBuilder#vars(Class...)}
-        *      <li class='jm'>{@link MicroserviceBuilder#varContext(String, 
Object)}
+        *      <li class='jm'>{@link MicroserviceBuilder#varBean(Class,Object)}
         * </ul>
         *
         * @return The VarResolver used by this Microservice, or <jk>null</jk> 
if it was never created.
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 ca073e5..f14cba6 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
@@ -369,18 +369,19 @@ public class MicroserviceBuilder {
        }
 
        /**
-        * Adds a var resolver context object for vars defined in the 
configuration and var resolver.
+        * Adds a bean for vars defined in the var resolver.
         *
         * <p>
-        * This calls {@link VarResolverBuilder#contextObject(String,Object)} 
on the var resolver used to construct the configuration
+        * This calls {@link VarResolverBuilder#bean(Class,Object)} on the var 
resolver used to construct the configuration
         * object returned by {@link Microservice#getConfig()} and the var 
resolver returned by {@link Microservice#getVarResolver()}.
         *
-        * @param name The context object name.
-        * @param object The context object.
+        * @param c The bean type.
+        * @param value The bean.
+        * @param <T> The bean type.
         * @return This object (for method chaining).
         */
-       public MicroserviceBuilder varContext(String name, Object object) {
-               varResolverBuilder.contextObject(name, object);
+       public <T> MicroserviceBuilder varBean(Class<T> c, T value) {
+               varResolverBuilder.bean(c, value);
                return this;
        }
 
diff --git 
a/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroserviceBuilder.java
 
b/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroserviceBuilder.java
index 502a7ef..57071a4 100644
--- 
a/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroserviceBuilder.java
+++ 
b/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroserviceBuilder.java
@@ -336,8 +336,8 @@ public class JettyMicroserviceBuilder extends 
MicroserviceBuilder {
        }
 
        @Override /* MicroserviceBuilder */
-       public JettyMicroserviceBuilder varContext(String name, Object object) {
-               super.varContext(name, object);
+       public <T> JettyMicroserviceBuilder varBean(Class<T> c, T value) {
+               super.varBean(c, value);
                return this;
        }
 
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 ef53109..cbe8a26 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
@@ -4609,7 +4609,7 @@ public class RestContext extends BeanContext {
                if (x == null)
                        x = builder.varResolverBuilder
                                .vars(createVars(resource,beanFactory))
-                               .contextObject("messages", getMessages())
+                               .bean(Messages.class, getMessages())
                                .build();
 
                x = BeanFactory
@@ -6268,22 +6268,6 @@ public class RestContext extends BeanContext {
        }
 
        /**
-        * Returns the session objects for the specified request.
-        *
-        * <p>
-        * The default implementation simply returns a single map containing 
<c>{'req':req,'res',res}</c>.
-        *
-        * @param call The current REST call.
-        * @return The session objects for that request.
-        */
-       public Map<String,Object> getSessionObjects(RestCall call) {
-               Map<String,Object> m = new HashMap<>();
-               m.put("req", call.getRequest());
-               m.put("res", call.getResponse());
-               return m;
-       }
-
-       /**
         * Called at the start of a request to invoke all {@link 
HookEvent#START_CALL} methods.
         *
         * @param call The current request.
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 d445b93..06bd2f4 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
@@ -149,7 +149,7 @@ public class RestContextBuilder extends BeanContextBuilder 
implements ServletCon
                                .defaultVars()
                                .vars(ConfigVar.class)
                                .vars(FileVar.class)
-                               .contextObject("crm", 
FileFinder.create().cp(resourceClass,null,true).build());
+                               .bean(FileFinder.class, 
FileFinder.create().cp(resourceClass,null,true).build());
 
                        VarResolver vr = varResolverBuilder.build();
                        beanFactory.addBean(VarResolver.class, vr);
@@ -159,7 +159,7 @@ public class RestContextBuilder extends BeanContextBuilder 
implements ServletCon
                        beanFactory.addBean(Config.class, config);
 
                        // Add our config file to the variable resolver.
-                       
varResolverBuilder.contextObject(ConfigVar.SESSION_config, config);
+                       varResolverBuilder.bean(Config.class, config);
                        vr = varResolverBuilder.build();
                        beanFactory.addBean(VarResolver.class, vr);
 
@@ -313,20 +313,20 @@ public class RestContextBuilder extends 
BeanContextBuilder implements ServletCon
         * information.
         *
         * <p>
-        * For example, the {@link ConfigVar} needs access to this resource's 
{@link Config} through the
-        * {@link ConfigVar#SESSION_config} object that can be specified as 
either a session object (temporary) or
-        * context object (permanent).
+        * 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.addVarContextObject(<jsf>SESSION_config</jsf>, 
configFile);
+        *      config.varBean(Config.<jk>class</jk>, configFile);
         * </p>
         *
-        * @param name The context object key (i.e. the name that the Var class 
looks for).
-        * @param object The context object.
+        * @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 RestContextBuilder varContextObject(String name, Object object) {
-               this.varResolverBuilder.contextObject(name, object);
+       public <T> RestContextBuilder varBean(Class<T> beanType, T bean) {
+               this.varResolverBuilder.bean(beanType, bean);
                return this;
        }
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
index a57401c..6171b10 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
@@ -1192,9 +1192,10 @@ public final class RestRequest extends 
HttpServletRequestWrapper {
                if (varSession == null)
                        varSession = context
                                .getVarResolver()
-                               .createSession(context.getSessionObjects(call))
-                               .sessionObject("req", this)
-                               .sessionObject("res", res);
+                               .createSession(call.getBeanFactory())
+                               .bean(RestRequest.class, this)
+                               .bean(RestResponse.class, res)
+                               .bean(RestCall.class, call);
                return varSession;
        }
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerProvider.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerProvider.java
index d79f52c..d5723c8 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerProvider.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/SwaggerProvider.java
@@ -83,7 +83,7 @@ public class SwaggerProvider {
                Class<?> c = context.getResourceClass();
                FileFinder ff = fileFinder != null ? fileFinder : 
FileFinder.create().cp(c,null,false).build();
                Messages mb = messages != null ? messages.forLocale(locale) : 
Messages.create(c).build().forLocale(locale);
-               VarResolverSession vrs = 
vr.createSession().sessionObject("messages", mb);
+               VarResolverSession vrs = 
vr.createSession().bean(Messages.class, mb);
                SwaggerProviderSession session = new 
SwaggerProviderSession(context, locale, ff, messages, vrs, js.createSession());
 
                return session.getSwagger();
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/FileVar.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/FileVar.java
index 9260a67..2f0c4d6 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/FileVar.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/FileVar.java
@@ -12,6 +12,7 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.rest.vars;
 
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.svl.*;
@@ -47,14 +48,15 @@ import org.apache.juneau.svl.*;
  * Files of type HTML, XHTML, XML, JSON, Javascript, and CSS will be stripped 
of comments.
  * This allows you to place license headers in files without them being 
serialized to the output.
  *
+ * <p>
+ * This variable resolver requires that a {@link RestRequest} bean be 
available in the session bean factory.
+ *
  * <ul class='seealso'>
  *     <li class='link'>{@doc SvlVariables}
  * </ul>
  */
 public class FileVar extends DefaultingVar {
 
-       private static final String SESSION_req = "req";
-
        /**
         * The name of this variable.
         */
@@ -70,25 +72,21 @@ public class FileVar extends DefaultingVar {
        @Override /* Var */
        public String resolve(VarResolverSession session, String key) throws 
Exception {
 
-               RestRequest req = session.getSessionObject(RestRequest.class, 
SESSION_req, false);
-               if (req != null) {
-
-                       String s = 
req.getFileFinder().getString(key).orElse(null);
-                       if (s == null)
-                               return null;
-                       String subType = FileUtils.getExtension(key);
-                       if ("html".equals(subType) || "xhtml".equals(subType) 
|| "xml".equals(subType))
-                               s = s.replaceAll("(?s)<!--(.*?)-->\\s*", "");
-                       else if ("json".equals(subType) || 
"javascript".equals(subType) || "css".equals(subType))
-                               s = s.replaceAll("(?s)\\/\\*(.*?)\\*\\/\\s*", 
"");
-                       return s;
-               }
+               RestRequest req = 
session.getBean(RestRequest.class).orElseThrow(InternalServerError::new);
 
-               return null;
+               String s = req.getFileFinder().getString(key).orElse(null);
+               if (s == null)
+                       return null;
+               String subType = FileUtils.getExtension(key);
+               if ("html".equals(subType) || "xhtml".equals(subType) || 
"xml".equals(subType))
+                       s = s.replaceAll("(?s)<!--(.*?)-->\\s*", "");
+               else if ("json".equals(subType) || "javascript".equals(subType) 
|| "css".equals(subType))
+                       s = s.replaceAll("(?s)\\/\\*(.*?)\\*\\/\\s*", "");
+               return s;
        }
 
        @Override /* Var */
        public boolean canResolve(VarResolverSession session) {
-               return session.hasSessionObject(SESSION_req);
+               return session.getBean(RestRequest.class).isPresent();
        }
 }
\ No newline at end of file
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/LocalizationVar.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/LocalizationVar.java
index 7c0688d..8341477 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/LocalizationVar.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/LocalizationVar.java
@@ -15,6 +15,7 @@ package org.apache.juneau.rest.vars;
 import java.util.*;
 
 import org.apache.juneau.cp.*;
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.svl.*;
 
@@ -25,8 +26,7 @@ import org.apache.juneau.svl.*;
  * The format for this var is <js>"$L{key[,args...]}"</js>.
  *
  * <p>
- * This variable resolver requires that a {@link RestRequest} object be set as 
a context object on the resolver or a
- * session object on the resolver session.
+ * This variable resolver requires that a {@link RestRequest} bean be 
available in the session bean factory.
  *
  * <p>
  * Values are pulled from the {@link RestRequest#getMessage(String,Object[])} 
method.
@@ -42,9 +42,6 @@ import org.apache.juneau.svl.*;
  */
 public class LocalizationVar extends MultipartVar {
 
-       private static final String SESSION_messages = "messages";
-       private static final String SESSION_req = "req";
-
        /** The name of this variable. */
        public static final String NAME = "L";
 
@@ -60,9 +57,11 @@ public class LocalizationVar extends MultipartVar {
                if (args.length > 0) {
                        String key = args[0];
                        String[] a = (args.length > 1) ? 
Arrays.copyOfRange(args, 1, args.length) : new String[0];
-                       Messages messages = 
session.getSessionObject(Messages.class, SESSION_messages, false);
+                       Messages messages = null;
+                       if (session.getBean(RestRequest.class).isPresent())
+                               messages = 
session.getBean(RestRequest.class).get().getMessages();
                        if (messages == null)
-                               messages = 
session.getSessionObject(RestRequest.class, SESSION_req, true).getMessages();
+                               messages = 
session.getBean(Messages.class).orElseThrow(InternalServerError::new);
                        return messages.getString(key, (Object[])a);
                }
                return "";
@@ -70,6 +69,6 @@ public class LocalizationVar extends MultipartVar {
 
        @Override /* Var */
        public boolean canResolve(VarResolverSession session) {
-               return session.hasSessionObject(SESSION_messages) || 
session.hasSessionObject(SESSION_req);
+               return session.getBean(Messages.class).isPresent() || 
session.getBean(RestRequest.class).isPresent();
        }
 }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestAttributeVar.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestAttributeVar.java
index 2f7e31c..77a1317 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestAttributeVar.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestAttributeVar.java
@@ -16,6 +16,7 @@ import static org.apache.juneau.internal.StringUtils.*;
 
 import javax.servlet.http.*;
 
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.svl.*;
 
@@ -31,14 +32,13 @@ import org.apache.juneau.svl.*;
  *
  * <h5 class='section'>Example:</h5>
  * <p class='bcode w800'>
- *     String foo = restRequest.resolveVars(<js>"$RA{foo}"</js>);
- *     String fooOrBar = restRequest.resolveVars(<js>"$RA{foo,bar}"</js>);
+ *     String <jv>foo</jv> = 
<jv>restRequest</jv>.getVarResolver().resolve(<js>"$RA{foo}"</js>);
+ *     String <jv>fooOrBar</jv> = 
<jv>restRequest</jv>.getVarResolver().resolve(<js>"$RA{foo,bar}"</js>);
  * </p>
  *
  * <ul class='notes'>
  *     <li>
- *             This variable resolver requires that a {@link RestRequest} 
object be set as a context object on the resolver
- *             or a session object on the resolver session.
+ *             This variable resolver requires that a {@link RestRequest} bean 
be available in the session bean factory.
  *     <li>
  *             For security reasons, nested and recursive variables are not 
resolved.
  * </ul>
@@ -49,9 +49,6 @@ import org.apache.juneau.svl.*;
  */
 public class RequestAttributeVar extends MultipartResolvingVar {
 
-       private static final String SESSION_req = "req";
-
-
        /** The name of this variable. */
        public static final String NAME = "RA";
 
@@ -74,12 +71,12 @@ public class RequestAttributeVar extends 
MultipartResolvingVar {
 
        @Override /* Var */
        public String resolve(VarResolverSession session, String key) {
-               RestRequest req = session.getSessionObject(RestRequest.class, 
SESSION_req, true);
+               RestRequest req = 
session.getBean(RestRequest.class).orElseThrow(InternalServerError::new);
                return stringify(req.getAttribute(key));
        }
 
        @Override /* Var */
        public boolean canResolve(VarResolverSession session) {
-               return session.hasSessionObject(SESSION_req);
+               return session.getBean(RestRequest.class).isPresent();
        }
 }
\ No newline at end of file
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestFormDataVar.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestFormDataVar.java
index 3fee404..cb0c6f0 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestFormDataVar.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestFormDataVar.java
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.rest.vars;
 
+
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.svl.*;
 
@@ -27,14 +29,13 @@ import org.apache.juneau.svl.*;
  *
  * <h5 class='section'>Example:</h5>
  * <p class='bcode w800'>
- *     String foo = restRequest.resolveVars(<js>"$RF{foo}"</js>);
- *     String fooOrBar = restRequest.resolveVars(<js>"$RF{foo,bar}"</js>);
+ *     String <jv>foo</jv> = 
<jv>restRequest</jv>.getVarResolver().resolve(<js>"$RF{foo}"</js>);
+ *     String <jv>fooOrBar</jv> = 
<jv>restRequest</jv>.getVarResolver().resolve(<js>"$RF{foo,bar}"</js>);
  * </p>
  *
  * <ul class='notes'>
  *     <li>
- *             This variable resolver requires that a {@link RestRequest} 
object be set as a context object on the resolver
- *             or a session object on the resolver session.
+ *             This variable resolver requires that a {@link RestRequest} bean 
be available in the session bean factory.
  *     <li>
  *             For security reasons, nested and recursive variables are not 
resolved.
  * </ul>
@@ -45,8 +46,6 @@ import org.apache.juneau.svl.*;
  */
 public class RequestFormDataVar extends MultipartResolvingVar {
 
-       private static final String SESSION_req = "req";
-
        /** The name of this variable. */
        public static final String NAME = "RF";
 
@@ -69,12 +68,11 @@ public class RequestFormDataVar extends 
MultipartResolvingVar {
 
        @Override /* Var */
        public String resolve(VarResolverSession session, String key) {
-               RestRequest req = session.getSessionObject(RestRequest.class, 
SESSION_req, true);
-               return req.getFormData(key);
+               return 
session.getBean(RestRequest.class).orElseThrow(InternalServerError::new).getFormData(key);
        }
 
        @Override /* Var */
        public boolean canResolve(VarResolverSession session) {
-               return session.hasSessionObject(SESSION_req);
+               return session.getBean(RestRequest.class).isPresent();
        }
 }
\ No newline at end of file
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestHeaderVar.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestHeaderVar.java
index 6a58ffc..49bf226 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestHeaderVar.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestHeaderVar.java
@@ -12,6 +12,7 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.rest.vars;
 
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.svl.*;
 
@@ -27,14 +28,13 @@ import org.apache.juneau.svl.*;
  *
  * <h5 class='section'>Example:</h5>
  * <p class='bcode w800'>
- *     String foo = restRequest.resolveVars(<js>"$RH{Foo}"</js>);
- *     String fooOrBar = restRequest.resolveVars(<js>"$RH{Foo,Bar}"</js>);
+ *     String <jv>foo</jv> = 
<jv>restRequest</jv>.getVarResolver().resolve(<js>"$RH{foo}"</js>);
+ *     String <jv>fooOrBar</jv> = 
<jv>restRequest</jv>.getVarResolver().resolve(<js>"$RH{foo,bar}"</js>);
  * </p>
  *
  * <ul class='notes'>
  *     <li>
- *             This variable resolver requires that a {@link RestRequest} 
object be set as a context object on the resolver
- *             or a session object on the resolver session.
+ *             This variable resolver requires that a {@link RestRequest} bean 
be available in the session bean factory.
  *     <li>
  *             For security reasons, nested and recursive variables are not 
resolved.
  * </ul>
@@ -45,8 +45,6 @@ import org.apache.juneau.svl.*;
  */
 public class RequestHeaderVar extends MultipartResolvingVar {
 
-       private static final String SESSION_req = "req";
-
        /** The name of this variable. */
        public static final String NAME = "RH";
 
@@ -69,12 +67,11 @@ public class RequestHeaderVar extends MultipartResolvingVar 
{
 
        @Override /* Var */
        public String resolve(VarResolverSession session, String key) {
-               RestRequest req = session.getSessionObject(RestRequest.class, 
SESSION_req, true);
-               return req.getHeader(key);
+               return 
session.getBean(RestRequest.class).orElseThrow(InternalServerError::new).getHeader(key);
        }
 
        @Override /* Var */
        public boolean canResolve(VarResolverSession session) {
-               return session.hasSessionObject(SESSION_req);
+               return session.getBean(RestRequest.class).isPresent();
        }
 }
\ No newline at end of file
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestPathVar.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestPathVar.java
index 7b65578..2a35fc9 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestPathVar.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestPathVar.java
@@ -12,6 +12,7 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.rest.vars;
 
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.svl.*;
 
@@ -28,14 +29,13 @@ import org.apache.juneau.svl.*;
  * <h5 class='section'>Example:</h5>
  * <p class='bcode w800'>
  *     <jc>// URI path pattern = "/foo/{foo}/bar/{bar}"</jc>
- *     String foo = restRequest.resolveVars(<js>"$RP{foo}"</js>);
- *     String fooOrBar = restRequest.resolveVars(<js>"$RP{foo,bar}"</js>);
+ *     String <jv>foo</jv> = 
<jv>restRequest</jv>.getVarResolver().resolve(<js>"$RP{foo}"</js>);
+ *     String <jv>fooOrBar</jv> = 
<jv>restRequest</jv>.getVarResolver().resolve(<js>"$RP{foo,bar}"</js>);
  * </p>
  *
  * <ul class='notes'>
  *     <li>
- *             This variable resolver requires that a {@link RestRequest} 
object be set as a context object on the resolver
- *             or a session object on the resolver session.
+ *             This variable resolver requires that a {@link RestRequest} bean 
be available in the session bean factory.
  *     <li>
  *             For security reasons, nested and recursive variables are not 
resolved.
  * </ul>
@@ -46,8 +46,6 @@ import org.apache.juneau.svl.*;
  */
 public class RequestPathVar extends MultipartResolvingVar {
 
-       private static final String SESSION_req = "req";
-
        /** The name of this variable. */
        public static final String NAME = "RP";
 
@@ -70,7 +68,7 @@ public class RequestPathVar extends MultipartResolvingVar {
 
        @Override /* Var */
        public String resolve(VarResolverSession session, String key) {
-               RestRequest req = session.getSessionObject(RestRequest.class, 
SESSION_req, true);
+               RestRequest req = 
session.getBean(RestRequest.class).orElseThrow(InternalServerError::new);
                if ("REMAINDER".equals(key))
                        return req.getPathRemainder();
                return req.getPath(key);
@@ -78,6 +76,6 @@ public class RequestPathVar extends MultipartResolvingVar {
 
        @Override /* Var */
        public boolean canResolve(VarResolverSession session) {
-               return session.hasSessionObject(SESSION_req);
+               return session.getBean(RestRequest.class).isPresent();
        }
 }
\ No newline at end of file
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestQueryVar.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestQueryVar.java
index 67915d8..0bf345a 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestQueryVar.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestQueryVar.java
@@ -12,6 +12,7 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.rest.vars;
 
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.svl.*;
 
@@ -28,14 +29,13 @@ import org.apache.juneau.svl.*;
  * <h5 class='section'>Example:</h5>
  * <p class='bcode w800'>
  *     <jc>// URI = "...?foo=X&amp;bar=Y"</jc>
- *     String foo = restRequest.resolveVars(<js>"$RQ{foo}"</js>);
- *     String fooOrBar = restRequest.resolveVars(<js>"$RQ{foo,bar}"</js>);
+ *     String <jv>foo</jv> = 
<jv>restRequest</jv>.getVarResolver().resolve(<js>"$RQ{foo}"</js>);
+ *     String <jv>fooOrBar</jv> = 
<jv>restRequest</jv>.getVarResolver().resolve(<js>"$RHQ{foo,bar}"</js>);
  * </p>
  *
  * <ul class='notes'>
  *     <li>
- *             This variable resolver requires that a {@link RestRequest} 
object be set as a context object on the resolver
- *             or a session object on the resolver session.
+ *             This variable resolver requires that a {@link RestRequest} bean 
be available in the session bean factory.
  *     <li>
  *             For security reasons, nested and recursive variables are not 
resolved.
  * </ul>
@@ -46,8 +46,6 @@ import org.apache.juneau.svl.*;
  */
 public class RequestQueryVar extends MultipartResolvingVar {
 
-       private static final String SESSION_req = "req";
-
        /** The name of this variable. */
        public static final String NAME = "RQ";
 
@@ -70,12 +68,11 @@ public class RequestQueryVar extends MultipartResolvingVar {
 
        @Override /* Var */
        public String resolve(VarResolverSession session, String key) {
-               RestRequest req = session.getSessionObject(RestRequest.class, 
SESSION_req, true);
-               return req.getQuery(key);
+               return 
session.getBean(RestRequest.class).orElseThrow(InternalServerError::new).getQuery(key);
        }
 
        @Override /* Var */
        public boolean canResolve(VarResolverSession session) {
-               return session.hasSessionObject(SESSION_req);
+               return session.getBean(RestRequest.class).isPresent();
        }
 }
\ No newline at end of file
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestSwaggerVar.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestSwaggerVar.java
index c5db98d..eabba46 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestSwaggerVar.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestSwaggerVar.java
@@ -52,14 +52,13 @@ import org.apache.juneau.svl.*;
  *
  * <h5 class='section'>Example:</h5>
  * <p class='bcode w800'>
- *     String title = restRequest.resolveVars(<js>"$RI{title}"</js>);
- *     String titleOrDescription = 
restRequest.resolveVars(<js>"$RI{title,description}"</js>);
+ *     String <jv>title</jv> = 
<jv>restRequest</jv>.getVarResolver().resolve(<js>"$RS{title}"</js>);
+ *     String <jv>titleOrDescription</jv> = 
<jv>restRequest</jv>.getVarResolver().resolve(<js>"$RS{title,description}"</js>);
  * </p>
  *
  * <ul class='notes'>
  *     <li>
- *             This variable resolver requires that a {@link RestRequest} 
object be set as a context object on the resolver
- *             or a session object on the resolver session.
+ *             This variable resolver requires that a {@link RestRequest} bean 
be available in the session bean factory.
  *     <li>
  *             For security reasons, nested and recursive variables are not 
resolved.
  * </ul>
@@ -70,8 +69,6 @@ import org.apache.juneau.svl.*;
  */
 public class RequestSwaggerVar extends MultipartResolvingVar {
 
-       private static final String SESSION_req = "req";
-
        /** The name of this variable. */
        public static final String NAME = "RS";
 
@@ -95,7 +92,7 @@ public class RequestSwaggerVar extends MultipartResolvingVar {
        @Override /* Var */
        public String resolve(VarResolverSession session, String key) throws 
HttpException, InternalServerError {
                try {
-                       RestRequest req = 
session.getSessionObject(RestRequest.class, SESSION_req, true);
+                       RestRequest req = 
session.getBean(RestRequest.class).orElseThrow(InternalServerError::new);
                        Optional<Swagger> swagger = req.getSwagger();
                        WriterSerializer s = SimpleJsonSerializer.DEFAULT;
                        Optional<Operation> methodSwagger = 
req.getMethodSwagger();
@@ -139,6 +136,6 @@ public class RequestSwaggerVar extends 
MultipartResolvingVar {
 
        @Override /* Var */
        public boolean canResolve(VarResolverSession session) {
-               return session.hasSessionObject(SESSION_req);
+               return session.getBean(RestRequest.class).isPresent();
        }
 }
\ No newline at end of file
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestVar.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestVar.java
index faed17a..c721e9c 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestVar.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestVar.java
@@ -14,6 +14,7 @@ package org.apache.juneau.rest.vars;
 
 
 import org.apache.juneau.*;
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.svl.*;
@@ -41,14 +42,12 @@ import org.apache.juneau.svl.*;
  *
  * <h5 class='section'>Example:</h5>
  * <p class='bcode w800'>
- *     String resourceTitle = 
restRequest.resolveVars(<js>"$R{resourceTitle}"</js>);
- *     String resourceTitleOrDescription = 
restRequest.resolveVars(<js>"$R{resourceTitle,resourceDescription}"</js>);
+ *     String <jv>servletClass</jv> = 
<jv>restRequest</jv>.getVarResolver().resolve(<js>"$R{servletClass}"</js>);
  * </p>
  *
  * <ul class='notes'>
  *     <li>
- *             This variable resolver requires that a {@link RestRequest} 
object be set as a context object on the resolver
- *             or a session object on the resolver session.
+ *             This variable resolver requires that a {@link RestRequest} bean 
be available in the session bean factory.
  *     <li>
  *             For security reasons, nested and recursive variables are not 
resolved.
  * </ul>
@@ -59,10 +58,6 @@ import org.apache.juneau.svl.*;
  */
 public class RequestVar extends MultipartResolvingVar {
 
-       private static final String SESSION_req = "req";
-       private static final String SESSION_res = "res";
-
-
        /** The name of this variable. */
        public static final String NAME = "R";
 
@@ -85,7 +80,7 @@ public class RequestVar extends MultipartResolvingVar {
 
        @Override /* Var */
        public String resolve(VarResolverSession session, String key) {
-               RestRequest req = session.getSessionObject(RestRequest.class, 
SESSION_req, true);
+               RestRequest req = 
session.getBean(RestRequest.class).orElseThrow(InternalServerError::new);
                char c = StringUtils.charAt(key, 0);
                if (c == 'a') {
                        if ("authorityPath".equals(key))
@@ -121,6 +116,6 @@ public class RequestVar extends MultipartResolvingVar {
 
        @Override /* Var */
        public boolean canResolve(VarResolverSession session) {
-               return session.hasSessionObject(SESSION_req) && 
session.hasSessionObject(SESSION_res);
+               return session.getBean(RestRequest.class).isPresent();
        }
 }
\ No newline at end of file
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java
index 8399774..f4ed05f 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java
@@ -16,6 +16,7 @@ import static org.apache.juneau.internal.StringUtils.*;
 
 import java.io.*;
 
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.svl.*;
@@ -27,8 +28,7 @@ import org.apache.juneau.svl.*;
  * The format for this var is <js>"$SA{contentType,key[,defaultValue]}"</js>.
  *
  * <p>
- * This variable resolver requires that a {@link RestRequest} object be set as 
a context object on the resolver or a
- * session object on the resolver session.
+ * This variable resolver requires that a {@link RestRequest} bean be 
available in the session bean factory.
  *
  * <p>
  * Since this is a {@link SimpleVar}, any variables contained in the result 
will be recursively resolved.
@@ -40,8 +40,6 @@ import org.apache.juneau.svl.*;
  */
 public class SerializedRequestAttrVar extends StreamedVar {
 
-       private static final String SESSION_req = "req";
-
        /** The name of this variable. */
        public static final String NAME = "SA";
 
@@ -58,15 +56,13 @@ public class SerializedRequestAttrVar extends StreamedVar {
                if (i == -1)
                        throw new RuntimeException("Invalid format for $SA var. 
 Must be of the format $SA{contentType,key[,defaultValue]}");
                String[] s2 = split(key);
-               RestRequest req = session.getSessionObject(RestRequest.class, 
SESSION_req, true);
-               if (req != null) {
-                       Object o = req.getAttribute(key);
-                       if (o == null)
-                               o = key;
-                       Serializer s = 
req.getSerializers().getSerializer(s2[0]);
-                       if (s != null)
-                               s.serialize(w, o);
-               }
+               RestRequest req = 
session.getBean(RestRequest.class).orElseThrow(InternalServerError::new);
+               Object o = req.getAttribute(key);
+               if (o == null)
+                       o = key;
+               Serializer s = req.getSerializers().getSerializer(s2[0]);
+               if (s != null)
+                       s.serialize(w, o);
        }
 
        @Override  /* Var */
@@ -81,6 +77,6 @@ public class SerializedRequestAttrVar extends StreamedVar {
 
        @Override /* Var */
        public boolean canResolve(VarResolverSession session) {
-               return session.hasSessionObject(SESSION_req);
+               return session.getBean(RestRequest.class).isPresent();
        }
 }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/ServletInitParamVar.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/ServletInitParamVar.java
index c9a4d26..93ad803 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/ServletInitParamVar.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/ServletInitParamVar.java
@@ -12,6 +12,7 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.rest.vars;
 
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.svl.*;
 
@@ -22,8 +23,7 @@ import org.apache.juneau.svl.*;
  * The format for this var is <js>"$I{key[,defaultValue]}"</js>.
  *
  * <p>
- * This variable resolver requires that a {@link RestRequest} object be set as 
a context object on the resolver or a
- * session object on the resolver session.
+ * This variable resolver requires that a {@link RestRequest} bean be 
available in the session bean factory.
  *
  * <p>
  * Values are pulled from the {@link RestServlet#getInitParameter(String)} 
method.
@@ -38,8 +38,6 @@ import org.apache.juneau.svl.*;
  */
 public class ServletInitParamVar extends DefaultingVar {
 
-       private static final String SESSION_req = "req";
-
        /** The name of this variable. */
        public static final String NAME = "I";
 
@@ -52,11 +50,11 @@ public class ServletInitParamVar extends DefaultingVar {
 
        @Override /* Var */
        public String resolve(VarResolverSession session, String key) {
-               return session.getSessionObject(RestRequest.class, SESSION_req, 
true).getContext().getServletInitParameter(key);
+               return 
session.getBean(RestRequest.class).orElseThrow(InternalServerError::new).getContext().getServletInitParameter(key);
        }
 
        @Override /* Var */
        public boolean canResolve(VarResolverSession session) {
-               return session.hasSessionObject(SESSION_req);
+               return session.getBean(RestRequest.class).isPresent();
        }
 }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SwaggerVar.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SwaggerVar.java
index ee984fb..4740cde 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SwaggerVar.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SwaggerVar.java
@@ -12,6 +12,7 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.rest.vars;
 
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.svl.*;
 import org.apache.juneau.utils.*;
@@ -33,8 +34,7 @@ import org.apache.juneau.utils.*;
  *
  * <ul class='notes'>
  *     <li>
- *             This variable resolver requires that a {@link RestRequest} 
object be set as a context object on the resolver
- *             or a session object on the resolver session.
+ *             This variable resolver requires that a {@link RestRequest} bean 
be available in the session bean factory.
  *     <li>
  *             For security reasons, nested and recursive variables are not 
resolved.
  * </ul>
@@ -45,8 +45,6 @@ import org.apache.juneau.utils.*;
  */
 public class SwaggerVar extends MultipartResolvingVar {
 
-       private static final String SESSION_req = "req";
-
        /** The name of this variable. */
        public static final String NAME = "SS";
 
@@ -69,12 +67,12 @@ public class SwaggerVar extends MultipartResolvingVar {
 
        @Override /* Var */
        public String resolve(VarResolverSession session, String key) {
-               RestRequest req = session.getSessionObject(RestRequest.class, 
SESSION_req, true);
+               RestRequest req = 
session.getBean(RestRequest.class).orElseThrow(InternalServerError::new);
                return new PojoRest(req.getSwagger()).getString(key);
        }
 
        @Override /* Var */
        public boolean canResolve(VarResolverSession session) {
-               return session.hasSessionObject(SESSION_req);
+               return session.getBean(RestRequest.class).isPresent();
        }
 }
\ No newline at end of file
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/UrlVar.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/UrlVar.java
index 7240bdf..7d38be1 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/UrlVar.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/UrlVar.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.rest.vars;
 
 import org.apache.juneau.*;
+import org.apache.juneau.http.exception.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.svl.*;
 
@@ -30,6 +31,9 @@ import org.apache.juneau.svl.*;
  * See {@link UriResolver} for the kinds of URIs that can be resolved.
  *
  * <p>
+ * This variable resolver requires that a {@link RestRequest} bean be 
available in the session bean factory.
+ *
+ * <p>
  * Uses the URI resolver returned by {@link RestRequest#getUriResolver()}.
  *
  * <ul class='seealso'>
@@ -38,8 +42,6 @@ import org.apache.juneau.svl.*;
  */
 public class UrlVar extends SimpleVar {
 
-       private static final String SESSION_req = "req";
-
        /** The name of this variable. */
        public static final String NAME = "U";
 
@@ -52,12 +54,11 @@ public class UrlVar extends SimpleVar {
 
        @Override /* Var */
        public String resolve(VarResolverSession session, String key) {
-               RestRequest req = session.getSessionObject(RestRequest.class, 
SESSION_req, true);
-               return req.getUriResolver().resolve(key);
+               return 
session.getBean(RestRequest.class).orElseThrow(InternalServerError::new).getUriResolver().resolve(key);
        }
 
        @Override /* Var */
        public boolean canResolve(VarResolverSession session) {
-               return session.hasSessionObject(SESSION_req);
+               return session.getBean(RestRequest.class).isPresent();
        }
 }
\ No newline at end of file
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/Widget.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/Widget.java
index aad7722..65bfb51 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/Widget.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/Widget.java
@@ -18,6 +18,7 @@ import org.apache.juneau.rest.*;
 import org.apache.juneau.svl.*;
 import org.apache.juneau.cp.*;
 import org.apache.juneau.html.*;
+import org.apache.juneau.http.exception.*;
 
 /**
  * Defines an interface for resolvers of <js>"$W{...}"</js> string variables.
@@ -38,9 +39,6 @@ import org.apache.juneau.html.*;
  */
 public abstract class Widget implements HtmlWidget {
 
-       private static final String SESSION_req = "req";
-       private static final String SESSION_res = "res";
-
        /**
         * The widget key.
         *
@@ -61,11 +59,11 @@ public abstract class Widget implements HtmlWidget {
        }
 
        private RestRequest req(VarResolverSession session) {
-               return session.getSessionObject(RestRequest.class, SESSION_req, 
true);
+               return 
session.getBean(RestRequest.class).orElseThrow(InternalServerError::new);
        }
 
        private RestResponse res(VarResolverSession session) {
-               return session.getSessionObject(RestResponse.class, 
SESSION_res, true);
+               return 
session.getBean(RestResponse.class).orElseThrow(InternalServerError::new);
        }
 
        @Override /* HtmlWidget */

Reply via email to