Ошибка создания бина с именем '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;
    }
}

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

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

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

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

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

  5. Для удобства имя ("сотрудник") определения bean-компонента Region в вашем МЕСТНОМ " Region" регионе также будет использоваться в качестве имени Region, поэтому employeeRegion.setName("employee") не нужно

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

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

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

  9. Последнее замечание по состоянию на этот пост Spring Boot 2.0.8.RELEASE это последний выпуск.

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

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

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

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

Другие вопросы по тегам