将不同的 @Configuration bean 传递给基于 rest 的客户端

pass different @Configuration bean to a rest based Client

我有两个不同的配置,我将从应用程序 yml 加载它们。属性相同,但值可能不同。

我如何使它工作 giveMeRestTemplate(类型配置)

// app.yml

    bus:
      tyres:8
      seats:40
      color:red
      url: www.businfo.com
    car:
      tyres:4
      seats:6
      color:blue
      url: www.carinfo.com

所以我有不同的 ConfigruationProperties class 就像下面的 CarConfig

@ConfigurationProperties("bus")
    public class BusConfig{
      public int tyres;
      public int seats;
      public string color ;
      public string url;
    //setters and getters below.

    }

然后我有一个休息客户端,我用它来调用一些 api 来获取信息。所以这个api可以return你可以说的不同类型车辆的信息。

public class RestClientHelper{

    public RestTemplate giveMeRestTemplate(Type config);
    {
     return restTemplate; //using the above type which might have url to the specific api to call.

     }
}

想法是调用代码可以根据发送给它的配置获得不同的 rest 模板。

   public SomeClient{

    @Autowired
    RestClientHelper rch;
    
    @Autowired
    BusConfig bc;

    @Autowired
    CarConfig cc;

    
    public void publishDetails(){
     rch.giveMeRestTemplate(bc);    //so if i send cc then it should prepare rest template for cc
    }
   }

我建议稍微更改一下配置属性(为简洁起见省略了 getter 和 setter):

public enum Type {
    BUS, CAR
}

@ConfigurationProperties("rest-config")
public class RestConfig {
    private Map<Type, ConfigType> type = new HashMap<>();

    public static class ConfigType {
        private int tyres;
        private int seats;
        private string color;
        private string url;
    }
}

这样你就可以拥有以下配置文件:

rest-config:
  type:
    bus:
      tyres: 8
      seats: 40
      color: red
      url: www.businfo.com
    car:
      tyres: 4
      seats: 6
      color: blue
      url: www.carinfo.com

最后是你的帮手:

@Service
public class RestClientService {

    @Autowired
    private RestConfig config;

    public RestTemplate giveMeRestTemplate(Type type) {
        RestConfig.ConfigType cfg = config.getType().get(type);
        // do what's necessary with cfg
        return restTemplate;
    }
}

无论@Archie 发布什么(谢谢) 给了我这样写的灵感。

public enum Type {
    BUS, CAR
}

因此将字符串存储为映射中的键,它告诉我此配置是哪种特定类型。

   @ConfigurationProperties("rest-config")
    public class RestConfig {
        private Map<String, ConfigType> type = new HashMap<>();
        public static class ConfigType {
            private int tyres;
            private int seats;
            private string color;
            private string url;
        }
    }

所以助手可以采用类型实际配置类型(这是我的调用者代码可以根据可以创建的模板向它发送类型,而不是在这个方法中读取它是哪种配置类型。)

    public class RestClientHelper{
    
        public RestTemplate giveMeRestTemplate(RestConfig.type config);
        {
         return restTemplate; //using the above type which might have url to the specific api to call.
    
         }
    }

客户代码

public SomeClient{

    @Autowired
    RestClientHelper rch;
    
    public void publishDetails(){
     rch.giveMeRestTemplate(rch.type.get(Type.BUS.toString()));    //I am sending a actual type by using enum to match the string name
    }
   }