juneau-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jamesbog...@apache.org
Subject [juneau] branch master updated: Spring Boot changes.
Date Sat, 08 Dec 2018 13:56:29 GMT
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 f4ae17d  Spring Boot changes.
f4ae17d is described below

commit f4ae17d488196499037bceaec52af40abd519071
Author: JamesBognar <jamesbognar@apache.org>
AuthorDate: Sat Dec 8 08:56:15 2018 -0500

    Spring Boot changes.
---
 .../utils/ClasspathResourceFinderSimple.java       | 19 ++++-
 ...ver.html => 02.SpringRestResourceResolver.html} |  2 +-
 juneau-doc/src/main/javadoc/overview.html          | 89 +++++++++++++++++++---
 juneau-doc/src/main/javadoc/resources/docs.txt     |  9 ++-
 .../main/javadoc/resources/fragments/about.html    |  4 +-
 .../src/main/javadoc/resources/fragments/toc.html  |  7 +-
 .../juneau/examples/rest/springboot/App.java       | 23 +++---
 ...Initializer.java => JuneauRestInitializer.java} | 10 +--
 ...Processor.java => JuneauRestPostProcessor.java} | 64 +++++++++++-----
 .../{JuneauIntegration.java => JuneauRest.java}    | 25 ++++--
 10 files changed, 182 insertions(+), 70 deletions(-)

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ClasspathResourceFinderSimple.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ClasspathResourceFinderSimple.java
index 410bfa4..3de00c5 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ClasspathResourceFinderSimple.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ClasspathResourceFinderSimple.java
@@ -65,16 +65,29 @@ public class ClasspathResourceFinderSimple implements ClasspathResourceFinder
{
 	 * @throws IOException
 	 */
 	protected InputStream findClasspathResource(Class<?> baseClass, String name, Locale
locale) throws IOException {
-		if (locale == null)
-			return baseClass.getResourceAsStream(name);
+		
+		if (locale == null) 
+			return getResourceAsStream(baseClass, name);
+		
 		for (String n : getCandidateFileNames(name, locale)) {
-			InputStream is = baseClass.getResourceAsStream(n);
+			InputStream is = getResourceAsStream(baseClass, n);
 			if (is != null)
 				return is;
 		}
 		return null;
 	}
 
+	private InputStream getResourceAsStream(Class<?> baseClass, String name) {
+		InputStream is = baseClass.getResourceAsStream(name);
+		if (is != null)
+			return is;
+		if (! name.startsWith("/"))
+			is = baseClass.getResourceAsStream("/" + name);
+		if (is != null)
+			return is;
+		return null;
+	}
+
 	/**
 	 * Returns the candidate file names for the specified file name in the specified locale.
 	 *
diff --git a/juneau-doc/docs/Topics/09.juneau-rest-server-springboot/01.SpringRestResourceResolver.html
b/juneau-doc/docs/Topics/09.juneau-rest-server-springboot/02.SpringRestResourceResolver.html
similarity index 99%
rename from juneau-doc/docs/Topics/09.juneau-rest-server-springboot/01.SpringRestResourceResolver.html
rename to juneau-doc/docs/Topics/09.juneau-rest-server-springboot/02.SpringRestResourceResolver.html
index 2105729..3ee50a2 100644
--- a/juneau-doc/docs/Topics/09.juneau-rest-server-springboot/01.SpringRestResourceResolver.html
+++ b/juneau-doc/docs/Topics/09.juneau-rest-server-springboot/02.SpringRestResourceResolver.html
@@ -16,7 +16,7 @@
 {new} SpringRestResourceResolver
 
 <p>
-	The {@link oaj.rest.springboot.SpringRestResourceResolver} class 
+	The {@link oaj.rest.springboot.SpringRestResourceResolver} class is an implementation of

 	
 	
  * Implementation of a {@link RestResourceResolver} for resolving resource classes using
Spring.
diff --git a/juneau-doc/src/main/javadoc/overview.html b/juneau-doc/src/main/javadoc/overview.html
index 66688da..03d9cf0 100644
--- a/juneau-doc/src/main/javadoc/overview.html
+++ b/juneau-doc/src/main/javadoc/overview.html
@@ -359,9 +359,10 @@
 	<ol>
 		<li><p class=''><a class='doclink' href='#juneau-rest-server-jaxrs.BaseProvider'>Juneau
JAX-RS Provider</a></p>
 	</ol>
-	<li><p class='toc2 todo'><a class='doclink' href='#juneau-rest-server-springboot'>juneau-rest-server-springboot</a></p>
+	<li><p class='toc2 new'><a class='doclink' href='#juneau-rest-server-springboot'>juneau-rest-server-springboot</a></p>
 	<ol>
-		<li><p class='todo'><a class='doclink' href='#juneau-rest-server-springboot.TODO'>TODO</a></p>
+		<li><p class='new'><a class='doclink' href='#juneau-rest-server-springboot.Classes'>Classes</a></p>
+		<li><p class='new'><a class='doclink' href='#juneau-rest-server-springboot.SpringRestResourceResolver'>SpringRestResourceResolver</a></p>
 	</ol>
 	<li><p class='toc2 '><a class='doclink' href='#juneau-rest-client'>juneau-rest-client</a></p>
 	<ol>
@@ -454,7 +455,7 @@
 		<li><p class=''><a class='doclink' href='#juneau-examples-rest.ConfigResource'>ConfigResource</a></p>
 		<li><p class=''><a class='doclink' href='#juneau-examples-rest.LogsResource'>LogsResource</a></p>
 	</ol>
-	<li><p class='toc2 todo'><a class='doclink' href='#juneau-examples-rest-jetty'>juneau-examples-rest</a></p>
+	<li><p class='toc2 todo'><a class='doclink' href='#juneau-examples-rest-jetty'>juneau-examples-rest-jetty</a></p>
 	<ol>
 		<li><p class='todo'><a class='doclink' href='#juneau-examples-rest-jetty.Classes'>Classes</a></p>
 		<li><p class='todo'><a class='doclink' href='#juneau-examples-rest-jetty.DeployingToHeroku'>Deploying
to Heroku</a></p>
@@ -21386,7 +21387,7 @@
 
 <!-- ====================================================================================================
-->
 
-<h2 class='topic todo' onclick='toggle(this)'><a href='#juneau-rest-server-springboot'
id='juneau-rest-server-springboot'>9 - juneau-rest-server-springboot</a></h2>
+<h2 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-server-springboot'
id='juneau-rest-server-springboot'>9 - juneau-rest-server-springboot</a></h2>
 <div class='topic'><!-- START: 9 - juneau-rest-server-springboot -->
 <h5 class='figure'>Maven Dependency</h5>
 <p class='bpcode w500'>
@@ -21404,22 +21405,88 @@
 
 <h5 class='figure'>OSGi Module</h5>
 <p class='bpcode w500'>
-	org.apache.juneau.rest.springboot_{@property juneauVersion}.jar 
+	org.apache.juneau.rest.server.springboot_{@property juneauVersion}.jar 
 </p>	
 
 <p>
-	The <code>juneau-rest-server-springboot</code> library provides classes to make
it easy to deploy Juneau
-	REST resources within the Spring Boot framework.
+	The <code>juneau-rest-server-springboot</code> library provides classes to make
it easy to integrate
+	Juneau REST resources with Spring and Spring Boot.
 </p>
 
 <!-- ====================================================================================================
-->
 
-<h3 class='topic todo' onclick='toggle(this)'><a href='#juneau-rest-server-springboot.TODO'
id='juneau-rest-server-springboot.TODO'>9.1 - TODO</a></h3>
-<div class='topic'><!-- START: 9.1 - juneau-rest-server-springboot.TODO -->
+<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-server-springboot.Classes'
id='juneau-rest-server-springboot.Classes'>9.1 - Classes</a></h3>
+<div class='topic'><!-- START: 9.1 - juneau-rest-server-springboot.Classes -->
 <p>
 	TODO
 </p>
-</div><!-- END: 9.1 - juneau-rest-server-springboot.TODO -->
+</div><!-- END: 9.1 - juneau-rest-server-springboot.Classes -->
+
+<!-- ====================================================================================================
-->
+
+<h3 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-server-springboot.SpringRestResourceResolver'
id='juneau-rest-server-springboot.SpringRestResourceResolver'>9.2 - SpringRestResourceResolver</a></h3>
+<div class='topic'><!-- START: 9.2 - juneau-rest-server-springboot.SpringRestResourceResolver
-->
+<p>
+	The {@link org.apache.juneau.rest.springboot.SpringRestResourceResolver} class 
+	
+	
+ * Implementation of a {@link RestResourceResolver} for resolving resource classes using
Spring.
+ *
+ * <p>
+ * Used for resolving resource classes defined via {@link RestResource#children()}.
+ *
+ * <p>
+ * A typical usage pattern for registering a Juneau REST resource class is shown below:
+ *
+ * <p class='bpcode w800'>
+ * 	<ja>@Configuration</ja>
+ * 	<jk>public class</jk> MySpringConfiguration {
+ *
+ * 		<ja>@AutoWired</ja>
+ * 		<jk>private static volatile</jk> ApplicationContext <jsf>appContext</jsf>;
+ *
+ * 		<ja>@Bean</ja>
+ * 		<jk>public</jk> RestResourceResolver restResourceResolver(ApplicationContext
appContext) {
+ * 			<jk>return new</jk> SpringRestResourceResolver(appContext);
+ * 		}
+ *
+ * 		<ja>@Bean</ja>
+ * 		<jk>public</jk> RootRest root(RestResourceResolver resolver) {
+ * 			<jk>return new</jk> RootRest().setRestResourceResolver(resolver);
+ * 		}
+ *
+ * 		<ja>@Bean</ja>
+ * 		<jk>public</jk> ServletRegistrationBean rootRegistration(RootRest root)
{
+ * 			<jk>return new</jk> ServletRegistrationBean(root, <jsf>CONTEXT_ROOT</jsf>,
<jsf>CONTEXT_ROOT</jsf>+<js>"/"</js>, <jsf>CONTEXT_ROOT</jsf>+<js>"/*"</js>);
+ * 		}
+ * </p>
+	
+</p>
+public class SpringRestResourceResolver extends BasicRestResourceResolver {
+
+	private ApplicationContext applicationContext;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param applicationContext The spring application context object.
+	 */
+	public SpringRestResourceResolver(ApplicationContext applicationContext) {
+		this.applicationContext = applicationContext;
+	}
+
+	@Override /* RestResourceResolver */
+	public <T> T resolve(Object parent, Class<T> c, RestContextBuilder builder,
Object...args) {
+		T resource = null;
+		try {
+			resource = applicationContext.getBean(c);
+		} catch (Exception e) { /* Ignore */ }
+		if (resource == null)
+			resource = super.resolve(parent, c, builder);
+		return resource;
+	}
+}
+</div><!-- END: 9.2 - juneau-rest-server-springboot.SpringRestResourceResolver -->
 </div><!-- END: 9 - juneau-rest-server-springboot -->
 
 <!-- ====================================================================================================
