当前位置: 首页 > 知识库问答 >
问题:

Spring Boot:多个具有不同前缀的类似ConfigurationProperties

钱德海
2023-03-14

我使用SpringBoot,有两个非常相似的服务,我想在应用程序中配置它们。yml

配置大致如下所示:

serviceA.url=abc.com
serviceA.port=80

serviceB.url=def.com
serviceB.port=8080

是否可以创建一个带有@ConfigurationProperties注释的类,并在注入点设置前缀?

例如。

@Component
@ConfigurationProperties
public class ServiceProperties {
   private String url;
   private String port;

   // Getters & Setters
}

然后在服务本身:

public class ServiceA {

   @Autowired
   @SomeFancyAnnotationToSetPrefix(prefix="serviceA")
   private ServiceProperties serviceAProperties;

   // ....
}

不幸的是,我还没有在留档中找到关于这样一个功能的东西...非常感谢您的帮助!

共有3个答案

夹谷宜民
2023-03-14

除了JavaBean验证之外,Javvanos示例工作得很好。

我在其中一个属性上有一个注释@NotNull:

public class ServiceProperties {
   @NotNull
   private String url;
   private String port;

   // Getters & Setters

}

结果,应用程序启动失败,出现以下错误消息:

***************************
APPLICATION FAILED TO START
***************************

Description:

Binding to target ch.sbb.hop.commons.infrastructure.hadoop.spark.SparkJobDeployerConfig@730d2164 failed:

    Property: url
    Value: null
    Reason: may not be null


Action:

Update your application's configuration

删除注释后,应用程序将使用正确的属性绑定启动。总之,我认为JavaBean验证无法获得正确初始化的实例存在问题,可能是因为配置方法上缺少代理。

崔恺
2023-03-14

遵循本Spring Boot中@ConfigurationProperties的发布指南,您可以创建一个没有注释的简单类:

public class ServiceProperties {
   private String url;
   private String port;

   // Getters & Setters
}

然后使用@Bean注释创建@Configuration类:

@Configuration
@PropertySource("classpath:name_properties_file.properties")
public class ConfigProperties {

    @Bean
    @ConfigurationProperties(prefix = "serviceA")
    public ServiceProperties serviceA() {
        return new ServiceProperties ();
    }

    @Bean
    @ConfigurationProperties(prefix = "serviceB")
    public ServiceProperties serviceB(){
        return new ServiceProperties ();
    }
}

最后,您可以获得如下属性:

@SpringBootApplication
public class Application implements CommandLineRunner {

    @Autowired
    private ConfigProperties configProperties ;

    private void watheverMethod() {
        // For ServiceA properties
        System.out.println(configProperties.serviceA().getUrl());

        // For ServiceB properties
        System.out.println(configProperties.serviceB().getPort());
    }
}
陆阳曜
2023-03-14

我取得了和你尝试的几乎相同的成就。首先,注册每个属性bean

@Bean
@ConfigurationProperties(prefix = "serviceA")
public ServiceProperties  serviceAProperties() {
    return new ServiceProperties ();
}

@Bean
@ConfigurationProperties(prefix = "serviceB")
public ServiceProperties  serviceBProperties() {
    return new ServiceProperties ();
}

在服务(或将使用属性的某个地方)放置一个@Qualifier并指定哪个属性将自动连接。

public class ServiceA {
    @Autowired
    @Qualifier("serviceAProperties")
    private ServiceProperties serviceAProperties;

}
 类似资料:
  • 问题内容: 例如我有静态字段的类: 我可以使用两个不同的类加载器两次加载该类。我该如何避免呢?这是不安全和危险的。 另外,如果我将instance设置为null,那么是否将两个类的instance都设置为null? 问题答案: 如果你希望跨类加载器为true ,则需要一个公共父类来加载所讨论的类,或者你需要自己指定类加载器。 更新:来自@Pshemo的评论下面的博客中相当一部分内容可能直接来自Ja

  • 另外,如果我将instance设置为null,那么这两个类是否都设置为null?

  • 我创建了一个具有@ConfigurationProperties(Prefix='common.kafka')的配置类的配置类

  • 我正在使用java。util。ServiceLoader创建轻量级插件框架。 我目前正在努力解决如何拥有多个具有相同FQN的实现类。我想在类路径上拥有同一个插件的两个副本,并且可以访问META-INF/services目录中给出的两个实现类。 以下是一些简单的eclipse项目,它们说明了我的意思:https://docs.google.com/open?id=0B4MxFm-ACB3IUmswN

  • 我想知道如何转换类似于SwitchMap的可观察,但不是限制为单个活动流有多个(有限的)流。 其目的是让多个任务同时工作,达到某些任务计数限制,并允许新任务使用FIFO队列策略启动,这意味着任何新任务到达时都将立即启动,队列中最旧的任务将被取消。 switchMap将为源的每个发射创建可观察流,并将取消以前运行的可观察流。一旦创建了新的可观察流,我想实现类似的功能,但允许在某个级别(如flatMa

  • 我的目标: <代码>http://host:port/myApp/about返回一个名为about的jsp页面。jsp 我的web.xml: 我的servlet.xml(使用Spring 3.0.3. RELEASE): 我的控制器: 在服务器(jetty 6,servlet api 2.5)启动时,我看到: 上述目标的设置结果: > 产生错误: 我检查/尝试过的事情: > 确实存在 我已经在这两