Ошибка создания bean-компонента с именем «gemfireCache»: FactoryBean выдал исключение при создании объекта

Я пытаюсь создать регион «сотрудник» и поместить в него некоторые данные. Но я получаю исключение ниже:

[warn 2018/12/27 17:15:46.518 IST tid=0x1] Исключение во время инициализации контекста — отмена попытки обновления: org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем «gemfireConfiguration»: внедрение зависимостей ресурсов неуспешный; вложенным исключением является org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем «gemfireCache»: FactoryBean выдал исключение при создании объекта; вложенным исключением является java.lang.NoClassDefFoundError: it/unimi/dsi/fastutil/ints/Int2ObjectOpenHashMap

[warn 27/12/2018 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.Gemfire1ApplicationTests@ 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;
    }

} 

ПОМ.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>  

person Arunprasad    schedule 27.12.2018    source источник
comment
java.lang.NoClassDefFoundError: it/unimi/dsi/fastutil/ints/Int2ObjectOpenHashMap — вы должны убедиться, что эта зависимость (с правильной версией) добавлена ​​в ваш pom и доступна в вашем пути к классам   -  person Ram    schedule 27.12.2018
comment
после добавления зависимости. теперь я получаю другое исключение Добавленная зависимость ‹dependency› ‹groupId›it.unimi.dsi‹/groupId› ‹artifactId›fastutil‹/artifactId› ‹version›6.3‹/version› ‹/dependency› Исключение, вызванное: org.springframework .beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем «gemfireCache»: FactoryBean выдал исключение при создании объекта; вложенным исключением является java.lang.NoClassDefFoundError: javax/transaction/Synchronization   -  person Arunprasad    schedule 27.12.2018
comment
Похоже, библиотека транзакций Java отсутствует. Пожалуйста, соответствующую зависимость   -  person Ram    schedule 27.12.2018
comment
После добавления ниже зависимостей теперь я получаю «Вызвано: java.lang.ClassNotFoundException: org.apache.lucene.analysis.miscellaneous.PerFieldAnalyzerWrapper» shiro-all-1.1.0 commons-lang-2.6 lucene-analyzers-3.6.0   -  person Arunprasad    schedule 27.12.2018
comment
Кажется, я имею в виду неправильную lucene-analyzers версию   -  person Arunprasad    schedule 27.12.2018
comment
После добавления lucene-analyzers-common-4.1.0 &lucene-queryparser-4.1.0 выглядит нормально   -  person Arunprasad    schedule 28.12.2018
comment
Должно быть что-то не так с вашим POM-файлом Maven, поскольку Maven будет извлекать все необязательные/непредоставленные транзитивные зависимости, особенно с учетом набора зависимостей, которые вы явно объявили. Например, объявления зависимости от org.springframework.data:spring-data-gemfire достаточно, чтобы подключить зависимости Lucene. Вы также должны удалить это: <relativePath/> из родителя.   -  person John Blum    schedule 05.02.2019


Ответы (2)


Добавление дополнительных советов с указанным выше классом конфигурации GemFire/Spring JavaConfig.

Учитывая, что вы используете Spring Data Kay (подразумевается использование вами 2.0.x родительского POM Spring Boot, т. е. 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;
    }
}

Несколько вещей, о которых следует помнить:

  1. @PeerCacheApplication имеет мета-аннотацию с @Configuration, поэтому вам не нужна явная аннотация Spring @Configuration в классе конфигурации.

  2. @PeerCacheApplication позволяет настроить уровень журнала GemFire ​​(наряду с другой конфигурацией ведения журнала) с помощью атрибута аннотации logLevel. Точно так же вы можете установить уровень журнала, используя соответствующее свойство spring.data.gemfire.cache.log-level в файле Spring Boot application.properties (см. здесь). Есть много других атрибутов и соответствующих свойств (например, name), которые вы можете использовать для настройки и настройки других конфигураций.

  3. Хотя имена пакетов на основе строк поддерживаются в @EnableGemfireRepositories и подобных аннотациях, мы обычно предпочитаем и рекомендуем пользователям использовать типобезопасный вариант basePacakgeClasses. Вам нужно ссылаться только на один тип из каждого пакета верхнего уровня, в котором хранятся репозитории вашего приложения.

  4. Явная аннотация @Autowired не нужна для ваших определений bean-компонентов. Вам не нужно явно вводить EmployeeRepository в класс конфигурации для его инициализации; просто введите его в класс @Service, где он будет использоваться.

  5. Для удобства имя («сотрудник») определения бина «Регион» в вашем ЛОКАЛЬНОМ регионе «сотрудник» также будет использоваться в качестве имени региона, поэтому employeeRegion.setName("employee") не нужен.

  6. Вы не должны комбинировать LocalRegionFactoryBean.setPersistent(:boolean) с LocalRegionFactoryBean.setDataPolicy(:DataPolicy), так как DataPolicy будет иметь приоритет.

  7. Хотя @ComponentScan вполне приемлем и даже удобен в разработке, я обычно не предпочитаю и не рекомендую пользователям использовать сканирование компонентов. Обычно всегда лучше быть явным.

  8. Как указано в комментариях, вы должны удалить <relativePath/> из своего родительского определения в вашем приложении Maven POM-файле.

  9. Последнее замечание: на момент публикации Spring Boot 2.0.8.RELEASE является последней версией.

Что касается ваших проблем с путями к классам, если вы правильно используете Maven, то Maven должен позаботиться о правильных транзитивных зависимостях.

Вы можете обратиться к множеству примеров в этом репозитории для дальнейшего разъяснения.

Надеюсь это поможет!

person John Blum    schedule 05.02.2019
comment
Я также должен отметить, что вам не понадобится явное определение bean-компонента сотрудника (LOCAL/Preloaded) Region, если вы используете аннотацию @EnableEntityDefinedRegions (docs.spring.io/spring-data/geode/docs/current/api/org/) либо. См. документацию (docs.spring.io/spring-data/gemfire/docs/2.0.10.RELEASE/) для получения более подробной информации. - person John Blum; 05.02.2019
comment
Наконец, учитывая, что вы используете Spring Boot, вас также может заинтересовать github.com /spring-projects/spring-boot-data-geode, к вашему сведению. - person John Blum; 05.02.2019

Как упоминалось в комментариях, ошибка показывает, что некоторые зависимости (java.lang.NoClassDefFoundError: it/unimi/dsi/fastutil/ints/Int2ObjectOpenHashMap) отсутствуют. Пожалуйста, добавьте соответствующие зависимости в ваш pom.xml

person Ram    schedule 28.12.2018
comment
добавление fastutil недостаточно, добавлены shiro-all-1.1.0 commons-lang-2.6 lucene-analyzers-4.1.0 и lucene-queryparser-4.1.0. решить проблему - person Arunprasad; 31.12.2018