diff --git a/commons/common-util/src/main/java/com/schbrain/common/util/BeanCopyUtils.java b/commons/common-util/src/main/java/com/schbrain/common/util/BeanCopyUtils.java index e288d3b08b1bb644a10824232e3819aea1f9f583..454cfffa418aeeb4048038b754bda4b789456cd0 100644 --- a/commons/common-util/src/main/java/com/schbrain/common/util/BeanCopyUtils.java +++ b/commons/common-util/src/main/java/com/schbrain/common/util/BeanCopyUtils.java @@ -1,14 +1,13 @@ package com.schbrain.common.util; +import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Singleton; import cn.hutool.core.util.ReflectUtil; -import cn.hutool.extra.spring.SpringUtil; import com.google.common.base.Joiner; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; -import org.springframework.beans.BeansException; import org.springframework.cglib.beans.BeanCopier; import org.springframework.cglib.core.Converter; -import org.springframework.core.convert.ConversionService; import org.springframework.util.ClassUtils; import java.util.ArrayList; @@ -20,12 +19,11 @@ import java.util.List; * @author liaozan * @since 2022/1/24 */ +@Slf4j public class BeanCopyUtils { private static final Joiner CACHE_KEY_JOINER = Joiner.on("#"); - private static final ConversionServiceConverter CONVERTER = new ConversionServiceConverter(); - /** * copy object list */ @@ -54,7 +52,7 @@ public class BeanCopyUtils { return null; } BeanCopier copier = getCopier(source.getClass(), target.getClass()); - copier.copy(source, target, CONVERTER); + copier.copy(source, target, DefaultConverter.INSTANCE); return target; } @@ -67,18 +65,9 @@ public class BeanCopyUtils { return CACHE_KEY_JOINER.join(source.getName(), target.getName()); } - @SuppressWarnings("unchecked") - private static class ConversionServiceConverter implements Converter { - - private ConversionService conversionService; + private static class DefaultConverter implements Converter { - private ConversionServiceConverter() { - try { - this.conversionService = SpringUtil.getBean(ConversionService.class); - } catch (BeansException e) { - this.conversionService = null; - } - } + private static final DefaultConverter INSTANCE = new DefaultConverter(); @Override public Object convert(Object value, Class targetType, Object context) { @@ -88,10 +77,11 @@ public class BeanCopyUtils { if (ClassUtils.isAssignableValue(targetType, value)) { return value; } - if (conversionService != null && conversionService.canConvert(value.getClass(), targetType)) { - return conversionService.convert(value, targetType); + Object converted = Convert.convertQuietly(targetType, value, null); + if (converted == null) { + log.warn("Could not copy {} to {}, value type: {}", value, targetType, value.getClass()); } - return value; + return converted; } } diff --git a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/ColumnMeta.java b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/ColumnMeta.java index 797b3703e9056b78c2565f4003bf8b07884c1be3..7c0c4a3cf2a7dd1dc9d41090ec7120c6d5d2196b 100644 --- a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/ColumnMeta.java +++ b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/ColumnMeta.java @@ -39,4 +39,9 @@ public class ColumnMeta { */ private String extra; + /** + * 索引名称 + */ + private String indexName; + } \ No newline at end of file diff --git a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/ColumnMetaRowMapper.java b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/ColumnMetaRowMapper.java index bf1e04579d3d63d9af1ddc52f0e19b49e2cee85e..67ef37e0e5dc2ac5bb553225b32136e118d01f1b 100644 --- a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/ColumnMetaRowMapper.java +++ b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/ColumnMetaRowMapper.java @@ -20,6 +20,7 @@ public class ColumnMetaRowMapper implements RowMapper { columnMeta.setNullable(isNullable(resultSet.getString("IS_NULLABLE"))); columnMeta.setColumnDefault(resultSet.getString("COLUMN_DEFAULT")); columnMeta.setExtra(resultSet.getString("EXTRA")); + columnMeta.setIndexName(resultSet.getString("INDEX_NAME")); return columnMeta; } diff --git a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/DefaultTableConstraintChecker.java b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/DefaultTableConstraintChecker.java index 17ba121d550b0130f5d80fc650313bbcf15d9a99..562c17620439e75be6053c227a2f2a0873701251 100644 --- a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/DefaultTableConstraintChecker.java +++ b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/DefaultTableConstraintChecker.java @@ -1,6 +1,8 @@ package com.schbrain.framework.autoconfigure.mybatis.constraint; import com.mysql.cj.MysqlType; +import com.schbrain.framework.autoconfigure.mybatis.biz.BizIdHelper; +import com.schbrain.framework.autoconfigure.mybatis.core.BizIdColumnField; import com.schbrain.framework.autoconfigure.mybatis.exception.TableConstraintException; import static com.schbrain.framework.autoconfigure.mybatis.constant.MybatisConstants.*; @@ -25,6 +27,22 @@ public class DefaultTableConstraintChecker implements TableConstraintChecker { checkDeleteVersionField(table); } + @Override + public void checkBizIdField(Table table) { + BizIdColumnField bizColumnField = BizIdHelper.getBizColumnField(table.getTableInfo().getEntityType()); + if (bizColumnField == null) { + return; + } + ColumnMeta columnMeta = table.getColumnMeta(bizColumnField.getColumnName()); + if (columnMeta == null) { + addMissingFieldError(table, bizColumnField.getColumnName()); + return; + } + if (columnMeta.getIndexName() == null) { + addError(table, columnMeta, "BizId field should create an index"); + } + } + protected void checkIdField(Table table) { ColumnMeta idColumnMeta = table.getColumnMeta(ID); if (idColumnMeta == null) { diff --git a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/DefaultTableMetaDataLoader.java b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/DefaultTableMetaDataLoader.java index 25c019b73acf83cb2517ffa45525d0ac33c72569..31af9a8ed29ea2120df1036594869c8a961e9e0e 100644 --- a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/DefaultTableMetaDataLoader.java +++ b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/DefaultTableMetaDataLoader.java @@ -11,7 +11,7 @@ import java.util.*; */ public class DefaultTableMetaDataLoader implements TableMetaDataLoader { - public static final String METADATA_QUERY = "SELECT `TABLE_NAME`,`COLUMN_NAME`,`COLUMN_DEFAULT`,`DATA_TYPE`,`EXTRA`,`IS_NULLABLE` FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ?"; + private static final String METADATA_QUERY = "SELECT c.`TABLE_NAME`,c.`COLUMN_NAME`,c.`COLUMN_DEFAULT`,c.`DATA_TYPE`,c.`EXTRA`,c.`IS_NULLABLE`,s.INDEX_NAME FROM INFORMATION_SCHEMA.COLUMNS c left join INFORMATION_SCHEMA.STATISTICS s on c.TABLE_SCHEMA = s.TABLE_SCHEMA and c.TABLE_NAME = s.TABLE_NAME and c.COLUMN_NAME = s.COLUMN_NAME WHERE c.TABLE_SCHEMA = ?"; private final RowMapper rowMapper = new ColumnMetaRowMapper(); diff --git a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/Table.java b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/Table.java index 992002e6f77947b4c4ebcfe1336755d6d6e5981a..b6dfe56f511aed360b9518160fc31eeba9082302 100644 --- a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/Table.java +++ b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/Table.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.schbrain.common.util.StreamUtils; import com.schbrain.framework.autoconfigure.mybatis.exception.TableConstraintException; import lombok.Data; +import lombok.Getter; import org.apache.commons.lang3.StringUtils; import javax.annotation.Nullable; @@ -14,6 +15,7 @@ import java.util.*; * @author liaozan * @since 2022/9/2 */ +@Getter public class Table { private final TableInfo tableInfo; @@ -43,18 +45,10 @@ public class Table { return columnMetaMap.containsKey(column); } - public List getFieldInfoList() { - return fieldInfoList; - } - public void addError(TableConstraintException error) { errors.add(error); } - public List getErrors() { - return errors; - } - @Data public static class FieldInfo { diff --git a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/TableConstraintChecker.java b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/TableConstraintChecker.java index 52111572fa70c4a73e01ca1ae4b300bded032061..53b2cd34c831279b71e3b4a5210ec796864cfb60 100644 --- a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/TableConstraintChecker.java +++ b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/constraint/TableConstraintChecker.java @@ -16,4 +16,9 @@ public interface TableConstraintChecker { */ void checkLogicDeleteField(Table table); + /** + * 检查业务主键 id 字段 + */ + void checkBizIdField(Table table); + } \ No newline at end of file diff --git a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/listener/TableConstraintCheckerBean.java b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/listener/TableConstraintCheckerBean.java index 78ce54b22bed0080fa2e30d5043d09e7f17488a2..3da9bb733bac11d59f379671407eb0cd265fb10a 100644 --- a/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/listener/TableConstraintCheckerBean.java +++ b/starters/mybatis-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/mybatis/listener/TableConstraintCheckerBean.java @@ -127,6 +127,7 @@ public class TableConstraintCheckerBean implements SmartInitializingSingleton, B if (ClassUtils.isAssignable(BaseEntityWithLogicDelete.class, entityClass)) { checker.checkLogicDeleteField(table); } + checker.checkBizIdField(table); } errors.addAll(table.getErrors()); }