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);