-->
@@ -27232,7 +27299,7 @@
 
 <!-- ====================================================================================================
-->
 
-<h2 class='topic todo' onclick='toggle(this)'><a href='#juneau-examples-rest-jetty'
id='juneau-examples-rest-jetty'>16 - juneau-examples-rest</a></h2>
+<h2 class='topic todo' onclick='toggle(this)'><a href='#juneau-examples-rest-jetty'
id='juneau-examples-rest-jetty'>16 - juneau-examples-rest-jetty</a></h2>
 <div class='topic'><!-- START: 16 - juneau-examples-rest-jetty -->
 <h5 class='figure'>Archive File</h5>
 <p class='bpcode w500'>
diff --git a/juneau-doc/src/main/javadoc/resources/docs.txt b/juneau-doc/src/main/javadoc/resources/docs.txt
index 774753b..16fe6b2 100644
--- a/juneau-doc/src/main/javadoc/resources/docs.txt
+++ b/juneau-doc/src/main/javadoc/resources/docs.txt
@@ -91,9 +91,9 @@ juneau-dto.Swagger = #juneau-dto.Swagger, Overview > juneau-dto >
Swagger
 juneau-dto.SwaggerUI = #juneau-dto.SwaggerUI, Overview > juneau-dto > Swagger UI
 juneau-examples-core = #juneau-examples-core, Overview > juneau-examples-core
 juneau-examples-rest = #juneau-examples-rest, Overview > juneau-examples-rest
