Jelajahi Sumber

更新一些通用的实体类,校验类

luoguangyi 3 tahun lalu
induk
melakukan
dddb59d4b5
15 mengubah file dengan 364 tambahan dan 45 penghapusan
  1. 3 3
      iot-admin-server/src/main/java/com/yushu/modules/tool/controller/codegen/vo/table/ToolCodegenTablePageReqVO.java
  2. 3 3
      iot-admin-server/src/main/java/com/yushu/modules/tool/controller/test/vo/ToolTestDemoExportReqVO.java
  3. 3 3
      iot-admin-server/src/main/java/com/yushu/modules/tool/controller/test/vo/ToolTestDemoPageReqVO.java
  4. 2 2
      iot-framework/iot-common/src/main/java/com/yushu/framework/common/core/IntArrayValuable.java
  5. 25 0
      iot-framework/iot-common/src/main/java/com/yushu/framework/common/enums/DigitalDataCategory.java
  6. 32 0
      iot-framework/iot-common/src/main/java/com/yushu/framework/common/enums/DigitalObjectType.java
  7. 33 0
      iot-framework/iot-common/src/main/java/com/yushu/framework/common/enums/DigitalObjectTypeShort.java
  8. 11 0
      iot-framework/iot-common/src/main/java/com/yushu/framework/common/pojo/CommonResult.java
  9. 28 18
      iot-framework/iot-common/src/main/java/com/yushu/framework/common/util/date/DateUtils.java
  10. 2 2
      iot-framework/iot-common/src/main/java/com/yushu/framework/common/validation/InEnum.java
  11. 9 6
      iot-framework/iot-common/src/main/java/com/yushu/framework/common/validation/InEnumValidator.java
  12. 158 0
      iot-framework/iot-common/src/main/java/com/yushu/framework/common/validation/ValidatableList.java
  13. 30 0
      iot-framework/iot-spring-boot-starter-web/src/main/java/com/yushu/framework/web/config/WebAutoConfiguration.java
  14. 24 7
      iot-framework/iot-spring-boot-starter-web/src/main/java/com/yushu/framework/web/core/handler/GlobalExceptionHandler.java
  15. 1 1
      pom.xml

+ 3 - 3
iot-admin-server/src/main/java/com/yushu/modules/tool/controller/codegen/vo/table/ToolCodegenTablePageReqVO.java

@@ -10,7 +10,7 @@ import org.springframework.format.annotation.DateTimeFormat;
 
 import java.util.Date;
 
-import static com.yushu.framework.common.util.date.DateUtils.DATE_TIME_FORMAT_SHOW;
+import static cn.hutool.core.date.DatePattern.NORM_DATETIME_PATTERN;
 
 @ApiModel("表定义分页 Request VO")
 @Data
@@ -25,11 +25,11 @@ public class ToolCodegenTablePageReqVO extends PageParam {
     private String tableComment;
 
     @ApiModelProperty(value = "开始创建时间", example = "2020-10-24 00:00:00")
-    @DateTimeFormat(pattern = DATE_TIME_FORMAT_SHOW)
+    @DateTimeFormat(pattern = NORM_DATETIME_PATTERN)
     private Date beginCreateTime;
 
     @ApiModelProperty(value = "结束创建时间", example = "2020-10-24 23:59:59")
-    @DateTimeFormat(pattern = DATE_TIME_FORMAT_SHOW)
+    @DateTimeFormat(pattern = NORM_DATETIME_PATTERN)
     private Date endCreateTime;
 
 }

+ 3 - 3
iot-admin-server/src/main/java/com/yushu/modules/tool/controller/test/vo/ToolTestDemoExportReqVO.java

@@ -7,7 +7,7 @@ import org.springframework.format.annotation.DateTimeFormat;
 
 import java.util.Date;
 
-import static com.yushu.framework.common.util.date.DateUtils.DATE_TIME_FORMAT_SHOW;
+import static cn.hutool.core.date.DatePattern.NORM_DATETIME_PATTERN;
 
 @ApiModel(value = "字典类型 Excel 导出 Request VO", description = "参数和 ToolTestDemoPageReqVO 是一致的")
 @Data
