Browse Source

机构: 增加一个可控的@Valid验证方法

hgw 3 years ago
parent
commit
6da84afd5c

+ 4 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/controller/BaseController.java

@@ -7,6 +7,7 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.thirdparty.exception.ThirdpartyException;
 import com.ym.mec.util.http.HttpUtil;
 import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -120,6 +121,9 @@ public class BaseController {
 		}catch (Exception exception){
 			logger.error("System Error", exception);
 		}
+        if (StringUtils.isNotBlank(ex.getMessage())) {
+            return failed(ex.getMessage());
+        }
 		return failed("系统繁忙");
 	}
 

+ 72 - 0
mec-util/src/main/java/com/ym/mec/util/validator/ValidationKit.java

@@ -0,0 +1,72 @@
+package com.ym.mec.util.validator;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+
+import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * 个别功能在传参时只需要部分成员变量赋值,但是接收类加入了@Valid的验证,
+ * 从而不得已要在传参时把接收类所有的成员变量都赋值。
+ * 该功能可以让加入了@Valid的验证的接收类中分成员变量没有赋值的时不报出异
+ * 常,只针对你需要的值进行验证再报出异常。
+ *
+ * @author hgw
+ * Created by 2021-12-20
+ */
+public class ValidationKit {
+
+    /**
+     * 校验
+     *
+     * @param result BindingResult
+     * @param fields 只校验的字段
+     */
+    public static void validFields(BindingResult result, String... fields) {
+        if (!result.hasFieldErrors()) {
+            return;
+        }
+        Stream<String> stringStream = result.getFieldErrors().stream()
+                .map(FieldError::getField)
+                .filter(field -> ArrayUtils.contains(fields, field));
+
+        String errorCollect = concat(result, stringStream);
+        if (StringUtils.isNotBlank(errorCollect)) {
+            throw new RuntimeException(errorCollect);
+        }
+    }
+
+    /**
+     * 忽略校验部分字段
+     *
+     * @param result       BindingResult
+     * @param ignoreFields 忽略验证的字段
+     */
+    public static void ignoreFields(BindingResult result, String... ignoreFields) {
+        if (!result.hasFieldErrors()) {
+            return;
+        }
+        Stream<String> stringStream = result.getFieldErrors().stream()
+                .map(FieldError::getField)
+                .filter(field -> !ArrayUtils.contains(ignoreFields, field));
+
+        String errorCollect = concat(result, stringStream);
+        if (StringUtils.isNotBlank(errorCollect)) {
+            throw new RuntimeException(errorCollect);
+        }
+    }
+
+    private static String concat(BindingResult result, Stream<String> stringStream) {
+        return stringStream.filter(f -> Objects.nonNull(result.getFieldError(f)))
+                .map(result::getFieldError)
+                .filter(Objects::nonNull)
+                .map(FieldError::getDefaultMessage)
+                .filter(StringUtils::isNotBlank)
+                .collect(Collectors.joining());
+    }
+
+}

+ 7 - 6
mec-web/src/main/java/com/ym/mec/web/controller/TenantInfoController.java

@@ -3,9 +3,11 @@ package com.ym.mec.web.controller;
 import com.ym.mec.biz.dal.dto.TenantInfoDto;
 import com.ym.mec.biz.service.TenantInfoService;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.util.validator.ValidationKit;
 import io.swagger.annotations.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
@@ -25,7 +27,7 @@ public class TenantInfoController extends BaseController {
 
     @ApiOperation("添加机构信息")
     @PostMapping(value = "/add")
-//    @PreAuthorize("@pcs.hasPermissions('tenantInfo/add')")
+    @PreAuthorize("@pcs.hasPermissions('tenantInfo/add')")
     public Object addTenantInfo(@Valid @RequestBody TenantInfoDto dto) {
         tenantInfoService.addTenantInfo(dto);
         return succeed();
@@ -33,8 +35,9 @@ public class TenantInfoController extends BaseController {
 
     @ApiOperation("修改机构信息")
     @PostMapping(value = "/update")
-//    @PreAuthorize("@pcs.hasPermissions('tenantInfo/update')")
-    public Object updateTenantInfo(@Valid @RequestBody TenantInfoDto dto) {
+    @PreAuthorize("@pcs.hasPermissions('tenantInfo/update')")
+    public Object updateTenantInfo(@Valid @RequestBody TenantInfoDto dto, BindingResult bindingResult) {
+        ValidationKit.ignoreFields(bindingResult,"productInfo","config");
         tenantInfoService.updateTenantInfo(dto);
         return succeed();
     }
@@ -49,12 +52,10 @@ public class TenantInfoController extends BaseController {
 
     @ApiOperation("查询单个机构详情")
     @GetMapping(value = "/info/{id}")
-//    @PreAuthorize("@pcs.hasPermissions('tenantInfo/info')")
     public Object queryTenantInfo(@ApiParam(value = "机构ID", required = true) @PathVariable("id") Integer id) {
         return succeed(tenantInfoService.queryTenantInfo(id));
     }
 
-
     @ApiImplicitParams({
             @ApiImplicitParam(name = "search", dataType = "String", value = "关键字"),
             @ApiImplicitParam(name = "createdName", dataType = "String", value = "创建人"),
@@ -67,7 +68,7 @@ public class TenantInfoController extends BaseController {
     })
     @ApiOperation("分页查询")
     @PostMapping(value = "/queryPage")
-//    @PreAuthorize("@pcs.hasPermissions('tenantInfo/queryPage')")
+    @PreAuthorize("@pcs.hasPermissions('tenantInfo/queryPage')")
     public Object queryPage(@RequestBody Map<String, Object> param) {
         return succeed(tenantInfoService.queryPage(param));
     }