-juneau-examples-rest-jetty = #juneau-examples-rest-jetty, Overview > juneau-examples-rest
-juneau-examples-rest-jetty.Classes = #juneau-examples-rest-jetty.Classes, Overview > juneau-examples-rest
> Classes
-juneau-examples-rest-jetty.DeployingToHeroku = #juneau-examples-rest-jetty.DeployingToHeroku,
Overview > juneau-examples-rest > Deploying to Heroku
+juneau-examples-rest-jetty = #juneau-examples-rest-jetty, Overview > juneau-examples-rest-jetty
+juneau-examples-rest-jetty.Classes = #juneau-examples-rest-jetty.Classes, Overview > juneau-examples-rest-jetty
> Classes
+juneau-examples-rest-jetty.DeployingToHeroku = #juneau-examples-rest-jetty.DeployingToHeroku,
Overview > juneau-examples-rest-jetty > Deploying to Heroku
 juneau-examples-rest-springboot = #juneau-examples-rest-springboot, Overview > juneau-examples-rest-springboot
 juneau-examples-rest-springboot.Classes = #juneau-examples-rest-springboot.Classes, Overview
> juneau-examples-rest-springboot > Classes
 juneau-examples-rest-springboot.DeployingToHeroku = #juneau-examples-rest-springboot.DeployingToHeroku,
