【问题标题】:error while reloading spring properties with @RefreshScope in spring cloud在 Spring Cloud 中使用 @RefreshScope 重新加载弹簧属性时出错
【发布时间】:2019-06-09 05:17:55
【问题描述】:

我正在使用 @RefreshScope 注释测试 spring-cloud 的一个原型。我为此使用了一个外部属性文件。我在运行时参数中提供并配置了它。

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 更新完整的 pom 内容请查看
  • 是的,不兼容的版本。

标签: spring-boot spring-cloud


【解决方案1】:

添加云上下文依赖并重试

<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

【讨论】:

  • 尝试了你的建议,但还是一样的错误报告
  • 查看这个关于如何使用 refreshscope 的示例:spring.io/guides/gs/centralized-configuration
  • Configuration 和 RefreshScope 注释不能用于我之前提到的同一元素......你经历过吗?
  • 我已经分离了两个注释。在配置类使用 RefreshScope、ComponentScan,在主类使用 EnableAutoConfiguration。还是帮不上忙。仍然缺少一些配置
【解决方案2】:

1.1.8.RELEASE 用于 Spring Cloud 是 Camden 发布系列的一部分,该系列用于 Spring Boot 1.4.x 发布。

请参阅Release Trains 部分,了解用于您的 Spring Boot 版本的发布系列

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

目前是,

发布火车启动版本

格林威治 2.1.x

芬奇利 2.0.x

Edgware 1.5.x

道尔斯顿 1.5.x

当您使用 spring boot 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 2023-03-25
    • 2015-11-12
    • 2023-03-28
    • 2016-08-06
    • 2022-01-09
    • 2018-01-16
    相关资源
    最近更新 更多