自定义参数解析器,翻译实体属性
- 自定义参数解析器,翻译实体属性 推荐度:
- 相关推荐
自定义参数解析器,翻译实体属性
一、需求背景
统计一个产品的数据,需要根据用户传递的、约定的枚举类型的值,来确定统计维度。
刚开始,打算使用的是实体类型的getter
、setter
方式翻译用户传递的枚举值;但是,在获取翻译后的统计维度的时候,发现无法翻译/翻译失败了,于是换个方式,使用自定义参数解析器
的方式来处理这个需求.
二、具体实现
1.实体类型
package xxx.operator.qo;import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;import java.util.Date;
import java.util.List;/*** Author: wxz* Date: 2023.11.1 9:08* Description: 小贷数据分析查询条件*/
@Data
@NoArgsConstructor
public class PettyLoanStatisticsQuery {/*** 开始日期*/@Getter@Setter@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd")private Date startDate;/*** 结束日期*/@Getter@Setter@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd")private Date endDate;/*** 前端传过来的统计标记*/@Getter@Setter@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)private int dimension;/*** 统计维度*/@Getter@JsonIgnoreprivate String orderBy;@Getter@Setter@JsonIgnoreprivate List<String> organizeIds;public void setOrderBy(int dimension) {OrderByEnum of = OrderByEnum.of(dimension);if (of != null) {this.orderBy = of.getOrderBy();}}public PettyLoanStatisticsQuery(int dimension) {this.setOrderBy(dimension);}/***统计维度枚举private enum OrderByEnum {/*** 区域*/Area(0, "man.area_id"),/*** 组织机构*/Organize(1, "ductanize_id"),/*** 主体类型identity_type*/IdentityType(2, "man.identity_type");@Getter@Setterprivate int code;/*** 统计维度枚举*/@Getter@Setterprivate String orderBy;OrderByEnum(int code, String orderBy) {this.code = code;this.orderBy = orderBy;}/*** 根据code查询枚举*/public static OrderByEnum of(int code) {OrderByEnum[] values = OrderByEnum.values();for (OrderByEnum a : values) {if (a.code == code) {return a;}}return null;}}
}
2.自定义参数解析器
package xxx.config;import com.ncjr.businessbase.operator.qo.FinancialLeasingStatisticsQuery;
import com.ncjr.businessbase.operator.qo.PettyLoanStatisticsQuery;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdviceAdapter;import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.List;/*** 自定义参数解析器,翻译租赁/小贷业务orderBy枚举*/
@ControllerAdvice
public class FinancialStatisticsRequestBodyAdvice extends RequestBodyAdviceAdapter {/*** 需要处理的类*/private final List<Object> targets = Arrays.asList(FinancialLeasingStatisticsQuery.class, PettyLoanStatisticsQuery.class);@Overridepublic boolean supports(MethodParameter methodParameter, Type type,Class<? extends HttpMessageConverter<?>> aClass) {// 判断是否需要对参数进行处理return targets.contains(methodParameter.getParameterType());}@Overridepublic Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter,Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {// 在读取请求体后执行自定义逻辑: 金融租赁if (body instanceof FinancialLeasingStatisticsQuery) {FinancialLeasingStatisticsQuery query = (FinancialLeasingStatisticsQuery) body;int dimension = query.getDimension();query.setOrderBy(dimension);}//小贷if (body instanceof PettyLoanStatisticsQuery) {PettyLoanStatisticsQuery query = (PettyLoanStatisticsQuery) body;int dimension = query.getDimension();query.setOrderBy(dimension);}return super.afterBodyRead(body, inputMessage, parameter, targetType, converterType);}
}
通过上述自定义的参数解析器翻译
枚举的 code
属性值以后,就可以拿到对应的orderBy
枚举值,然后查询的时候直接使用即可.
(PS:参数解析器中,还可以使用多态等技术,优化处理各个if,简化处理逻辑).
最新文章
- BIOS的报警声音对应的故障原因
- 蓝屏时如何阻止电脑自动重启
- Linux 本地zabbix结合内网穿透工具实现安全远程访问浏览器
- 诚迈科技旗下智达诚远亮相2023世界新汽车技术合作生态展
- 多平台发布文章产品需求文档
- 我精心制作的 python 一小时极简课程来了 ≧◠◡◠≦ 绝非市面上的妖艳货
- 【C++】字符串处理:c
- 【开题报告】基于uni
- 轻量级 SSO 方略:基于 OIDC 规范(二)
- centos 设置密码永不过期
- 逻辑的迷途
- 2.3 Windows驱动开发:内核字符串转换方法
- C++ double转string
- 卡码网语言基础课 |链表的基础操作II
- 7.外部存储器,Cache,虚拟存储器
- Mac环境配置的相关知识
- VuePress介绍及使用指南