最近有一个ES搜索的需求,request有十几个二十个字段,在构建term查询的时候,就需要对每个字段进行空校验然后赋值,于是自己写了个反射获取有值的字段名和字段值并存放到map中,构建term只需要遍历map即可。
/**
* 反射获取request中有值(但不包含排序、分页字段)的字段名和字段值
* @return map<k,v> k表示字段名,v表示数据
*/
public Map<String, Object> getFieldAndValueMap(OrderSearchRequest request) {
Map<String, Object> map = new HashMap<>();
Field[] fields = OrderSearchRequest.class.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
try {
if (Objects.nonNull(field.get(request))) {
// 跳过不需要统计的字段
if (needIgnore(field)) {
continue;
}
map.put(field.getName(), field.get(request));
}
} catch (IllegalAccessException e) {
log.error("convert param error. {}", e.getMessage());
}
}
log.info("receive search field: ");
map.forEach((k, v) -> log.info("{}:{}", k, v));
return map;
}
private boolean needIgnore(Field field) {
String fieldName = field.getName();
return fieldName.equals("sortField")
|| fieldName.equals("sortType")
|| fieldName.equals("pageIndex")
|| fieldName.equals("pageSize")
|| fieldName.equals("searchFieldMap");
}
复制代码
如果你喜欢我的文章,那麻烦请关注我的公众号,该公众号还处于初始阶段,谢谢大家的支持。
想看往期文章, 请点击我的GitHub地址: github.com/fantj2016/j…