【发布时间】:2019-08-23 04:14:24
【问题描述】:
我确实有这个用例。
- 调用者(同一微服务或不同微服务中的 API)希望将不同的 KEYS 和 VALUES 作为审计报告作为其方法的一部分。
- 某些 KEYS 很可能很常见,大多数调用者都可以报告。
- 当使用来自多个调用者的 KEY NAME 来报告相同的 KEY 时,必须保持一致性。示例:如果所有人都想报告消费者 ID,那么所有调用者只需要使用键“consumerId”来实现不同调用者之间的一致性。
- 可以有一些可重用的枚举类来保存所有的通用键,就像上面一样,这样每个调用者都可以使用。来电者仍然可以拥有自己想要报告的自定义 KEY。
- 所有调用者都不应该做重复的工作,比如如果 caller1、caller2 想要报告 consumerID(公共 KEY),那么我不想同时定义具有 consumerID 作为属性的类,然后将其转换为 JSON。
我想使用以下类型的实现。
枚举来保存公共 KEYS
public enum EnumKeys implements Key {
CONSUMERID("consumerId")
...
...
...
}
每个调用者可以用来报告 KEY AND VALUE 的通用类 @JsonPropertyOrder(字母=真) 公共类报告数据 {
private Map<String, Object> properties = new HashMap<>();
@JsonAnyGetter
public Map<String, Object> getProperties() {
return properties;
}
public void setProperties(Map<String, Object> properties) {
this.properties = properties;
}
public ReportData add(Key key, Object value){
properties.put(key.getKeyName(), value);
return this;
}
来电者 1 报告消费者 ID
ReportData reportData = new ReportData();
reportData.add(EnumKeys.CONSUMERID,"123");
呼叫者 2 报告消费者 ID
报告数据 reportData = new ReportData(); reportData.add(EnumKeys.CONSUMERID,"435");
来电 3 报告不常用的 XYZ 键
//First create a custom KEY
public enum CustomEnum implements Key{
XYZ("xyz");
}
ReportData reportData = new ReportData();
reportData.add(CustomEnum.XYZ,"custom value");
最终框架会将每个属性键对转换为 JSON
ObjectMapper mapper = new ObjectMapper().writeValueAsString(reportData);
输出
- 并非所有调用者都需要创建持有者类(相当于 ReportData)来持有属性。
- 使用 ReportData 的实例,它们可以使 KEY 使用相同的 KEY 名称保持一致性
- 调用者可以扩展 EnumKeys(KEY 的主列表)并定义自己的键,并且仍然可以使用相同的报告方式。
问题
- 这种使用方式有什么不好的地方吗?
- 从 HashMap/EnumMap 实例化对象 (ReportData) 有什么不好的吗?
- 对象(带有实例成员)是否更适合生成 JSON 或 HASHMAP 更受约束的 KEY NAME 更好?最终目的地是 JSON。
- 使用现有类(具有 n 个属性)和与 ReportData 类一起使用的任何简单方法。
感谢任何输入。
【问题讨论】: