You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by se...@apache.org on 2021/04/16 08:03:15 UTC
[ignite-extensions] branch master updated: IGNITE-13169 Remove
Ignite bean name requirement for Spring Data Repository - Fixes #55.
This is an automated email from the ASF dual-hosted git repository.
sergeychugunov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite-extensions.git
The following commit(s) were added to refs/heads/master by this push:
new a25117b IGNITE-13169 Remove Ignite bean name requirement for Spring Data Repository - Fixes #55.
a25117b is described below
commit a25117b7ce4c156bf29d207e43002d35b9ff70cc
Author: Semyon Danilov <sa...@yandex.ru>
AuthorDate: Fri Apr 16 10:14:30 2021 +0300
IGNITE-13169 Remove Ignite bean name requirement for Spring Data Repository - Fixes #55.
Signed-off-by: Sergey Chugunov <se...@gmail.com>
---
.../examples/SpringApplicationConfiguration.java | 6 +-
.../repository/support/IgniteProxyFactory.java | 73 ++++++++++-----
.../support/IgniteRepositoryFactoryBean.java | 4 +-
...gniteSpringDataConnectionConfigurationTest.java | 99 ++++++++++++++++++++
.../repository/support/IgniteProxyFactory.java | 73 ++++++++++-----
.../support/IgniteRepositoryFactoryBean.java | 4 +-
...gniteSpringDataConnectionConfigurationTest.java | 100 +++++++++++++++++++++
.../repository/support/IgniteProxyFactory.java | 63 +++++++++----
...gniteSpringDataConnectionConfigurationTest.java | 82 +++++++++++++++++
9 files changed, 433 insertions(+), 71 deletions(-)
diff --git a/modules/spring-data-2.0-ext/examples/main/java/org/apache/ignite/springdata20/examples/SpringApplicationConfiguration.java b/modules/spring-data-2.0-ext/examples/main/java/org/apache/ignite/springdata20/examples/SpringApplicationConfiguration.java
index d7b4a91..15ded04 100644
--- a/modules/spring-data-2.0-ext/examples/main/java/org/apache/ignite/springdata20/examples/SpringApplicationConfiguration.java
+++ b/modules/spring-data-2.0-ext/examples/main/java/org/apache/ignite/springdata20/examples/SpringApplicationConfiguration.java
@@ -29,10 +29,10 @@ import org.springframework.context.annotation.Configuration;
/**
* Every {@link IgniteRepository} is bound to a specific Apache Ignite that it communicates to in order to mutate and
* read data via Spring Data API. To pass an instance of Apache Ignite cache to an {@link IgniteRepository} it's
- * required to initialize {@link IgniteRepositoryFactoryBean} with on of the following:
+ * required to initialize {@link IgniteRepositoryFactoryBean} with one of the following:
* <ul>
- * <li>{@link Ignite} instance bean named "igniteInstance"</li>
- * <li>{@link IgniteConfiguration} bean named "igniteCfg"</li>
+ * <li>{@link Ignite} instance bean</li>
+ * <li>{@link IgniteConfiguration} bean</li>
* <li>A path to Ignite's Spring XML configuration named "igniteSpringCfgPath"</li>
* <ul/>
* In this example the first approach is utilized.
diff --git a/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteProxyFactory.java b/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteProxyFactory.java
index d571cc2..b5280ee 100644
--- a/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteProxyFactory.java
+++ b/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteProxyFactory.java
@@ -19,8 +19,14 @@ package org.apache.ignite.springdata20.repository.support;
import java.util.HashSet;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Stream;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.client.IgniteClient;
+import org.apache.ignite.configuration.ClientConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.springdata.proxy.IgniteProxy;
import org.apache.ignite.springdata20.repository.config.RepositoryConfig;
import org.springframework.beans.BeansException;
@@ -103,29 +109,25 @@ public class IgniteProxyFactory implements ApplicationContextAware, DisposableBe
private IgniteProxy createIgniteProxy(Class<?> repoInterface) {
RepositoryConfig repoCfg = getRepositoryConfiguration(repoInterface);
- Object connCfg;
-
- try {
- connCfg = ctx.getBean(evaluateExpression(repoCfg.igniteInstance()));
- }
- catch (BeansException ex) {
- try {
- connCfg = ctx.getBean(evaluateExpression(repoCfg.igniteCfg()));
- }
- catch (BeansException ex2) {
- try {
- connCfg = ctx.getBean(evaluateExpression(repoCfg.igniteSpringCfgPath()), String.class);
- }
- catch (BeansException ex3) {
- throw new IllegalArgumentException("Invalid configuration for repository " +
- repoInterface.getName() + ". No beans were found that provide connection configuration to the" +
- " Ignite cluster. Check \"igniteInstance\", \"igniteCfg\", \"igniteSpringCfgPath\" parameters" +
- " of " + RepositoryConfig.class.getName() + " repository annotation.");
- }
- }
- }
-
- return IgniteProxy.of(connCfg);
+ return Stream.<BeanFinder>of(
+ () -> ctx.getBean(evaluateExpression(repoCfg.igniteInstance())),
+ () -> ctx.getBean(evaluateExpression(repoCfg.igniteCfg())),
+ () -> ctx.getBean(evaluateExpression(repoCfg.igniteSpringCfgPath()), String.class),
+ () -> ctx.getBean(Ignite.class),
+ () -> ctx.getBean(IgniteClient.class),
+ () -> ctx.getBean(IgniteConfiguration.class),
+ () -> ctx.getBean(ClientConfiguration.class)
+ ).map(BeanFinder::getBean)
+ .filter(Objects::nonNull)
+ .findFirst()
+ .map(IgniteProxy::of)
+ .orElseThrow(() -> {
+ return new IllegalArgumentException("Invalid configuration for repository " +
+ repoInterface.getName() + ". No beans were found that provide connection configuration to the" +
+ " Ignite cluster. Check \"igniteInstance\", \"igniteCfg\", \"igniteSpringCfgPath\" parameters" +
+ " of " + RepositoryConfig.class.getName() + " repository annotation or provide Ignite, IgniteClient, " +
+ " ClientConfiguration or IgniteConfiguration bean to application context.");
+ });
}
/**
@@ -137,4 +139,29 @@ public class IgniteProxyFactory implements ApplicationContextAware, DisposableBe
private String evaluateExpression(String spelExpression) {
return (String)expressionResolver.evaluate(spelExpression, beanExpressionCtx);
}
+
+ /**
+ * Helper interface that wraps getBean method.
+ */
+ @FunctionalInterface
+ private interface BeanFinder {
+ /**
+ * Get bean.
+ * @return Bean or null if {@link BeansException} was thrown.
+ */
+ default Object getBean() {
+ try {
+ return get();
+ } catch (BeansException ex) {
+ return null;
+ }
+ }
+
+ /**
+ * Get bean.
+ * @return Bean.
+ * @throws BeansException If bean was not found.
+ */
+ Object get() throws BeansException;
+ }
}
diff --git a/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteRepositoryFactoryBean.java b/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteRepositoryFactoryBean.java
index bce6dda..0ec1313 100644
--- a/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteRepositoryFactoryBean.java
+++ b/modules/spring-data-2.0-ext/src/main/java/org/apache/ignite/springdata20/repository/support/IgniteRepositoryFactoryBean.java
@@ -34,8 +34,8 @@ import org.springframework.data.repository.core.support.RepositoryFactorySupport
* The {@link org.apache.ignite.springdata20.repository.config.RepositoryConfig} requires to define one of the
* parameters below in your Spring application configuration in order to get an access to Apache Ignite cluster:
* <ul>
- * <li>{@link Ignite} instance bean named "igniteInstance" by default</li>
- * <li>{@link IgniteConfiguration} bean named "igniteCfg" by default</li>
+ * <li>{@link Ignite} instance bean</li>
+ * <li>{@link IgniteConfiguration} bean</li>
* <li>A path to Ignite's Spring XML configuration named "igniteSpringCfgPath" by default</li>
* <ul/>
*
diff --git a/modules/spring-data-2.0-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java b/modules/spring-data-2.0-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
index 4187e28..10d016d 100644
--- a/modules/spring-data-2.0-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
+++ b/modules/spring-data-2.0-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
@@ -21,6 +21,7 @@ import java.io.Serializable;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
+import org.apache.ignite.client.IgniteClient;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.ClientConfiguration;
import org.apache.ignite.configuration.ClientConnectorConfiguration;
@@ -75,6 +76,30 @@ public class IgniteSpringDataConnectionConfigurationTest extends GridCommonAbstr
checkRepositoryConfiguration(ClientConfigurationApplication.class, IgniteClientConfigRepository.class);
}
+ /** Tests repository configuration in case {@link Ignite} with non default is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithoutIgniteInstanceParameter() {
+ checkRepositoryConfiguration(DefaultIgniteBeanApplication.class, IgniteRepositoryWithoutExplicitIgnite.class);
+ }
+
+ /** Tests repository configuration in case {@link IgniteClient} with non default name is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithoutIgniteClientInstanceParameter() {
+ checkRepositoryConfiguration(DefaultIgniteClientBeanApplication.class, IgniteRepositoryWithoutExplicitIgnite.class);
+ }
+
+ /** Tests repository configuration in case {@link ClientConfiguration} with non default name is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithoutIgnitClientConfigurationParameter() {
+ checkRepositoryConfiguration(DefaultIgniteClientConfigurationBeanApplication.class, IgniteRepositoryWithoutExplicitIgnite.class);
+ }
+
+ /** Tests repository configuration in case {@link IgniteConfiguration} with non default name is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithoutIgniteConfigurationParameter() {
+ checkRepositoryConfiguration(DefaultIgniteConfigurationBeanApplication.class, IgniteRepositoryWithoutExplicitIgnite.class);
+ }
+
/**
* Tests repository configuration in case {@link IgniteConfiguration} that refers to existing Ignite node instance
* used to access the Ignite cluster.
@@ -205,6 +230,80 @@ public class IgniteSpringDataConnectionConfigurationTest extends GridCommonAbstr
}
}
+ /**
+ * Spring Application configuration for repository testing in case if Ignite bean name was not provided
+ * through {@link RepositoryConfig#igniteInstance()} ()}.
+ */
+ @Configuration
+ @EnableIgniteRepositories(
+ considerNestedRepositories = true,
+ includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = IgniteRepositoryWithoutExplicitIgnite.class)
+ )
+ public static class DefaultIgniteBeanApplication {
+ /** Ignite bean. */
+ @Bean
+ public Ignite someIgnite() {
+ return Ignition.start(getIgniteConfiguration("test", false));
+ }
+ }
+
+ /**
+ * Spring Application configuration for repository testing in case if IgniteClient bean name was not provided
+ * through {@link RepositoryConfig#igniteInstance()} ()}.
+ */
+ @Configuration
+ @EnableIgniteRepositories(
+ considerNestedRepositories = true,
+ includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = IgniteRepositoryWithoutExplicitIgnite.class)
+ )
+ public static class DefaultIgniteClientBeanApplication {
+ /** Ignite client bean. */
+ @Bean
+ public IgniteClient someIgnite() {
+ return Ignition.startClient(new ClientConfiguration().setAddresses(LOCAL_HOST + ':' + CLI_CONN_PORT));
+ }
+ }
+
+ /**
+ * Spring Application configuration for repository testing in case if ClientConfiguration bean name was not provided
+ * through {@link RepositoryConfig#igniteCfg()}.
+ */
+ @Configuration
+ @EnableIgniteRepositories(
+ considerNestedRepositories = true,
+ includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = IgniteRepositoryWithoutExplicitIgnite.class)
+ )
+ public static class DefaultIgniteClientConfigurationBeanApplication {
+ /** Ignite client configuration bean. */
+ @Bean
+ public ClientConfiguration someCfg() {
+ return new ClientConfiguration().setAddresses(LOCAL_HOST + ':' + CLI_CONN_PORT);
+ }
+ }
+
+ /**
+ * Spring Application configuration for repository testing in case if IgniteConfiguration bean name was not provided
+ * through {@link RepositoryConfig#igniteCfg()}.
+ */
+ @Configuration
+ @EnableIgniteRepositories(
+ considerNestedRepositories = true,
+ includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = IgniteRepositoryWithoutExplicitIgnite.class)
+ )
+ public static class DefaultIgniteConfigurationBeanApplication {
+ /** Ignite client configuration bean. */
+ @Bean
+ public IgniteConfiguration someCfg() {
+ return getIgniteConfiguration("test", false);
+ }
+ }
+
+ /** Repository for testing configuration approach through default ignite beans. */
+ @RepositoryConfig(cacheName = "PersonCache")
+ public interface IgniteRepositoryWithoutExplicitIgnite extends IgniteRepository<Object, Serializable> {
+ // No-op.
+ }
+
/** Repository for testing configuration approach through {@link IgniteConfiguration}. */
@RepositoryConfig(cacheName = "PersonCache", igniteCfg = "igniteConfiguration")
public interface IgniteConfigRepository extends IgniteRepository<Object, Serializable> {
diff --git a/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteProxyFactory.java b/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteProxyFactory.java
index ac56e00..33d3757 100644
--- a/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteProxyFactory.java
+++ b/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteProxyFactory.java
@@ -19,8 +19,14 @@ package org.apache.ignite.springdata22.repository.support;
import java.util.HashSet;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Stream;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.client.IgniteClient;
+import org.apache.ignite.configuration.ClientConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.springdata.proxy.IgniteProxy;
import org.apache.ignite.springdata22.repository.config.RepositoryConfig;
import org.springframework.beans.BeansException;
@@ -103,29 +109,25 @@ public class IgniteProxyFactory implements ApplicationContextAware, DisposableBe
private IgniteProxy createIgniteProxy(Class<?> repoInterface) {
RepositoryConfig repoCfg = getRepositoryConfiguration(repoInterface);
- Object connCfg;
-
- try {
- connCfg = ctx.getBean(evaluateExpression(repoCfg.igniteInstance()));
- }
- catch (BeansException ex) {
- try {
- connCfg = ctx.getBean(evaluateExpression(repoCfg.igniteCfg()));
- }
- catch (BeansException ex2) {
- try {
- connCfg = ctx.getBean(evaluateExpression(repoCfg.igniteSpringCfgPath()), String.class);
- }
- catch (BeansException ex3) {
- throw new IllegalArgumentException("Invalid configuration for repository " +
- repoInterface.getName() + ". No beans were found that provide connection configuration to the" +
- " Ignite cluster. Check \"igniteInstance\", \"igniteCfg\", \"igniteSpringCfgPath\" parameters" +
- " of " + RepositoryConfig.class.getName() + " repository annotation.");
- }
- }
- }
-
- return IgniteProxy.of(connCfg);
+ return Stream.<BeanFinder>of(
+ () -> ctx.getBean(evaluateExpression(repoCfg.igniteInstance())),
+ () -> ctx.getBean(evaluateExpression(repoCfg.igniteCfg())),
+ () -> ctx.getBean(evaluateExpression(repoCfg.igniteSpringCfgPath()), String.class),
+ () -> ctx.getBean(Ignite.class),
+ () -> ctx.getBean(IgniteClient.class),
+ () -> ctx.getBean(IgniteConfiguration.class),
+ () -> ctx.getBean(ClientConfiguration.class)
+ ).map(BeanFinder::getBean)
+ .filter(Objects::nonNull)
+ .findFirst()
+ .map(IgniteProxy::of)
+ .orElseThrow(() -> {
+ return new IllegalArgumentException("Invalid configuration for repository " +
+ repoInterface.getName() + ". No beans were found that provide connection configuration to the" +
+ " Ignite cluster. Check \"igniteInstance\", \"igniteCfg\", \"igniteSpringCfgPath\" parameters" +
+ " of " + RepositoryConfig.class.getName() + " repository annotation or provide Ignite, IgniteClient, " +
+ " ClientConfiguration or IgniteConfiguration bean to application context.");
+ });
}
/**
@@ -137,4 +139,29 @@ public class IgniteProxyFactory implements ApplicationContextAware, DisposableBe
private String evaluateExpression(String spelExpression) {
return (String)expressionResolver.evaluate(spelExpression, beanExpressionCtx);
}
+
+ /**
+ * Helper interface that wraps getBean method.
+ */
+ @FunctionalInterface
+ private interface BeanFinder {
+ /**
+ * Get bean.
+ * @return Bean or null if {@link BeansException} was thrown.
+ */
+ default Object getBean() {
+ try {
+ return get();
+ } catch (BeansException ex) {
+ return null;
+ }
+ }
+
+ /**
+ * Get bean.
+ * @return Bean.
+ * @throws BeansException If bean was not found.
+ */
+ Object get() throws BeansException;
+ }
}
diff --git a/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteRepositoryFactoryBean.java b/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteRepositoryFactoryBean.java
index 9d6794d..4f6b7a9 100644
--- a/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteRepositoryFactoryBean.java
+++ b/modules/spring-data-2.2-ext/src/main/java/org/apache/ignite/springdata22/repository/support/IgniteRepositoryFactoryBean.java
@@ -34,8 +34,8 @@ import org.springframework.data.repository.core.support.RepositoryFactorySupport
* The {@link org.apache.ignite.springdata22.repository.config.RepositoryConfig} requires to define one of the
* parameters below in your Spring application configuration in order to get an access to Apache Ignite cluster:
* <ul>
- * <li>{@link Ignite} instance bean named "igniteInstance" by default</li>
- * <li>{@link IgniteConfiguration} bean named "igniteCfg" by default</li>
+ * <li>{@link Ignite} instance bean</li>
+ * <li>{@link IgniteConfiguration} bean</li>
* <li>A path to Ignite's Spring XML configuration named "igniteSpringCfgPath" by default</li>
* <ul/>
*
diff --git a/modules/spring-data-2.2-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java b/modules/spring-data-2.2-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
index 68c421a..c91dbe1 100644
--- a/modules/spring-data-2.2-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
+++ b/modules/spring-data-2.2-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
@@ -21,6 +21,7 @@ import java.io.Serializable;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
+import org.apache.ignite.client.IgniteClient;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.ClientConfiguration;
import org.apache.ignite.configuration.ClientConnectorConfiguration;
@@ -28,6 +29,7 @@ import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.apache.ignite.springdata.misc.PersonRepository;
import org.apache.ignite.springdata22.repository.IgniteRepository;
import org.apache.ignite.springdata22.repository.config.EnableIgniteRepositories;
import org.apache.ignite.springdata22.repository.config.RepositoryConfig;
@@ -75,6 +77,30 @@ public class IgniteSpringDataConnectionConfigurationTest extends GridCommonAbstr
checkRepositoryConfiguration(ClientConfigurationApplication.class, IgniteClientConfigRepository.class);
}
+ /** Tests repository configuration in case {@link Ignite} with non default is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithoutIgniteInstanceParameter() {
+ checkRepositoryConfiguration(DefaultIgniteBeanApplication.class, IgniteRepositoryWithoutExplicitIgnite.class);
+ }
+
+ /** Tests repository configuration in case {@link IgniteClient} with non default name is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithoutIgniteClientInstanceParameter() {
+ checkRepositoryConfiguration(DefaultIgniteClientBeanApplication.class, IgniteRepositoryWithoutExplicitIgnite.class);
+ }
+
+ /** Tests repository configuration in case {@link ClientConfiguration} with non default name is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithoutIgnitClientConfigurationParameter() {
+ checkRepositoryConfiguration(DefaultIgniteClientConfigurationBeanApplication.class, IgniteRepositoryWithoutExplicitIgnite.class);
+ }
+
+ /** Tests repository configuration in case {@link IgniteConfiguration} with non default name is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithoutIgniteConfigurationParameter() {
+ checkRepositoryConfiguration(DefaultIgniteConfigurationBeanApplication.class, IgniteRepositoryWithoutExplicitIgnite.class);
+ }
+
/**
* Tests repository configuration in case {@link IgniteConfiguration} that refers to existing Ignite node instance
* used to access the Ignite cluster.
@@ -205,6 +231,80 @@ public class IgniteSpringDataConnectionConfigurationTest extends GridCommonAbstr
}
}
+ /**
+ * Spring Application configuration for repository testing in case if Ignite bean name was not provided
+ * through {@link RepositoryConfig#igniteInstance()} ()}.
+ */
+ @Configuration
+ @EnableIgniteRepositories(
+ considerNestedRepositories = true,
+ includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = IgniteRepositoryWithoutExplicitIgnite.class)
+ )
+ public static class DefaultIgniteBeanApplication {
+ /** Ignite bean. */
+ @Bean
+ public Ignite someIgnite() {
+ return Ignition.start(getIgniteConfiguration("test", false));
+ }
+ }
+
+ /**
+ * Spring Application configuration for repository testing in case if IgniteClient bean name was not provided
+ * through {@link RepositoryConfig#igniteInstance()} ()}.
+ */
+ @Configuration
+ @EnableIgniteRepositories(
+ considerNestedRepositories = true,
+ includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = IgniteRepositoryWithoutExplicitIgnite.class)
+ )
+ public static class DefaultIgniteClientBeanApplication {
+ /** Ignite client bean. */
+ @Bean
+ public IgniteClient someIgnite() {
+ return Ignition.startClient(new ClientConfiguration().setAddresses(LOCAL_HOST + ':' + CLI_CONN_PORT));
+ }
+ }
+
+ /**
+ * Spring Application configuration for repository testing in case if ClientConfiguration bean name was not provided
+ * through {@link RepositoryConfig#igniteCfg()}.
+ */
+ @Configuration
+ @EnableIgniteRepositories(
+ considerNestedRepositories = true,
+ includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = IgniteRepositoryWithoutExplicitIgnite.class)
+ )
+ public static class DefaultIgniteClientConfigurationBeanApplication {
+ /** Ignite client configuration bean. */
+ @Bean
+ public ClientConfiguration someCfg() {
+ return new ClientConfiguration().setAddresses(LOCAL_HOST + ':' + CLI_CONN_PORT);
+ }
+ }
+
+ /**
+ * Spring Application configuration for repository testing in case if IgniteConfiguration bean name was not provided
+ * through {@link RepositoryConfig#igniteCfg()}.
+ */
+ @Configuration
+ @EnableIgniteRepositories(
+ considerNestedRepositories = true,
+ includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = IgniteRepositoryWithoutExplicitIgnite.class)
+ )
+ public static class DefaultIgniteConfigurationBeanApplication {
+ /** Ignite client configuration bean. */
+ @Bean
+ public IgniteConfiguration someCfg() {
+ return getIgniteConfiguration("test", false);
+ }
+ }
+
+ /** Repository for testing configuration approach through default ignite beans. */
+ @RepositoryConfig(cacheName = "PersonCache")
+ public interface IgniteRepositoryWithoutExplicitIgnite extends IgniteRepository<Object, Serializable> {
+ // No-op.
+ }
+
/** Repository for testing configuration approach through {@link IgniteConfiguration}. */
@RepositoryConfig(cacheName = "PersonCache", igniteCfg = "igniteConfiguration")
public interface IgniteConfigRepository extends IgniteRepository<Object, Serializable> {
diff --git a/modules/spring-data-ext/src/main/java/org/apache/ignite/springdata/repository/support/IgniteProxyFactory.java b/modules/spring-data-ext/src/main/java/org/apache/ignite/springdata/repository/support/IgniteProxyFactory.java
index 3585287..ba19f93 100644
--- a/modules/spring-data-ext/src/main/java/org/apache/ignite/springdata/repository/support/IgniteProxyFactory.java
+++ b/modules/spring-data-ext/src/main/java/org/apache/ignite/springdata/repository/support/IgniteProxyFactory.java
@@ -17,6 +17,12 @@
package org.apache.ignite.springdata.repository.support;
+import java.util.Objects;
+import java.util.stream.Stream;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.client.IgniteClient;
+import org.apache.ignite.configuration.ClientConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.springdata.proxy.IgniteProxy;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.AbstractFactoryBean;
@@ -60,28 +66,49 @@ public class IgniteProxyFactory extends AbstractFactoryBean<IgniteProxy> impleme
/** {@inheritDoc} */
@Override protected IgniteProxy createInstance() {
- Object connCfg;
+ return Stream.<BeanFinder>of(
+ () -> ctx.getBean(IGNITE_INSTANCE_BEAN_NAME),
+ () -> ctx.getBean(IGNITE_CONFIG_BEAN_NAME),
+ () -> ctx.getBean(IGNITE_SPRING_CONFIG_PATH_BEAN_NAME, String.class),
+ () -> ctx.getBean(Ignite.class),
+ () -> ctx.getBean(IgniteClient.class),
+ () -> ctx.getBean(IgniteConfiguration.class),
+ () -> ctx.getBean(ClientConfiguration.class)
+ ).map(BeanFinder::getBean)
+ .filter(Objects::nonNull)
+ .findFirst()
+ .map(IgniteProxy::of)
+ .orElseThrow(() -> {
+ return new IllegalArgumentException("No beans were found that provide connection configuration to" +
+ " the Ignite cluster. One of the beans with the following names is required : \"" +
+ IGNITE_INSTANCE_BEAN_NAME + "\", \"" + IGNITE_CONFIG_BEAN_NAME + "\" or \"" +
+ IGNITE_SPRING_CONFIG_PATH_BEAN_NAME + "\". You can also provide Ignite, IgniteClient," +
+ " IgniteConfiguration or ClientConfiguration bean to application context.");
+ });
+ }
- try {
- connCfg = ctx.getBean(IGNITE_INSTANCE_BEAN_NAME);
- }
- catch (BeansException ex) {
+ /**
+ * Helper interface that wraps getBean method.
+ */
+ @FunctionalInterface
+ private interface BeanFinder {
+ /**
+ * Get bean.
+ * @return Bean or null if {@link BeansException} was thrown.
+ */
+ default Object getBean() {
try {
- connCfg = ctx.getBean(IGNITE_CONFIG_BEAN_NAME);
- }
- catch (BeansException ex2) {
- try {
- connCfg = ctx.getBean(IGNITE_SPRING_CONFIG_PATH_BEAN_NAME, String.class);
- }
- catch (BeansException ex3) {
- throw new IllegalArgumentException("No beans were found that provide connection configuration to" +
- " the Ignite cluster. One of the beans with the following names is required : \"" +
- IGNITE_INSTANCE_BEAN_NAME + "\", \"" + IGNITE_CONFIG_BEAN_NAME + "\" or \"" +
- IGNITE_SPRING_CONFIG_PATH_BEAN_NAME + "\".");
- }
+ return get();
+ } catch (BeansException ex) {
+ return null;
}
}
- return IgniteProxy.of(connCfg);
+ /**
+ * Get bean.
+ * @return Bean.
+ * @throws BeansException If bean was not found.
+ */
+ Object get() throws BeansException;
}
}
diff --git a/modules/spring-data-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java b/modules/spring-data-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
index aa3d6a7..5d5fbae 100644
--- a/modules/spring-data-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
+++ b/modules/spring-data-ext/src/test/java/org/apache/ignite/springdata/IgniteSpringDataConnectionConfigurationTest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.springdata;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
+import org.apache.ignite.client.IgniteClient;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.ClientConfiguration;
import org.apache.ignite.configuration.ClientConnectorConfiguration;
@@ -32,6 +33,7 @@ import org.apache.ignite.springdata.misc.PersonRepository;
import org.apache.ignite.springdata.repository.IgniteRepository;
import org.apache.ignite.springdata.repository.config.EnableIgniteRepositories;
import org.apache.ignite.springdata.repository.config.RepositoryConfig;
+import org.apache.ignite.springdata.repository.support.IgniteProxyFactory;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
@@ -76,6 +78,30 @@ public class IgniteSpringDataConnectionConfigurationTest extends GridCommonAbstr
checkRepositoryConfiguration(ClientConfigurationApplication.class);
}
+ /** Tests repository configuration in case {@link Ignite} with non default is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithNonDefaultIgniteBean() {
+ checkRepositoryConfiguration(NonDefaultIgniteBeanApplication.class);
+ }
+
+ /** Tests repository configuration in case {@link IgniteClient} with non default name is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithNonDefaultIgniteClientBean() {
+ checkRepositoryConfiguration(NonDefaultIgniteClientBeanApplication.class);
+ }
+
+ /** Tests repository configuration in case {@link ClientConfiguration} with non default name is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithNonDefaultIgniteClientConfigurationBean() {
+ checkRepositoryConfiguration(NonDefaultIgniteClientConfigurationBeanApplication.class);
+ }
+
+ /** Tests repository configuration in case {@link IgniteConfiguration} with non default name is used to access the Ignite cluster. */
+ @Test
+ public void testRepositoryWithNonDefaultIgniteConfigurationBean() {
+ checkRepositoryConfiguration(NonDefaultIgniteConfigurationBeanApplication.class);
+ }
+
/**
* Tests repository configuration in case {@link IgniteConfiguration} that refers to existing Ignite node instance
* is used to access the Ignite cluster.
@@ -198,6 +224,62 @@ public class IgniteSpringDataConnectionConfigurationTest extends GridCommonAbstr
}
}
+ /**
+ * Spring Application configuration for repository testing in case {@link Ignite} bean with name different from
+ * {@link IgniteProxyFactory#IGNITE_INSTANCE_BEAN_NAME} is used for accessing the cluster.
+ */
+ @Configuration
+ @EnableIgniteRepositories(includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = PersonRepository.class))
+ public static class NonDefaultIgniteBeanApplication {
+ /** Ignite bean. */
+ @Bean
+ public Ignite someIgnite() {
+ return Ignition.start(getIgniteConfiguration("test", false));
+ }
+ }
+
+ /**
+ * Spring Application configuration for repository testing in case {@link IgniteClient} bean with name different from
+ * {@link IgniteProxyFactory#IGNITE_INSTANCE_BEAN_NAME} is used for accessing the cluster.
+ */
+ @Configuration
+ @EnableIgniteRepositories(includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = PersonRepository.class))
+ public static class NonDefaultIgniteClientBeanApplication {
+ /** Ignite client bean. */
+ @Bean
+ public IgniteClient someIgnite() {
+ return Ignition.startClient(new ClientConfiguration().setAddresses(LOCAL_HOST + ':' + CLI_CONN_PORT));
+ }
+ }
+
+ /**
+ * Spring Application configuration for repository testing in case {@link ClientConfiguration} bean with name different from
+ * {@link IgniteProxyFactory#IGNITE_CONFIG_BEAN_NAME} is used for accessing the cluster.
+ */
+ @Configuration
+ @EnableIgniteRepositories(includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = PersonRepository.class))
+ public static class NonDefaultIgniteClientConfigurationBeanApplication {
+ /** Ignite client configuration bean. */
+ @Bean
+ public ClientConfiguration someCfg() {
+ return new ClientConfiguration().setAddresses(LOCAL_HOST + ':' + CLI_CONN_PORT);
+ }
+ }
+
+ /**
+ * Spring Application configuration for repository testing in case {@link IgniteConfiguration} bean with name different from
+ * {@link IgniteProxyFactory#IGNITE_CONFIG_BEAN_NAME} is used for accessing the cluster.
+ */
+ @Configuration
+ @EnableIgniteRepositories(includeFilters = @Filter(type = ASSIGNABLE_TYPE, classes = PersonRepository.class))
+ public static class NonDefaultIgniteConfigurationBeanApplication {
+ /** Ignite client configuration bean. */
+ @Bean
+ public IgniteConfiguration someCfg() {
+ return getIgniteConfiguration("test", false);
+ }
+ }
+
/** Repository for testing application behavior in case the cache name is not specified in the repository configuration. */
@RepositoryConfig
interface InvalidCacheRepository extends IgniteRepository<Person, Integer> {