Overview > juneau-examples-rest-springboot > Deploying to Heroku
@@ -255,7 +255,8 @@ juneau-rest-server = #juneau-rest-server, Overview > juneau-rest-server
 juneau-rest-server-jaxrs = #juneau-rest-server-jaxrs, Overview > juneau-rest-server-jaxrs
 juneau-rest-server-jaxrs.BaseProvider = #juneau-rest-server-jaxrs.BaseProvider, Overview
> juneau-rest-server-jaxrs > Juneau JAX-RS Provider
 juneau-rest-server-springboot = #juneau-rest-server-springboot, Overview > juneau-rest-server-springboot
-juneau-rest-server-springboot.TODO = #juneau-rest-server-springboot.TODO, Overview > juneau-rest-server-springboot
> TODO
+juneau-rest-server-springboot.Classes = #juneau-rest-server-springboot.Classes, Overview
> juneau-rest-server-springboot > Classes
+juneau-rest-server-springboot.SpringRestResourceResolver = #juneau-rest-server-springboot.SpringRestResourceResolver,
Overview > juneau-rest-server-springboot > SpringRestResourceResolver
 juneau-rest-server.BuiltInParameters = #juneau-rest-server.BuiltInParameters, Overview >
juneau-rest-server > Built-in Parameters
 juneau-rest-server.ClassHierarchy = #juneau-rest-server.ClassHierarchy, Overview > juneau-rest-server
> Class Hierarchy
 juneau-rest-server.ClientVersioning = #juneau-rest-server.ClientVersioning, Overview >
juneau-rest-server > Client Versioning
diff --git a/juneau-doc/src/main/javadoc/resources/fragments/about.html b/juneau-doc/src/main/javadoc/resources/fragments/about.html
index bc8175c..abed929 100644
--- a/juneau-doc/src/main/javadoc/resources/fragments/about.html
+++ b/juneau-doc/src/main/javadoc/resources/fragments/about.html
@@ -21,9 +21,9 @@
 	<li><b>juneau-svl</b><br>A simple yet powerful variable replacement
language API.
 	<li><b>juneau-config</b><br>A sophisticated configuration file API.
 	<li><b>juneau-rest-server</b><br>A universal REST server API for
creating Swagger-based self-documenting REST interfaces using POJOs, simply deployed as 
-		one or more top-level servlets in any Servlet 3.1.0+ container.
+		one or more top-level servlets in any Servlet 3.1.0+ container or Spring Boot.
 	<li><b>juneau-rest-client</b><br>A universal REST client API for
interacting with Juneau or 3rd-party REST interfaces using POJOs and proxy interfaces.
-	<li><b>juneau-microservice</b><br>A REST microservice API that combines
all the features above with a simple configurable Jetty server for 
+	<li><b>juneau-microservice</b><br>A REST microservice API that combines
all the features above as a simple configurable Jetty server for 
 		creating lightweight standalone REST interfaces that start up in milliseconds.
 </ul>
 <p>
diff --git a/juneau-doc/src/main/javadoc/resources/fragments/toc.html b/juneau-doc/src/main/javadoc/resources/fragments/toc.html
index 99f1c20..0543a58 100644
--- a/juneau-doc/src/main/javadoc/resources/fragments/toc.html
+++ b/juneau-doc/src/main/javadoc/resources/fragments/toc.html
@@ -302,9 +302,10 @@
 	<ol>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server-jaxrs.BaseProvider'>Juneau
JAX-RS Provider</a></p>
 	</ol>
