Ошибка при перезагрузке свойств пружины с помощью @RefreshScope в весеннем облаке

Я тестирую один прототип Spring-Cloud с помощью аннотации @RefreshScope. Для этого я использую один внешний файл свойств. Который я предоставил и настроил в аргументе времени выполнения.

зависимость pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"  xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0      http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.1.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.proto.reload</groupId>
<artifactId>CachingService</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>CachingService</name>
<description>Demo project for cache</description>

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-context</artifactId>
        <version>1.1.8.RELEASE</version>
    </dependency>

    <!-- <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-client</artifactId> 
        <version>1.1.3.RELEASE</version> </dependency> -->
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Это основной класс

package com.proto.reload;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.ApplicationPidFileWriter;

@SpringBootApplication
public class CachingServiceApplication {

public static void main(String[] args) {
    if (args.length == 0) {
        System.out.println("Invalid Commandline argument. Please provide Consumer Properties file.");
        System.exit(0);
    }
    new SpringApplicationBuilder(CachingServiceApplication.class)
            .listeners(new ApplicationPidFileWriter())
            .properties("spring.config.name:" + args[0].replaceAll(".properties", ""))
            .build()
            .run(args);

    while (true) {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(ConfigClass.getName());
    }
}

}

Конфигурационный класс с аннотацией @RefreshScope

package com.proto.reload;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;

@Configuration
@RefreshScope
public class ConfigClass {

    private static String name;

    public static String getName() {
        return name;
    }

    @Value("${app.prop.name}")
    public void setName(String name) {
        this.name = name;
    }

}

И это файл свойств, который я передаю через аргумент

app.prop.name=FirstOldValue

spring.pid.file=TestOne.pid

Когда я запускаю этот код, я получаю следующую ошибку.

   12:38:41.051 [main] DEBUG org.springframework.boot.context.logging.ClasspathLoggingApplicationListener - Application failed to start with classpath: [file:/C:/Program%20Files/Java/jre1.8.0_191/lib/resources.jar, file:/C:/Program%20Files/Java/jre1.8.0_191/lib/rt.jar, file:/C:/Program%20Files/Java/jre1.8.0_191/lib/jsse.jar, file:/C:/Program%20Files/Java/jre1.8.0_191/lib/jce.jar, file:/C:/Program%20Files/Java/jre1.8.0_191/lib/charsets.jar, file:/C:/Program%20Files/Java/jre1.8.0_191/lib/jfr.jar, file:/C:/Program%20Files/Java/jre1.8.0_191/lib/ext/access-bridge-64.jar, file:/C:/Program%20Files/Java/jre1.8.0_191/lib/ext/cldrdata.jar, ...]
12:38:41.105 [main] ERROR org.springframework.boot.SpringApplication - Application run failed
java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.<init>([Ljava/lang/Object;)V
    at org.springframework.cloud.bootstrap.BootstrapApplicationListener.bootstrapServiceContext(BootstrapApplicationListener.java:120)
    at org.springframework.cloud.bootstrap.BootstrapApplicationListener.onApplicationEvent(BootstrapApplicationListener.java:84)
    at org.springframework.cloud.bootstrap.BootstrapApplicationListener.onApplicationEvent(BootstrapApplicationListener.java:62)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127)
    at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:75)
    at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54)
    at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:347)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:306)
    at com.proto.reload.CachingServiceApplication.main(CachingServiceApplication.java:19)

Я неправильно использую @RefreshScope? Этот код отлично работает, когда я удаляю зависимость и @RefreshScope, но не обновляю значение свойства во время выполнения. Моя цель - загрузить измененное значение свойства во время выполнения.

Пожалуйста, добавьте свой полный POM, это похоже на несоответствие зависимостей. Вы должны использовать Spring Cloud BOM или Parent POM, чтобы зависимости Spring Cloud соответствовали Spring Boot.

Darren Forsythe 15.01.2019 09:41

@Darren Обновил полный контент pom, пожалуйста, проверьте

T T 15.01.2019 10:05

Ага, несовместимые версии.

spencergibb 15.01.2019 18:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
3
2 226
2

Ответы 2

Добавьте зависимость от облачного контекста и попробуйте еще раз

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-context</artifactId>
        <version>1.1.8.RELEASE</version>
    </dependency>

Обновлять : просто недопустимо использовать @Configuration и @RefreshScope в одном элементе. Согласно этой ветке URL: https://github.com/spring-cloud/spring-cloud-config/issues/43

Пробовал то, что вы предлагали, но все тот же отчет об ошибке

T T 15.01.2019 09:29

см. этот пример о том, как использовать область обновления: spring.io/guides/gs/centralized-configuration

Vishnu 15.01.2019 09:48

Аннотации Configuration и RefreshScope не могут быть использованы для одного и того же элемента, о котором я упоминал ранее .... вы прошли через это?

Vishnu 15.01.2019 09:59

Я разделил обе аннотации. Использовал RefreshScope, ComponentScan в классе конфигурации и использовал EnableAutoConfiguration в основном классе. По-прежнему не помогает. Некоторая конфигурация все еще отсутствует

T T 15.01.2019 10:08

1.1.8.RELEASE для Spring Cloud является частью поезда Camden Release, предназначенного для выпусков Spring Boot 1.4.x.

Пожалуйста, смотрите раздел Release Trains, чтобы узнать, какую версию выпуска использовать для вашей версии Spring Boot.

https://spring.io/projects/spring-cloud

В настоящее время они,

Release Train Boot Version

Greenwich 2.1.x

Finchley 2.0.x

Edgware 1.5.x

Dalston 1.5.x

Поскольку вы используете весеннюю загрузку 2.1.1, ваше управление зависимостями должно выглядеть, как показано ниже, обратите внимание, что в Гринвиче нет RELEASE, но вам нужно добавить репозиторий вех.

 <repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>http://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.RC2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-context</artifactId>
    </dependency>

</dependencies>

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