虽然解决了对应场景的问题:
前端传入枚举的name
,数据库存储类型为tinyint
,导致获取DbType
为UNKNOWN
,从而没有自定义进入Convertor
的问题,虽然可以手动在枚举字段上加@DbField(type=DbType.INT)
让其进入Converter
,但是即便进入了Convertor
,由于参数只有DbType
为INT
,以及实际的String
类型的枚举name
,导致仍然无法获取到其枚举对应类型,就拿不到name
对应的枚举ordinal
但是由于距离发版还有一段时间,或者是低版本想要实现这个需求的场景,就得手动注入ParamResolver
了
import cn.zhxu.bs.*;
import cn.zhxu.bs.bean.DbType;
import cn.zhxu.bs.boot.BeanSearcherProperties;
import cn.zhxu.bs.group.GroupResolver;
import cn.zhxu.bs.implement.DefaultParamResolver;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author VampireAchao
* @since 2023/2/17 11:33
*/
@Component
public class BeanSearcherParamResolver extends DefaultParamResolver {
public BeanSearcherParamResolver(PageExtractor pageExtractor,
FieldOpPool fieldOpPool,
List<ParamFilter> paramFilters,
List<ParamResolver.Convertor> convertors,
GroupResolver groupResolver,
BeanSearcherProperties config) {
super(convertors, paramFilters);
setPageExtractor(pageExtractor);
setFieldOpPool(fieldOpPool);
BeanSearcherProperties.Params conf = config.getParams();
setOperatorSuffix(conf.getOperatorKey());
setIgnoreCaseSuffix(conf.getIgnoreCaseKey());
setOrderName(conf.getOrder());
setSortName(conf.getSort());
setOrderByName(conf.getOrderBy());
setSeparator(conf.getSeparator());
setOnlySelectName(conf.getOnlySelect());
setSelectExcludeName(conf.getSelectExclude());
BeanSearcherProperties.Params.Group group = conf.getGroup();
setGexprName(group.getExprName());
setGroupSeparator(group.getSeparator());
setGroupResolver(groupResolver);
}
/**
* @param meta
* @param value
* @return
*/
@Override
protected Object convertParamValue(FieldMeta meta, Object value) {
if (value == null) {
return null;
}
DbType dbType = meta.getDbType();
if (dbType.getType() != null && dbType.getType().isInstance(value)) {
return value;
}
Class<?> vType = value.getClass();
for (Convertor convertor : getConvertors()) {
if (convertor instanceof BeanSearcherConvertor) {
if (((BeanSearcherConvertor) convertor).supports(meta, vType)) {
return ((BeanSearcherConvertor) convertor).convert(meta, value);
}
}
if (convertor.supports(dbType, vType)) {
return convertor.convert(dbType, value);
}
}
return value;
}
}
然后此处的BeanSearcherConvertor
import cn.zhxu.bs.FieldMeta;
import cn.zhxu.bs.ParamResolver;
/**
* @author VampireAchao
* @since 2023/2/17 15:05
*/
public interface BeanSearcherConvertor extends ParamResolver.Convertor {
default boolean supports(FieldMeta meta, Class<?> valueType) {
return supports(meta.getDbType(), valueType);
}
default Object convert(FieldMeta meta, Object value) {
return convert(meta.getDbType(), value);
}
}
以及对应的实现:
import cn.hutool.core.util.EnumUtil;
import cn.zhxu.bs.FieldMeta;
import cn.zhxu.bs.bean.DbType;
import org.springframework.stereotype.Component;
import java.util.Objects;
/**
* @author VampireAchao
* @since 2023/2/17 15:27
*/
@Component
public class BeanSearcherEnumConvertor implements BeanSearcherConvertor {
/**
* @param meta
* @param valueType
* @return
*/
@Override
public boolean supports(FieldMeta meta, Class<?> valueType) {
return meta.getField().getType().isEnum();
}
/**
* @param meta
* @param value
* @return
*/
@Override
public Object convert(FieldMeta meta, Object value) {
final Enum valueEnum = EnumUtil.getBy((Class<Enum>) meta.getField().getType(), e -> Objects.equals(e.name(), value));
if (valueEnum == null) {
return null;
}
return valueEnum.ordinal();
}
/**
* @param dbType 需转换的目标类型
* @param valueType 值类型
* @return 是否支持
*/
@Override
public boolean supports(DbType dbType, Class<?> valueType) {
return false;
}
/**
* @param dbType 目标类型
* @param value 待转换的值
* @return 转换后的值
*/
@Override
public Object convert(DbType dbType, Object value) {
return value;
}
}
这样,前端就可以传入gender=MALE
这样的格式,而实际执行的sql
为gender = 1
这样了