-	<li><p class='toc2 todo'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server-springboot'>juneau-rest-server-springboot</a></p>
+	<li><p class='toc2 new'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server-springboot'>juneau-rest-server-springboot</a></p>
 	<ol>
-		<li><p class='todo'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server-springboot.TODO'>TODO</a></p>
+		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server-springboot.Classes'>Classes</a></p>
+		<li><p class='new'><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-server-springboot.SpringRestResourceResolver'>SpringRestResourceResolver</a></p>
 	</ol>
 	<li><p class='toc2 '><a class='doclink' href='{OVERVIEW_URL}#juneau-rest-client'>juneau-rest-client</a></p>
 	<ol>
@@ -397,7 +398,7 @@
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-examples-rest.ConfigResource'>ConfigResource</a></p>
 		<li><p class=''><a class='doclink' href='{OVERVIEW_URL}#juneau-examples-rest.LogsResource'>LogsResource</a></p>
 	</ol>
-	<li><p class='toc2 todo'><a class='doclink' href='{OVERVIEW_URL}#juneau-examples-rest-jetty'>juneau-examples-rest</a></p>
+	<li><p class='toc2 todo'><a class='doclink' href='{OVERVIEW_URL}#juneau-examples-rest-jetty'>juneau-examples-rest-jetty</a></p>
 	<ol>
 		<li><p class='todo'><a class='doclink' href='{OVERVIEW_URL}#juneau-examples-rest-jetty.Classes'>Classes</a></p>
 		<li><p class='todo'><a class='doclink' href='{OVERVIEW_URL}#juneau-examples-rest-jetty.DeployingToHeroku'>Deploying
to Heroku</a></p>
diff --git a/juneau-examples/juneau-examples-rest-springboot/src/main/java/org/apache/juneau/examples/rest/springboot/App.java
b/juneau-examples/juneau-examples-rest-springboot/src/main/java/org/apache/juneau/examples/rest/springboot/App.java
index df887a8..f6f8781 100644
--- a/juneau-examples/juneau-examples-rest-springboot/src/main/java/org/apache/juneau/examples/rest/springboot/App.java
+++ b/juneau-examples/juneau-examples-rest-springboot/src/main/java/org/apache/juneau/examples/rest/springboot/App.java
@@ -17,32 +17,27 @@ import org.apache.juneau.rest.springboot.*;
 import org.apache.juneau.rest.springboot.annotations.*;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.builder.*;
-import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.*;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RestController;
 
 /**
  * Entry point for Examples REST application when deployed as a Spring Boot application.
  */
 @SpringBootApplication
-@JuneauIntegration(rootResources = RootResources.class)
 @Controller
