Ошибка создания бина с именем 'gemfireCache': FactoryBean выдал исключение при создании объекта - PullRequest
0 голосов
/ 27 декабря 2018

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

[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] Не удалось вызвать метод уничтожения для объекта EJBс именем '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]

класс домена1013 * Класс репозитория

@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 ]

0 голосов
/ 05 февраля 2019

Добавление дополнительных советов с указанным выше классом конфигурации 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, поэтому вам не нужна явная аннотация Spring @Configuration для класса конфигурации.

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

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

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

  5. Для удобства имя ("employee") определения компонента Region в вашем LOCAL "работнике" 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 должен позаботиться о правильных переходных зависимостях.

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

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

0 голосов
/ 28 декабря 2018

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

...