将不同的 @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
}
}
我有两个不同的配置,我将从应用程序 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
}
}