This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch 2033-IoC
in repository https://gitbox.apache.org/repos/asf/isis.git
The following commit(s) were added to refs/heads/2033-IoC by this push:
new b33d1b9 ISIS-2033: simple-app: let CDI bootstrap Spring
b33d1b9 is described below
commit b33d1b99318db504ca0498c71809acdb5bf140ff
Author: Andi Huber <[email protected]>
AuthorDate: Tue Jan 29 21:26:13 2019 +0100
ISIS-2033: simple-app: let CDI bootstrap Spring
Task-Url: https://issues.apache.org/jira/browse/ISIS-2033
---
.../isis/config/builder/ModulePackageHelper.java | 5 ++++
.../isis/core/metamodel/services/ServiceUtil.java | 16 +++++++------
.../modules/spring/SpringContextBridge.java | 27 ++++++++++++++++++++++
.../modules/spring/SpringContextListener.java | 26 ---------------------
.../domainapp/modules/spring/SpringModule.java | 9 ++++++++
.../modules/spring/SpringModuleBridge.java | 20 ++++++++++++++++
.../modules/spring/SpringModuleCDIBridge.java | 17 --------------
.../modules/spring/dom/customer/CustomerMenu.java | 27 ++++++++++++++++++----
8 files changed, 92 insertions(+), 55 deletions(-)
diff --git
a/core/config/src/main/java/org/apache/isis/config/builder/ModulePackageHelper.java
b/core/config/src/main/java/org/apache/isis/config/builder/ModulePackageHelper.java
index 75294dd..f938e64 100644
---
a/core/config/src/main/java/org/apache/isis/config/builder/ModulePackageHelper.java
+++
b/core/config/src/main/java/org/apache/isis/config/builder/ModulePackageHelper.java
@@ -187,6 +187,11 @@ class ModulePackageHelper {
registry.setViewModelTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix,
viewModelTypes));
registry.setXmlElementTypes(withinPackageAndNotAnonymous(packagesWithDotSuffix,
xmlElementTypes));
+ typesForScanning.addAll(domainServiceTypes);
+ typesForScanning.addAll(viewModelTypes);
+ typesForScanning.addAll(domainObjectTypes);
+ typesForScanning.addAll(persistenceCapableTypes);
+
return typesForScanning;
}
diff --git
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceUtil.java
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceUtil.java
index 61bdaa8..e3d8e06 100644
---
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceUtil.java
+++
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceUtil.java
@@ -38,6 +38,7 @@ public final class ServiceUtil {
private ServiceUtil() {
}
+ //FIXME [2033] I found no standardized way yet to do this, maybe create a
list during bean-scan?
public static String idOfBean(final Bean<?> serviceBean) {
// serviceBean might also be a producer method
@@ -84,14 +85,15 @@ public final class ServiceUtil {
return normalize(requiredTypes.iterator().next());
}
+ return serviceBean.toString();
- throw _Exceptions.unrecoverable(
- String.format("Could not extract a service id from the
given bean '%s', "
- + "implementedTypes='%s'
requiredTypes='%s' from types %s.",
- serviceBean,
- implementedTypes,
- requiredTypes,
- serviceBean.getTypes()));
+// throw _Exceptions.unrecoverable(
+// String.format("Could not extract a service id from the
given bean '%s', "
+// + "implementedTypes='%s'
requiredTypes='%s' from types %s.",
+// serviceBean,
+// implementedTypes,
+// requiredTypes,
+// serviceBean.getTypes()));
}
diff --git
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringContextBridge.java
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringContextBridge.java
new file mode 100644
index 0000000..a05728c
--- /dev/null
+++
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringContextBridge.java
@@ -0,0 +1,27 @@
+package domainapp.modules.spring;
+
+import javax.enterprise.inject.Disposes;
+import javax.enterprise.inject.Produces;
+import javax.inject.Singleton;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ConfigurableApplicationContext;
+
+import lombok.val;
+
+public class SpringContextBridge {
+
+ @Produces @Singleton
+ public ApplicationContext springContext() {
+ val springContext = new SpringApplication(SpringModule.class);
+ return springContext.run();
+ }
+
+ public void close(@Disposes ApplicationContext springContext) {
+ if(springContext instanceof ConfigurableApplicationContext) {
+
((ConfigurableApplicationContext)springContext).close();
+ }
+ }
+
+}
diff --git
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringContextListener.java
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringContextListener.java
deleted file mode 100644
index 7d266aa..0000000
---
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringContextListener.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package domainapp.modules.spring;
-
-import java.util.NoSuchElementException;
-
-import javax.enterprise.inject.Vetoed;
-
-import org.apache.isis.commons.internal.context._Context;
-import org.springframework.beans.BeansException;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-
-@Vetoed // must not be managed by CDI
-public class SpringContextListener implements ApplicationContextAware {
-
- @Override
- public void setApplicationContext(ApplicationContext springContext)
throws BeansException {
- _Context.putSingleton(ApplicationContext.class, springContext);
- }
-
- public static ApplicationContext currentContext() {
- return _Context.getOrThrow(ApplicationContext.class,
- ()-> new NoSuchElementException(
- "There is no Spring
ApplicationContext stored on framework's _Context."));
- }
-
-}
diff --git
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModule.java
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModule.java
index c7dbef3..666fab0 100644
---
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModule.java
+++
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModule.java
@@ -18,6 +18,15 @@
*/
package domainapp.modules.spring;
+import javax.enterprise.inject.Vetoed;
+
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.Configuration;
+
+@Vetoed // must not be managed by CDI
+@Configuration
+//@ComponentScan(basePackages= {"domainapp.modules.spring"})
+@EnableAutoConfiguration
public class SpringModule {
}
diff --git
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModuleBridge.java
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModuleBridge.java
new file mode 100644
index 0000000..a35e278
--- /dev/null
+++
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModuleBridge.java
@@ -0,0 +1,20 @@
+package domainapp.modules.spring;
+
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+
+import org.springframework.context.ApplicationContext;
+
+import domainapp.modules.spring.dom.customer.CustomerRepository;
+
+// not to be managed by Spring
+public class SpringModuleBridge {
+
+ @Inject ApplicationContext springContext;
+
+ @Produces
+ public CustomerRepository getCustomerRepository() {
+ return springContext.getBean(CustomerRepository.class);
+ }
+
+}
diff --git
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModuleCDIBridge.java
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModuleCDIBridge.java
deleted file mode 100644
index f0b4ba4..0000000
---
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringModuleCDIBridge.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package domainapp.modules.spring;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.inject.Produces;
-import javax.inject.Singleton;
-
-import domainapp.modules.spring.dom.customer.CustomerRepository;
-
-@ApplicationScoped // not to be managed by Spring
-public class SpringModuleCDIBridge {
-
- @Produces @Singleton
- public CustomerRepository getCustomerRepository() {
- return
SpringContextListener.currentContext().getBean(CustomerRepository.class);
- }
-
-}
diff --git
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/dom/customer/CustomerMenu.java
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/dom/customer/CustomerMenu.java
index 1af74d8..0dbaa79 100644
---
a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/dom/customer/CustomerMenu.java
+++
b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/dom/customer/CustomerMenu.java
@@ -3,28 +3,45 @@ package domainapp.modules.spring.dom.customer;
import java.util.List;
import javax.inject.Inject;
-import javax.inject.Singleton;
import org.apache.isis.applib.annotation.Action;
import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.annotation.DomainObjectLayout;
import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.DomainServiceLayout;
import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.ParameterLayout;
@DomainService(
nature = NatureOfService.VIEW_MENU_ONLY,
objectType = "simple.CustomerMenu"
)
-@DomainObjectLayout(named="Customer (Spring Demo)")
-@Singleton
+@DomainServiceLayout(named="Customer (Spring Demo)")
public class CustomerMenu {
@Inject private CustomerRepository customerRepository;
@Action
@ActionLayout(cssClassFa="fa-leaf")
- public List<Customer> findByLastName(String lastName) {
+ public List<Customer> findByLastName(
+ @ParameterLayout(named="Last Name")
+ String lastName) {
+
return customerRepository.findByLastName(lastName);
}
+ @Action
+ @ActionLayout(cssClassFa="fa-leaf")
+ public Customer createCustomer (
+
+ @ParameterLayout(named="First Name")
+ String firstName,
+
+ @ParameterLayout(named="Last Name")
+ String lastName
+
+ ) {
+
+ return customerRepository.save(new Customer(firstName,
lastName));
+ }
+
}