-@RestController
 public class App {
 
-	private static volatile ConfigurableApplicationContext ctx;
-
 	public static void main(String[] args) {
-		ctx = new SpringApplicationBuilder(App.class)
-			.initializers(new JuneauContextInitializer(App.class))
+		new SpringApplicationBuilder(App.class)
+			.initializers(new JuneauRestInitializer(App.class))
 			.run(args);
 	}
 
-	public static void start() {
-		main(new String[0]);
-	}
-
-	public static void stop() {
-		ctx.stop();
+	/**
+	 * Our root resource.
+	 */
+	@Bean @JuneauRest
+	public RootResources getRootResources() {
+		return new RootResources();
 	}
 }
diff --git a/juneau-rest/juneau-rest-server-springboot/src/main/java/org/apache/juneau/rest/springboot/JuneauContextInitializer.java
b/juneau-rest/juneau-rest-server-springboot/src/main/java/org/apache/juneau/rest/springboot/JuneauRestInitializer.java
similarity index 84%
rename from juneau-rest/juneau-rest-server-springboot/src/main/java/org/apache/juneau/rest/springboot/JuneauContextInitializer.java
rename to juneau-rest/juneau-rest-server-springboot/src/main/java/org/apache/juneau/rest/springboot/JuneauRestInitializer.java
index 985b273..e7ac5c3 100644
--- a/juneau-rest/juneau-rest-server-springboot/src/main/java/org/apache/juneau/rest/springboot/JuneauContextInitializer.java
+++ b/juneau-rest/juneau-rest-server-springboot/src/main/java/org/apache/juneau/rest/springboot/JuneauRestInitializer.java
@@ -12,7 +12,7 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest.springboot;
 
-import org.apache.juneau.rest.springboot.annotations.JuneauIntegration;
+import org.apache.juneau.rest.springboot.annotations.JuneauRest;
 import org.springframework.context.ApplicationContextInitializer;
 import org.springframework.context.ConfigurableApplicationContext;
 
@@ -20,10 +20,10 @@ import org.springframework.context.ConfigurableApplicationContext;
  * Spring Boot context initializer for Juneau REST resources.
  *
  * <p>
- * Looks for the {@link JuneauIntegration} annotation on the Spring application class to
automatically
+ * Looks for the {@link JuneauRest} annotation on the Spring application class to automatically
  * register Juneau REST resources.
  */
-public class JuneauContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>
{
+public class JuneauRestInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>
{
 
     private final Class<?> appClass;
 
@@ -32,14 +32,14 @@ public class JuneauContextInitializer implements ApplicationContextInitializer<C
      *
      * @param appClass The Spring application class.
      */
-    public JuneauContextInitializer(Class<?> appClass) {
+    public JuneauRestInitializer(Class<?> appClass) {
         this.appClass = appClass;
     }
 
     @Override /* ApplicationContextInitializer */
     public void initialize(ConfigurableApplicationContext ctx) {
     	ctx.addBeanFactoryPostProcessor(
-        	new JuneauIntegrationPostProcessor(ctx, appClass)
+        	new JuneauRestPostProcessor(ctx, appClass)
         );
     }
 }
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-server-springboot/src/main/java/org/apache/juneau/rest/springboot/JuneauIntegrationPostProcessor.java
b/juneau-rest/juneau-rest-server-springboot/src/main/java/org/apache/juneau/rest/springboot/JuneauRestPostProcessor.java
similarity index 59%
rename from juneau-rest/juneau-rest-server-springboot/src/main/java/org/apache/juneau/rest/springboot/JuneauIntegrationPostProcessor.java
rename to juneau-rest/juneau-rest-server-springboot/src/main/java/org/apache/juneau/rest/springboot/JuneauRestPostProcessor.java
index 0caa24c..8a19fca 100644
--- a/juneau-rest/juneau-rest-server-springboot/src/main/java/org/apache/juneau/rest/springboot/JuneauIntegrationPostProcessor.java
+++ b/juneau-rest/juneau-rest-server-springboot/src/main/java/org/apache/juneau/rest/springboot/JuneauRestPostProcessor.java
@@ -13,24 +13,28 @@
 package org.apache.juneau.rest.springboot;
 
 import org.apache.juneau.rest.*;
-import org.apache.juneau.rest.springboot.annotations.JuneauIntegration;
+import org.apache.juneau.rest.springboot.annotations.JuneauRest;
 import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.beans.factory.config.*;
 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
 import org.springframework.beans.factory.support.RootBeanDefinition;
 import org.springframework.boot.web.servlet.ServletRegistrationBean;
 import org.springframework.context.*;
+import org.springframework.core.type.*;
+
+import java.util.*;
 
 import javax.servlet.Servlet;
 
 /**
- * Processes the {@link JuneauIntegration} annotation on the Spring application class.
+ * Processes the {@link JuneauRest} annotation on the Spring application class and <ja>@Bean</ja>
methods.
  */
-public class JuneauIntegrationPostProcessor implements BeanDefinitionRegistryPostProcessor
{
+public class JuneauRestPostProcessor implements BeanDefinitionRegistryPostProcessor {
 
-    private final ConfigurableApplicationContext ctx;
     private final Class<?> appClass;
+    private final RestResourceResolver restResourceResolver;
+    private BeanDefinitionRegistry registry;
 
     /**
      * Constructor.
@@ -38,34 +42,52 @@ public class JuneauIntegrationPostProcessor implements BeanDefinitionRegistryPos
      * @param ctx The spring application context.
      * @param appClass The spring application class.
      */
-    public JuneauIntegrationPostProcessor(ConfigurableApplicationContext ctx, Class<?>
appClass) {
+    public JuneauRestPostProcessor(ConfigurableApplicationContext ctx, Class<?> appClass)
{
         this.appClass = appClass;
-        this.ctx = ctx;
+        this.restResourceResolver = new SpringRestResourceResolver(ctx);
     }
 
     @Override /* BeanDefinitionRegistryPostProcessor */
     public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
+    	this.registry = registry;
+    }
 
-    	JuneauIntegration a = appClass.getAnnotation(JuneauIntegration.class);
+    @Override /* BeanDefinitionRegistryPostProcessor */
+    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws
BeansException {
+    	try {
+			Map<String,RestServlet> m = new LinkedHashMap<>();
 
-    	if (a == null || a.rootResources().length == 0)
-    		return;
+        	// @JuneauRest on App class.
+        	if (appClass != null) {
+            	JuneauRest a = appClass.getAnnotation(JuneauRest.class);
+    			if (a != null)
+    				for (Class<? extends RestServlet> c : a.servlets())
+    					m.put(c.getName(), c.newInstance());
+        	}
 
-    	RestResourceResolver rrr = new SpringRestResourceResolver(ctx);
+        	// @JuneauRest on classes.
+			for (Map.Entry<String,Object> e : beanFactory.getBeansWithAnnotation(JuneauRest.class).entrySet())
+				if (e.getValue() instanceof RestServlet)
+					m.put(e.getKey(), (RestServlet)e.getValue());
 
-    	for (Class<? extends RestServlet> c : a.rootResources()) {
-			try {
-	            RestServlet rs = c.newInstance().setRestResourceResolver(rrr);
+			// @JuneauRest on @Bean method.
+			for (String beanName : beanFactory.getBeanNamesForType(RestServlet.class)) {
+				BeanDefinition bd = beanFactory.getBeanDefinition(beanName);
+		        if (bd.getSource() instanceof AnnotatedTypeMetadata) {
+		        	AnnotatedTypeMetadata metadata = (AnnotatedTypeMetadata)bd.getSource();
+		        	if (metadata.isAnnotated(JuneauRest.class.getName()))
+		        		m.put(beanName, (RestServlet)beanFactory.getBean(beanName));
+		        }
+			}
+
+			for (RestServlet rs : m.values()) {
+				rs.setRestResourceResolver(restResourceResolver);
 		        ServletRegistrationBean<Servlet> reg = new ServletRegistrationBean<>(rs,
'/' + rs.getPath());
 		        registry.registerBeanDefinition(reg.getServletName(), new RootBeanDefinition(ServletRegistrationBean.class,
() -> reg));
-			} catch (Exception e) {
-				throw new RuntimeException(e);
 			}
-        }
-    }
 
-    @Override /* BeanDefinitionRegistryPostProcessor */
-    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws
BeansException {
-    	// No-op
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
     }
 }
diff --git a/juneau-rest/juneau-rest-server-springboot/src/main/java/org/apache/juneau/rest/springboot/annotations/JuneauIntegration.java
b/juneau-rest/juneau-rest-server-springboot/src/main/java/org/apache/juneau/rest/springboot/annotations/JuneauRest.java
similarity index 75%
rename from juneau-rest/juneau-rest-server-springboot/src/main/java/org/apache/juneau/rest/springboot/annotations/JuneauIntegration.java
rename to juneau-rest/juneau-rest-server-springboot/src/main/java/org/apache/juneau/rest/springboot/annotations/JuneauRest.java
index b6deacd..64718a6 100644
--- a/juneau-rest/juneau-rest-server-springboot/src/main/java/org/apache/juneau/rest/springboot/annotations/JuneauIntegration.java
+++ b/juneau-rest/juneau-rest-server-springboot/src/main/java/org/apache/juneau/rest/springboot/annotations/JuneauRest.java
@@ -12,23 +12,36 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest.springboot.annotations;
 
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
 import org.apache.juneau.rest.RestServlet;
-import org.springframework.stereotype.Component;
+import org.springframework.context.annotation.*;
 
 import java.lang.annotation.*;
 
 /**
  * Added to Spring application classes to denote Juneau REST resource classes to deploy as
servlets.
+ *
+ * <p>
+ * The annotation can be used in two places:
+ * <ul class='spaced-list'>
+ * 	<li>
+ * 		On the source class of a Spring Boot application.
+ * 	<li>
+ * 		On {@link Bean}-annotated methods on configuration beans.
+ * </ul>
  */
-@Target({ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
+@Target({TYPE,METHOD})
+@Retention(RUNTIME)
 @Documented
 @Inherited
-@Component
-public @interface JuneauIntegration {
+public @interface JuneauRest {
 
 	/**
 	 * Specifies one or more implementations of {@link RestServlet} to deploy as servlets.
+	 * <p>
+	 * This method is only applicable when used on the source class of a Spring Boot application.
 	 */
-	Class<? extends RestServlet>[] rootResources();
+	Class<? extends RestServlet>[] servlets() default {};
 }


Mime
View raw message