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

commit 3370667cd0d1de4a06a20b05de7f18a289478a47
Author: JamesBognar <[email protected]>
AuthorDate: Tue Sep 14 09:56:10 2021 -0400

    Context API refactoring.
---
 .../apache/juneau/cp/BeanCreateMethodFinder.java   |  27 +-
 .../main/java/org/apache/juneau/cp/BeanStore.java  |  23 +
 .../apache/juneau/rest/mock/MockRestClient.java    |   2 +-
 .../org/apache/juneau/rest/RestContextBuilder.java | 763 +++++++++++----------
 .../java/org/apache/juneau/rest/RestServlet.java   |   2 +-
 .../java/org/apache/juneau/rest/Swagger_Test.java  |   4 +-
 .../apache/juneau/rest/testutils/TestUtils.java    |   2 +-
 7 files changed, 442 insertions(+), 381 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 b0829c8..d0dede0 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
@@ -32,6 +32,7 @@ import org.apache.juneau.reflect.*;
 public class BeanCreateMethodFinder<T> {
 
        private Class<T> beanType;
+       private final Class<?> resourceClass;
        private final Object resource;
        private final BeanStore beanStore;
 
@@ -43,7 +44,27 @@ public class BeanCreateMethodFinder<T> {
        BeanCreateMethodFinder(Class<T> beanType, Object resource, BeanStore 
beanStore) {
                this.beanType = beanType;
                this.resource = resource;
-               this.beanStore = beanStore;
+               this.resourceClass = resource.getClass();
+               this.beanStore = BeanStore.of(beanStore, resource);
+       }
+
+       BeanCreateMethodFinder(Class<T> beanType, Class<?> resourceClass, 
BeanStore beanStore) {
+               this.beanType = beanType;
+               this.resource = null;
+               this.resourceClass = resourceClass;
+               this.beanStore = BeanStore.of(beanStore);
+       }
+
+       /**
+        * Adds a bean to the lookup for parameters.
+        *
+        * @param c The bean type.
+        * @param t The bean.
+        * @return This object.
+        */
+       public <T2> BeanCreateMethodFinder<T> addBean(Class<T2> c, T2 t) {
+               beanStore.addBean(c, t);
+               return this;
        }
 
        /**
@@ -73,11 +94,11 @@ public class BeanCreateMethodFinder<T> {
         */
        public BeanCreateMethodFinder<T> find(String methodName, 
Class<?>...requiredParams) {
                if (method == null) {
-                       ClassInfo ci = ClassInfo.of(resource);
+                       ClassInfo ci = ClassInfo.of(resourceClass);
                        for (MethodInfo m : ci.getPublicMethods()) {
                                if (m.isAll(NOT_DEPRECATED) && 
m.hasReturnType(beanType) && m.getSimpleName().equals(methodName) && 
(!m.hasAnnotation(BeanIgnore.class))) {
                                        List<ClassInfo> missing = 
beanStore.getMissingParamTypes(m.getParams());
-                                       if (missing.isEmpty() && 
m.hasAllArgs(requiredParams)) {
+                                       if (missing.isEmpty() && 
m.hasAllArgs(requiredParams) && (m.isNotStatic() || resource != null)) {
                                                this.method = m;
                                                this.args = 
beanStore.getParams(m.getParams());
                                        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
index 010c86a..79e24dd 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
@@ -583,6 +583,29 @@ public class BeanStore {
        }
 
        /**
+        * Constructor.
+        *
+        * @param c The bean type to create.
+        * @param resourceClass The class containing the bean creator method.
+        * @return The created bean or the default value if method could not be 
found.
+        */
+       public <T> BeanCreateMethodFinder<T> beanCreateMethodFinder(Class<T> c, 
Class<?> resourceClass) {
+               return new BeanCreateMethodFinder<>(c, resourceClass, this);
+       }
+
+       /**
+        * Constructor.
+        *
+        * @param c The bean type to create.
+        * @return The created bean or the default value if method could not be 
found.
+        */
+       public <T> BeanCreateMethodFinder<T> beanCreateMethodFinder(Class<T> c) 
{
+               if (outer == null)
+                       throw runtimeException("Method cannot be used without 
outer bean definition.");
+               return new BeanCreateMethodFinder<>(c, outer, this);
+       }
+
+       /**
         * Given the list of param types, returns a list of types that are 
missing from this factory.
         *
         * @param params The param types to chec.
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 8386d44..79b24fe 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
@@ -283,7 +283,7 @@ public class MockRestClient extends RestClient implements 
HttpClientConnection {
                                        .create(o.getClass(), null, null)
                                        
.defaultClasses(BasicTestRestLogger.class)
                                        .debugDefault(CONDITIONAL)
-                                       .init(o)
+                                       .init(()->o)
                                        .build()
                                        .postInit()
                                        .postInitChildFirst();
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 14ae1fd..4d27c85 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
@@ -104,7 +104,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         */
        @SuppressWarnings("javadoc")
        public static final class Null extends RestContextBuilder {
-               protected Null(Class<?> resourceClass, RestContext 
parentContext, ServletConfig servletConfig) throws ServletException {
+               protected Null(Class<?> resourceClass, RestContext 
parentContext, ServletConfig servletConfig) {
                        super(resourceClass, parentContext, servletConfig);
                }
        }
@@ -178,55 +178,26 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
        /**
         * Constructor.
         *
-        * @param resourceClass The resource class.
+        * @param resourceClass
+        *      The REST servlet/bean type that this context is defined against.
         * @param parentContext The parent context if this is a child of 
another resource.
         * @param servletConfig The servlet config if available.
-        * @throws ServletException Initialization failed.
         */
-       protected RestContextBuilder(Class<?> resourceClass, RestContext 
parentContext, ServletConfig servletConfig) throws ServletException {
-               try {
-                       type(RestContext.class);
-
-                       this.resourceClass = resourceClass;
-                       this.inner = servletConfig;
-                       this.parentContext = parentContext;
-
-                       // Pass-through default values.
-                       if (parentContext != null) {
-                               defaultClasses = 
parentContext.defaultClasses.copy();
-                               defaultSettings = 
parentContext.defaultSettings.copy();
-                               rootBeanStore = parentContext.rootBeanStore;
-                       } else {
-                               defaultClasses = DefaultClassList.create();
-                               defaultSettings = DefaultSettingsMap.create();
-                       }
-
-                       beanStore = createBeanStore(resourceClass, 
parentContext)
-                               .build()
-                               .addBean(RestContextBuilder.class, this)
-                               .addBean(ServletConfig.class, 
ofNullable(servletConfig).orElse(this))
-                               .addBean(ServletContext.class, 
ofNullable(servletConfig).orElse(this).getServletContext());
-
-                       if (rootBeanStore == null)
-                               rootBeanStore = beanStore.copy().build();
-
-                       varResolver = createVarResolver(beanStore, 
resourceClass);
-                       beanStore.add(VarResolver.class, varResolver.build());
-                       config = beanStore.add(Config.class, 
createConfig(beanStore, resourceClass));
-                       beanStore.add(VarResolver.class, 
varResolver.bean(Config.class, config).build());
-
-                       // Add the servlet init parameters to our properties.
-                       if (servletConfig != null) {
-                               VarResolver vr = 
beanStore.getBean(VarResolver.class).get();
-                               for (Enumeration<String> ep = 
servletConfig.getInitParameterNames(); ep.hasMoreElements();) {
-                                       String p = ep.nextElement();
-                                       String initParam = 
servletConfig.getInitParameter(p);
-                                       set(vr.resolve(p), 
vr.resolve(initParam));
-                               }
-                       }
-
-               } catch (Exception e) {
-                       throw new ServletException(e);
+       protected RestContextBuilder(Class<?> resourceClass, RestContext 
parentContext, ServletConfig servletConfig) {
+               type(RestContext.class);
+
+               this.resourceClass = resourceClass;
+               this.inner = servletConfig;
+               this.parentContext = parentContext;
+
+               // Pass-through default values.
+               if (parentContext != null) {
+                       defaultClasses = parentContext.defaultClasses.copy();
+                       defaultSettings = parentContext.defaultSettings.copy();
+                       rootBeanStore = parentContext.rootBeanStore;
+               } else {
+                       defaultClasses = DefaultClassList.create();
+                       defaultSettings = DefaultSettingsMap.create();
                }
        }
 
@@ -245,21 +216,44 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
        }
 
        /**
-        * Performs initialization on this builder.
-        *
-        * Calls all @RestHook(INIT) methods on the specified resource object.
+        * Performs initialization on this builder against the specified REST 
servlet/bean instance.
         *
-        * @param resource The resource bean. Required.
+        * @param resource
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return This object.
         * @throws ServletException If hook method calls failed.
         */
-       public RestContextBuilder init(Object resource) throws ServletException 
{
-               this.resource = resource instanceof Supplier ? 
(Supplier<?>)resource : ()->resource;
+       public RestContextBuilder init(Supplier<?> resource) throws 
ServletException {
+               this.resource = resource;
+               Supplier<?> r = this.resource;
+               Class<?> rc = resourceClass;
+
+               beanStore = createBeanStore(rc, r)
+                       .build()
+                       .addBean(RestContextBuilder.class, this)
+                       .addBean(ServletConfig.class, 
ofNullable(inner).orElse(this))
+                       .addBean(ServletContext.class, 
ofNullable(inner).orElse(this).getServletContext());
+               BeanStore bs = beanStore;
+
+               if (rootBeanStore == null)
+                       rootBeanStore = beanStore.copy().build();
+
+               varResolver = createVarResolver(bs, rc);
+               beanStore.add(VarResolver.class, varResolver.build());
+               config = beanStore.add(Config.class, createConfig(bs, rc));
+               beanStore.add(VarResolver.class, varResolver.bean(Config.class, 
config).build());
+
+               // Add the servlet init parameters to our properties.
+               if (inner != null) {
+                       VarResolver vr = 
beanStore.getBean(VarResolver.class).get();
+                       for (Enumeration<String> ep = 
inner.getInitParameterNames(); ep.hasMoreElements();) {
+                               String p = ep.nextElement();
+                               String initParam = inner.getInitParameter(p);
+                               set(vr.resolve(p), vr.resolve(initParam));
+                       }
+               }
 
                ClassInfo rci = ClassInfo.of(resourceClass);
-               BeanStore bs = beanStore();
-
-               runInitHooks(bs, resource());
 
                VarResolverSession vrs = varResolver().build().createSession();
                AnnotationWorkList al = 
rci.getAnnotationList(ContextApplyFilter.INSTANCE).getWork(vrs);
@@ -268,13 +262,9 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                partParser().apply(al);
                jsonSchemaGenerator().apply(al);
 
-               return this;
-       }
+               runInitHooks(bs, resource());
 
-       private Supplier<?> resource() {
-               if (resource == null)
-                       throw runtimeException("Resource not available.  
init(Object) has not been called.");
-               return resource;
+               return this;
        }
 
        private void runInitHooks(BeanStore beanStore, Supplier<?> resource) 
throws ServletException {
@@ -307,6 +297,29 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                }
        }
 
+       /**
+        * Returns the REST servlet/bean instance that this context is defined 
against.
+        *
+        * @return The REST servlet/bean instance that this context is defined 
against.
+        */
+       public final Supplier<?> resource() {
+               if (resource == null)
+                       throw runtimeException("Resource not available.  
init(Object) has not been called.");
+               return resource;
+       }
+
+       /**
+        * Returns the REST servlet/bean instance that this context is defined 
against if it's the specified type.
+        *
+        * @param type The expected type of the resource bean.
+        * @return The bean cast to that instance, or {@link Optional#empty()} 
if it's not the specified type.
+        */
+       @SuppressWarnings("unchecked")
+       public final <T> Optional<T> resourceAs(Class<T> type) {
+               Object r = resource().get();
+               return Optional.ofNullable(type.isInstance(r) ? (T)r : null);
+       }
+
        
//-----------------------------------------------------------------------------------------------------------------
        // defaultClasses
        
//-----------------------------------------------------------------------------------------------------------------
@@ -327,7 +340,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         *
         * @return The default classes list for this builder.
         */
-       public DefaultClassList defaultClasses() {
+       public final DefaultClassList defaultClasses() {
                return defaultClasses;
        }
 
@@ -345,7 +358,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @return This object.
         * @see #defaultClasses()
         */
-       public RestContextBuilder defaultClasses(Class<?>...values) {
+       public final RestContextBuilder defaultClasses(Class<?>...values) {
                defaultClasses().add(values);
                return this;
        }
@@ -367,7 +380,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         *
         * @return The default settings map for this builder.
         */
-       public DefaultSettingsMap defaultSettings() {
+       public final DefaultSettingsMap defaultSettings() {
                return defaultSettings;
        }
 
@@ -386,7 +399,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @return This object.
         * @see #defaultSettings()
         */
-       public RestContextBuilder defaultSetting(String key, Object value) {
+       public final RestContextBuilder defaultSetting(String key, Object 
value) {
                defaultSettings().set(key, value);
                return this;
        }
@@ -402,7 +415,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * 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:
+        * The bean store is created by the constructor using the {@link 
#createBeanStore(Class,Supplier)} method and is initialized with the following 
beans:
         * <ul>
         *      <li>{@link RestContextBuilder}
         *      <li>{@link ServletConfig}
@@ -427,37 +440,6 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
        }
 
        /**
-        * Sets the bean store for this builder.
-        *
-        * <p>
-        * The resolver used for resolving instances of child resources and 
various other beans including:
-        * <ul>
-        *      <li>{@link RestLogger}
-        *      <li>{@link SwaggerProvider}
-        *      <li>{@link FileFinder}
-        *      <li>{@link StaticFiles}
-        * </ul>
-        *
-        * <p>
-        * Note that the <c>SpringRestServlet</c> classes uses the 
<c>SpringBeanStore</c> class to allow for any
-        * Spring beans to be injected into your REST resources.
-        *
-        * <ul class='seealso'>
-        *      <li class='link'>{@doc RestInjection}
-        * </ul>
-        *
-        * @param value
-        *      The new value for this setting.
-        *      <br>The default is {@link BasicRestLogger}.
-        * @return This object (for method chaining).
-        */
-       @FluentSetter
-       public RestContextBuilder beanStore(BeanStore value) {
-               beanStore = value;
-               return this;
-       }
-
-       /**
         * Creates the bean store for this builder.
         *
         * <p>
@@ -471,14 +453,16 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * 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 resourceClass
+        *      The REST servlet/bean type that this context is defined against.
+        * @param resource
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return A new bean store.
         */
-       protected BeanStore.Builder createBeanStore(Class<?> resourceClass, 
RestContext parentContext) {
+       protected BeanStore.Builder createBeanStore(Class<?> resourceClass, 
Supplier<?> resource) {
 
                // Create default builder.
-               Value<BeanStore.Builder> v = 
Value.of(BeanStore.create().parent(parentContext == null ? null : 
parentContext.getRootBeanStore()));
+               Value<BeanStore.Builder> v = 
Value.of(BeanStore.create().parent(rootBeanStore()));
 
                // Apply @Rest(beanStore).
                ClassInfo.of(resourceClass)
@@ -491,13 +475,13 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
 
                // Replace with builder:  public static BeanStore.Builder 
createBeanStore()
                v.get().build()
-                       .beanCreateMethodFinder(BeanStore.Builder.class, 
resourceClass)
+                       .beanCreateMethodFinder(BeanStore.Builder.class, 
resource.get())
                        .find("createBeanStore")
                        .run(x -> v.set(x));
 
                // Replace with implementations:  public static BeanStore 
createBeanStore()
                v.get().build()
-                       .beanCreateMethodFinder(BeanStore.class, resourceClass)
+                       .beanCreateMethodFinder(BeanStore.class, resource.get())
                        .find("createBeanStore")
                        .run(x -> v.get().impl(x));
 
@@ -568,7 +552,8 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * </ol>
         *
         * @param beanStore The bean store containing injected beans.
-        * @param resourceClass The resource class.
+        * @param resourceClass
+        *      The REST servlet/bean type that this context is defined against.
         * @return A new var resolver builder.
         */
        protected VarResolver.Builder createVarResolver(BeanStore beanStore, 
Class<?> resourceClass) {
@@ -576,15 +561,18 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                Value<VarResolver.Builder> v = Value.empty();
 
                // Get builder from:  public static VarResolver.Builder 
createVarResolver()
-               BeanStore
-                       .of(beanStore)
+               beanStore
                        .beanCreateMethodFinder(VarResolver.Builder.class, 
resourceClass)
                        .find("createVarResolver")
                        .run(x -> v.set(x));
 
                // Get builder from bean store.
-               if (v.isEmpty())
-                       beanStore.getBean(VarResolver.Builder.class).map(y -> 
y.copy()).ifPresent(x -> v.set(x));
+               if (v.isEmpty()) {
+                       beanStore
+                               .getBean(VarResolver.Builder.class)
+                               .map(y -> y.copy())
+                               .ifPresent(x -> v.set(x));
+               }
 
                // Create default builder.
                if (v.isEmpty()) {
@@ -599,13 +587,14 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                }
 
                // Get implementation from bean store.
-               beanStore.getBean(VarResolver.class).ifPresent(x -> 
v.get().impl(x));
+               beanStore
+                       .getBean(VarResolver.class)
+                       .ifPresent(x -> v.get().impl(x));
 
                // Get implementation from:  public static VarResolver 
createVarResolver()
-               BeanStore
-                       .of(beanStore)
-                       .addBean(VarResolver.Builder.class, v.get())
+               beanStore
                        .beanCreateMethodFinder(VarResolver.class, 
resourceClass)
+                       .addBean(VarResolver.Builder.class, v.get())
                        .find("createVarResolver")
                        .run(x -> v.get().impl(x));
 
@@ -628,7 +617,8 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * </ol>
         *
         * @param beanStore The bean store containing injected beans.
-        * @param resourceClass The resource class.
+        * @param resourceClass
+        *      The REST servlet/bean type that this context is defined against.
         * @return A new var resolver variable list.
         */
        protected VarList createVars(BeanStore beanStore, Class<?> 
resourceClass) {
@@ -636,7 +626,10 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                Value<VarList> v = Value.empty();
 
                // Get implementation from bean store.
-               beanStore.getBean(VarList.class).map(x -> x.copy()).ifPresent(x 
-> v.set(x));
+               beanStore
+                       .getBean(VarList.class)
+                       .map(x -> x.copy())
+                       .ifPresent(x -> v.set(x));
 
                // Create default.
                if (v.isEmpty()) {
@@ -664,10 +657,9 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                }
 
                // Get implementation from:  public static VarList createVars()
-               BeanStore
-                       .of(beanStore, resourceClass)
-                       .addBean(VarList.class, v.get())
+               beanStore
                        .beanCreateMethodFinder(VarList.class, resourceClass)
+                       .addBean(VarList.class, v.get())
                        .find("createVars")
                        .run(x -> v.set(x));
 
@@ -712,7 +704,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @return This object (for method chaining).
         */
        @FluentSetter
-       public RestContextBuilder config(Config config) {
+       public final RestContextBuilder config(Config config) {
                this.config = config;
                return this;
        }
@@ -721,11 +713,11 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * Creates the config for this builder.
         *
         * @param beanStore The bean store to use for creating the config.
-        * @param resourceClass The resource class.
+        * @param resourceClass
+        *      The REST servlet/bean type that this context is defined against.
         * @return A new bean store.
-        * @throws Exception If bean store could not be instantiated.
         */
-       protected Config createConfig(BeanStore beanStore, Class<?> 
resourceClass) throws Exception {
+       protected Config createConfig(BeanStore beanStore, Class<?> 
resourceClass) {
 
                Value<Config> v = Value.empty();
 
@@ -741,7 +733,8 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
 
                // Find our config file.  It's the last non-empty 
@RestResource(config).
                VarResolver vr = 
beanStore.getBean(VarResolver.class).orElseThrow(()->runtimeException("VarResolver
 not found."));
-               String cf = ClassInfo.of(resourceClass)
+               String cf = ClassInfo
+                       .of(resourceClass)
                        .getAnnotations(Rest.class)
                        .stream()
                        .map(x -> x.config())
@@ -773,7 +766,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * Returns the logger to use for the REST resource.
         *
         * @return The logger to use for the REST resource.
-        * @throws RuntimeException If {@link #init(Object)} has not been 
called.
+        * @throws RuntimeException If {@link #init(Supplier)} has not been 
called.
         */
        public final Logger logger() {
                if (logger == null)
@@ -813,7 +806,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * </ul>
         *
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         *      <br>Created by {@link RestContextBuilder#beanStore()}.
@@ -824,15 +817,16 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                Value<Logger> v = Value.empty();
                Object r = resource.get();
 
-               beanStore.getBean(Logger.class).ifPresent(x -> v.set(x));
+               beanStore
+                       .getBean(Logger.class)
+                       .ifPresent(x -> v.set(x));
 
                if (v.isEmpty())
                        v.set(Logger.getLogger(className(r)));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(Logger.class)
                        .addBean(Logger.class, v.get())
-                       .beanCreateMethodFinder(Logger.class, r)
                        .find("createLogger")
                        .run(x -> v.set(x));
 
@@ -872,7 +866,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * </ul>
         *
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @param parent
         *      The parent context if the REST bean was registered via {@link 
Rest#children()}.
         *      <br>Will be <jk>null</jk> if the bean is a top-level resource.
@@ -884,14 +878,15 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
        protected ThrownStore.Builder createThrownStore(BeanStore beanStore, 
Supplier<?> resource, RestContext parent) {
 
                Value<ThrownStore.Builder> v = Value.empty();
-               Object r = resource.get();
 
-               beanStore.getBean(ThrownStore.Builder.class).map(x -> 
x.copy()).ifPresent(x->v.set(x));
+               beanStore
+                       .getBean(ThrownStore.Builder.class)
+                       .map(x -> x.copy())
+                       .ifPresent(x->v.set(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(ThrownStore.Builder.class)
                        .addBean(ThrownStore.Builder.class, v.get())
-                       .beanCreateMethodFinder(ThrownStore.Builder.class, r)
                        .find("createThrownStore")
                        .run(x -> v.set(x));
 
@@ -905,12 +900,13 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                }
 
                // Specify the implementation class if its set as a default.
-               defaultClasses().get(ThrownStore.class).ifPresent(x -> 
v.get().implClass(x));
+               defaultClasses()
+                       .get(ThrownStore.class)
+                       .ifPresent(x -> v.get().implClass(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(ThrownStore.class)
                        .addBean(ThrownStore.Builder.class, v.get())
-                       .beanCreateMethodFinder(ThrownStore.class, r)
                        .find("createThrownStore")
                        .run(x -> v.get().impl(x));
 
@@ -938,20 +934,21 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The stack trace store for this REST resource.
         */
        protected MethodExecStore.Builder createMethodExecStore(BeanStore 
beanStore, Supplier<?> resource) {
 
                Value<MethodExecStore.Builder> v = Value.empty();
-               Object r = resource.get();
 
-               beanStore.getBean(MethodExecStore.Builder.class).map(x -> 
x.copy()).ifPresent(x->v.set(x));
+               beanStore
+                       .getBean(MethodExecStore.Builder.class)
+                       .map(x -> x.copy())
+                       .ifPresent(x->v.set(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(MethodExecStore.Builder.class)
                        .addBean(MethodExecStore.Builder.class, v.get())
-                       .beanCreateMethodFinder(MethodExecStore.Builder.class, 
r)
                        .find("createMethodExecStore")
                        .run(x -> v.set(x));
 
@@ -964,12 +961,13 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                }
 
                // Specify the implementation class if its set as a default.
-               defaultClasses().get(MethodExecStore.class).ifPresent(x -> 
v.get().implClass(x));
+               defaultClasses()
+                       .get(MethodExecStore.class)
+                       .ifPresent(x -> v.get().implClass(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(MethodExecStore.class)
                        .addBean(MethodExecStore.Builder.class, v.get())
-                       .beanCreateMethodFinder(MethodExecStore.class, r)
                        .find("createMethodExecStore")
                        .run(x -> v.get().impl(x));
 
@@ -1070,31 +1068,28 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The messages builder for this REST object.
         */
        protected Messages.Builder createMessages(BeanStore beanStore, 
Supplier<?> resource) {
 
                Value<Messages.Builder> v = Value.empty();
-               Object r = resource.get();
 
-               BeanStore
-                       .of(beanStore, r)
-                       .beanCreateMethodFinder(Messages.Builder.class, r)
+               beanStore
+                       .beanCreateMethodFinder(Messages.Builder.class)
                        .find("createMessages")
                        .run(x -> v.set(x));
 
                if (v.isEmpty()) {
                        v.set(
                                Messages
-                                       .create(r.getClass())
+                                       .create(resourceClass)
                        );
                }
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(Messages.class)
                        .addBean(Messages.Builder.class, v.get())
-                       .beanCreateMethodFinder(Messages.class, r)
                        .find("createMessages")
                        .run(x -> v.get().impl(x));
 
@@ -1222,15 +1217,17 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The response handler builder for this REST resource.
         */
        protected ResponseProcessorList.Builder 
createResponseProcessors(BeanStore beanStore, Supplier<?> resource) {
 
                Value<ResponseProcessorList.Builder> v = Value.empty();
-               Object r = resource.get();
 
-               beanStore.getBean(ResponseProcessorList.Builder.class).map(x -> 
x.copy()).ifPresent(x -> v.set(x));
+               beanStore
+                       .getBean(ResponseProcessorList.Builder.class)
+                       .map(x -> x.copy())
+                       .ifPresent(x -> v.set(x));
 
                if (v.isEmpty()) {
                        v.set(
@@ -1251,19 +1248,19 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                        );
                }
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       
.beanCreateMethodFinder(ResponseProcessorList.Builder.class)
                        .addBean(ResponseProcessorList.Builder.class, v.get())
-                       
.beanCreateMethodFinder(ResponseProcessorList.Builder.class, r)
                        .find("createResponseProcessors")
                        .run(x -> v.set(x));
 
-               beanStore.getBean(ResponseProcessorList.class).ifPresent(x -> 
v.get().impl(x));
+               beanStore
+                       .getBean(ResponseProcessorList.class)
+                       .ifPresent(x -> v.get().impl(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(ResponseProcessorList.class)
                        .addBean(ResponseProcessorList.Builder.class, v.get())
-                       .beanCreateMethodFinder(ResponseProcessorList.class, r)
                        .find("createResponseProcessors")
                        .run(x -> v.get().impl(x));
 
@@ -1334,7 +1331,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * </ul>
         *
         * @return The builder for the {@link RestLogger} object in the REST 
context.
-        * @throws RuntimeException If {@link #init(Object)} has not been 
called.
+        * @throws RuntimeException If {@link #init(Supplier)} has not been 
called.
         */
        public final RestLogger.Builder callLogger() {
                if (callLogger == null)
@@ -1373,20 +1370,21 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The call logger builder for this REST resource.
         */
        protected RestLogger.Builder createCallLogger(BeanStore beanStore, 
Supplier<?> resource) {
 
                Value<RestLogger.Builder> v = Value.empty();
-               Object r = resource.get();
 
-               beanStore.getBean(RestLogger.Builder.class).map(x -> 
x.copy()).ifPresent(x-> v.set(x));
+               beanStore
+                       .getBean(RestLogger.Builder.class)
+                       .map(x -> x.copy())
+                       .ifPresent(x-> v.set(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(RestLogger.Builder.class)
                        .addBean(RestLogger.Builder.class, v.get())
-                       .beanCreateMethodFinder(RestLogger.Builder.class, r)
                        .find("createCallLogger")
                        .run(x -> v.set(x));
 
@@ -1419,18 +1417,21 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                        );
                }
 
-               if (r instanceof RestLogger)
-                       v.get().impl((RestLogger)r);
+               resourceAs(RestLogger.class)
+                       .ifPresent(x -> v.get().impl(x));
 
-               beanStore.getBean(RestLogger.class).ifPresent(x-> 
v.get().impl(x));
+               beanStore
+                       .getBean(RestLogger.class)
+                       .ifPresent(x-> v.get().impl(x));
 
                // Specify the implementation class if its set as a default.
-               defaultClasses().get(RestLogger.class).ifPresent(x -> 
v.get().implClass(x));
+               defaultClasses()
+                       .get(RestLogger.class)
+                       .ifPresent(x -> v.get().implClass(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(RestLogger.class)
                        .addBean(RestLogger.Builder.class, v.get())
-                       .beanCreateMethodFinder(RestLogger.class, r)
                        .find("createCallLogger")
                        .run(x -> v.get().impl(x));
 
@@ -1478,16 +1479,18 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The HTTP part serializer for this REST resource.
         */
        protected HttpPartSerializer.Creator createPartSerializer(BeanStore 
beanStore, Supplier<?> resource) {
 
                Value<HttpPartSerializer.Creator> v = Value.empty();
-               Object r = resource.get();
 
                // Get builder from bean store.
-               beanStore.getBean(HttpPartSerializer.Creator.class).map(x -> 
x.copy()).ifPresent(x -> v.set(x));
+               beanStore
+                       .getBean(HttpPartSerializer.Creator.class)
+                       .map(x -> x.copy())
+                       .ifPresent(x -> v.set(x));
 
                // Create default.
                if (v.isEmpty()) {
@@ -1499,24 +1502,26 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                }
 
                // Set implementation if in bean store.
-               beanStore.getBean(HttpPartSerializer.class).ifPresent(x -> 
v.get().impl(x));
+               beanStore
+                       .getBean(HttpPartSerializer.class)
+                       .ifPresent(x -> v.get().impl(x));
 
                // Set default type.
-               defaultClasses.get(HttpPartSerializer.class).ifPresent(x -> 
v.get().type(x));
+               defaultClasses
+                       .get(HttpPartSerializer.class)
+                       .ifPresent(x -> v.get().type(x));
 
                // Call:  public [static] HttpPartSerializer.Creator 
createPartSerializer(<anything-in-bean-store>)
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       
.beanCreateMethodFinder(HttpPartSerializer.Creator.class)
                        .addBean(HttpPartSerializer.Creator.class, v.get())
-                       
.beanCreateMethodFinder(HttpPartSerializer.Creator.class, r)
                        .find("createPartSerializer")
                        .run(x -> v.set(x));
 
                // Call:  public [static] HttpPartSerializer 
createPartSerializer(<anything-in-bean-store>)
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(HttpPartSerializer.class)
                        .addBean(HttpPartSerializer.Creator.class, v.get())
-                       .beanCreateMethodFinder(HttpPartSerializer.class, r)
                        .find("createPartSerializer")
                        .run(x -> v.get().impl(x));
 
@@ -1564,16 +1569,18 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The HTTP part serializer for this REST resource.
         */
        protected HttpPartParser.Creator createPartParser(BeanStore beanStore, 
Supplier<?> resource) {
 
                Value<HttpPartParser.Creator> v = Value.empty();
-               Object r = resource.get();
 
                // Get builder from bean store.
-               beanStore.getBean(HttpPartParser.Creator.class).map(x -> 
x.copy()).ifPresent(x -> v.set(x));
+               beanStore
+                       .getBean(HttpPartParser.Creator.class)
+                       .map(x -> x.copy())
+                       .ifPresent(x -> v.set(x));
 
                // Create default.
                if (v.isEmpty()) {
@@ -1585,24 +1592,26 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                }
 
                // Set implementation if in bean store.
-               beanStore.getBean(HttpPartParser.class).ifPresent(x -> 
v.get().impl(x));
+               beanStore
+                       .getBean(HttpPartParser.class)
+                       .ifPresent(x -> v.get().impl(x));
 
                // Set default type.
-               defaultClasses.get(HttpPartParser.class).ifPresent(x -> 
v.get().type(x));
+               defaultClasses
+                       .get(HttpPartParser.class)
+                       .ifPresent(x -> v.get().type(x));
 
                // Call:  public [static] HttpPartParser.Creator 
createPartParser(<anything-in-bean-store>)
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(HttpPartParser.Creator.class)
                        .addBean(HttpPartParser.Creator.class, v.get())
-                       .beanCreateMethodFinder(HttpPartParser.Creator.class, r)
                        .find("createPartParser")
                        .run(x -> v.set(x));
 
                // Call:  public [static] HttpPartParser 
createPartParser(<anything-in-bean-store>)
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(HttpPartParser.class)
                        .addBean(HttpPartParser.Creator.class, v.get())
-                       .beanCreateMethodFinder(HttpPartParser.class, r)
                        .find("createPartParser")
                        .run(x -> v.get().impl(x));
 
@@ -1644,15 +1653,17 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The JSON schema generator builder for this REST resource.
         */
        protected JsonSchemaGeneratorBuilder 
createJsonSchemaGenerator(BeanStore beanStore, Supplier<?> resource) {
 
                Value<JsonSchemaGeneratorBuilder> v = Value.empty();
-               Object r = resource.get();
 
-               beanStore.getBean(JsonSchemaGeneratorBuilder.class).map(x -> 
x.copy()).ifPresent(x -> v.set(x));
+               beanStore
+                       .getBean(JsonSchemaGeneratorBuilder.class)
+                       .map(x -> x.copy())
+                       .ifPresent(x -> v.set(x));
 
                if (v.isEmpty()) {
                        v.set(
@@ -1660,19 +1671,19 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                        );
                }
 
-               beanStore.getBean(JsonSchemaGenerator.class).ifPresent(x -> 
v.get().impl(x));
+               beanStore
+                       .getBean(JsonSchemaGenerator.class)
+                       .ifPresent(x -> v.get().impl(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       
.beanCreateMethodFinder(JsonSchemaGeneratorBuilder.class)
                        .addBean(JsonSchemaGeneratorBuilder.class, v.get())
-                       
.beanCreateMethodFinder(JsonSchemaGeneratorBuilder.class, r)
                        .find("createJsonSchemaGenerator")
                        .run(x -> v.set(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(JsonSchemaGenerator.class)
                        .addBean(JsonSchemaGeneratorBuilder.class, v.get())
-                       .beanCreateMethodFinder(JsonSchemaGenerator.class, r)
                        .find("createJsonSchemaGenerator")
                        .run(x -> v.get().impl(x));
 
@@ -1818,15 +1829,17 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The file finder for this REST resource.
         */
        protected FileFinder.Builder createFileFinder(BeanStore beanStore, 
Supplier<?> resource) {
 
                Value<FileFinder.Builder> v = Value.empty();
-               Object r = resource.get();
 
-               beanStore.getBean(FileFinder.Builder.class).map(x -> 
x.copy()).ifPresent(x -> v.set(x));
+               beanStore
+                       .getBean(FileFinder.Builder.class)
+                       .map(x -> x.copy())
+                       .ifPresent(x -> v.set(x));
 
                if (v.isEmpty()) {
                        v.set(
@@ -1835,31 +1848,33 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                                        .beanStore(beanStore)
                                        .dir("static")
                                        .dir("htdocs")
-                                       .cp(r.getClass(), "htdocs", true)
-                                       .cp(r.getClass(), "/htdocs", true)
+                                       .cp(resourceClass, "htdocs", true)
+                                       .cp(resourceClass, "/htdocs", true)
                                        .caching(1_000_000)
                                        .exclude("(?i).*\\.(class|properties)")
                        );
                }
 
-               beanStore.getBean(FileFinder.class).ifPresent(x -> 
v.get().impl(x));
+               beanStore
+                       .getBean(FileFinder.class)
+                       .ifPresent(x -> v.get().impl(x));
 
-               if (r instanceof FileFinder)
-                       v.get().impl((FileFinder)r);
+               resourceAs(FileFinder.class)
+                       .ifPresent(x -> v.get().impl(x));
 
-               defaultClasses.get(FileFinder.class).ifPresent(x -> 
v.get().type(x));
+               defaultClasses
+                       .get(FileFinder.class)
+                       .ifPresent(x -> v.get().type(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(FileFinder.Builder.class)
                        .addBean(FileFinder.Builder.class, v.get())
-                       .beanCreateMethodFinder(FileFinder.Builder.class, r)
                        .find("createFileFinder")
                        .run(x -> v.set(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(FileFinder.class)
                        .addBean(FileFinder.Builder.class, v.get())
-                       .beanCreateMethodFinder(FileFinder.class, r)
                        .find("createFileFinder")
                        .run(x -> v.get().impl(x));
 
@@ -1996,15 +2011,17 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The file finder for this REST resource.
         */
        protected StaticFiles.Builder createStaticFiles(BeanStore beanStore, 
Supplier<?> resource) {
 
                Value<StaticFiles.Builder> v = Value.empty();
-               Object r = resource.get();
 
-               beanStore.getBean(StaticFiles.Builder.class).map(x -> 
x.copy()).ifPresent(x -> v.set(x));
+               beanStore
+                       .getBean(StaticFiles.Builder.class)
+                       .map(x -> x.copy())
+                       .ifPresent(x -> v.set(x));
 
                if (v.isEmpty()) {
                        v.set(
@@ -2013,32 +2030,34 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                                        .beanStore(beanStore)
                                        .dir("static")
                                        .dir("htdocs")
-                                       .cp(r.getClass(), "htdocs", true)
-                                       .cp(r.getClass(), "/htdocs", true)
+                                       .cp(resourceClass, "htdocs", true)
+                                       .cp(resourceClass, "/htdocs", true)
                                        .caching(1_000_000)
                                        .exclude("(?i).*\\.(class|properties)")
                                        .headers(cacheControl("max-age=86400, 
public"))
                        );
                }
 
-               beanStore.getBean(StaticFiles.class).ifPresent(x -> 
v.get().impl(x));
+               beanStore
+                       .getBean(StaticFiles.class)
+                       .ifPresent(x -> v.get().impl(x));
 
-               if (r instanceof StaticFiles)
-                       v.get().impl((StaticFiles)r);
+               resourceAs(StaticFiles.class)
+                       .ifPresent(x -> v.get().impl(x));
 
-               defaultClasses.get(StaticFiles.class).ifPresent(x -> 
v.get().type(x));
+               defaultClasses
+                       .get(StaticFiles.class)
+                       .ifPresent(x -> v.get().type(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(StaticFiles.Builder.class)
                        .addBean(StaticFiles.Builder.class, v.get())
-                       .beanCreateMethodFinder(StaticFiles.Builder.class, r)
                        .find("createStaticFiles")
                        .run(x -> v.set(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(StaticFiles.class)
                        .addBean(StaticFiles.Builder.class, v.get())
-                       .beanCreateMethodFinder(StaticFiles.class, r)
                        .find("createStaticFiles")
                        .run(x -> v.get().impl(x));
 
@@ -2157,32 +2176,34 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The default request headers for this REST object.
         */
        protected HeaderList.Builder createDefaultRequestHeaders(BeanStore 
beanStore, Supplier<?> resource) {
 
                Value<HeaderList.Builder> v = Value.empty();
-               Object r = resource.get();
 
-               beanStore.getBean("RestContext.defaultRequestHeaders", 
HeaderList.Builder.class).map(x -> x.copy()).ifPresent(x -> v.set(x));
+               beanStore
+                       .getBean("RestContext.defaultRequestHeaders", 
HeaderList.Builder.class)
+                       .map(x -> x.copy())
+                       .ifPresent(x -> v.set(x));
 
                if (v.isEmpty())
                        v.set(HeaderList.create());
 
-               beanStore.getBean("RestContext.defaultRequestHeaders", 
HeaderList.class).ifPresent(x -> v.get().impl(x));
+               beanStore
+                       .getBean("RestContext.defaultRequestHeaders", 
HeaderList.class)
+                       .ifPresent(x -> v.get().impl(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(HeaderList.Builder.class)
                        .addBean(HeaderList.Builder.class, v.get())
-                       .beanCreateMethodFinder(HeaderList.Builder.class, r)
                        .find("createDefaultRequestHeaders")
                        .run(x -> v.set(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(HeaderList.class)
                        .addBean(HeaderList.Builder.class, v.get())
-                       .beanCreateMethodFinder(HeaderList.class, r)
                        .find("createDefaultRequestHeaders")
                        .run(x -> v.get().impl(x));
 
@@ -2267,32 +2288,34 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The default response headers for this REST object.
         */
        protected HeaderList.Builder createDefaultResponseHeaders(BeanStore 
beanStore, Supplier<?> resource) {
 
                Value<HeaderList.Builder> v = Value.empty();
-               Object r = resource.get();
 
-               beanStore.getBean("RestContext.defaultResponseHeaders", 
HeaderList.Builder.class).map(x -> x.copy()).ifPresent(x -> v.set(x));
+               beanStore
+                       .getBean("RestContext.defaultResponseHeaders", 
HeaderList.Builder.class)
+                       .map(x -> x.copy())
+                       .ifPresent(x -> v.set(x));
 
                if (v.isEmpty())
                        v.set(HeaderList.create());
 
-               beanStore.getBean("RestContext.defaultResponseHeaders", 
HeaderList.class).ifPresent(x -> v.get().impl(x));
+               beanStore
+                       .getBean("RestContext.defaultResponseHeaders", 
HeaderList.class)
+                       .ifPresent(x -> v.get().impl(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(HeaderList.Builder.class)
                        .addBean(HeaderList.Builder.class, v.get())
-                       .beanCreateMethodFinder(HeaderList.Builder.class, r)
                        .find("createDefaultResponseHeaders")
                        .run(x -> v.set(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(HeaderList.class)
                        .addBean(HeaderList.Builder.class, v.get())
-                       .beanCreateMethodFinder(HeaderList.class, r)
                        .find("createDefaultResponseHeaders")
                        .run(x -> v.get().impl(x));
 
@@ -2374,23 +2397,24 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The default response headers for this REST object.
         */
        protected NamedAttributeList createDefaultRequestAttributes(BeanStore 
beanStore, Supplier<?> resource) {
 
                Value<NamedAttributeList> v = Value.empty();
-               Object r = resource.get();
 
-               beanStore.getBean("RestContext.defaultRequestAttributes", 
NamedAttributeList.class).map(x -> x.copy()).ifPresent(x -> v.set(x));
+               beanStore
+                       .getBean("RestContext.defaultRequestAttributes", 
NamedAttributeList.class)
+                       .map(x -> x.copy())
+                       .ifPresent(x -> v.set(x));
 
                if (v.isEmpty())
                        v.set(NamedAttributeList.create());
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(NamedAttributeList.class)
                        .addBean(NamedAttributeList.class, v.get())
-                       .beanCreateMethodFinder(NamedAttributeList.class, r)
                        .find("createDefaultRequestAttributes")
                        .run(x -> v.set(x));
 
@@ -2506,15 +2530,17 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The REST method parameter resolvers for this REST resource.
         */
        protected RestOpArgList.Builder createRestOpArgs(BeanStore beanStore, 
Supplier<?> resource) {
 
                Value<RestOpArgList.Builder> v = Value.empty();
-               Object r = resource.get();
 
-               beanStore.getBean("RestContext.restOpArgs", 
RestOpArgList.Builder.class).map(x -> x.copy()).ifPresent(x -> v.set(x));
+               beanStore
+                       .getBean("RestContext.restOpArgs", 
RestOpArgList.Builder.class)
+                       .map(x -> x.copy())
+                       .ifPresent(x -> v.set(x));
 
                if (v.isEmpty()) {
                        v.set(
@@ -2565,19 +2591,19 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                        );
                }
 
-               beanStore.getBean("RestContext.restOpArgs", 
RestOpArgList.class).ifPresent(x -> v.get().impl(x));
+               beanStore
+                       .getBean("RestContext.restOpArgs", RestOpArgList.class)
+                       .ifPresent(x -> v.get().impl(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(RestOpArgList.Builder.class)
                        .addBean(RestOpArgList.Builder.class, v.get())
-                       .beanCreateMethodFinder(RestOpArgList.Builder.class, r)
                        .find("createRestOpArgs")
                        .run(x -> v.set(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(RestOpArgList.class)
                        .addBean(RestOpArgList.Builder.class, v.get())
-                       .beanCreateMethodFinder(RestOpArgList.class, r)
                        .find("createRestOpArgs")
                        .run(x -> v.get().impl(x));
 
@@ -2605,15 +2631,17 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The REST method parameter resolvers for this REST resource.
         */
        protected RestOpArgList.Builder createHookMethodArgs(BeanStore 
beanStore, Supplier<?> resource) {
 
                Value<RestOpArgList.Builder> v = Value.empty();
-               Object r = resource.get();
 
-               beanStore.getBean("RestContext.hookMethodArgs", 
RestOpArgList.Builder.class).map(x -> x.copy()).ifPresent(x -> v.set(x));
+               beanStore
+                       .getBean("RestContext.hookMethodArgs", 
RestOpArgList.Builder.class)
+                       .map(x -> x.copy())
+                       .ifPresent(x -> v.set(x));
 
                if (v.isEmpty()) {
                        v.set(
@@ -2641,19 +2669,19 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                        );
                }
 
-               beanStore.getBean("RestContext.hookMethodArgs", 
RestOpArgList.class).ifPresent(x -> v.get().impl(x));
+               beanStore
+                       .getBean("RestContext.hookMethodArgs", 
RestOpArgList.class)
+                       .ifPresent(x -> v.get().impl(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(RestOpArgList.Builder.class)
                        .addBean(RestOpArgList.Builder.class, v.get())
-                       .beanCreateMethodFinder(RestOpArgList.Builder.class, r)
                        .find("createHookMethodArgs")
                        .run(x -> v.set(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(RestOpArgList.class)
                        .addBean(RestOpArgList.Builder.class, v.get())
-                       .beanCreateMethodFinder(RestOpArgList.class, r)
                        .find("createHookMethodArgs")
                        .run(x -> v.get().impl(x));
 
@@ -2746,15 +2774,17 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The debug enablement bean for this REST object.
         */
        protected DebugEnablement.Builder createDebugEnablement(BeanStore 
beanStore, Supplier<?> resource) {
 
                Value<DebugEnablement.Builder> v = Value.empty();
-               Object r = resource.get();
 
-               beanStore.getBean(DebugEnablement.Builder.class).map(x -> 
x.copy()).ifPresent(x -> v.set(x));
+               beanStore
+                       .getBean(DebugEnablement.Builder.class)
+                       .map(x -> x.copy())
+                       .ifPresent(x -> v.set(x));
 
                if (v.isEmpty()) {
                        DebugEnablement.Builder b = DebugEnablement
@@ -2766,7 +2796,7 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                        b.defaultEnable(debugDefault);
 
                        // Gather @RestOp(debug) settings.
-                       for (MethodInfo mi : 
ClassInfo.ofProxy(r).getPublicMethods()) {
+                       for (MethodInfo mi : 
ClassInfo.ofProxy(resource.get()).getPublicMethods()) {
                                mi
                                        .getAnnotationGroupList(RestOp.class)
                                        .getValues(String.class, "debug")
@@ -2779,24 +2809,26 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                        v.set(b);
                }
 
-               if (r instanceof DebugEnablement)
-                       v.get().impl((DebugEnablement)r);
+               resourceAs(DebugEnablement.class)
+                       .ifPresent(x -> v.get().impl(x));
 
-               defaultClasses.get(DebugEnablement.class).ifPresent(x -> 
v.get().type(x));
+               defaultClasses
+                       .get(DebugEnablement.class)
+                       .ifPresent(x -> v.get().type(x));
 
-               beanStore.getBean(DebugEnablement.class).ifPresent(x -> 
v.get().impl(x));
+               beanStore
+                       .getBean(DebugEnablement.class)
+                       .ifPresent(x -> v.get().impl(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(DebugEnablement.Builder.class)
                        .addBean(DebugEnablement.Builder.class, v.get())
-                       .beanCreateMethodFinder(DebugEnablement.Builder.class, 
r)
                        .find("createDebugEnablement")
                        .run(x -> v.set(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(DebugEnablement.class)
                        .addBean(DebugEnablement.Builder.class, v.get())
-                       .beanCreateMethodFinder(DebugEnablement.class, r)
                        .find("createDebugEnablement")
                        .run(x -> v.get().impl(x));
 
@@ -2824,18 +2856,16 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The default response headers for this REST object.
         */
        protected MethodList createStartCallMethods(BeanStore beanStore, 
Supplier<?> resource) {
 
                Value<MethodList> v = Value.of(getHookMethods(resource, 
HookEvent.START_CALL));
-               Object r = resource.get();
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(MethodList.class)
                        .addBean(MethodList.class, v.get())
-                       .beanCreateMethodFinder(MethodList.class, r)
                        .find("createStartCallMethods")
                        .run(x -> v.set(x));
 
@@ -2863,18 +2893,16 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The default response headers for this REST object.
         */
        protected MethodList createEndCallMethods(BeanStore beanStore, 
Supplier<?> resource) {
 
                Value<MethodList> v = Value.of(getHookMethods(resource, 
HookEvent.END_CALL));
-               Object r = resource.get();
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(MethodList.class)
                        .addBean(MethodList.class, v.get())
-                       .beanCreateMethodFinder(MethodList.class, r)
                        .find("createEndCallMethods")
                        .run(x -> v.set(x));
 
@@ -2902,18 +2930,16 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The default response headers for this REST object.
         */
        protected MethodList createPostInitMethods(BeanStore beanStore, 
Supplier<?> resource) {
 
                Value<MethodList> v = Value.of(getHookMethods(resource, 
HookEvent.POST_INIT));
-               Object r = resource.get();
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(MethodList.class)
                        .addBean(MethodList.class, v.get())
-                       .beanCreateMethodFinder(MethodList.class, r)
                        .find("createPostInitMethods")
                        .run(x -> v.set(x));
 
@@ -2941,18 +2967,16 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The default response headers for this REST object.
         */
        protected MethodList createPostInitChildFirstMethods(BeanStore 
beanStore, Supplier<?> resource) {
 
                Value<MethodList> v = Value.of(getHookMethods(resource, 
HookEvent.POST_INIT_CHILD_FIRST));
-               Object r = resource.get();
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(MethodList.class)
                        .addBean(MethodList.class, v.get())
-                       .beanCreateMethodFinder(MethodList.class, r)
                        .find("createPostInitChildFirstMethods")
                        .run(x -> v.set(x));
 
@@ -2979,18 +3003,16 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The default response headers for this REST object.
         */
        protected MethodList createDestroyMethods(BeanStore beanStore, 
Supplier<?> resource) {
 
                Value<MethodList> v = Value.of(getHookMethods(resource, 
HookEvent.DESTROY));
-               Object r = resource.get();
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(MethodList.class)
                        .addBean(MethodList.class, v.get())
-                       .beanCreateMethodFinder(MethodList.class, r)
                        .find("createDestroyMethods")
                        .run(x -> v.set(x));
 
@@ -3018,18 +3040,16 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The default response headers for this REST object.
         */
        protected MethodList createPreCallMethods(BeanStore beanStore, 
Supplier<?> resource) {
 
                Value<MethodList> v = Value.of(getHookMethods(resource, 
HookEvent.PRE_CALL));
-               Object r = resource.get();
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(MethodList.class)
                        .addBean(MethodList.class, v.get())
-                       .beanCreateMethodFinder(MethodList.class, r)
                        .find("createPreCallMethods")
                        .run(x -> v.set(x));
 
@@ -3057,18 +3077,16 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The default response headers for this REST object.
         */
        protected MethodList createPostCallMethods(BeanStore beanStore, 
Supplier<?> resource) {
 
                Value<MethodList> v = Value.of(getHookMethods(resource, 
HookEvent.POST_CALL));
-               Object r = resource.get();
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(MethodList.class)
                        .addBean(MethodList.class, v.get())
-                       .beanCreateMethodFinder(MethodList.class, r)
                        .find("createPostCallMethods")
                        .run(x -> v.set(x));
 
@@ -3099,16 +3117,15 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The default response headers for this REST object.
         * @throws RestServletException If a problem occurred instantiating one 
of the child rest contexts.
         */
        protected RestOperations.Builder createRestOperations(BeanStore 
beanStore, Supplier<?> resource, RestContext restContext) throws 
RestServletException {
 
                Value<RestOperations.Builder> v = 
Value.of(RestOperations.create());
-               Object r = resource.get();
 
-               ClassInfo rci = ClassInfo.of(r);
+               ClassInfo rci = ClassInfo.of(resource.get());
 
                for (MethodInfo mi : rci.getPublicMethods()) {
                        AnnotationList al = 
mi.getAnnotationGroupList(RestOp.class);
@@ -3159,17 +3176,15 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                        }
                }
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(RestOperations.Builder.class)
                        .addBean(RestOperations.Builder.class, v.get())
-                       .beanCreateMethodFinder(RestOperations.Builder.class, r)
                        .find("createRestOperationsBuilder")
                        .run(x -> v.set(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(RestOperations.class)
                        .addBean(RestOperations.Builder.class, v.get())
-                       .beanCreateMethodFinder(RestOperations.class, r)
                        .find("createRestOperations")
                        .run(x -> v.get().impl(x));
 
@@ -3200,23 +3215,24 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The default response headers for this REST object.
         * @throws Exception If a problem occurred instantiating one of the 
child rest contexts.
         */
        protected RestChildren.Builder createRestChildren(BeanStore beanStore, 
Supplier<?> resource, RestContext restContext) throws Exception {
 
                Value<RestChildren.Builder> v = 
Value.of(RestChildren.create().beanStore(beanStore).type(childrenClass));
-               Object r = resource.get();
 
                // Initialize our child resources.
                for (Object o : children) {
                        String path = null;
+                       Supplier<?> so;
 
                        if (o instanceof RestChild) {
                                RestChild rc = (RestChild)o;
                                path = rc.path;
-                               o = rc.resource;
+                               Object o2 = rc.resource;
+                               so = ()->o2;
                        }
 
                        RestContextBuilder cb = null;
@@ -3229,18 +3245,20 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                                cb = RestContext.create(oc, restContext, inner);
                                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.
+                                       so = ()->bf.getBean(oc).get();  // If 
we resolved via injection, always get it this way.
                                } else {
-                                       o = bf.createBean(oc);
+                                       Object o2 = bf.createBean(oc);
+                                       so = ()->o2;
                                }
                        } else {
                                cb = RestContext.create(o.getClass(), 
restContext, inner);
+                               so = ()->o;
                        }
 
                        if (path != null)
                                cb.path(path);
 
-                       RestContext cc = cb.init(o).build();
+                       RestContext cc = cb.init(so).build();
 
                        MethodInfo mi = ClassInfo.of(o).getMethod("setContext", 
RestContext.class);
                        if (mi != null)
@@ -3249,17 +3267,15 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                        v.get().add(cc);
                }
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(RestChildren.Builder.class)
                        .addBean(RestChildren.Builder.class, v.get())
-                       .beanCreateMethodFinder(RestChildren.Builder.class, r)
                        .find("createRestChildrenBuilder")
                        .run(x -> v.set(x));
 
-               BeanStore
-                       .of(beanStore, r)
+               beanStore
+                       .beanCreateMethodFinder(RestChildren.class)
                        .addBean(RestChildren.Builder.class, v.get())
-                       .beanCreateMethodFinder(RestChildren.class, r)
                        .find("createRestChildren")
                        .run(x -> v.get().impl(x));
 
@@ -3312,13 +3328,11 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
         * @param beanStore
         *      The factory used for creating beans and retrieving injected 
beans.
         * @param resource
-        *      The REST servlet or bean that this context defines.
+        *      The REST servlet/bean instance that this context is defined 
against.
         * @return The info provider for this REST resource.
         */
        protected SwaggerProvider.Builder createSwaggerProvider(BeanStore 
beanStore, Supplier<?> resource) {
 
-               Object r = resource.get();
-
                Value<SwaggerProvider.Builder> v = Value.of(
                        SwaggerProvider
                                .create()
@@ -3329,24 +3343,27 @@ public class RestContextBuilder extends ContextBuilder 
implements ServletConfig
                                
.jsonSchemaGenerator(()->beanStore.getBean(JsonSchemaGenerator.class).orElseThrow(()->runtimeException("JsonSchemaGenerator
 bean not found.")))
                );
 
-               beanStore.getBean(SwaggerProvider.Builder.class).map(x -> 
x.copy()).ifPresent(x -> v.set(x));
+               beanStore
+                       .getBean(SwaggerProvider.Builder.class)
+                       .map(x -> x.copy())
+                       .ifPresent(x -> v.set(x));
 
-               if (r instanceof SwaggerProvider)
-                       v.get().impl((SwaggerProvider)r);
+               resourceAs(SwaggerProvider.class)
+                       .ifPresent(x -> v.get().impl(x));
 
-               beanStore.getBean(SwaggerProvider.class).ifPresent(x -> 
v.get().impl(x));
+               beanStore
+                       .getBean(SwaggerProvider.class)
+                       .ifPresent(x -> v.get().impl(x));
 
-               BeanStore
-                       .of(beanStore, resource)
+               beanStore
+                       .beanCreateMethodFinder(SwaggerProvider.Builder.class)
                        .addBean(SwaggerProvider.Builder.class, v.get())
-                       .beanCreateMethodFinder(SwaggerProvider.Builder.class, 
resource)
                        .find("createSwaggerProviderBuilder")
                        .run(x -> v.set(x));
 
-               BeanStore
-                       .of(beanStore, resource)
+               beanStore
+                       .beanCreateMethodFinder(SwaggerProvider.class)
                        .addBean(SwaggerProvider.Builder.class, v.get())
-                       .beanCreateMethodFinder(SwaggerProvider.class, resource)
                        .find("createSwaggerProviderBuilder")
                        .run(x -> v.get().impl(x));
 
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 faaada2..c46901f 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(this.getClass(), null, 
servletConfig).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-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 bac45d7..4b58ede 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(resource.getClass(),null,null).init(resource).defaultClasses(TestClasspathFileFinder.class).build();
+               RestContext rc = 
RestContext.create(resource.getClass(),null,null).init(()->resource).defaultClasses(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(resource.getClass(),null,null).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/testutils/TestUtils.java 
b/juneau-utest/src/test/java/org/apache/juneau/rest/testutils/TestUtils.java
index 5fcd8e0..ce60b51 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(r.getClass(),null,null).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();

Reply via email to