我有一個類,用作請求訪問另一個服務。
它有幾個欄位,如下所示。
public class RequestClass {
@JsonProperty("123")
private String name;
@JsonProperty("124")
private String email;
@JsonProperty("129")
private String mobile;
}
上游服務需要欄位 id 為 123、124、129 等的請求。
對于測驗和生產環境,這些欄位 ID 會有所不同。
除了使用不同的 RequestClass 之外,還有什么更好的方法可以做到嗎?
uj5u.com熱心網友回復:
您可以創建一個配置類,在其中根據您的環境跟蹤實際 id 并使用 jackson 的@JsonAnyGetter映射它們。
因此,例如,如果您有以下內容application.properties(我在這里使用多檔案道具,但您也可以使用application.properties每個組態檔):
spring.profiles.active=dev
#---
spring.config.activate.on-profile=dev
application.requestClass.nameId=123
#---
spring.config.activate.on-profile=test
application.requestClass.nameId=456
然后,您將創建您的配置類(我使用 Lombok 的@Datagetter/setter):
@Configuration
@Data
public class RequestClassConfig {
@Value("${application.requestClass.nameId}")
private String nameId;
@PostConstruct
public void postConstruct() {
RequestClass.config = this;
}
}
最后是你的 DTO @JsonAnyGetter:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RequestClass {
public static RequestClassConfig config;
@JsonIgnore
private String name;
@JsonAnyGetter
public Map<String, Object> any() {
final var map = new HashMap<String, Object>();
map.put(config.getNameId(), this.name);
return map;
}
}
請注意,您可以對其余道具執行相同操作,為了簡潔起見,我剛剛省略了這些道具。
現在進行快速測驗運行:
@SpringBootApplication
public class App {
public static void main(String[] args) throws JsonProcessingException {
SpringApplication.run(App.class, args);
final var mapper = new ObjectMapper();
final var req = new RequestClass();
req.setName("test");
System.out.println(mapper.writeValueAsString(req));
}
}
這將列印
{"123":"test"}到控制臺,如果dev組態檔是活動的,
{"456":"test"}如果test組態檔被激活。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/376096.html
