This is an automated email from the ASF dual-hosted git repository.

xiaoyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new 9ecf8a8  [ISSUE #2956]valid meta data api paramater (#3023)
9ecf8a8 is described below

commit 9ecf8a8257135a5995d900857c4859c4d31917c7
Author: likeguo <[email protected]>
AuthorDate: Fri Mar 11 11:15:12 2022 +0800

    [ISSUE #2956]valid meta data api paramater (#3023)
    
    * valid meta data api paramater
    
    * valid meta data api paramater
---
 .../http/http-debug-meta-data-controller-api.http  |  92 ++++++++++++++++
 .../admin/controller/MetaDataController.java       |  27 +++--
 .../shenyu/admin/exception/ExceptionHandlers.java  |   4 +-
 .../apache/shenyu/admin/mapper/MetaDataMapper.java |  43 +++++---
 .../shenyu/admin/model/dto/BatchCommonDTO.java     |   3 +-
 .../apache/shenyu/admin/model/dto/MetaDataDTO.java | 122 ++++++++++++++-------
 .../admin/service/impl/MetaDataServiceImpl.java    |  38 +------
 .../service/provider/MetaDataPathProvider.java     |  42 +++++++
 .../admin/validation/annotation/Existed.java       |   7 ++
 .../validation/validator/ExistedValidator.java     |   3 +
 .../main/resources/mappers/meta-data-sqlmap.xml    |   4 +
 .../admin/controller/MetaDataControllerTest.java   |  33 +++++-
 .../shenyu/admin/service/MetaDataServiceTest.java  |  59 +---------
 13 files changed, 316 insertions(+), 161 deletions(-)

diff --git a/shenyu-admin/src/http/http-debug-meta-data-controller-api.http 
b/shenyu-admin/src/http/http-debug-meta-data-controller-api.http
new file mode 100644
index 0000000..72741d4
--- /dev/null
+++ b/shenyu-admin/src/http/http-debug-meta-data-controller-api.http
@@ -0,0 +1,92 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+#
+
+# if you debug api, replace your own token
+
+### metadata list by page
+GET 
http://localhost:9095/meta-data/queryList/?currentPage=1&pageSize=10&userId=1&pluginId=1
+Accept: application/json
+Content-Type: application/json
+X-Access-Token: 
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTmFtZSI6ImFkbWluIiwiZXhwIjoxNjQ3MDA1ODUxfQ.PQKajtOBgL8_it1Ctylk1-TdBTxFv_fneX1ZPWY4DeE
+
+### metadata list
+GET http://localhost:9095/meta-data/findAll
+Accept: application/json
+Content-Type: application/json
+X-Access-Token: 
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTmFtZSI6ImFkbWluIiwiZXhwIjoxNjQ3MDA1ODUxfQ.PQKajtOBgL8_it1Ctylk1-TdBTxFv_fneX1ZPWY4DeE
+
+### metadata group list
+GET http://localhost:9095/meta-data/findAllGroup
+Accept: application/json
+Content-Type: application/json
+X-Access-Token: 
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTmFtZSI6ImFkbWluIiwiZXhwIjoxNjQ3MDA1ODUxfQ.PQKajtOBgL8_it1Ctylk1-TdBTxFv_fneX1ZPWY4DeE
+
+### metadata get
+GET http://localhost:9095/meta-data/1501918894986723328
+Accept: application/json
+Content-Type: application/json
+X-Access-Token: 
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTmFtZSI6ImFkbWluIiwiZXhwIjoxNjQ3MDA1ODUxfQ.PQKajtOBgL8_it1Ctylk1-TdBTxFv_fneX1ZPWY4DeE
+
+### create or update
+POST http://localhost:9095/meta-data/createOrUpdate
+Accept: application/json
+Content-Type: application/json
+X-Access-Token: 
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTmFtZSI6ImFkbWluIiwiZXhwIjoxNjQ3MDA1ODUxfQ.PQKajtOBgL8_it1Ctylk1-TdBTxFv_fneX1ZPWY4DeE
+
+{
+  "appName": "appName ",
+  "contextPath": "contextPath",
+  "path": "path",
+  "ruleName": "ruleName",
+  "rpcType": "rpcType",
+  "serviceName": "serviceName",
+  "methodName": "methodName",
+  "enabled": false,
+  "dataId": 1
+}
+
+### metadata delete
+DELETE http://localhost:9095/meta-data/batchDeleted
+Accept: application/json
+Content-Type: application/json
+X-Access-Token: 
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTmFtZSI6ImFkbWluIiwiZXhwIjoxNjQ3MDA1ODUxfQ.PQKajtOBgL8_it1Ctylk1-TdBTxFv_fneX1ZPWY4DeE
+
+[
+  1
+]
+
+### enable
+POST http://localhost:9095/meta-data/batchEnabled
+Accept: application/json
+Content-Type: application/json
+X-Access-Token: 
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTmFtZSI6ImFkbWluIiwiZXhwIjoxNjQ3MDA1ODUxfQ.PQKajtOBgL8_it1Ctylk1-TdBTxFv_fneX1ZPWY4DeE
+
+{
+  "enabled": true,
+  "ids": [
+    1,
+    2,
+    3
+  ]
+}
+
+### sync data
+POST http://localhost:9095/meta-data/syncData
+Accept: application/json
+Content-Type: application/json
+X-Access-Token: 
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTmFtZSI6ImFkbWluIiwiZXhwIjoxNjQ3MDA1ODUxfQ.PQKajtOBgL8_it1Ctylk1-TdBTxFv_fneX1ZPWY4DeE
+
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/MetaDataController.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/MetaDataController.java
index 7d2d5cc..dc1e542 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/MetaDataController.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/MetaDataController.java
@@ -28,6 +28,7 @@ import org.apache.shenyu.admin.model.vo.MetaDataVO;
 import org.apache.shenyu.admin.service.MetaDataService;
 import org.apache.shenyu.admin.utils.ShenyuResultMessage;
 import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -38,6 +39,7 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.validation.Valid;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
 import java.util.List;
 
 /**
@@ -63,7 +65,9 @@ public class MetaDataController {
      * @return the shenyu result
      */
     @GetMapping("/queryList")
-    public ShenyuAdminResult queryList(final String appName, final Integer 
currentPage, final Integer pageSize) {
+    public ShenyuAdminResult queryList(final String appName,
+                                       @NotNull(message = "currentPage not 
null") final Integer currentPage,
+                                       @NotNull(message = "pageSize not null") 
final Integer pageSize) {
         CommonPager<MetaDataVO> commonPager = metaDataService.listByPage(new 
MetaDataQuery(appName, new PageParameter(currentPage, pageSize)));
         return ShenyuAdminResult.success(ShenyuResultMessage.QUERY_SUCCESS, 
commonPager);
     }
@@ -95,9 +99,8 @@ public class MetaDataController {
      * @return the shenyu result
      */
     @GetMapping("/{id}")
-    public ShenyuAdminResult editor(@PathVariable("id") final String id) {
-        MetaDataVO metaDataVO = metaDataService.findById(id);
-        return ShenyuAdminResult.success(ShenyuResultMessage.DETAIL_SUCCESS, 
metaDataVO);
+    public ShenyuAdminResult detail(@PathVariable("id") final String id) {
+        return ShenyuAdminResult.success(ShenyuResultMessage.DETAIL_SUCCESS, 
metaDataService.findById(id));
     }
 
     /**
@@ -108,10 +111,7 @@ public class MetaDataController {
      */
     @PostMapping("/createOrUpdate")
     public ShenyuAdminResult createOrUpdate(@Valid @RequestBody final 
MetaDataDTO metaDataDTO) {
-        String result = metaDataService.createOrUpdate(metaDataDTO);
-        if (StringUtils.isNoneBlank(result)) {
-            return ShenyuAdminResult.error(result);
-        }
+        metaDataService.createOrUpdate(metaDataDTO);
         return ShenyuAdminResult.success(ShenyuResultMessage.CREATE_SUCCESS);
     }
 
@@ -126,6 +126,17 @@ public class MetaDataController {
         Integer deleteCount = metaDataService.delete(ids);
         return ShenyuAdminResult.success(ShenyuResultMessage.DELETE_SUCCESS, 
deleteCount);
     }
+    
+    /**
+     * Batch deleted metadata.
+     *
+     * @param ids the ids
+     * @return the shenyu result
+     */
+    @DeleteMapping("/batchDeleted")
+    public ShenyuAdminResult batchDelete(@RequestBody @NotEmpty final 
List<@NotBlank String> ids) {
+        return batchDeleted(ids);
+    }
 
     /**
      * Batch enabled metadata.
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/exception/ExceptionHandlers.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/exception/ExceptionHandlers.java
index 00c84c5..4854c19 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/exception/ExceptionHandlers.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/exception/ExceptionHandlers.java
@@ -127,7 +127,7 @@ public class ExceptionHandlers {
     
     @ExceptionHandler(ShenyuAdminException.class)
     protected ShenyuAdminResult handleShenyuException(final 
ShenyuAdminException exception) {
-        LOG.error("null pointer exception ", exception);
-        return ShenyuAdminResult.error(CommonErrorCode.NOT_FOUND_EXCEPTION, 
exception.getMessage());
+        LOG.error("shenyu admin exception ", exception);
+        return ShenyuAdminResult.error(CommonErrorCode.ERROR, 
exception.getMessage());
     }
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/MetaDataMapper.java 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/MetaDataMapper.java
index 3a5774b..68ad81f 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/MetaDataMapper.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/MetaDataMapper.java
@@ -22,6 +22,7 @@ import org.apache.ibatis.annotations.Param;
 import org.apache.shenyu.admin.model.entity.MetaDataDO;
 import org.apache.shenyu.admin.model.query.MetaDataQuery;
 
+import java.io.Serializable;
 import java.util.List;
 import java.util.Set;
 
@@ -30,7 +31,7 @@ import java.util.Set;
  */
 @Mapper
 public interface MetaDataMapper {
-
+    
     /**
      * Select by id meta data do.
      *
@@ -38,21 +39,22 @@ public interface MetaDataMapper {
      * @return the meta data do
      */
     MetaDataDO selectById(String id);
-
+    
     /**
      * Select a list of MetaDataDOs by idList.
+     *
      * @param idSet a set of ids
      * @return a list of MetaDataDOs
      */
     List<MetaDataDO> selectByIdSet(@Param("idSet") Set<String> idSet);
-
+    
     /**
      * Find all list.
      *
      * @return the list
      */
     List<MetaDataDO> findAll();
-
+    
     /**
      * Find by path meta data do.
      *
@@ -60,16 +62,16 @@ public interface MetaDataMapper {
      * @return the meta data do
      */
     MetaDataDO findByPath(String path);
-
+    
     /**
      * Find by service name and method meta data do.
      *
      * @param serviceName the service name
-     * @param methodName      the methodName
+     * @param methodName  the methodName
      * @return the meta data do
      */
     MetaDataDO findByServiceNameAndMethod(@Param("serviceName") String 
serviceName, @Param("methodName") String methodName);
-
+    
     /**
      * Select by query list.
      *
@@ -77,14 +79,14 @@ public interface MetaDataMapper {
      * @return the list
      */
     List<MetaDataDO> selectByQuery(MetaDataQuery metaDataQuery);
-
+    
     /**
      * Select all list.
      *
      * @return the list
      */
     List<MetaDataDO> selectAll();
-
+    
     /**
      * Count by query integer.
      *
@@ -92,7 +94,7 @@ public interface MetaDataMapper {
      * @return the integer
      */
     Integer countByQuery(MetaDataQuery metaDataQuery);
-
+    
     /**
      * Insert int.
      *
@@ -100,7 +102,7 @@ public interface MetaDataMapper {
      * @return the int
      */
     int insert(MetaDataDO metaDataDO);
-
+    
     /**
      * Update int.
      *
@@ -108,7 +110,7 @@ public interface MetaDataMapper {
      * @return the int
      */
     int update(MetaDataDO metaDataDO);
-
+    
     /**
      * Update enable int.
      *
@@ -116,16 +118,16 @@ public interface MetaDataMapper {
      * @return the int
      */
     int updateEnable(MetaDataDO metaDataDO);
-
+    
     /**
      * update enable batch.
      *
-     * @param idSet the ids
+     * @param idSet   the ids
      * @param enabled the status
      * @return the count
      */
     int updateEnableBatch(@Param("idSet") Set<String> idSet, @Param("enabled") 
Boolean enabled);
-
+    
     /**
      * Delete int.
      *
@@ -133,11 +135,20 @@ public interface MetaDataMapper {
      * @return the int
      */
     int delete(String id);
-
+    
     /**
      * batch delete by a set of ids.
+     *
      * @param idSet a set of ids
      * @return the count of deleted
      */
     int deleteByIdSet(@Param("idSet") Set<String> idSet);
+    
+    /**
+     * the path is existed.
+     *
+     * @param path path
+     * @return existed
+     */
+    Boolean pathExisted(Serializable path);
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/BatchCommonDTO.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/BatchCommonDTO.java
index 43f759d..277eb94 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/BatchCommonDTO.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/BatchCommonDTO.java
@@ -17,6 +17,7 @@
 
 package org.apache.shenyu.admin.model.dto;
 
+import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import java.io.Serializable;
@@ -32,7 +33,7 @@ public class BatchCommonDTO implements Serializable {
 
     @NotEmpty
     @NotNull
-    private List<String> ids;
+    private List<@NotBlank String> ids;
 
     @NotNull
     private Boolean enabled;
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/MetaDataDTO.java 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/MetaDataDTO.java
index 897e9a2..ccfe01c 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/MetaDataDTO.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/MetaDataDTO.java
@@ -17,42 +17,86 @@
 
 package org.apache.shenyu.admin.model.dto;
 
+import org.apache.shenyu.admin.service.provider.MetaDataPathProvider;
+import org.apache.shenyu.admin.validation.annotation.Existed;
+import org.apache.shenyu.common.constant.AdminConstants;
+
+import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 import java.util.Objects;
 
 public class MetaDataDTO implements Serializable {
-
+    
     private static final long serialVersionUID = 7476312364813536366L;
-
+    
     private String id;
-
+    
+    /**
+     * appName must is not null.
+     */
     @NotNull
+    @NotBlank
     private String appName;
-
+    
+    /**
+     * context path is not null.
+     */
+    @NotBlank
     private String contextPath;
-
+    
+    /**
+     * the path is not null.
+     */
+    @NotBlank
+    @Existed(provider = MetaDataPathProvider.class, reverse = true, message = 
AdminConstants.DATA_PATH_IS_EXIST)
     private String path;
-
+    
+    /**
+     * rule name is not null.
+     */
+    @NotBlank
     private String ruleName;
-
+    
+    /**
+     * path desc.
+     */
     private String pathDesc;
-
+    
+    /**
+     * rpc tyoe is not null.
+     */
+    @NotBlank
     private String rpcType;
-
+    
+    /**
+     * service name is not null.
+     */
+    @NotBlank
     private String serviceName;
-
+    
+    /**
+     * method name is not null.
+     */
+    @NotBlank
     private String methodName;
-
+    
+    /**
+     * parameter typs.
+     */
     private String parameterTypes;
-
+    
+    /**
+     * rpc ext.
+     */
     private String rpcExt;
-
+    
     /**
      * whether enabled.
      */
+    @NotNull
     private Boolean enabled;
-
+    
     /**
      * Gets the value of id.
      *
@@ -61,7 +105,7 @@ public class MetaDataDTO implements Serializable {
     public String getId() {
         return id;
     }
-
+    
     /**
      * Sets the id.
      *
@@ -70,7 +114,7 @@ public class MetaDataDTO implements Serializable {
     public void setId(final String id) {
         this.id = id;
     }
-
+    
     /**
      * Gets the value of appName.
      *
@@ -79,7 +123,7 @@ public class MetaDataDTO implements Serializable {
     public String getAppName() {
         return appName;
     }
-
+    
     /**
      * Sets the appName.
      *
@@ -88,7 +132,7 @@ public class MetaDataDTO implements Serializable {
     public void setAppName(final String appName) {
         this.appName = appName;
     }
-
+    
     /**
      * Gets the value of contextPath.
      *
@@ -97,7 +141,7 @@ public class MetaDataDTO implements Serializable {
     public String getContextPath() {
         return contextPath;
     }
-
+    
     /**
      * Sets the contextPath.
      *
@@ -106,7 +150,7 @@ public class MetaDataDTO implements Serializable {
     public void setContextPath(final String contextPath) {
         this.contextPath = contextPath;
     }
-
+    
     /**
      * Gets the value of path.
      *
@@ -115,7 +159,7 @@ public class MetaDataDTO implements Serializable {
     public String getPath() {
         return path;
     }
-
+    
     /**
      * Sets the path.
      *
@@ -124,7 +168,7 @@ public class MetaDataDTO implements Serializable {
     public void setPath(final String path) {
         this.path = path;
     }
-
+    
     /**
      * Gets the value of ruleName.
      *
@@ -133,7 +177,7 @@ public class MetaDataDTO implements Serializable {
     public String getRuleName() {
         return ruleName;
     }
-
+    
     /**
      * Sets the ruleName.
      *
@@ -142,7 +186,7 @@ public class MetaDataDTO implements Serializable {
     public void setRuleName(final String ruleName) {
         this.ruleName = ruleName;
     }
-
+    
     /**
      * Gets the value of pathDesc.
      *
@@ -151,7 +195,7 @@ public class MetaDataDTO implements Serializable {
     public String getPathDesc() {
         return pathDesc;
     }
-
+    
     /**
      * Sets the pathDesc.
      *
@@ -160,7 +204,7 @@ public class MetaDataDTO implements Serializable {
     public void setPathDesc(final String pathDesc) {
         this.pathDesc = pathDesc;
     }
-
+    
     /**
      * Gets the value of rpcType.
      *
@@ -169,7 +213,7 @@ public class MetaDataDTO implements Serializable {
     public String getRpcType() {
         return rpcType;
     }
-
+    
     /**
      * Sets the rpcType.
      *
@@ -178,7 +222,7 @@ public class MetaDataDTO implements Serializable {
     public void setRpcType(final String rpcType) {
         this.rpcType = rpcType;
     }
-
+    
     /**
      * Gets the value of serviceName.
      *
@@ -187,7 +231,7 @@ public class MetaDataDTO implements Serializable {
     public String getServiceName() {
         return serviceName;
     }
-
+    
     /**
      * Sets the serviceName.
      *
@@ -196,7 +240,7 @@ public class MetaDataDTO implements Serializable {
     public void setServiceName(final String serviceName) {
         this.serviceName = serviceName;
     }
-
+    
     /**
      * Gets the value of methodName.
      *
@@ -205,7 +249,7 @@ public class MetaDataDTO implements Serializable {
     public String getMethodName() {
         return methodName;
     }
-
+    
     /**
      * Sets the methodName.
      *
@@ -214,7 +258,7 @@ public class MetaDataDTO implements Serializable {
     public void setMethodName(final String methodName) {
         this.methodName = methodName;
     }
-
+    
     /**
      * Gets the value of parameterTypes.
      *
@@ -223,7 +267,7 @@ public class MetaDataDTO implements Serializable {
     public String getParameterTypes() {
         return parameterTypes;
     }
-
+    
     /**
      * Sets the parameterTypes.
      *
@@ -232,7 +276,7 @@ public class MetaDataDTO implements Serializable {
     public void setParameterTypes(final String parameterTypes) {
         this.parameterTypes = parameterTypes;
     }
-
+    
     /**
      * Gets the value of rpcExt.
      *
@@ -241,7 +285,7 @@ public class MetaDataDTO implements Serializable {
     public String getRpcExt() {
         return rpcExt;
     }
-
+    
     /**
      * Sets the rpcExt.
      *
@@ -250,7 +294,7 @@ public class MetaDataDTO implements Serializable {
     public void setRpcExt(final String rpcExt) {
         this.rpcExt = rpcExt;
     }
-
+    
     /**
      * Gets the value of enabled.
      *
@@ -259,7 +303,7 @@ public class MetaDataDTO implements Serializable {
     public Boolean getEnabled() {
         return enabled;
     }
-
+    
     /**
      * Sets the enabled.
      *
@@ -268,7 +312,7 @@ public class MetaDataDTO implements Serializable {
     public void setEnabled(final Boolean enabled) {
         this.enabled = enabled;
     }
-
+    
     @Override
     public boolean equals(final Object o) {
         if (this == o) {
@@ -291,7 +335,7 @@ public class MetaDataDTO implements Serializable {
                 && Objects.equals(rpcExt, that.rpcExt)
                 && Objects.equals(enabled, that.enabled);
     }
-
+    
     @Override
     public int hashCode() {
         return Objects.hash(id, appName, contextPath, path, ruleName, 
pathDesc, rpcType, serviceName, methodName, parameterTypes, rpcExt, enabled);
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/MetaDataServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/MetaDataServiceImpl.java
index 57bbf3e..2fbe07a 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/MetaDataServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/MetaDataServiceImpl.java
@@ -36,8 +36,6 @@ import org.apache.shenyu.common.enums.ConfigGroupEnum;
 import org.apache.shenyu.common.enums.DataEventTypeEnum;
 import org.apache.shenyu.common.utils.UUIDUtils;
 import org.apache.shenyu.register.common.dto.MetaDataRegisterDTO;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -57,9 +55,7 @@ import java.util.stream.Collectors;
  */
 @Service
 public class MetaDataServiceImpl implements MetaDataService {
-
-    private static final Logger LOG = 
LoggerFactory.getLogger(MetaDataServiceImpl.class);
-
+    
     private final MetaDataMapper metaDataMapper;
 
     private final ApplicationEventPublisher eventPublisher;
@@ -92,10 +88,6 @@ public class MetaDataServiceImpl implements MetaDataService {
 
     @Override
     public String createOrUpdate(final MetaDataDTO metaDataDTO) {
-        String msg = checkData(metaDataDTO);
-        if (StringUtils.isNoneBlank(msg)) {
-            return msg;
-        }
         MetaDataDO metaDataDO = 
MetaDataTransfer.INSTANCE.mapToEntity(metaDataDTO);
         DataEventTypeEnum eventType;
         String pathDesc = Objects.isNull(metaDataDO.getPathDesc()) ? "" : 
metaDataDO.getPathDesc();
@@ -191,8 +183,9 @@ public class MetaDataServiceImpl implements MetaDataService 
{
 
     @Override
     public Map<String, List<MetaDataVO>> findAllGroup() {
-        List<MetaDataVO> metaDataVOS = 
MetaDataTransfer.INSTANCE.mapToVOList(metaDataMapper.selectAll());
-        return 
metaDataVOS.stream().collect(Collectors.groupingBy(MetaDataVO::getAppName));
+        return 
MetaDataTransfer.INSTANCE.mapToVOList(metaDataMapper.selectAll())
+                .stream()
+                .collect(Collectors.groupingBy(MetaDataVO::getAppName));
     }
 
     @Override
@@ -218,26 +211,5 @@ public class MetaDataServiceImpl implements 
MetaDataService {
     public int insert(final MetaDataDO metaDataDO) {
         return metaDataMapper.insert(metaDataDO);
     }
-
-    private String checkData(final MetaDataDTO metaDataDTO) {
-        if (!checkParam(metaDataDTO)) {
-            LOG.error("metaData create param is error, {}", metaDataDTO);
-            return AdminConstants.PARAMS_ERROR;
-        }
-
-        final MetaDataDO exist = 
metaDataMapper.findByPath(metaDataDTO.getPath());
-        if (Objects.nonNull(exist) && 
!exist.getId().equals(metaDataDTO.getId())) {
-            return AdminConstants.DATA_PATH_IS_EXIST;
-        }
-
-        return StringUtils.EMPTY;
-    }
-
-    private boolean checkParam(final MetaDataDTO metaDataDTO) {
-        return !StringUtils.isEmpty(metaDataDTO.getAppName())
-                && !StringUtils.isEmpty(metaDataDTO.getPath())
-                && !StringUtils.isEmpty(metaDataDTO.getRpcType())
-                && !StringUtils.isEmpty(metaDataDTO.getServiceName())
-                && !StringUtils.isEmpty(metaDataDTO.getMethodName());
-    }
+    
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/provider/MetaDataPathProvider.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/provider/MetaDataPathProvider.java
new file mode 100644
index 0000000..910c678
--- /dev/null
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/provider/MetaDataPathProvider.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.shenyu.admin.service.provider;
+
+import org.apache.shenyu.admin.mapper.MetaDataMapper;
+import org.apache.shenyu.admin.validation.ExistProvider;
+import org.springframework.stereotype.Component;
+
+import java.io.Serializable;
+
+/**
+ * MetaDataPathProvider.
+ */
+@Component
+public class MetaDataPathProvider implements ExistProvider {
+    
+    private final MetaDataMapper metaDataMapper;
+    
+    public MetaDataPathProvider(final MetaDataMapper metaDataMapper) {
+        this.metaDataMapper = metaDataMapper;
+    }
+    
+    @Override
+    public Boolean existed(final Serializable key) {
+        return metaDataMapper.pathExisted(key);
+    }
+}
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/validation/annotation/Existed.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/validation/annotation/Existed.java
index ecadf19..2ea340b 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/validation/annotation/Existed.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/validation/annotation/Existed.java
@@ -46,6 +46,13 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
 public @interface Existed {
     
     /**
+     * if reverse ,it is not existed.
+     *
+     * @return not existed
+     */
+    boolean reverse() default false;
+    
+    /**
      * message.
      *
      * @return string
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/validation/validator/ExistedValidator.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/validation/validator/ExistedValidator.java
index 957c010..d9466f7 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/validation/validator/ExistedValidator.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/validation/validator/ExistedValidator.java
@@ -54,6 +54,9 @@ public class ExistedValidator implements 
ConstraintValidator<Existed, Serializab
         if (Objects.isNull(annotation.provider())) {
             throw new ResourceNotFoundException("the validation ExistProvider 
is not found");
         }
+        if (annotation.reverse()) {
+            return !Boolean.TRUE.equals(getExistProvider().existed(value));
+        }
         return Boolean.TRUE.equals(getExistProvider().existed(value));
     }
     
diff --git a/shenyu-admin/src/main/resources/mappers/meta-data-sqlmap.xml 
b/shenyu-admin/src/main/resources/mappers/meta-data-sqlmap.xml
index f7891f7..3398b5a 100644
--- a/shenyu-admin/src/main/resources/mappers/meta-data-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/meta-data-sqlmap.xml
@@ -103,6 +103,10 @@
         from meta_data
     </select>
 
+    <select id="pathExisted" resultType="java.lang.Boolean">
+        select true from meta_data where path = #{path} limit 1
+    </select>
+
     <insert id="insert" 
parameterType="org.apache.shenyu.admin.model.entity.MetaDataDO">
         insert into meta_data (id, date_created, date_updated, app_name, 
path,path_desc,rpc_type, 
service_name,method_name,parameter_types,rpc_ext,enabled )
         values (#{id,jdbcType=VARCHAR}, #{dateCreated,jdbcType=TIMESTAMP}, 
#{dateUpdated,jdbcType=TIMESTAMP},
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/MetaDataControllerTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/MetaDataControllerTest.java
index 523b4d8..3de01bc 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/MetaDataControllerTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/MetaDataControllerTest.java
@@ -24,9 +24,11 @@ import org.apache.shenyu.admin.model.dto.MetaDataDTO;
 import org.apache.shenyu.admin.model.page.CommonPager;
 import org.apache.shenyu.admin.model.page.PageParameter;
 import org.apache.shenyu.admin.model.query.MetaDataQuery;
+import org.apache.shenyu.admin.model.vo.MetaDataVO;
 import org.apache.shenyu.admin.service.MetaDataService;
+import org.apache.shenyu.admin.service.provider.MetaDataPathProvider;
+import org.apache.shenyu.admin.spring.SpringBeanUtils;
 import org.apache.shenyu.admin.utils.ShenyuResultMessage;
-import org.apache.shenyu.admin.model.vo.MetaDataVO;
 import org.apache.shenyu.common.constant.AdminConstants;
 import org.apache.shenyu.common.utils.DateUtils;
 import org.apache.shenyu.common.utils.GsonUtils;
@@ -36,6 +38,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.http.MediaType;
 import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
@@ -43,13 +46,15 @@ import 
org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
 import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Arrays;
 
 import static org.hamcrest.core.Is.is;
 import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
 import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
@@ -66,6 +71,9 @@ public final class MetaDataControllerTest {
 
     @Mock
     private MetaDataService metaDataService;
+    
+    @Mock
+    private MetaDataPathProvider pathProvider;
 
     private final MetaDataVO metaDataVO = new MetaDataVO("appName", "appPath", 
"desc", "rpcType", "serviceName", "methodName", "types", "rpcExt",
             "1", DateUtils.localDateTimeToString(LocalDateTime.now()), 
DateUtils.localDateTimeToString(LocalDateTime.now()),
@@ -74,6 +82,7 @@ public final class MetaDataControllerTest {
     @BeforeEach
     public void setUp() {
         this.mockMvc = MockMvcBuilders.standaloneSetup(metaDataController)
+//                .setControllerAdvice(pathProvider)
                 .setControllerAdvice(new ExceptionHandlers())
                 .build();
     }
@@ -141,7 +150,15 @@ public final class MetaDataControllerTest {
         metaDataDTO.setId("0001");
         metaDataDTO.setAppName("aname-01");
         metaDataDTO.setContextPath("path");
+        metaDataDTO.setPath("/path");
+        metaDataDTO.setRpcType("rpcType");
+        metaDataDTO.setMethodName("methodName");
+        metaDataDTO.setServiceName("serviceName");
+        metaDataDTO.setRuleName("ruleName");
         metaDataDTO.setEnabled(false);
+        
SpringBeanUtils.getInstance().setApplicationContext(mock(ConfigurableApplicationContext.class));
+        
when(SpringBeanUtils.getInstance().getBean(MetaDataPathProvider.class)).thenReturn(pathProvider);
+        when(pathProvider.existed(metaDataDTO.getPath())).thenReturn(null);
         
given(this.metaDataService.createOrUpdate(metaDataDTO)).willReturn(StringUtils.EMPTY);
         
this.mockMvc.perform(MockMvcRequestBuilders.post("/meta-data/createOrUpdate")
                 .contentType(MediaType.APPLICATION_JSON)
@@ -157,13 +174,21 @@ public final class MetaDataControllerTest {
         metaDataDTO.setId("0001");
         metaDataDTO.setAppName("aname-01");
         metaDataDTO.setContextPath("path");
+        metaDataDTO.setPath("/path");
+        metaDataDTO.setRpcType("rpcType");
+        metaDataDTO.setMethodName("methodName");
+        metaDataDTO.setServiceName("serviceName");
+        metaDataDTO.setRuleName("ruleName");
         metaDataDTO.setEnabled(false);
-        
given(this.metaDataService.createOrUpdate(metaDataDTO)).willReturn(AdminConstants.PARAMS_ERROR);
+        
SpringBeanUtils.getInstance().setApplicationContext(mock(ConfigurableApplicationContext.class));
+        
when(SpringBeanUtils.getInstance().getBean(MetaDataPathProvider.class)).thenReturn(pathProvider);
+        when(pathProvider.existed(metaDataDTO.getPath())).thenReturn(true);
         
this.mockMvc.perform(MockMvcRequestBuilders.post("/meta-data/createOrUpdate")
                 .contentType(MediaType.APPLICATION_JSON)
                 .content(GsonUtils.getInstance().toJson(metaDataDTO)))
                 .andExpect(status().isOk())
-                .andExpect(jsonPath("$.message", 
is(AdminConstants.PARAMS_ERROR)))
+                .andExpect(jsonPath("$.code", is(500)))
+                .andExpect(jsonPath("$.message", is("Request error! invalid 
argument [path: The path already exists and can't be added repeatedly!]")))
                 .andReturn();
     }
 
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java
index 6d7e7f2..b451098 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/MetaDataServiceTest.java
@@ -111,8 +111,6 @@ public final class MetaDataServiceTest {
      */
     @Test
     public void testCreateOrUpdate() {
-        testCreateOrUpdateForParamsError();
-        testCreateOrUpdateForPathExist();
         testCreateOrUpdateForInsert();
         testCreateOrUpdateForUpdate();
     }
@@ -237,68 +235,13 @@ public final class MetaDataServiceTest {
         
metaDataService.saveOrUpdateMetaData(MetaDataDO.builder().id("1").build(), new 
MetaDataRegisterDTO());
         verify(metaDataMapper).update(any(MetaDataDO.class));
     }
-
-    /**
-     * Cases where the params error.
-     */
-    private void testCreateOrUpdateForParamsError() {
-        when(metaDataDTO.getAppName())
-                .thenReturn(null)
-                .thenReturn(StringUtils.EMPTY)
-                .thenReturn("AppName");
-        when(metaDataDTO.getPath())
-                .thenReturn(null)
-                .thenReturn(StringUtils.EMPTY)
-                .thenReturn("path");
-        when(metaDataDTO.getRpcType())
-                .thenReturn(null)
-                .thenReturn(StringUtils.EMPTY)
-                .thenReturn("rpcType");
-        when(metaDataDTO.getServiceName())
-                .thenReturn(null)
-                .thenReturn(StringUtils.EMPTY)
-                .thenReturn("serviceName");
-        when(metaDataDTO.getMethodName())
-                .thenReturn(null)
-                .thenReturn(StringUtils.EMPTY)
-                .thenReturn("methodName");
-
-        for (int i = 0; i < 2 * 5; i++) {
-            String msg = metaDataService.createOrUpdate(metaDataDTO);
-            assertEquals(AdminConstants.PARAMS_ERROR, msg);
-        }
-    }
-
-    /**
-     * Cases where check passed or the data path already exists.<br>
-     * The stub declared in createOrUpdateCase1 will not be repeated.
-     */
-    private void testCreateOrUpdateForPathExist() {
-        MetaDataDO metaDataDO = MetaDataDO.builder().id("id1").build();
-        when(metaDataDTO.getId())
-                .thenReturn(null)
-                .thenReturn("id1");
-        when(metaDataMapper.findByPath(anyString()))
-                .thenReturn(null)
-                .thenReturn(metaDataDO);
-
-        for (int i = 0; i < 2; i++) {
-            String msg = metaDataService.createOrUpdate(metaDataDTO);
-            assertEquals(StringUtils.EMPTY, msg);
-        }
-
-        when(metaDataDTO.getId()).thenReturn("id2");
-        String msg = metaDataService.createOrUpdate(metaDataDTO);
-        assertEquals(AdminConstants.DATA_PATH_IS_EXIST, msg);
-    }
-
+    
     /**
      * Cases where check passed and insert operation.<br>
      * The stub declared in createOrUpdateCase1 will not be repeated.
      */
     private void testCreateOrUpdateForInsert() {
         when(metaDataDTO.getId()).thenReturn(null);
-        when(metaDataMapper.findByPath(anyString())).thenReturn(null);
         when(metaDataMapper.insert(any())).thenReturn(1);
         String msg = metaDataService.createOrUpdate(metaDataDTO);
         assertEquals(StringUtils.EMPTY, msg);

Reply via email to