有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java正在寻找一种在springboot应用程序中解析值的方法。初始化SpringBootApplication之前的yml文件

因此,我的问题如下:

我使用spring AMQP连接到使用SSL的rabbitMQ实例。不幸的是,SpringAMQP目前不支持全长AMQPSURI,并且添加支持在优先级列表中并不高(请参阅问题:https://github.com/spring-projects/spring-boot/issues/6401)。他们需要分开

我的应用程序中需要以下字段。要连接的yml:

spring:
  rabbitmq:
    host: hostname
    port: portnumber
    username: username
    password: password
    virtual-host: virtualhost
    ssl:
      enabled: true

rabbitMQ实例的VCAP_服务环境仅提供以下格式的virtualhost和全长uri:amqps://username:password@hostname:portnumber/virtualhost

将这些值复制并粘贴到我的应用程序中。yml目前还不错,但从长远来看是不可行的。他们需要来自vcap_服务

我的@SpringBootApplication有@Beans,可以在启动时初始化到rabbitMQ实例的连接,因此我正在寻找一种方法来解析各个值,并在应用程序启动之前设置它们


共 (2) 个答案

  1. # 1 楼答案

    只需覆盖引导的自动配置连接工厂

    @SpringBootApplication
    public class So46937522Application {
    
        public static void main(String[] args) {
            SpringApplication.run(So46937522Application.class, args);
        }
    
        @Bean
        public CachingConnectionFactory rabbitConnectionFactory(RabbitProperties config)
                throws Exception {
            CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
            connectionFactory.getRabbitConnectionFactory()
                .setUri("amqps://guest:guest@10.0.0.3:5671/virtualhost");
            return connectionFactory;
        }
    
        @RabbitListener(queues = "si.test.queue")
        public void listen(Message in) {
            System.out.println(in);
        }
    
    }
    
  2. # 2 楼答案

    如果您只想在Spring启动应用程序初始化之前读取属性,那么可以在调用SpringApplication.run之前使用Spring的YamlPropertiesFactoryBean解析yaml文件。比如说,

    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {       
            YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean();
            yamlFactory.setResources(new ClassPathResource("application.yml"));
            Properties props = yamlFactory.getObject();
    
            String hostname = props.getProperty("spring.rabbitmq.hostname");
            ...
    
            SpringApplication.run(Application.class, args);
        }
    }