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

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


The following commit(s) were added to refs/heads/master by this push:
     new 79b1ae31b9 Refact/bean utils (#5497)
79b1ae31b9 is described below

commit 79b1ae31b9438b777c0a9c87e5459ea7f00a8bf1
Author: aias00 <[email protected]>
AuthorDate: Mon Mar 18 16:32:00 2024 +0800

    Refact/bean utils (#5497)
    
    * Refact BeanUtils #5487
    
    * Refact BeanUtils #5487
    
    * Refact BeanUtils #5487
    
    * Refact BeanUtils, replace null to Objects.isNull #5487
    
    * Refact BeanUtils, fix error log usage #5487
    
    * Refact BeanUtils, add unit test for AlertTransfer #5487
    
    * Refact BeanUtils, rename methods for AlertTransfer #5487
    
    ---------
    
    Co-authored-by: moremind <[email protected]>
---
 .../shenyu/admin/aspect/DataPermissionAspect.java  |   3 +-
 .../shenyu/admin/exception/ExceptionHandlers.java  |   2 +-
 .../listener/AbstractDataChangedListener.java      |   2 +-
 .../shenyu/admin/model/bean/DocParameter.java      |  20 +++
 .../service/impl/AlertDispatchServiceImpl.java     |   4 +-
 .../service/impl/AlertReceiverServiceImpl.java     |  18 +-
 .../admin/service/impl/DiscoveryServiceImpl.java   |   2 +-
 .../admin/service/impl/MetaDataServiceImpl.java    |   4 +-
 .../service/impl/MockRequestRecordServiceImpl.java |   3 +-
 .../service/impl/ProxySelectorServiceImpl.java     |   4 +-
 .../admin/service/impl/UpstreamCheckService.java   |   2 +-
 .../admin/service/manager/impl/DocManagerImpl.java |   2 +-
 .../manager/impl/LoadServiceDocEntryImpl.java      |   4 +-
 .../manager/impl/PullSwaggerDocServiceImpl.java    |   2 +-
 .../service/manager/impl/SwaggerDocParser.java     |  28 ++--
 .../shenyu/admin/transfer/AlertTransfer.java       | 120 ++++++++++++++
 .../shenyu/admin/transfer/MetaDataTransfer.java    |  23 +++
 .../org/apache/shenyu/admin/utils/HttpUtils.java   |  15 +-
 .../listener/websocket/WebsocketCollectorTest.java |   3 +-
 .../shenyu/admin/model/bean/DocParameterTest.java  |  16 ++
 .../shenyu/admin/transfer/AlertTransferTest.java   | 168 +++++++++++++++++++
 .../admin/transfer/MetaDataTransferTest.java       | 182 +++++++++++++++++++++
 .../plugin/base/fallback/FallbackHandler.java      |   2 +-
 .../sync/data/consul/ConsulSyncDataService.java    |   4 +-
 .../sync/data/polaris/PolarisSyncDataService.java  |   4 +-
 25 files changed, 579 insertions(+), 58 deletions(-)

diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/aspect/DataPermissionAspect.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/aspect/DataPermissionAspect.java
index c5ad252267..04da3aa571 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/aspect/DataPermissionAspect.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/aspect/DataPermissionAspect.java
@@ -31,6 +31,7 @@ import org.aspectj.lang.reflect.MethodSignature;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Stream;
 
 import static 
org.apache.shenyu.common.constant.AdminConstants.DATA_PERMISSION_RULE;
@@ -82,7 +83,7 @@ public class DataPermissionAspect {
     private Object[] getFilterSQLData(final ProceedingJoinPoint point) {
         DataPermission dataPermission = ((MethodSignature) 
point.getSignature()).getMethod().getAnnotation(DataPermission.class);
         Object[] args = point.getArgs();
-        if (dataPermission == null || args == null) {
+        if (Objects.isNull(dataPermission) || Objects.isNull(args)) {
             return args;
         }
         List<String> dataPermissionList = 
dataPermissionService.getDataPermission(JwtUtils.getUserInfo().getUserId());
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 fe17506abd..48cd9077bb 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
@@ -123,7 +123,7 @@ public class ExceptionHandlers {
     
     @ExceptionHandler(ShenyuException.class)
     protected ShenyuAdminResult handleShenyuException(final ShenyuException 
exception) {
-        String message = exception.getCause() == null ? null : 
exception.getCause().getMessage();
+        String message = Objects.isNull(exception.getCause()) ? null : 
exception.getCause().getMessage();
         if (!StringUtils.hasText(message)) {
             message = exception.getMessage();
         }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/AbstractDataChangedListener.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/AbstractDataChangedListener.java
index a302e96049..c9158e7ba1 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/AbstractDataChangedListener.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/AbstractDataChangedListener.java
@@ -270,7 +270,7 @@ public abstract class AbstractDataChangedListener 
implements DataChangedListener
     protected abstract void afterInitialize();
 
     /**
-     * if md5 is not the same as the original, then update lcoal cache.
+     * if md5 is not the same as the original, then update local cache.
      *
      * @param group ConfigGroupEnum
      * @param <T>   the type of class
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/bean/DocParameter.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/bean/DocParameter.java
index 17d85c5cbe..72f6b52963 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/bean/DocParameter.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/bean/DocParameter.java
@@ -228,4 +228,24 @@ public class DocParameter {
     public void setRefs(final List<DocParameter> refs) {
         this.refs = refs;
     }
+
+    /**
+     * copy DocParameter from source.
+     * @param source DocParameter
+     * @return DocParameter
+     */
+    public static DocParameter copy(final DocParameter source) {
+        DocParameter target = new DocParameter();
+        target.setId(source.getId());
+        target.setExample(source.getExample());
+        target.setDescription(source.getDescription());
+        target.setName(source.getName());
+        target.setModule(source.getModule());
+        target.setMaxLength(source.getMaxLength());
+        target.setRefs(source.getRefs());
+        target.setRequired(source.isRequired());
+        target.setType(source.getType());
+        target.setXExample(source.getXExample());
+        return target;
+    }
 }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/AlertDispatchServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/AlertDispatchServiceImpl.java
index 52faab64ec..dc52bed066 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/AlertDispatchServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/AlertDispatchServiceImpl.java
@@ -92,7 +92,7 @@ public class AlertDispatchServiceImpl implements 
AlertDispatchService, Disposabl
     
     @Override
     public boolean sendNoticeMsg(final AlertReceiverDTO receiver, final 
AlarmContent alert) {
-        if (receiver == null || receiver.getType() == null) {
+        if (Objects.isNull(receiver) || Objects.isNull(receiver.getType())) {
             log.warn("DispatcherAlarm-sendNoticeMsg params is empty 
alert:[{}], receiver:[{}]", alert, receiver);
             return false;
         }
@@ -164,7 +164,7 @@ public class AlertDispatchServiceImpl implements 
AlertDispatchService, Disposabl
                     }
                     if (!CollectionUtils.isEmpty(item.getLabels())) {
                         return 
item.getLabels().entrySet().stream().anyMatch(entry -> {
-                            if (alert.getLabels() == null || 
!alert.getLabels().containsKey(entry.getKey())) {
+                            if (Objects.isNull(alert.getLabels()) || 
!alert.getLabels().containsKey(entry.getKey())) {
                                 return false;
                             }
                             String labelValue = 
alert.getLabels().get(entry.getKey());
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/AlertReceiverServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/AlertReceiverServiceImpl.java
index ff8c74837c..b1e43fffa7 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/AlertReceiverServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/AlertReceiverServiceImpl.java
@@ -25,10 +25,10 @@ import org.apache.shenyu.admin.model.page.PageResultUtils;
 import org.apache.shenyu.admin.model.query.AlertReceiverQuery;
 import org.apache.shenyu.admin.service.AlertDispatchService;
 import org.apache.shenyu.admin.service.AlertReceiverService;
+import org.apache.shenyu.admin.transfer.AlertTransfer;
 import org.apache.shenyu.alert.model.AlertReceiverDTO;
 import org.apache.shenyu.common.dto.AlarmContent;
 import org.apache.shenyu.common.utils.UUIDUtils;
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -55,8 +55,7 @@ public class AlertReceiverServiceImpl implements 
AlertReceiverService {
     
     @Override
     public void addReceiver(final AlertReceiverDTO alertReceiverDTO) {
-        AlertReceiverDO receiverDO = new AlertReceiverDO();
-        BeanUtils.copyProperties(alertReceiverDTO, receiverDO);
+        AlertReceiverDO receiverDO = 
AlertTransfer.INSTANCE.mapToAlertReciverDO(alertReceiverDTO);
         receiverDO.setId(UUIDUtils.getInstance().generateShortUuid());
         Timestamp currentTime = new Timestamp(System.currentTimeMillis());
         receiverDO.setDateCreated(currentTime);
@@ -73,8 +72,7 @@ public class AlertReceiverServiceImpl implements 
AlertReceiverService {
     
     @Override
     public void updateReceiver(final AlertReceiverDTO alertReceiverDTO) {
-        AlertReceiverDO receiverDO = new AlertReceiverDO();
-        BeanUtils.copyProperties(alertReceiverDTO, receiverDO);
+        AlertReceiverDO receiverDO = 
AlertTransfer.INSTANCE.mapToAlertReciverDO(alertReceiverDTO);
         alertDispatchService.clearCache();
         alertReceiverMapper.updateByPrimaryKey(receiverDO);
     }
@@ -90,21 +88,15 @@ public class AlertReceiverServiceImpl implements 
AlertReceiverService {
         return PageResultUtils.result(receiverQuery.getPageParameter(), 
             () -> alertReceiverMapper.selectByQuery(receiverQuery)
                           .stream()
-                          .map(item -> {
-                              AlertReceiverDTO receiverDTO = new 
AlertReceiverDTO();
-                              BeanUtils.copyProperties(item, receiverDTO);
-                              return receiverDTO;
-                          })
+                          .map(AlertTransfer.INSTANCE::mapToAlertReceiverDTO)
                           .collect(Collectors.toList()));
     }
     
     @Override
     public AlertReceiverDTO detail(final String id) {
-        AlertReceiverDTO receiverDTO = new AlertReceiverDTO();
         AlertReceiverDO receiverDO = 
alertReceiverMapper.selectByPrimaryKey(id);
         if (receiverDO != null) {
-            BeanUtils.copyProperties(receiverDO, receiverDTO);
-            return receiverDTO;
+            return AlertTransfer.INSTANCE.mapToAlertReceiverDTO(receiverDO);
         } else {
             return null;
         }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DiscoveryServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DiscoveryServiceImpl.java
index ce0115821a..069cfdfa55 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DiscoveryServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/DiscoveryServiceImpl.java
@@ -223,7 +223,7 @@ public class DiscoveryServiceImpl implements 
DiscoveryService {
     }
 
     private DiscoveryVO update(final DiscoveryDTO discoveryDTO) {
-        if (discoveryDTO == null || discoveryDTO.getId() == null) {
+        if (Objects.isNull(discoveryDTO) || 
Objects.isNull(discoveryDTO.getId())) {
             return null;
         }
         Timestamp currentTime = new Timestamp(System.currentTimeMillis());
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 c96885edbf..926919e215 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
@@ -44,7 +44,6 @@ 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.beans.BeanUtils;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -259,8 +258,7 @@ public class MetaDataServiceImpl implements MetaDataService 
{
             final List<MetaDataDO> befores = 
Optional.ofNullable(metaDataMapper.findByServiceNameAndMethod(
                     metaDataDO.getServiceName(), 
null)).orElseGet(LinkedList::new);
             for (MetaDataDO b : befores) {
-                MetaDataDO update = new MetaDataDO();
-                BeanUtils.copyProperties(b, update);
+                MetaDataDO update = MetaDataTransfer.INSTANCE.copy(b);
                 update.setRpcExt(metaDataDTO.getRpcExt());
                 if (metaDataMapper.update(update) > 0) {
                     publisher.onUpdated(update, b);
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/MockRequestRecordServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/MockRequestRecordServiceImpl.java
index 37dce12ef9..d9cb7e49cf 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/MockRequestRecordServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/MockRequestRecordServiceImpl.java
@@ -31,6 +31,7 @@ import org.springframework.stereotype.Service;
 
 import java.sql.Timestamp;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -85,7 +86,7 @@ public class MockRequestRecordServiceImpl implements 
MockRequestRecordService {
     }
 
     private int update(final MockRequestRecordDTO mockRequestRecordDTO) {
-        if (mockRequestRecordDTO == null || mockRequestRecordDTO.getId() == 
null) {
+        if (Objects.isNull(mockRequestRecordDTO) || 
Objects.isNull(mockRequestRecordDTO.getId())) {
             return 0;
         }
         Timestamp currentTime = new Timestamp(System.currentTimeMillis());
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ProxySelectorServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ProxySelectorServiceImpl.java
index d2ad56a3dc..d466914d35 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ProxySelectorServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/ProxySelectorServiceImpl.java
@@ -226,7 +226,7 @@ public class ProxySelectorServiceImpl implements 
ProxySelectorService {
                         .dateCreated(currentTime)
                         .dateUpdated(currentTime)
                         .listenerNode(proxySelectorAddDTO.getListenerNode())
-                        .handler(proxySelectorAddDTO.getHandler() == null ? "" 
: proxySelectorAddDTO.getHandler())
+                        
.handler(Objects.isNull(proxySelectorAddDTO.getHandler()) ? "" : 
proxySelectorAddDTO.getHandler())
                         .props(proxySelectorAddDTO.getProps())
                         .build();
                 discoveryHandlerMapper.insertSelective(discoveryHandlerDO);
@@ -310,7 +310,7 @@ public class ProxySelectorServiceImpl implements 
ProxySelectorService {
                 .dateCreated(currentTime)
                 .dateUpdated(currentTime)
                 .listenerNode(proxySelectorAddDTO.getListenerNode())
-                .handler(proxySelectorAddDTO.getHandler() == null ? "" : 
proxySelectorAddDTO.getHandler())
+                .handler(Objects.isNull(proxySelectorAddDTO.getHandler()) ? "" 
: proxySelectorAddDTO.getHandler())
                 .props(proxySelectorAddDTO.getProps())
                 .build();
         discoveryHandlerMapper.insertSelective(discoveryHandlerDO);
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/UpstreamCheckService.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/UpstreamCheckService.java
index c7e687bdf5..142cec04bb 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/UpstreamCheckService.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/UpstreamCheckService.java
@@ -326,7 +326,7 @@ public class UpstreamCheckService {
                 }
                 return null;
             }, invokeExecutor).exceptionally(ex -> {
-                LOG.error("An exception occurred during the check of url {}: 
{}", commonUpstream.getUpstreamUrl(), ex);
+                LOG.error("An exception occurred during the check of url {}: 
", commonUpstream.getUpstreamUrl(), ex);
                 return null;
             }));
         }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/manager/impl/DocManagerImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/manager/impl/DocManagerImpl.java
index f65904606a..96fb285cc2 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/manager/impl/DocManagerImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/manager/impl/DocManagerImpl.java
@@ -154,7 +154,7 @@ public class DocManagerImpl implements DocManager {
             docInfo.setContextPath(contexPath);
             return docInfo;
         } catch (Exception e) {
-            LOG.error("getDocInfo clusterName={} error={} ", clusterName, e);
+            LOG.error("getDocInfo clusterName={} error", clusterName, e);
             return null;
         }
     }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/manager/impl/LoadServiceDocEntryImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/manager/impl/LoadServiceDocEntryImpl.java
index ab47269fe4..07dadf27a1 100755
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/manager/impl/LoadServiceDocEntryImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/manager/impl/LoadServiceDocEntryImpl.java
@@ -156,7 +156,7 @@ public class LoadServiceDocEntryImpl implements 
LoadServiceDocEntry {
                     return instance;
                 }).collect(Collectors.toList());
             } catch (Exception e) {
-                LOG.error("Error getting cluster instance list. contextPath={} 
error={}", contextPath, e);
+                LOG.error("Error getting cluster instance list. contextPath={} 
error", contextPath, e);
                 return Collections.emptyList();
             }
         }
@@ -241,7 +241,7 @@ public class LoadServiceDocEntryImpl implements 
LoadServiceDocEntry {
                     return instance;
                 }).collect(Collectors.toList());
             } catch (Exception e) {
-                LOG.error("Error getting cluster instance list. contextPath={} 
error={}", contextPath, e);
+                LOG.error("Error getting cluster instance list. contextPath={} 
error", contextPath, e);
                 return Collections.emptyList();
             }
         }
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/manager/impl/PullSwaggerDocServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/manager/impl/PullSwaggerDocServiceImpl.java
index c9c4a31afb..58e2a73eb5 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/manager/impl/PullSwaggerDocServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/manager/impl/PullSwaggerDocServiceImpl.java
@@ -114,7 +114,7 @@ public class PullSwaggerDocServiceImpl implements 
PullSwaggerDocService {
             );
             tagExt.setRefreshTime(newRefreshTime);
         } catch (Exception e) {
-            LOG.error("add api document fail. clusterName={} url={} error={}", 
instance.getClusterName(), url, e);
+            LOG.error("add api document fail. clusterName={} url={} error", 
instance.getClusterName(), url, e);
         } finally {
             tagExt.setDocLock(null);
             //Save the time of the last updated document and the newMd5 of 
apidoc.
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/manager/impl/SwaggerDocParser.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/manager/impl/SwaggerDocParser.java
index 5d33b241cf..f7afed202e 100755
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/manager/impl/SwaggerDocParser.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/manager/impl/SwaggerDocParser.java
@@ -18,19 +18,8 @@
 package org.apache.shenyu.admin.service.manager.impl;
 
 import com.google.common.collect.Sets;
-import com.google.gson.JsonElement;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-
 import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
 import org.apache.commons.collections4.CollectionUtils;
@@ -42,7 +31,17 @@ import org.apache.shenyu.admin.model.bean.DocModule;
 import org.apache.shenyu.admin.model.bean.DocParameter;
 import org.apache.shenyu.admin.service.manager.DocParser;
 import org.apache.shenyu.common.utils.GsonUtils;
-import org.springframework.beans.BeanUtils;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * Parse the JSON content of swagger.
@@ -206,8 +205,7 @@ public class SwaggerDocParser implements DocParser {
                 int index = name.indexOf('.');
                 String module = name.substring(0, index);
                 String newName = name.substring(index + 1);
-                DocParameter ret = new DocParameter();
-                BeanUtils.copyProperties(docParameter, ret);
+                DocParameter ret = DocParameter.copy(docParameter);
                 ret.setName(newName);
                 ret.setModule(module);
                 return ret;
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/transfer/AlertTransfer.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/transfer/AlertTransfer.java
new file mode 100644
index 0000000000..6e00fcbcd5
--- /dev/null
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/transfer/AlertTransfer.java
@@ -0,0 +1,120 @@
+/*
+ * 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.transfer;
+
+import org.apache.shenyu.admin.model.entity.AlertReceiverDO;
+import org.apache.shenyu.alert.model.AlertReceiverDTO;
+
+import java.util.Optional;
+
+/**
+ * The Alert transfer.
+ */
+public enum AlertTransfer {
+
+    /**
+     * The constant INSTANCE.
+     */
+    INSTANCE;
+
+    /**
+     * Map to entity alert receiver do.
+     *
+     * @param alertReceiverDTO the alert receiver dto
+     * @return the alert receiver do
+     */
+    public AlertReceiverDO mapToAlertReciverDO(final AlertReceiverDTO 
alertReceiverDTO) {
+        return Optional.ofNullable(alertReceiverDTO)
+                .map(v -> {
+                    AlertReceiverDO alertReceiverDO = new AlertReceiverDO();
+                    alertReceiverDO.setId(alertReceiverDTO.getId());
+                    alertReceiverDO.setName(alertReceiverDTO.getName());
+                    
alertReceiverDO.setAccessToken(alertReceiverDTO.getAccessToken());
+                    alertReceiverDO.setAgentId(alertReceiverDTO.getAgentId());
+                    alertReceiverDO.setCorpId(alertReceiverDTO.getCorpId());
+                    
alertReceiverDO.setAppSecret(alertReceiverDTO.getAppSecret());
+                    
alertReceiverDO.setDiscordBotToken(alertReceiverDTO.getDiscordBotToken());
+                    
alertReceiverDO.setDiscordChannelId(alertReceiverDTO.getDiscordChannelId());
+                    alertReceiverDO.setEmail(alertReceiverDTO.getEmail());
+                    
alertReceiverDO.setWechatId(alertReceiverDTO.getWechatId());
+                    alertReceiverDO.setEnable(alertReceiverDTO.isEnable());
+                    alertReceiverDO.setHookUrl(alertReceiverDTO.getHookUrl());
+                    alertReceiverDO.setType(alertReceiverDTO.getType());
+                    alertReceiverDO.setLabels(alertReceiverDTO.getLabels());
+                    alertReceiverDO.setLevels(alertReceiverDTO.getLevels());
+                    
alertReceiverDO.setTgUserId(alertReceiverDTO.getTgUserId());
+                    
alertReceiverDO.setTgBotToken(alertReceiverDTO.getTgBotToken());
+                    alertReceiverDO.setSmnSk(alertReceiverDTO.getSmnSk());
+                    alertReceiverDO.setSmnAk(alertReceiverDTO.getSmnAk());
+                    
alertReceiverDO.setSmnProjectId(alertReceiverDTO.getSmnProjectId());
+                    
alertReceiverDO.setSmnTopicUrn(alertReceiverDTO.getSmnTopicUrn());
+                    
alertReceiverDO.setSmnRegion(alertReceiverDTO.getSmnRegion());
+                    alertReceiverDO.setPhone(alertReceiverDTO.getPhone());
+                    alertReceiverDO.setMatchAll(alertReceiverDTO.isMatchAll());
+                    
alertReceiverDO.setSlackWebHookUrl(alertReceiverDTO.getSlackWebHookUrl());
+                    
alertReceiverDO.setDateCreated(alertReceiverDTO.getDateCreated());
+                    
alertReceiverDO.setDateUpdated(alertReceiverDTO.getDateUpdated());
+                    return alertReceiverDO;
+                })
+                .orElse(null);
+    }
+
+    /**
+     * Map to alert receiver dto.
+     *
+     * @param alertReceiverDO the alert receiver do
+     * @return the alert receiver do
+     */
+    public AlertReceiverDTO mapToAlertReceiverDTO(final AlertReceiverDO 
alertReceiverDO) {
+        return Optional.ofNullable(alertReceiverDO)
+                .map(v -> {
+                    AlertReceiverDTO alertReceiverDTO = new AlertReceiverDTO();
+                    alertReceiverDTO.setId(alertReceiverDO.getId());
+                    alertReceiverDTO.setName(alertReceiverDO.getName());
+                    
alertReceiverDTO.setAccessToken(alertReceiverDO.getAccessToken());
+                    alertReceiverDTO.setAgentId(alertReceiverDO.getAgentId());
+                    alertReceiverDTO.setCorpId(alertReceiverDO.getCorpId());
+                    
alertReceiverDTO.setAppSecret(alertReceiverDO.getAppSecret());
+                    
alertReceiverDTO.setDiscordBotToken(alertReceiverDO.getDiscordBotToken());
+                    
alertReceiverDTO.setDiscordChannelId(alertReceiverDO.getDiscordChannelId());
+                    alertReceiverDTO.setEmail(alertReceiverDO.getEmail());
+                    
alertReceiverDTO.setWechatId(alertReceiverDO.getWechatId());
+                    alertReceiverDTO.setEnable(alertReceiverDO.isEnable());
+                    alertReceiverDTO.setHookUrl(alertReceiverDO.getHookUrl());
+                    alertReceiverDTO.setType(alertReceiverDO.getType());
+                    alertReceiverDTO.setLabels(alertReceiverDO.getLabels());
+                    alertReceiverDTO.setLevels(alertReceiverDO.getLevels());
+                    
alertReceiverDTO.setTgUserId(alertReceiverDO.getTgUserId());
+                    
alertReceiverDTO.setTgBotToken(alertReceiverDO.getTgBotToken());
+                    alertReceiverDTO.setSmnSk(alertReceiverDO.getSmnSk());
+                    alertReceiverDTO.setSmnAk(alertReceiverDO.getSmnAk());
+                    
alertReceiverDTO.setSmnProjectId(alertReceiverDO.getSmnProjectId());
+                    
alertReceiverDTO.setSmnTopicUrn(alertReceiverDO.getSmnTopicUrn());
+                    
alertReceiverDTO.setSmnRegion(alertReceiverDO.getSmnRegion());
+                    alertReceiverDTO.setPhone(alertReceiverDO.getPhone());
+                    alertReceiverDTO.setMatchAll(alertReceiverDO.isMatchAll());
+                    
alertReceiverDTO.setSlackWebHookUrl(alertReceiverDO.getSlackWebHookUrl());
+                    
alertReceiverDTO.setDateCreated(alertReceiverDO.getDateCreated());
+                    
alertReceiverDTO.setDateUpdated(alertReceiverDO.getDateUpdated());
+                    return alertReceiverDTO;
+                })
+                .orElse(null);
+    }
+
+
+}
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/transfer/MetaDataTransfer.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/transfer/MetaDataTransfer.java
index e30982b75c..305c4ec5b6 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/transfer/MetaDataTransfer.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/transfer/MetaDataTransfer.java
@@ -83,6 +83,29 @@ public enum MetaDataTransfer {
                 .orElse(null);
     }
 
+    /**
+     * COpy to entity meta data do.
+     *
+     * @param metaDataDO the meta data source do
+     * @return the meta data do
+     */
+    public MetaDataDO copy(final MetaDataDO metaDataDO) {
+        return Optional.ofNullable(metaDataDO)
+                .map(source -> MetaDataDO.builder()
+                        .id(source.getId())
+                        .appName(source.getAppName())
+                        .path(source.getPath())
+                        .pathDesc(source.getPathDesc())
+                        .rpcType(source.getRpcType())
+                        .serviceName(source.getServiceName())
+                        .methodName(source.getMethodName())
+                        .parameterTypes(source.getParameterTypes())
+                        .rpcExt(source.getRpcExt())
+                        .enabled(source.getEnabled())
+                        .build())
+                .orElse(null);
+    }
+
     /**
      * Map to data meta data.
      *
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/utils/HttpUtils.java 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/utils/HttpUtils.java
index 56ffe68b52..681032ecf2 100644
--- a/shenyu-admin/src/main/java/org/apache/shenyu/admin/utils/HttpUtils.java
+++ b/shenyu-admin/src/main/java/org/apache/shenyu/admin/utils/HttpUtils.java
@@ -346,14 +346,15 @@ public class HttpUtils {
         addHeader(requestBuilder, header);
 
         Request request = requestBuilder.build();
-        Response response = httpClient
-            .newCall(request)
-            .execute();
-        if (response.isSuccessful()) {
-            ResponseBody body = response.body();
-            return body == null ? null : body.byteStream();
+        try (Response response = httpClient
+                .newCall(request)
+                .execute()) {
+            if (response.isSuccessful()) {
+                ResponseBody body = response.body();
+                return Objects.isNull(body) ? null : body.byteStream();
+            }
+            return null;
         }
-        return null;
     }
 
     /**
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/listener/websocket/WebsocketCollectorTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/listener/websocket/WebsocketCollectorTest.java
index 3f5b460cd9..c0777fd123 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/listener/websocket/WebsocketCollectorTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/listener/websocket/WebsocketCollectorTest.java
@@ -39,6 +39,7 @@ import org.springframework.test.util.ReflectionTestUtils;
 import javax.websocket.RemoteEndpoint;
 import javax.websocket.Session;
 import java.io.IOException;
+import java.util.Objects;
 import java.util.Set;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -153,7 +154,7 @@ public final class WebsocketCollectorTest {
 
     private long getSessionSetSize() {
         Set sessionSet = (Set) 
ReflectionTestUtils.getField(WebsocketCollector.class, "SESSION_SET");
-        return sessionSet == null ? -1 : sessionSet.size();
+        return Objects.isNull(sessionSet) ? -1 : sessionSet.size();
     }
 
     private Session getSession() {
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/model/bean/DocParameterTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/model/bean/DocParameterTest.java
index fdc2563fbb..0d1f18bee4 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/model/bean/DocParameterTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/model/bean/DocParameterTest.java
@@ -67,4 +67,20 @@ public final class DocParameterTest {
         final String example = docParameter.getExample();
         assertEquals("shenyuXExample", docParameter.getExample());
     }
+
+    @Test
+    public void testCopy() {
+        DocParameter copied = DocParameter.copy(docParameter);
+        assertEquals("shenyuDescription", copied.getDescription());
+        assertEquals(0, copied.getId().intValue());
+        assertEquals("shenyuMaxLength", copied.getMaxLength());
+        assertEquals("shenyuSetModule", copied.getModule());
+        assertEquals("shenyuName", copied.getName());
+        assertTrue(copied.isRequired());
+        assertEquals("shenyuType", copied.getType());
+        assertEquals("shenyuXExample", copied.getXExample());
+
+        copied.setRefs(Collections.singletonList(copied));
+        assertEquals(Collections.singletonList(copied), copied.getRefs());
+    }
 }
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/transfer/AlertTransferTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/transfer/AlertTransferTest.java
new file mode 100644
index 0000000000..49ab33059b
--- /dev/null
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/transfer/AlertTransferTest.java
@@ -0,0 +1,168 @@
+/*
+ * 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.transfer;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.apache.shenyu.admin.model.entity.AlertReceiverDO;
+import org.apache.shenyu.alert.model.AlertReceiverDTO;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.sql.Timestamp;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+/**
+ * test cast for {@link AlertTransfer}.
+ */
+public final class AlertTransferTest {
+
+    private AlertReceiverDTO alertReceiverDTO;
+
+    private AlertReceiverDO alertReceiverDO;
+
+    @BeforeEach
+    public void setUp() {
+        alertReceiverDTO = new AlertReceiverDTO();
+        alertReceiverDTO.setId("123");
+        alertReceiverDTO.setName("123");
+        alertReceiverDTO.setAccessToken("123");
+        alertReceiverDTO.setAgentId("123");
+        alertReceiverDTO.setCorpId("123");
+        alertReceiverDTO.setAppSecret("123");
+        alertReceiverDTO.setDiscordBotToken("123");
+        alertReceiverDTO.setDiscordChannelId("123");
+        alertReceiverDTO.setEmail("123");
+        alertReceiverDTO.setWechatId("123");
+        alertReceiverDTO.setEnable(true);
+        alertReceiverDTO.setHookUrl("123");
+        alertReceiverDTO.setType(Byte.valueOf("10"));
+        alertReceiverDTO.setLabels(Maps.newHashMap());
+        alertReceiverDTO.setLevels(Lists.newArrayList());
+        alertReceiverDTO.setTgUserId("123");
+        alertReceiverDTO.setTgBotToken("123");
+        alertReceiverDTO.setSmnSk("123");
+        alertReceiverDTO.setSmnAk("123");
+        alertReceiverDTO.setSmnProjectId("123");
+        alertReceiverDTO.setSmnTopicUrn("123");
+        alertReceiverDTO.setSmnRegion("123");
+        alertReceiverDTO.setPhone("123");
+        alertReceiverDTO.setMatchAll(true);
+        alertReceiverDTO.setSlackWebHookUrl("123");
+        Timestamp currentTime = new Timestamp(System.currentTimeMillis());
+        alertReceiverDTO.setDateCreated(currentTime);
+        alertReceiverDTO.setDateUpdated(currentTime);
+
+        alertReceiverDO = new AlertReceiverDO();
+        alertReceiverDO.setId("123");
+        alertReceiverDO.setName("123");
+        alertReceiverDO.setAccessToken("123");
+        alertReceiverDO.setAgentId("123");
+        alertReceiverDO.setCorpId("123");
+        alertReceiverDO.setAppSecret("123");
+        alertReceiverDO.setDiscordBotToken("123");
+        alertReceiverDO.setDiscordChannelId("123");
+        alertReceiverDO.setEmail("123");
+        alertReceiverDO.setWechatId("123");
+        alertReceiverDO.setEnable(true);
+        alertReceiverDO.setHookUrl("123");
+        alertReceiverDO.setType(Byte.valueOf("10"));
+        alertReceiverDO.setLabels(Maps.newHashMap());
+        alertReceiverDO.setLevels(Lists.newArrayList());
+        alertReceiverDO.setTgUserId("123");
+        alertReceiverDO.setTgBotToken("123");
+        alertReceiverDO.setSmnSk("123");
+        alertReceiverDO.setSmnAk("123");
+        alertReceiverDO.setSmnProjectId("123");
+        alertReceiverDO.setSmnTopicUrn("123");
+        alertReceiverDO.setSmnRegion("123");
+        alertReceiverDO.setPhone("123");
+        alertReceiverDO.setMatchAll(true);
+        alertReceiverDO.setSlackWebHookUrl("123");
+        alertReceiverDO.setDateCreated(currentTime);
+        alertReceiverDO.setDateUpdated(currentTime);
+    }
+
+    @Test
+    void testMapToEntity() {
+        AlertReceiverDO entity = 
AlertTransfer.INSTANCE.mapToAlertReciverDO(alertReceiverDTO);
+        assertNotNull(entity);
+        assertEquals(entity.getId(), alertReceiverDTO.getId());
+        assertEquals(entity.getName(), alertReceiverDTO.getName());
+        assertEquals(entity.getAccessToken(), 
alertReceiverDTO.getAccessToken());
+        assertEquals(entity.getAgentId(), alertReceiverDTO.getAgentId());
+        assertEquals(entity.getCorpId(), alertReceiverDTO.getCorpId());
+        assertEquals(entity.getAppSecret(), alertReceiverDTO.getAppSecret());
+        assertEquals(entity.getDiscordBotToken(), 
alertReceiverDTO.getDiscordBotToken());
+        assertEquals(entity.getDiscordChannelId(), 
alertReceiverDTO.getDiscordChannelId());
+        assertEquals(entity.getEmail(), alertReceiverDTO.getEmail());
+        assertEquals(entity.getWechatId(), alertReceiverDTO.getWechatId());
+        assertEquals(entity.isEnable(), alertReceiverDTO.isEnable());
+        assertEquals(entity.getHookUrl(), alertReceiverDTO.getHookUrl());
+        assertEquals(entity.getType(), alertReceiverDTO.getType());
+        assertEquals(entity.getLabels(), alertReceiverDTO.getLabels());
+        assertEquals(entity.getLevels(), alertReceiverDTO.getLevels());
+        assertEquals(entity.getTgUserId(), alertReceiverDTO.getTgUserId());
+        assertEquals(entity.getTgBotToken(), alertReceiverDTO.getTgBotToken());
+        assertEquals(entity.getSmnSk(), alertReceiverDTO.getSmnSk());
+        assertEquals(entity.getSmnAk(), alertReceiverDTO.getSmnAk());
+        assertEquals(entity.getSmnProjectId(), 
alertReceiverDTO.getSmnProjectId());
+        assertEquals(entity.getSmnTopicUrn(), 
alertReceiverDTO.getSmnTopicUrn());
+        assertEquals(entity.getSmnRegion(), alertReceiverDTO.getSmnRegion());
+        assertEquals(entity.getPhone(), alertReceiverDTO.getPhone());
+        assertEquals(entity.isMatchAll(), alertReceiverDTO.isMatchAll());
+        assertEquals(entity.getSlackWebHookUrl(), 
alertReceiverDTO.getSlackWebHookUrl());
+        assertEquals(entity.getDateCreated(), 
alertReceiverDTO.getDateCreated());
+        assertEquals(entity.getDateUpdated(), 
alertReceiverDTO.getDateUpdated());
+    }
+
+    @Test
+    void testMapToDTO() {
+        AlertReceiverDTO dto = 
AlertTransfer.INSTANCE.mapToAlertReceiverDTO(alertReceiverDO);
+        assertNotNull(dto);
+        assertEquals(dto.getId(), alertReceiverDO.getId());
+        assertEquals(dto.getName(), alertReceiverDO.getName());
+        assertEquals(dto.getAccessToken(), alertReceiverDO.getAccessToken());
+        assertEquals(dto.getAgentId(), alertReceiverDO.getAgentId());
+        assertEquals(dto.getCorpId(), alertReceiverDO.getCorpId());
+        assertEquals(dto.getAppSecret(), alertReceiverDO.getAppSecret());
+        assertEquals(dto.getDiscordBotToken(), 
alertReceiverDO.getDiscordBotToken());
+        assertEquals(dto.getDiscordChannelId(), 
alertReceiverDO.getDiscordChannelId());
+        assertEquals(dto.getEmail(), alertReceiverDO.getEmail());
+        assertEquals(dto.getWechatId(), alertReceiverDO.getWechatId());
+        assertEquals(dto.isEnable(), alertReceiverDO.isEnable());
+        assertEquals(dto.getHookUrl(), alertReceiverDO.getHookUrl());
+        assertEquals(dto.getType(), alertReceiverDO.getType());
+        assertEquals(dto.getLabels(), alertReceiverDO.getLabels());
+        assertEquals(dto.getLevels(), alertReceiverDO.getLevels());
+        assertEquals(dto.getTgUserId(), alertReceiverDO.getTgUserId());
+        assertEquals(dto.getTgBotToken(), alertReceiverDO.getTgBotToken());
+        assertEquals(dto.getSmnSk(), alertReceiverDO.getSmnSk());
+        assertEquals(dto.getSmnAk(), alertReceiverDO.getSmnAk());
+        assertEquals(dto.getSmnProjectId(), alertReceiverDO.getSmnProjectId());
+        assertEquals(dto.getSmnTopicUrn(), alertReceiverDO.getSmnTopicUrn());
+        assertEquals(dto.getSmnRegion(), alertReceiverDO.getSmnRegion());
+        assertEquals(dto.getPhone(), alertReceiverDO.getPhone());
+        assertEquals(dto.isMatchAll(), alertReceiverDO.isMatchAll());
+        assertEquals(dto.getSlackWebHookUrl(), 
alertReceiverDO.getSlackWebHookUrl());
+        assertEquals(dto.getDateCreated(), alertReceiverDO.getDateCreated());
+        assertEquals(dto.getDateUpdated(), alertReceiverDO.getDateUpdated());
+    }
+}
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/transfer/MetaDataTransferTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/transfer/MetaDataTransferTest.java
new file mode 100644
index 0000000000..9f6c04b29e
--- /dev/null
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/transfer/MetaDataTransferTest.java
@@ -0,0 +1,182 @@
+/*
+ * 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.transfer;
+
+import org.apache.shenyu.admin.model.dto.MetaDataDTO;
+import org.apache.shenyu.admin.model.entity.MetaDataDO;
+import org.apache.shenyu.admin.model.vo.MetaDataVO;
+import org.apache.shenyu.common.dto.MetaData;
+import org.apache.shenyu.register.common.dto.MetaDataRegisterDTO;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+/**
+ * test cast for {@link MetaDataTransfer}.
+ */
+public final class MetaDataTransferTest {
+
+    private MetaDataDTO metaDataDTO;
+
+    private MetaDataRegisterDTO metaDataRegisterDTO;
+
+    @BeforeEach
+    public void setUp() {
+        metaDataDTO = new MetaDataDTO();
+        metaDataDTO.setId("id123");
+        metaDataDTO.setAppName("appName123");
+        metaDataDTO.setPath("/app");
+        metaDataDTO.setEnabled(true);
+        metaDataDTO.setMethodName("methodName123");
+        metaDataDTO.setContextPath("/http");
+        metaDataDTO.setParameterTypes("String");
+        metaDataDTO.setPathDesc("desc");
+        metaDataDTO.setRpcType("http");
+        metaDataDTO.setRpcExt("none");
+        metaDataDTO.setRuleName("ruleName123");
+        metaDataDTO.setServiceName("serviceName123");
+
+
+        metaDataRegisterDTO = new MetaDataRegisterDTO();
+        metaDataRegisterDTO.setAppName("appName123");
+        metaDataRegisterDTO.setPath("/app");
+        metaDataRegisterDTO.setEnabled(true);
+        metaDataRegisterDTO.setMethodName("methodName123");
+        metaDataRegisterDTO.setContextPath("/http");
+        metaDataRegisterDTO.setParameterTypes("String");
+        metaDataRegisterDTO.setPathDesc("desc");
+        metaDataRegisterDTO.setRpcType("http");
+        metaDataRegisterDTO.setRpcExt("none");
+        metaDataRegisterDTO.setRuleName("ruleName123");
+        metaDataRegisterDTO.setServiceName("serviceName123");
+    }
+
+    @Test
+    public void testMapToEntity() {
+        MetaDataDO metaDataDO = 
MetaDataTransfer.INSTANCE.mapToEntity(metaDataDTO);
+        assertEquals("id123", metaDataDO.getId());
+        assertEquals("appName123", metaDataDO.getAppName());
+        assertEquals(true, metaDataDO.getEnabled());
+        assertEquals("methodName123", metaDataDO.getMethodName());
+        assertEquals("String", metaDataDO.getParameterTypes());
+        assertEquals("desc", metaDataDO.getPathDesc());
+        assertEquals("http", metaDataDO.getRpcType());
+        assertEquals("none", metaDataDO.getRpcExt());
+        assertEquals("serviceName123", metaDataDO.getServiceName());
+    }
+
+    @Test
+    public void testMapRegisterDTOToEntity() {
+        MetaDataDO metaDataDO = 
MetaDataTransfer.INSTANCE.mapRegisterDTOToEntity(metaDataRegisterDTO);
+        assertNull(null, metaDataDO.getId());
+        assertEquals("appName123", metaDataDO.getAppName());
+        assertEquals(true, metaDataDO.getEnabled());
+        assertEquals("methodName123", metaDataDO.getMethodName());
+        assertEquals("String", metaDataDO.getParameterTypes());
+        assertEquals("desc", metaDataDO.getPathDesc());
+        assertEquals("http", metaDataDO.getRpcType());
+        assertEquals("none", metaDataDO.getRpcExt());
+        assertEquals("serviceName123", metaDataDO.getServiceName());
+    }
+
+    @Test
+    public void testCopy() {
+        MetaDataDO metaDataDO = 
MetaDataTransfer.INSTANCE.mapToEntity(metaDataDTO);
+        MetaDataDO copied = MetaDataTransfer.INSTANCE.copy(metaDataDO);
+        assertEquals("id123", copied.getId());
+        assertEquals("appName123", copied.getAppName());
+        assertEquals(true, copied.getEnabled());
+        assertEquals("methodName123", copied.getMethodName());
+        assertEquals("String", copied.getParameterTypes());
+        assertEquals("desc", copied.getPathDesc());
+        assertEquals("http", copied.getRpcType());
+        assertEquals("none", copied.getRpcExt());
+        assertEquals("serviceName123", copied.getServiceName());
+    }
+
+    @Test
+    public void testMapToData() {
+        MetaDataDO metaDataDO = 
MetaDataTransfer.INSTANCE.mapToEntity(metaDataDTO);
+        MetaData metaData = MetaDataTransfer.INSTANCE.mapToData(metaDataDO);
+        assertEquals("id123", metaData.getId());
+        assertEquals("appName123", metaData.getAppName());
+        assertEquals(true, metaData.getEnabled());
+        assertEquals("methodName123", metaData.getMethodName());
+        assertEquals("String", metaData.getParameterTypes());
+        assertEquals("http", metaData.getRpcType());
+        assertEquals("none", metaData.getRpcExt());
+        assertEquals("serviceName123", metaData.getServiceName());
+    }
+
+    @Test
+    public void testMapToDataAll() {
+        MetaDataDO metaDataDO = 
MetaDataTransfer.INSTANCE.mapToEntity(metaDataDTO);
+        List<MetaDataDO> metaDataDOList = 
Collections.singletonList(metaDataDO);
+        List<MetaData> metaDataList = 
MetaDataTransfer.INSTANCE.mapToDataAll(metaDataDOList);
+
+        assertEquals(metaDataDOList.size(), metaDataList.size());
+
+        MetaData metaData = metaDataList.get(0);
+        assertEquals("id123", metaData.getId());
+        assertEquals("appName123", metaData.getAppName());
+        assertEquals(true, metaData.getEnabled());
+        assertEquals("methodName123", metaData.getMethodName());
+        assertEquals("String", metaData.getParameterTypes());
+        assertEquals("http", metaData.getRpcType());
+        assertEquals("none", metaData.getRpcExt());
+        assertEquals("serviceName123", metaData.getServiceName());
+    }
+
+    @Test
+    public void testMapToVO() {
+        MetaDataDO metaDataDO = 
MetaDataTransfer.INSTANCE.mapToEntity(metaDataDTO);
+        MetaDataVO metaDataVO = MetaDataTransfer.INSTANCE.mapToVO(metaDataDO);
+        assertEquals("id123", metaDataVO.getId());
+        assertEquals("appName123", metaDataVO.getAppName());
+        assertEquals(true, metaDataVO.getEnabled());
+        assertEquals("methodName123", metaDataVO.getMethodName());
+        assertEquals("String", metaDataVO.getParameterTypes());
+        assertEquals("desc", metaDataVO.getPathDesc());
+        assertEquals("http", metaDataVO.getRpcType());
+        assertEquals("none", metaDataVO.getRpcExt());
+        assertEquals("serviceName123", metaDataVO.getServiceName());
+    }
+
+    @Test
+    public void testMapToVOList() {
+        MetaDataDO metaDataDO = 
MetaDataTransfer.INSTANCE.mapToEntity(metaDataDTO);
+        List<MetaDataDO> metaDataDOList = 
Collections.singletonList(metaDataDO);
+        List<MetaDataVO> metaDataVOList = 
MetaDataTransfer.INSTANCE.mapToVOList(metaDataDOList);
+        assertEquals(metaDataDOList.size(), metaDataVOList.size());
+        MetaDataVO metaDataVO = metaDataVOList.get(0);
+        assertEquals("id123", metaDataVO.getId());
+        assertEquals("appName123", metaDataVO.getAppName());
+        assertEquals(true, metaDataVO.getEnabled());
+        assertEquals("methodName123", metaDataVO.getMethodName());
+        assertEquals("String", metaDataVO.getParameterTypes());
+        assertEquals("desc", metaDataVO.getPathDesc());
+        assertEquals("http", metaDataVO.getRpcType());
+        assertEquals("none", metaDataVO.getRpcExt());
+        assertEquals("serviceName123", metaDataVO.getServiceName());
+    }
+}
diff --git 
a/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/fallback/FallbackHandler.java
 
b/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/fallback/FallbackHandler.java
index a70e254ee9..5d4aeabd4e 100644
--- 
a/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/fallback/FallbackHandler.java
+++ 
b/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/fallback/FallbackHandler.java
@@ -71,7 +71,7 @@ public interface FallbackHandler {
         ServerHttpRequest request = exchange.getRequest();
         // avoid redirect loop, return error.
         boolean isSameUri;
-        if (!Objects.isNull(uri.getScheme())) {
+        if (Objects.nonNull(uri.getScheme())) {
             isSameUri = request.getURI().toString().equals(uri.toString());
         } else {
             String uriStr = UriUtils.repairData(uri.toString());
diff --git 
a/shenyu-sync-data-center/shenyu-sync-data-consul/src/main/java/org/apache/shenyu/sync/data/consul/ConsulSyncDataService.java
 
b/shenyu-sync-data-center/shenyu-sync-data-consul/src/main/java/org/apache/shenyu/sync/data/consul/ConsulSyncDataService.java
index 6e7730b4bc..8e94ae93c9 100644
--- 
a/shenyu-sync-data-center/shenyu-sync-data-consul/src/main/java/org/apache/shenyu/sync/data/consul/ConsulSyncDataService.java
+++ 
b/shenyu-sync-data-center/shenyu-sync-data-consul/src/main/java/org/apache/shenyu/sync/data/consul/ConsulSyncDataService.java
@@ -152,10 +152,10 @@ public class ConsulSyncDataService extends 
AbstractPathDataSyncService {
                         //data has not changed
                         return;
                     }
-                    if (!Objects.isNull(lastDatas)) {
+                    if (Objects.nonNull(lastDatas)) {
                         final ConsulData consulData = lastDatas.stream()
                                 .filter(lastData -> 
data.getKey().equals(lastData.getConsulKey())).findFirst().orElse(null);
-                        if (!Objects.isNull(consulData) && 
!StringUtils.isBlank(consulData.getConsulDataMd5())
+                        if (Objects.nonNull(consulData) && 
!StringUtils.isBlank(consulData.getConsulDataMd5())
                                 && 
consulData.getConsulDataMd5().equals(DigestUtils.md5Hex(data.getValue()))) {
                             return;
                         }
diff --git 
a/shenyu-sync-data-center/shenyu-sync-data-polaris/src/main/java/org/apache/shenyu/sync/data/polaris/PolarisSyncDataService.java
 
b/shenyu-sync-data-center/shenyu-sync-data-polaris/src/main/java/org/apache/shenyu/sync/data/polaris/PolarisSyncDataService.java
index 1830e35590..dc14eb9df3 100644
--- 
a/shenyu-sync-data-center/shenyu-sync-data-polaris/src/main/java/org/apache/shenyu/sync/data/polaris/PolarisSyncDataService.java
+++ 
b/shenyu-sync-data-center/shenyu-sync-data-polaris/src/main/java/org/apache/shenyu/sync/data/polaris/PolarisSyncDataService.java
@@ -101,7 +101,7 @@ public class PolarisSyncDataService extends 
AbstractNodeDataSyncService implemen
     @Override
     protected void doRemoveListener(final String removeKey) {
         final ConfigFileChangeListener configFileChangeListener = 
watchCache.get(removeKey);
-        if (!Objects.isNull(configFileChangeListener)) {
+        if (Objects.nonNull(configFileChangeListener)) {
             final ConfigFile configFile = 
configFileService.getConfigFile(polarisConfig.getNamespace(), 
polarisConfig.getFileGroup(), removeKey);
             configFile.removeChangeListener(configFileChangeListener);
         }
@@ -110,7 +110,7 @@ public class PolarisSyncDataService extends 
AbstractNodeDataSyncService implemen
     @Override
     public void close() {
         watchCache.forEach((key, configFileChangeListener) -> {
-            if (!Objects.isNull(configFileChangeListener)) {
+            if (Objects.nonNull(configFileChangeListener)) {
                 final ConfigFile configFile = 
configFileService.getConfigFile(polarisConfig.getNamespace(), 
polarisConfig.getFileGroup(), key);
                 configFile.removeChangeListener(configFileChangeListener);
             }

Reply via email to