diff --git a/ballcat-common/ballcat-common-conf/src/main/java/com/hccake/ballcat/common/conf/exception/GlobalExceptionHandlerResolver.java b/ballcat-common/ballcat-common-conf/src/main/java/com/hccake/ballcat/common/conf/exception/GlobalExceptionHandlerResolver.java index ad9087e4..d1370caa 100644 --- a/ballcat-common/ballcat-common-conf/src/main/java/com/hccake/ballcat/common/conf/exception/GlobalExceptionHandlerResolver.java +++ b/ballcat-common/ballcat-common-conf/src/main/java/com/hccake/ballcat/common/conf/exception/GlobalExceptionHandlerResolver.java @@ -5,6 +5,7 @@ import com.hccake.ballcat.common.core.exception.BusinessException; import com.hccake.ballcat.common.core.exception.handler.GlobalExceptionHandler; import com.hccake.ballcat.common.core.result.R; import com.hccake.ballcat.common.core.result.SystemResultCode; +import javax.validation.ValidationException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -21,8 +22,6 @@ import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; -import javax.validation.ValidationException; - /** * 全局异常处理 * @@ -40,6 +39,8 @@ public class GlobalExceptionHandlerResolver { public final static String PROD_ERR_MSG = "系统异常,请联系管理员"; + public final static String NLP_MSG = "空指针异常!"; + /** * 全局异常捕获 * @param e the e @@ -51,7 +52,8 @@ public class GlobalExceptionHandlerResolver { log.error("全局异常信息 ex={}", e.getMessage(), e); globalExceptionHandler.handle(e); // 当为生产环境, 不适合把具体的异常信息展示给用户, 比如数据库异常信息. - String errorMsg = GlobalConstants.ENV_PROD.equals(profile) ? PROD_ERR_MSG : e.getLocalizedMessage(); + String errorMsg = GlobalConstants.ENV_PROD.equals(profile) ? PROD_ERR_MSG + : (e instanceof NullPointerException ? NLP_MSG : e.getLocalizedMessage()); return R.failed(SystemResultCode.SERVER_ERROR, errorMsg); } diff --git a/ballcat-common/ballcat-common-conf/src/main/java/com/hccake/ballcat/common/conf/mybatis/MybatisPlusConfig.java b/ballcat-common/ballcat-common-conf/src/main/java/com/hccake/ballcat/common/conf/mybatis/MybatisPlusConfig.java index 7594528e..0a19da8c 100644 --- a/ballcat-common/ballcat-common-conf/src/main/java/com/hccake/ballcat/common/conf/mybatis/MybatisPlusConfig.java +++ b/ballcat-common/ballcat-common-conf/src/main/java/com/hccake/ballcat/common/conf/mybatis/MybatisPlusConfig.java @@ -4,18 +4,17 @@ import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.injector.ISqlInjector; -import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.hccake.extend.mybatis.plus.injector.CustomSqlInjector; +import com.hccake.extend.mybatis.plus.methods.InsertBatchSomeColumnByCollection; import com.hccake.extend.mybatis.plus.methods.SelectByPage; +import java.util.ArrayList; +import java.util.List; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import java.util.ArrayList; -import java.util.List; - /** * @author hccake * @date 2020/04/19 默认配置MybatisPlus分页插件,通过conditional注解达到覆盖效用 @@ -55,7 +54,7 @@ public class MybatisPlusConfig { public ISqlInjector customSqlInjector() { List list = new ArrayList<>(); // 对于只在更新时进行填充的字段不做插入处理 - list.add(new InsertBatchSomeColumn(t -> t.getFieldFill() != FieldFill.UPDATE)); + list.add(new InsertBatchSomeColumnByCollection(t -> t.getFieldFill() != FieldFill.UPDATE)); // 分页查询 返回 VO 对象 list.add(new SelectByPage()); return new CustomSqlInjector(list); diff --git a/ballcat-dependencies/pom.xml b/ballcat-dependencies/pom.xml index e0ba071d..950b9f42 100644 --- a/ballcat-dependencies/pom.xml +++ b/ballcat-dependencies/pom.xml @@ -239,6 +239,11 @@ ballcat-extend-pay-ali ${revision} + + com.hccake + ballcat-extend-pay-wx + ${revision} + diff --git a/ballcat-extends/ballcat-extend-kafka/src/main/java/com/hccake/extend/kafka/KafkaConsumerBuilder.java b/ballcat-extends/ballcat-extend-kafka/src/main/java/com/hccake/extend/kafka/KafkaConsumerBuilder.java index fc70b781..e3710472 100644 --- a/ballcat-extends/ballcat-extend-kafka/src/main/java/com/hccake/extend/kafka/KafkaConsumerBuilder.java +++ b/ballcat-extends/ballcat-extend-kafka/src/main/java/com/hccake/extend/kafka/KafkaConsumerBuilder.java @@ -1,20 +1,19 @@ package com.hccake.extend.kafka; +import static com.hccake.extend.kafka.KafkaConstants.BOOTSTRAP_SERVERS_DELIMITER; + import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.StrUtil; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import org.apache.kafka.clients.consumer.ConsumerConfig; -import org.apache.kafka.clients.consumer.KafkaConsumer; -import org.apache.kafka.common.serialization.Deserializer; - import java.util.Collection; import java.util.HashSet; import java.util.Properties; import java.util.Set; import java.util.function.Function; - -import static com.hccake.extend.kafka.KafkaConstants.BOOTSTRAP_SERVERS_DELIMITER; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.common.serialization.Deserializer; /** * 消费者 具体的配置请参考 {@link ConsumerConfig} 这里只提供一些常用配置 @@ -121,9 +120,11 @@ public class KafkaConsumerBuilder { } public Properties getProperties() { - bootstrapServers - .addAll(ListUtil.toList(properties.getProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, StrUtil.EMPTY) - .split(BOOTSTRAP_SERVERS_DELIMITER))); + String nowServes = properties.getProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, StrUtil.EMPTY); + if (StrUtil.isNotBlank(nowServes)) { + // 仅在存在配置时才插入 + bootstrapServers.addAll(ListUtil.toList(nowServes.split(BOOTSTRAP_SERVERS_DELIMITER))); + } properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, String.join(BOOTSTRAP_SERVERS_DELIMITER, bootstrapServers)); return properties; diff --git a/ballcat-extends/ballcat-extend-mybatis-plus/src/main/java/com/hccake/extend/mybatis/plus/mapper/ExtendMapper.java b/ballcat-extends/ballcat-extend-mybatis-plus/src/main/java/com/hccake/extend/mybatis/plus/mapper/ExtendMapper.java index 6f0ce907..7080220a 100644 --- a/ballcat-extends/ballcat-extend-mybatis-plus/src/main/java/com/hccake/extend/mybatis/plus/mapper/ExtendMapper.java +++ b/ballcat-extends/ballcat-extend-mybatis-plus/src/main/java/com/hccake/extend/mybatis/plus/mapper/ExtendMapper.java @@ -34,7 +34,7 @@ public interface ExtendMapper extends BaseMapper { * @return int 改动行 * @author lingting 2020-08-26 22:11 */ - int insertBatchSomeColumn(@Param("list") Collection list); + int insertBatchSomeColumn(@Param("collection") Collection list); /** * 根据 entity 条件,查询全部记录(并翻页) diff --git a/ballcat-extends/ballcat-extend-mybatis-plus/src/main/java/com/hccake/extend/mybatis/plus/methods/InsertBatchSomeColumnByCollection.java b/ballcat-extends/ballcat-extend-mybatis-plus/src/main/java/com/hccake/extend/mybatis/plus/methods/InsertBatchSomeColumnByCollection.java new file mode 100644 index 00000000..59a2af71 --- /dev/null +++ b/ballcat-extends/ballcat-extend-mybatis-plus/src/main/java/com/hccake/extend/mybatis/plus/methods/InsertBatchSomeColumnByCollection.java @@ -0,0 +1,83 @@ +package com.hccake.extend.mybatis.plus.methods; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.core.enums.SqlMethod; +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils; +import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn; +import java.util.List; +import java.util.function.Predicate; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.Accessors; +import org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator; +import org.apache.ibatis.executor.keygen.KeyGenerator; +import org.apache.ibatis.executor.keygen.NoKeyGenerator; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlSource; + +/** + * 从 {@link InsertBatchSomeColumn} 复制 + * + * @author lingting 2021/2/23 15:32 + */ +@NoArgsConstructor +@AllArgsConstructor +public class InsertBatchSomeColumnByCollection extends AbstractMethod { + + /** + * 字段筛选条件 + */ + @Setter + @Accessors(chain = true) + private Predicate predicate; + + @Override + public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { + KeyGenerator keyGenerator = new NoKeyGenerator(); + SqlMethod sqlMethod = SqlMethod.INSERT_ONE; + List fieldList = tableInfo.getFieldList(); + String insertSqlColumn = tableInfo.getKeyInsertSqlColumn(false) + + this.filterTableFieldInfo(fieldList, predicate, TableFieldInfo::getInsertSqlColumn, EMPTY); + String columnScript = LEFT_BRACKET + insertSqlColumn.substring(0, insertSqlColumn.length() - 1) + RIGHT_BRACKET; + String insertSqlProperty = tableInfo.getKeyInsertSqlProperty(ENTITY_DOT, false) + + this.filterTableFieldInfo(fieldList, predicate, i -> i.getInsertSqlProperty(ENTITY_DOT), EMPTY); + insertSqlProperty = LEFT_BRACKET + insertSqlProperty.substring(0, insertSqlProperty.length() - 1) + + RIGHT_BRACKET; + // 从 list 改为 collection. 允许传入除 list外的参数类型 + String valuesScript = SqlScriptUtils.convertForeach(insertSqlProperty, "collection", null, ENTITY, COMMA); + String keyProperty = null; + String keyColumn = null; + // 表包含主键处理逻辑,如果不包含主键当普通字段处理 + if (tableInfo.havePK()) { + if (tableInfo.getIdType() == IdType.AUTO) { + /* 自增主键 */ + keyGenerator = new Jdbc3KeyGenerator(); + keyProperty = tableInfo.getKeyProperty(); + keyColumn = tableInfo.getKeyColumn(); + } + else { + if (null != tableInfo.getKeySequence()) { + keyGenerator = TableInfoHelper.genKeyGenerator(getMethod(sqlMethod), tableInfo, builderAssistant); + keyProperty = tableInfo.getKeyProperty(); + keyColumn = tableInfo.getKeyColumn(); + } + } + } + String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), columnScript, valuesScript); + SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); + return this.addInsertMappedStatement(mapperClass, modelClass, getMethod(sqlMethod), sqlSource, keyGenerator, + keyProperty, keyColumn); + } + + @Override + public String getMethod(SqlMethod sqlMethod) { + // 自定义 mapper 方法名 + return "insertBatchSomeColumn"; + } + +} diff --git a/ballcat-extends/ballcat-extend-pay-ali/src/main/java/com/hccake/starte/pay/ali/AliPay.java b/ballcat-extends/ballcat-extend-pay-ali/src/main/java/com/hccake/starte/pay/ali/AliPay.java index 8fef557f..d50f2d98 100644 --- a/ballcat-extends/ballcat-extend-pay-ali/src/main/java/com/hccake/starte/pay/ali/AliPay.java +++ b/ballcat-extends/ballcat-extend-pay-ali/src/main/java/com/hccake/starte/pay/ali/AliPay.java @@ -16,11 +16,8 @@ import com.hccake.starte.pay.ali.domain.AliPayQuery; import lombok.Data; import java.math.BigDecimal; -import java.math.RoundingMode; import java.util.Map; -import static com.hccake.starte.pay.ali.constants.AliPayConstant.HUNDRED; - /** * api文档: https://opendocs.alipay.com/apis. * @@ -31,17 +28,17 @@ import static com.hccake.starte.pay.ali.constants.AliPayConstant.HUNDRED; @Data public class AliPay { - private String serverUrl; + private final String serverUrl; - private String appId; + private final String appId; - private String privateKey; + private final String privateKey; - private String format; + private final String format; - private String charset; + private final String charset; - private String alipayPublicKey; + private final String alipayPublicKey; private String signType; @@ -375,14 +372,4 @@ public class AliPay { return AlipaySignature.rsaCheckV2(map, alipayPublicKey, charset, signType); } - /** - * 金额单位转换, 元 转为 分 - * @param amount 支付金额, 单位 元 - * @return java.lang.String - * @author lingting 2021-01-25 10:27 - */ - public String yuanToFen(BigDecimal amount) { - return amount.multiply(HUNDRED).setScale(2, RoundingMode.UP).toPlainString(); - } - } diff --git a/ballcat-extends/ballcat-extend-pay-ali/src/main/java/com/hccake/starte/pay/ali/constants/AliPayConstant.java b/ballcat-extends/ballcat-extend-pay-ali/src/main/java/com/hccake/starte/pay/ali/constants/AliPayConstant.java index a752f908..18b1d28f 100644 --- a/ballcat-extends/ballcat-extend-pay-ali/src/main/java/com/hccake/starte/pay/ali/constants/AliPayConstant.java +++ b/ballcat-extends/ballcat-extend-pay-ali/src/main/java/com/hccake/starte/pay/ali/constants/AliPayConstant.java @@ -7,11 +7,6 @@ import java.math.BigDecimal; */ public class AliPayConstant { - /** - * 一百 - */ - public static final BigDecimal HUNDRED = new BigDecimal("100"); - /** * 支付宝支付线上api路径 */ diff --git a/pom.xml b/pom.xml index 48b51791..ffd2fed8 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 3.1.0 3.1.1 - 2.4.1 + 2.4.2