@@ -28,11 +28,11 @@ public class ToolTestDemoExportReqVO {
     @ApiModelProperty(value = "备注", example = "我是备注")
     private String remark;
 
-    @DateTimeFormat(pattern = DATE_TIME_FORMAT_SHOW)
+    @DateTimeFormat(pattern = NORM_DATETIME_PATTERN)
     @ApiModelProperty(value = "开始创建时间")
     private Date beginCreateTime;
 
-    @DateTimeFormat(pattern = DATE_TIME_FORMAT_SHOW)
+    @DateTimeFormat(pattern = NORM_DATETIME_PATTERN)
     @ApiModelProperty(value = "结束创建时间")
     private Date endCreateTime;
 

+ 3 - 3
iot-admin-server/src/main/java/com/yushu/modules/tool/controller/test/vo/ToolTestDemoPageReqVO.java

@@ -10,7 +10,7 @@ import org.springframework.format.annotation.DateTimeFormat;
 
 import java.util.Date;
 
-import static com.yushu.framework.common.util.date.DateUtils.DATE_TIME_FORMAT_SHOW;
+import static com.yushu.framework.common.util.date.DateUtils.NORM_DATETIME_PATTERN;
 
 @ApiModel("字典类型分页 Request VO")
 @Data
@@ -33,11 +33,11 @@ public class ToolTestDemoPageReqVO extends PageParam {
     @ApiModelProperty(value = "备注", example = "我是备注")
     private String remark;
 
-    @DateTimeFormat(pattern = DATE_TIME_FORMAT_SHOW)
+    @DateTimeFormat(pattern = NORM_DATETIME_PATTERN)
     @ApiModelProperty(value = "开始创建时间")
     private Date beginCreateTime;
 
-    @DateTimeFormat(pattern = DATE_TIME_FORMAT_SHOW)
+    @DateTimeFormat(pattern = NORM_DATETIME_PATTERN)
     @ApiModelProperty(value = "结束创建时间")
     private Date endCreateTime;
 

+ 2 - 2
iot-framework/iot-common/src/main/java/com/yushu/framework/common/core/IntArrayValuable.java

@@ -5,11 +5,11 @@ package com.yushu.framework.common.core;
  *
  * @author
  */
-public interface IntArrayValuable {
+public interface ObjectArrayValuable {
 
     /**
      * @return int 数组
      */
-    int[] array();
+    Object[] array();
 
 }

+ 25 - 0
iot-framework/iot-common/src/main/java/com/yushu/framework/common/enums/DigitalDataCategory.java

@@ -0,0 +1,25 @@
+package com.yushu.framework.common.enums;
+
+import lombok.Getter;
+
+/**
+ * 数据分类
+ * @author Charlie Yu
+ * @date 2021-06-25
+ */
+@Getter
+public enum DigitalDataCategory {
+    /** 数据类型 */
+    STATIC("STATIC", "静态量"),
+    PULSE("PULSE", "脉冲量"),
+    GRADATION("GRADATION", "阶段量"),
+    SEQUENTIAL("SEQUENTIAL", "时序量");
+
+    private String index;
+    private String name;
+
+    DigitalDataCategory(String index, String name) {
+        this.index = index;
+        this.name = name;
+    }
+}

+ 32 - 0
iot-framework/iot-common/src/main/java/com/yushu/framework/common/enums/DigitalObjectType.java

@@ -0,0 +1,32 @@
+package com.yushu.framework.common.enums;
+
+import lombok.Getter;
+
+/**
+ * 对象类型
+ * @author Charlie Yu
+ * @date 2021-06-25
+ */
+@Getter
+public enum DigitalObjectType {
+    /** 对象类型 */
+    PROJECT("project", "项目"),
+    BUILDING("building", "楼"),
+    FLOOR("floor", "楼层"),
+    SPACE("space", "空间"),
+    SYSTEM("system", "系统"),
+    EQUIPMENT("equipment", "设备"),
+    SHAFT("shaft", "竖井"),
+    COMPONENT("component", "部件"),
+    VIRTUAL("virtual", "虚拟对象"),
+    TOOL("tool", "工具"),
+    MATERIAL("material", "耗材");
+
+    private String index;
+    private String name;
+
+    DigitalObjectType(String index, String name) {
+        this.index = index;
+        this.name = name;
+    }
+}

+ 33 - 0
iot-framework/iot-common/src/main/java/com/yushu/framework/common/enums/DigitalObjectTypeShort.java

@@ -0,0 +1,33 @@
+package com.yushu.framework.common.enums;
+
+import lombok.Getter;
+
+/**
+ * 对象类型简写
+ * @author Charlie Yu
+ * @date 2021-06-25
+ */
+@Getter
+public enum DigitalObjectTypeShort {
+
+    /** 对象类型简写 */
+    PROJECT("Pj", "项目"),
+    BUILDING("Bd", "楼"),
+    FLOOR("Fl", "楼层"),
+    SPACE("Sp", "空间"),
+    SYSTEM("Sy", "系统"),
+    EQUIPMENT("Eq", "设备"),
+    SHAFT("Sh", "竖井"),
+    COMPONENT("Ec", "部件"),
+    VIRTUAL("Vo", "虚拟对象"),
+    TOOL("To", "工具"),
+    MATERIAL("Ma", "耗材");
+
+    private String index;
+    private String name;
+
+    DigitalObjectTypeShort(String index, String name) {
+        this.index = index;
+        this.name = name;
+    }
+}

+ 11 - 0
iot-framework/iot-common/src/main/java/com/yushu/framework/common/pojo/CommonResult.java

@@ -2,10 +2,13 @@ package com.yushu.framework.common.pojo;
 
 import cn.hutool.core.collection.CollUtil;
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.yushu.framework.common.exception.ErrorCode;
 import com.yushu.framework.common.exception.ServiceException;
 import com.yushu.framework.common.exception.enums.GlobalErrorCodeConstants;
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 import org.springframework.util.Assert;
 
 import java.io.Serializable;
@@ -18,6 +21,8 @@ import java.util.Objects;
  * @param <T> 数据泛型
  */
 @Data
+@NoArgsConstructor
+@AllArgsConstructor
 public class CommonResult<T> implements Serializable {
     /**
      * 成功
@@ -33,28 +38,34 @@ public class CommonResult<T> implements Serializable {
      *
      * @see ErrorCode#getCode()
      */
+    @JsonInclude(JsonInclude.Include.NON_NULL)
     private Integer code;
     /**
      * success、fail
      */
+    @JsonInclude(JsonInclude.Include.NON_NULL)
     private String result;
     /**
      * 返回数据
      */
+    @JsonInclude(JsonInclude.Include.NON_NULL)
     private T data;
     /**
      * 错误提示,用户可阅读
      *
      * @see ErrorCode#getMessage() ()
      */
+    @JsonInclude(JsonInclude.Include.NON_NULL)
     private String message;
     /**
      * 返回记录条数或者操作记录条数
      */
+    @JsonInclude(JsonInclude.Include.NON_NULL)
     private Long count;
     /**
      * 记录总条数
      */
+    @JsonInclude(JsonInclude.Include.NON_NULL)
     private Long total;
 
 

+ 28 - 18
iot-framework/iot-common/src/main/java/com/yushu/framework/common/util/date/DateUtils.java

@@ -1,7 +1,12 @@
 package com.yushu.framework.common.util.date;
 
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import com.yushu.framework.common.exception.ServiceException;
 import lombok.extern.slf4j.Slf4j;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -20,18 +25,18 @@ import java.util.Date;
  * @since: 2019年8月5日: 下午4:44:21 Update By luoguangyi 2019年8月5日: 下午4:44:21
  */
 @Slf4j
-public class DateUtils {
-
-    public static final String SDF_DAY = "yyyyMMdd";
-    public static final String SDF_MONTH = "yyyyMM";
-    public static final String SDF_TIME = "yyyyMMddHHmmss";
-    public static final String SDF_TIME_NOT_DATE = "HHmmss";
-    public static final String SDF_HOUR = "yyyyMMddHH";
-    public static final String SDF_MINUTE = "yyyyMMddHHmm";
-    // 时间格式-显示
-    public final static String DATE_TIME_FORMAT_SHOW = "yyyy-MM-dd HH:mm:ss";
-    public final static String DATE_TIME_FORMAT_SHOW_MINUTE = "yyyy-MM-dd HH:mm";
-    private final static DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+public class DateUtils extends DatePattern {
+
+    private final static DateTimeFormatter PURE_DATETIME_FORMAT = DateTimeFormatter.ofPattern(PURE_DATETIME_PATTERN);
+    /**
+     * SimpleDateFormat ThreadLocal 保证线程安全
+     */
+    private static final ThreadLocal<SimpleDateFormat> simpleDateFormatThreadLocal = new ThreadLocal<SimpleDateFormat>() {
+        @Override
+        protected synchronized SimpleDateFormat initialValue() {
+            return new SimpleDateFormat(PURE_DATETIME_PATTERN);
+        }
+    };
     /**
      * 东八区时区偏移量
      */
@@ -109,11 +114,11 @@ public class DateUtils {
     }
 
     public static String format(LocalDateTime time) {
-        return time.format(FORMATTER);
+        return time.format(PURE_DATETIME_FORMAT);
     }
 
     public static String formatDate(Date date) {
-        return format(date2LocalDateTime(date));
+        return simpleDateFormatThreadLocal.get().format(date);
     }
 
     /**
@@ -132,11 +137,16 @@ public class DateUtils {
     }
 
     public static LocalDateTime parse(String dateStr) {
-        return LocalDateTime.parse(dateStr, FORMATTER);
+        return LocalDateTime.parse(dateStr, PURE_DATETIME_FORMAT);
     }
 
     public static Date parseDate(String dateStr) {
-        return localDateTime2Date(LocalDateTime.parse(dateStr, FORMATTER));
+        try {
+            return simpleDateFormatThreadLocal.get().parse(dateStr);
+        } catch (ParseException e) {
+            throw new ServiceException(500,dateStr+"格式错误");
+        }
+        //return localDateTime2Date(LocalDateTime.parse(dateStr, PURE_DATETIME_FORMAT));
     }
 
     // 获取当前时间的指定格式
@@ -211,11 +221,11 @@ public class DateUtils {
      * @author lijie
      */
     public static String getNowTimeStr() {
-        return LocalDateTime.now().format(FORMATTER);
+        return LocalDateTime.now().format(PURE_DATETIME_FORMAT);
     }
 
     public static String getTimeStr(LocalDateTime date) {
-        return date.format(FORMATTER);
+        return date.format(PURE_DATETIME_FORMAT);
     }
 
     public static String getMinusHour(String dateTime, long hour) {

+ 2 - 2
iot-framework/iot-common/src/main/java/com/yushu/framework/common/validation/InEnum.java

@@ -1,6 +1,6 @@
 package com.yushu.framework.common.validation;
 
-import com.yushu.framework.common.core.IntArrayValuable;
+import com.yushu.framework.common.core.ObjectArrayValuable;
 
 import javax.validation.Constraint;
 import javax.validation.Payload;
@@ -24,7 +24,7 @@ public @interface InEnum {
     /**
      * @return 实现 EnumValuable 接口的
      */
-    Class<? extends IntArrayValuable> value();
+    Class<? extends ObjectArrayValuable> value();
 
     String message() default "必须在指定范围 {value}";
 

+ 9 - 6
iot-framework/iot-common/src/main/java/com/yushu/framework/common/validation/InEnumValidator.java

@@ -1,6 +1,6 @@
 package com.yushu.framework.common.validation;
 
-import com.yushu.framework.common.core.IntArrayValuable;
+import com.yushu.framework.common.core.ObjectArrayValuable;
 
 import javax.validation.ConstraintValidator;
 import javax.validation.ConstraintValidatorContext;
@@ -9,22 +9,25 @@ import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
-public class InEnumValidator implements ConstraintValidator<InEnum, Integer> {
+/**
+ * @author luoguangyi
+ */
+public class InEnumValidator implements ConstraintValidator<InEnum, Object> {
 
-    private List<Integer> values;
+    private List<Object> values;
 
     @Override
     public void initialize(InEnum annotation) {
-        IntArrayValuable[] values = annotation.value().getEnumConstants();
+        ObjectArrayValuable[] values = annotation.value().getEnumConstants();
         if (values.length == 0) {
             this.values = Collections.emptyList();
         } else {
-            this.values = Arrays.stream(values[0].array()).boxed().collect(Collectors.toList());
+            this.values = Arrays.stream(values[0].array()).collect(Collectors.toList());
         }
     }
 
     @Override
-    public boolean isValid(Integer value, ConstraintValidatorContext context) {
+    public boolean isValid(Object value, ConstraintValidatorContext context) {
         // 为空时,默认不校验,即认为通过
         if (value == null) {
             return true;

+ 158 - 0
iot-framework/iot-common/src/main/java/com/yushu/framework/common/validation/ValidatableList.java

@@ -0,0 +1,158 @@
+/*
+ * Copyright 2016-2021 Pnoker. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.yushu.framework.common.validation;
+
+import javax.validation.Valid;
+import java.util.*;
+
+/**
+ * 自定义List 用于List参数校验
+ * 实现List内容校验的两种方式:
+ * 1.使用ValidatableList包裹成java bean
+ * 2.类加@Validated,参数加@Valid
+ * 前提:引入下面包
+ *  <dependency>
+ *     <groupId>org.springframework.boot</groupId>
+ *     <artifactId>spring-boot-starter-validation</artifactId>
+ *  </dependency>
+ * @author lgy
+ */
+public class ValidatableList<E> implements List<E> {
+
+    @Valid
+    private List<E> list = new LinkedList<>();
+
+    @Override
+    public int size() {
+        return list.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return list.isEmpty();
+    }
+
+    @Override
+    public boolean contains(Object o) {
+        return list.contains(o);
+    }
+
+    @Override
+    public Iterator<E> iterator() {
+        return list.iterator();
+    }
+
+    @Override
+    public Object[] toArray() {
+        return list.toArray();
+    }
+
+    @Override
+    public <T> T[] toArray(T[] a) {
+        return list.toArray(a);
+    }
+
+    @Override
+    public boolean add(E e) {
+        return list.add(e);
+    }
+
+    @Override
+    public boolean remove(Object o) {
+        return list.remove(o);
+    }
+
+    @Override
+    public boolean containsAll(Collection<?> c) {
+        return list.containsAll(c);
+    }
+
+    @Override
+    public boolean addAll(Collection<? extends E> c) {
+        return list.addAll(c);
+    }
+
+    @Override
+    public boolean addAll(int index, Collection<? extends E> c) {
+        return list.addAll(index, c);
+    }
+
+    @Override
+    public boolean removeAll(Collection<?> c) {
+        return list.removeAll(c);
+    }
+
+    @Override
+    public boolean retainAll(Collection<?> c) {
+        return list.retainAll(c);
+    }
+
+    @Override
+    public void clear() {
+        list.clear();
+    }
+
+    @Override
+    public E get(int index) {
+        return list.get(index);
+    }
+
+    @Override
+    public E set(int index, E element) {
+        return list.set(index, element);
+    }
+
+    @Override
+    public void add(int index, E element) {
+        list.add(index, element);
+    }
+
+    @Override
+    public E remove(int index) {
+        return list.remove(index);
+    }
+
+    @Override
+    public int indexOf(Object o) {
+        return list.indexOf(o);
+    }
+
+    @Override
+    public int lastIndexOf(Object o) {
+        return list.lastIndexOf(o);
+    }
+
+    @Override
+    public ListIterator<E> listIterator() {
+        return list.listIterator();
+    }
+
+    @Override
+    public ListIterator<E> listIterator(int index) {
+        return list.listIterator(index);
+    }
+
+    @Override
+    public List<E> subList(int fromIndex, int toIndex) {
+        return list.subList(fromIndex, toIndex);
+    }
+
+    public List<E> getList() {
+        return list;
+    }
+
+    public void setList(List<E> list) {
+        this.list = list;
+    }
+}

+ 30 - 0
iot-framework/iot-spring-boot-starter-web/src/main/java/com/yushu/framework/web/config/WebAutoConfiguration.java

@@ -1,5 +1,8 @@
 package com.yushu.framework.web.config;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.yushu.framework.common.test.WebFilterOrderEnum;
 import com.yushu.framework.web.core.filter.CacheRequestBodyFilter;
 import com.yushu.framework.web.core.filter.DemoFilter;
@@ -10,19 +13,26 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 import org.springframework.util.PathMatcher;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.cors.CorsConfiguration;
 import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
 import org.springframework.web.filter.CorsFilter;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
 import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
 import javax.annotation.Resource;
 import javax.servlet.Filter;
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.List;
 
 @Configuration
+@EnableWebMvc
 @EnableConfigurationProperties({WebProperties.class, XssProperties.class})
 public class WebAutoConfiguration implements WebMvcConfigurer {
 
@@ -39,6 +49,26 @@ public class WebAutoConfiguration implements WebMvcConfigurer {
         bean.setOrder(order);
         return bean;
     }
+    @Override
+    public void configureMessageConverters(List<HttpMessageConverter<?>> list) {
+        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
+
+        // Long ToStringSerializer
+        ObjectMapper objectMapper = jsonConverter.getObjectMapper();
+        SimpleModule simpleModule = new SimpleModule();
+        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
+        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
+        objectMapper.registerModule(simpleModule);
+
+        // MediaType
+        List<MediaType> mediaTypes = new ArrayList<>(jsonConverter.getSupportedMediaTypes());
+        mediaTypes.add(MediaType.ALL);
+        mediaTypes.add(MediaType.TEXT_PLAIN);
+        mediaTypes.add(MediaType.MULTIPART_FORM_DATA);
+
+        jsonConverter.setSupportedMediaTypes(mediaTypes);
+        list.add(jsonConverter);
+    }
 
 //    @Bean
 //    public GlobalExceptionHandler globalExceptionHandler(ApiErrorLogFrameworkService apiErrorLogFrameworkService) {

+ 24 - 7
iot-framework/iot-spring-boot-starter-web/src/main/java/com/yushu/framework/web/core/handler/GlobalExceptionHandler.java

@@ -2,6 +2,7 @@ package com.yushu.framework.web.core.handler;
 
 import cn.hutool.core.exceptions.ExceptionUtil;
 import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.servlet.ServletUtil;
 import com.yushu.framework.apilog.core.service.ApiErrorLogFrameworkService;
 import com.yushu.framework.apilog.core.service.dto.ApiErrorLogCreateDTO;
@@ -20,6 +21,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.util.Assert;
 import org.springframework.validation.BindException;
 import org.springframework.validation.FieldError;
+import org.springframework.validation.ObjectError;
 import org.springframework.web.HttpRequestMethodNotSupportedException;
 import org.springframework.web.bind.MethodArgumentNotValidException;
 import org.springframework.web.bind.MissingServletRequestParameterException;
@@ -32,7 +34,9 @@ import javax.servlet.http.HttpServletRequest;
 import javax.validation.ConstraintViolation;
 import javax.validation.ConstraintViolationException;
 import javax.validation.ValidationException;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 import java.util.Map;
 
 import static com.yushu.framework.common.exception.enums.GlobalErrorCodeConstants.*;
@@ -55,9 +59,6 @@ public class GlobalExceptionHandler {
     @Autowired
     private ApiErrorLogFrameworkService apiErrorLogFrameworkService;
 
-    //private final String applicationName;
-    //private final ApiErrorLogFrameworkService apiErrorLogFrameworkService;
-
 
     /**
      * 处理所有异常,主要是提供给 Filter 使用
@@ -126,9 +127,19 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(MethodArgumentNotValidException.class)
     public CommonResult<?> methodArgumentNotValidExceptionExceptionHandler(MethodArgumentNotValidException ex) {
         log.warn("[methodArgumentNotValidExceptionExceptionHandler]", ex);
-        FieldError fieldError = ex.getBindingResult().getFieldError();
-        assert fieldError != null; // 断言,避免告警
-        return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数不正确:%s", fieldError.getDefaultMessage()));
+        List<ObjectError> errors = ex.getBindingResult().getAllErrors();
+        StringBuffer sb = new StringBuffer();
+        List<String> errorArr = new ArrayList<>();
+        for (ObjectError error : errors) {
+            if (error instanceof FieldError) {
+                FieldError fieldError = (FieldError) error;
+                errorArr.add(fieldError.getField() + fieldError.getDefaultMessage());
+            } else {
+                errorArr.add(error.getObjectName() + error.getDefaultMessage());
+            }
+        }
+        String errMsg = StrUtil.join(";", errorArr.toArray(new String[]{}));
+        return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数不正确:%s", errMsg));
     }
 
     /**
@@ -148,8 +159,14 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(value = ConstraintViolationException.class)
     public CommonResult<?> constraintViolationExceptionHandler(ConstraintViolationException ex) {
         log.warn("[constraintViolationExceptionHandler]", ex);
+        //@RequestParam 参数校验失败
+        List<String> errorArr = new ArrayList<>();
+        for (ConstraintViolation constraint : ex.getConstraintViolations()) {
+            errorArr.add(constraint.getInvalidValue() + "非法" + constraint.getMessage());
+        }
         ConstraintViolation<?> constraintViolation = ex.getConstraintViolations().iterator().next();
-        return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数不正确:%s", constraintViolation.getMessage()));
+        String errMsg = StrUtil.join(";", errorArr.toArray(new String[]{}));
+        return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数不正确:%s", errMsg));
     }
 
     /**

+ 1 - 1
pom.xml

@@ -26,7 +26,7 @@
         <module>iot-business</module>
         <module>iot-admin-server</module>
         <!-- <module>spring-cloud-alibaba-examples</module>-->
-        <!-- <module>demo</module>-->
+         <module>demo</module>
     </modules>
     <dependencyManagement>
         <dependencies>