Ошибка создания бина с именем 'gemfireCache': FactoryBean выдал исключение при создании объекта
Я пытаюсь создать "служащий" регион и поместить в него некоторые данные. Но я получаю исключение ниже:
[warn 2018/12/27 17: 15: 46.518 IST tid = 0x1] Исключительная ситуация во время инициализации контекста - отмена попытки обновления: org.springframework.beans.factory.BeanCreationException: Ошибка создания бина с именем 'gemfireConfiguration': внедрение зависимостей ресурса не удалось; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка создания бина с именем 'gemfireCache': FactoryBean вызвала исключение при создании объекта; Вложенным исключением является java.lang.NoClassDefFoundError: it / unimi / dsi / fastutil / ints / Int2ObjectOpenHashMap
[warn 2018/12/27 17: 15: 46.519 IST tid = 0x1] Ошибка вызова метода уничтожения для компонента с именем 'gemfireCache': org.apache.geode.cache.CacheClosedException: кэш еще не создан.
[ошибка 2018/12/27 17:15:46.522 IST tid=0x1] Обнаружено исключение при разрешении TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener@c667f46] для подготовки тестового экземпляра [com.gemfire.demo.Gemfirets@48bfb884]
Доменный класс
@Region("employee")
public class Employee {
@Id
public String name;
public double salary;
...
}
Репозиторий класса
@Repository
public interface EmployeeRepository extends CrudRepository<Employee, String> {
Employee findByName(String name);
}
Класс конфигурации
@Configuration
@ComponentScan
@EnableGemfireRepositories(basePackages = "com.gemfire.demo")
public class GemfireConfiguration {
@Autowired
EmployeeRepository employeeRepository;
@Bean
Properties gemfireProperties() {
Properties gemfireProperties = new Properties();
gemfireProperties.setProperty("name", "SpringDataGemFireApplication");
gemfireProperties.setProperty("mcast-port", "0");
gemfireProperties.setProperty("log-level", "config");
return gemfireProperties;
}
@Bean
@Autowired
CacheFactoryBean gemfireCache() {
CacheFactoryBean gemfireCache = new CacheFactoryBean();
gemfireCache.setClose(true);
gemfireCache.setProperties(gemfireProperties());
return gemfireCache;
}
@Bean(name="employee")
@Autowired
LocalRegionFactoryBean<String, Employee> getEmployee(final GemFireCache cache) {
LocalRegionFactoryBean<String, Employee> employeeRegion = new LocalRegionFactoryBean<String, Employee>();
employeeRegion.setCache(cache);
employeeRegion.setClose(false);
employeeRegion.setName("employee");
employeeRegion.setPersistent(false);
employeeRegion.setDataPolicy(DataPolicy.PRELOADED);
return employeeRegion;
}
}
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-gemfire</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.0</version>
</dependency>
2 ответа
Добавление дополнительных советов с указанным выше классом конфигурации GemFire /Spring JavaConfig выше.
Учитывая, что вы используете Spring Data Kay
(подразумевается использование Spring Boot 2.0.x
родительский POM, т.е. org.springframework.boot:spring-boot-dependencies
; см. здесь), тогда вы могли бы использовать (относительно) новую и удобную модель конфигурации на основе аннотаций Spring Data GemFire.
Тем самым ваш GemfireConfiguration
класс выше станет...
@PeerCacheApplication
@EnableGemfireRepositories(basePackages = "com.gemfire.demo")
class GemfireConfiguration {
@Bean(name="employee")
LocalRegionFactoryBean<String, Employee> getEmployee(GemFireCache cache) {
LocalRegionFactoryBean<String, Employee> employeeRegion =
new LocalRegionFactoryBean<String, Employee>();
employeeRegion.setCache(cache);
employeeRegion.setClose(false);
employeeRegion.setDataPolicy(DataPolicy.PRELOADED);
return employeeRegion;
}
}
Несколько вещей, которые нужно иметь в виду:
@PeerCacheApplication
мета-аннотирован с@Configuration
так что вам не нужна явная весна@Configuration
аннотация на классе конфигурации.@PeerCacheApplication
позволяет настроить уровень ведения журнала GemFire (наряду с другими настройками ведения журнала), используяlogLevel
атрибут аннотации. Точно так же вы можете установить уровень журнала, используя соответствующее свойство,spring.data.gemfire.cache.log-level
в весеннем ботинкеapplication.properties
файл (см. здесь). Есть много других атрибутов и соответствующих свойств (например,name
) вы можете использовать для настройки и настройки другой конфигурации.Хотя имена пакетов на основе строк поддерживаются на
@EnableGemfireRepositories
и аналогичные аннотации, мы обычно предпочитаем и рекомендуем пользователям использовать типобезопасный вариантbasePacakgeClasses
, Вам нужно обращаться только к одному типу из каждого пакета верхнего уровня, где хранятся ваши репозитории приложений.Явный
@Autowired
аннотации не нужны в ваших определениях бинов. Вам не нужно явно вводитьEmployeeRepository
в классе конфигурации для его инициализации; просто введите его в@Service
класс, где он будет использоваться.Для удобства имя ("сотрудник") определения bean-компонента Region в вашем МЕСТНОМ " Region" регионе также будет использоваться в качестве имени Region, поэтому
employeeRegion.setName("employee")
не нужноВы не должны комбинировать
LocalRegionFactoryBean.setPersistent(:boolean)
сLocalRegionFactoryBean.setDataPolicy(:DataPolicy)
поскольку DataPolicy будет иметь приоритет.В то время как
@ComponentScan
Это вполне приемлемо и даже удобно в разработке, я обычно не предпочитаю и не рекомендую пользователям использовать компонентное сканирование. Обычно всегда лучше быть явным.Как указано в комментариях, вы должны удалить
<relativePath/>
из определения вашего родителя в POM-файле приложения Maven.Последнее замечание по состоянию на этот пост Spring Boot
2.0.8.RELEASE
это последний выпуск.
Что касается ваших проблем с classpath, если вы используете Maven правильно, то Maven должен позаботиться о том, чтобы вывести правильные переходные зависимости.
Вы можете обратиться ко многим примерам, которые я привел в этом репо для дальнейшего разъяснения.
Надеюсь это поможет!
Как уже упоминалось в комментариях, ошибка показывает некоторые зависимости (java.lang.NoClassDefFoundError: it/unimi/dsi/fastutil/ints/Int2ObjectOpenHashMap
) не хватает. Пожалуйста, добавьте соответствующие зависимости в ваш pom.xml