Browse Source

update_19

andy 1 year ago
parent
commit
0ffe821a59

+ 1 - 0
src/main/java/com/scbfkj/uni/UniApplication.java

@@ -12,6 +12,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 public class UniApplication {
 
     public static void main(String[] args) {
+        Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println("停止程序")));
         SpringApplication.run(UniApplication.class, args);
     }
 

+ 1 - 1
src/main/java/com/scbfkj/uni/api/LogAop.java

@@ -132,7 +132,7 @@ public class LogAop {
             return ResponseEntity.ok(UniReturnUtil.fail(message));
         } finally {
             Object finalReturnData = returnData;
-            LoggerService.log("interfacelog", new HashMap<>() {{
+            LoggerService.log(LoggerService.LogType.INTERFACE, new HashMap<>() {{
                 put("requesttime", requestTime);
                 put("requestpath", uri);
                 put("requestdata", DataFormatUtil.toString(args));

+ 3 - 1
src/main/java/com/scbfkj/uni/library/RequestUtil.java

@@ -83,7 +83,9 @@ public class RequestUtil {
             if (applicationList.isEmpty()) {
                 throw new RuntimeException("获取应用失败");
             }
-            return applicationList.get(0);
+            Map<String, Object> app = applicationList.get(0);
+            requestAttributes.setAttribute("application",app, SCOPE_SESSION);
+            return app;
         }
         return (Map<String, Object>) application;
 

+ 1 - 1
src/main/java/com/scbfkj/uni/library/UniReturnUtil.java

@@ -59,7 +59,7 @@ public class UniReturnUtil {
     }
 
     public static String getMessage(Throwable e){
-        String detailMessage = Arrays.stream(e.getStackTrace()).limit(5).map(it -> "%s.%s:%s".formatted(it.getClassName(), it.getMethodName(), it.getLineNumber())).collect(Collectors.joining("\n"));
+        String detailMessage = Arrays.stream(e.getStackTrace()).limit(8).map(it -> "%s.%s:%s".formatted(it.getClassName(), it.getMethodName(), it.getLineNumber())).collect(Collectors.joining("\n"));
         return "异常消息:%s\n 错误详情:%s".formatted(e.getMessage(),detailMessage);
     }
 }

+ 1 - 1
src/main/java/com/scbfkj/uni/process/DataBase.java

@@ -184,7 +184,7 @@ public class DataBase {
         JsonNode driverClassName = jsonNode.get("driverClassName");
         HikariPool dataSourcePool = createDataSourcePool(jdbcUrl.asText(), Objects.isNull(username) ? null : username.asText(), Objects.isNull(password) ? null : password.asText(), Objects.isNull(driverClassName) ? null : driverClassName.asText(), connectionStr);
         JsonNode enableCache = jsonNode.get("enableCache");
-        if (Objects.isNull(enableCache) || !enableCache.asBoolean()) {
+        if (Objects.isNull(enableCache) || enableCache.asBoolean()) {
             dataSourcePools.put(connectionStr, dataSourcePool);
         }
         return dataSourcePool;

+ 14 - 16
src/main/java/com/scbfkj/uni/service/DataProcessService.java

@@ -104,7 +104,7 @@ public class DataProcessService {
                         break;
                     } else if (Objects.equals("1", preCode)) {
                         continue;
-                    }else if(!Objects.equals("0",preCode)){
+                    } else if (!Objects.equals("0", preCode)) {
                         continue;
                     }
                 }
@@ -125,8 +125,7 @@ public class DataProcessService {
 
                 }
                 Object type = algorithmLibrary.get("algorithmtype");
-                Object expression = algorithmLibrary.get("computingexpression");
-                algorithmResult = processByAlgorithm(type,expression, parameters);
+                algorithmResult = processByAlgorithm(type,  parameters);
 //                    算法执行结果
                 data.put("result", algorithmResult);
                 execTime = System.currentTimeMillis() - startTime;
@@ -148,20 +147,20 @@ public class DataProcessService {
         } finally {
 //                    不管成功还是失败都记录日志
             if (Config.debug || Objects.nonNull(serviceInfo) && Objects.equals("1", serviceInfo.get("enablelog"))) {
-                String target="servicelog";
-                if(Objects.nonNull(message)){
-                    target="serviceerrlog";
+                LoggerService.LogType target = LoggerService.LogType.SERVICE;
+                if (Objects.nonNull(message)) {
+                    target = LoggerService.LogType.SERVICE_ERR;
                 }
                 LocalDateTime finalStartDateTime = startDateTime;
                 String finalServiceId = serviceId;
                 String finalMessage = message;
                 String finalLifecycleid = lifecycleid;
-                LoggerService.log(target,new HashMap<>(){{
+                LoggerService.log(target, new HashMap<>() {{
                     put("begintime", finalStartDateTime);
-                    put("endtime",LocalDateTime.now());
+                    put("endtime", LocalDateTime.now());
                     put("serviceid", finalServiceId);
-                    put("resource",DataFormatUtil.toString(resource));
-                    put("prepesource",DataFormatUtil.toString(preResource));
+                    put("resource", DataFormatUtil.toString(resource));
+                    put("prepesource", DataFormatUtil.toString(preResource));
                     put("returnmessage", finalMessage);
                     put("lifecycleid", finalLifecycleid);
                 }});
@@ -172,29 +171,28 @@ public class DataProcessService {
     }
 
     /**
-     * @param parameters       算法参数
+     * @param parameters 算法参数
      * @return
      * @throws Exception
      */
     public static Map<String, Object> processByAlgorithm
-    (Object type,Object expression, List<Object> parameters) throws Exception {
-
+    (Object type, List<Object> parameters) throws Exception {
 
 
         switch (type.toString()) {
 //            java反射
             case "1" -> {
-                return JavaScriptEngineUtil.invoke((Map<String, Object>) parameters.get(0), expression.toString(), parameters.subList(1, parameters.size()));
+                return JavaScriptEngineUtil.invoke((Map<String, Object>) parameters.get(0), DataFormatUtil.toString(parameters.get(0)), parameters.subList(2, parameters.size()));
             }
 //            JS表达式
             case "2" -> {
-                return JsScriptEngineUtil.eval(expression.toString(), parameters);
+                return JsScriptEngineUtil.eval(DataFormatUtil.toString(parameters.get(0)), parameters.subList(1, parameters.size()));
             }
 //            数据库
             case "3" -> {
 //                下放到Database中处理数据
 //                参数表达式顺序是 数据源连接字符串(String.$.datasource.connectset),sql表达式(String.$.algorithm.computingexpression),需要操作的值(List.$.args[1].returnData),执行编号(String.$.algorithm.executionnumber)
-                return DatabaseScriptUtil.exec(parameters.get(0).toString(), parameters.get(1).toString(), ((List<Map<String, Object>>) parameters.get(2)), parameters.get(3), (List<String>) parameters.get(4), (List<Map<String, Object>>) parameters.get(5));
+                return DatabaseScriptUtil.exec(DataFormatUtil.toString(parameters.get(0)), DataFormatUtil.toString(parameters.get(1)), ((List<Map<String, Object>>) parameters.get(2)), parameters.get(3), (List<String>) parameters.get(4), (List<Map<String, Object>>) parameters.get(5));
             }
         }
         return UniReturnUtil.fail("算法类型不支持");

+ 91 - 44
src/main/java/com/scbfkj/uni/service/LoggerService.java

@@ -2,14 +2,11 @@ package com.scbfkj.uni.service;
 
 import com.scbfkj.uni.library.DataFormatUtil;
 import com.scbfkj.uni.library.UniReturnUtil;
-import com.scbfkj.uni.library.script.DatabaseScriptUtil;
 import com.scbfkj.uni.process.DataBase;
-import com.scbfkj.uni.process.Elasticsearch;
-import com.scbfkj.uni.process.Kafka;
 import com.scbfkj.uni.system.Config;
+import com.zaxxer.hikari.pool.HikariPool;
 
 import java.io.File;
-import java.io.FileNotFoundException;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -18,6 +15,26 @@ import java.util.stream.Stream;
 
 public class LoggerService {
 
+    public enum LogType {
+
+        USER("userlog"),
+        INTERFACE("interfacelog"),
+        SYSTEM("systemerrlog"),
+        SERVICE("servicelog"),
+        SERVICE_ERR("serviceerrlog");
+
+        private String name;
+
+        LogType(String name) {
+            this.name = name;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+    }
+
     private static final String connection = """
             {
               "jdbcUrl": "jdbc:sqlite:%s",
@@ -25,15 +42,16 @@ public class LoggerService {
               "enableCache":false
             }
             """;
-    private static long filename = 0;
+    private static String currentFileName;
 
     private final static Set<Long> fileNames = new HashSet<>();
-    private static final String dbFileName = "logs/%s.sqlite";
+    private static final String dir = "logs/";
 
-    public static void log(String target, Map<String, Object> data) {
-        filename = System.currentTimeMillis() / Config.splitCount;
-
-        String filePath = dbFileName.formatted(filename);
+    public static void log(LogType type, Map<String, Object> data) {
+//        if (true) return;
+        long filename = System.currentTimeMillis() / Config.splitCount;
+        currentFileName = filename + ".sqlite";
+        String filePath = dir + currentFileName;
         String connectionStr = connection.formatted(filePath);
         synchronized (fileNames) {
             if (!fileNames.contains(filename)) {
@@ -46,7 +64,8 @@ public class LoggerService {
                                         primary key autoincrement,
                                     target     TEXT,
                                     currentfile TEXT,
-                                    targetconnection     TEXT,
+                                    datasourceid     TEXT,
+                                    expression     TEXT,
                                     datacontent      TEXT
                                 )""");
                     } catch (Exception e) {
@@ -59,50 +78,47 @@ public class LoggerService {
         }
         try {
             List<Object[]> datas = new ArrayList<>();
-            List<String> targets = Config.targets;
-            for (String targetconnection : targets) {
-                datas.add(new Object[]{target, filename, targetconnection, DataFormatUtil.toString(data)});
+//            List<Map<String, Object>> targets = Config.targets.stream().filter(it -> Objects.equals(it.get(""), type.getName())).toList();
+            List<Map<String, Object>> targets = DataBase.query(Config.centerConnectionStr, "select * from systeminfo where keyname=?", Collections.singletonList(new Object[]{type.getName()}));
+            for (Map<String, Object> targetconnection : targets) {
+                datas.add(new Object[]{type.getName(), filePath, targetconnection.get("datasourceid"), targetconnection.get("expression"), DataFormatUtil.toString(data)});
             }
-
-            DataBase.updateBatch(connectionStr, "insert into logs (target,currentfile,targetconnection,datacontent) values(?,?)", datas);
+            DataBase.updateBatch(connectionStr, "insert into logs (target,currentfile,datasourceid,expression,datacontent) values(?,?,?,?,?)", datas);
         } catch (Exception e) {
             System.out.println(UniReturnUtil.getMessage(e));
         }
     }
 
-    public static void sendMessage(String dirPath) throws FileNotFoundException {
+    public static void sendMessage() {
 //        判断目录
-        if (Objects.isNull(dirPath)) {
-            dirPath = "logs";
-        }
-        File file = new File(dirPath);
-        if (file.isFile()) {
-            throw new FileNotFoundException("%s不是一个目录".formatted(dirPath));
-        }
+
+        File file = new File(dir);
+
 //        日志目录下的文件
         List<File> files = Arrays.stream(file.listFiles()).toList();
 //        过滤出当前不使用的文件
         List<File> logsFiles = files.parallelStream()
                 .filter(logFile -> {
                     String fileName = logFile.getName();
-                    String sqliteFileName = fileName.substring(0, fileName.indexOf(".sqlite"));
-                    return !sqliteFileName.equals(filename);
+                    return !fileName.equals(currentFileName) && fileName.endsWith("sqlite");
                 }).toList();
 //        记录出错的日志文件
         List<String> errorFileNames = new ArrayList<>();
-        logsFiles.stream()
+        logsFiles.parallelStream()
                 .map(logFile -> {
                     String fileName = logFile.getName();
 //                    转成连接字符串
-                    return connection.formatted(fileName);
+                    return connection.formatted(dir + fileName);
                 })
                 .flatMap(connectionStr -> {
 //                    查询数据
                     try {
                         return DataBase.query(connectionStr, "select * from logs where 1=?", Collections.singletonList(new Object[]{1})).stream();
                     } catch (Exception e) {
-                        Matcher matcher = Pattern.compile("\\d+").matcher(connectionStr);
-                        errorFileNames.add(matcher.group());
+                        Matcher matcher = Pattern.compile("logs/\\d+\\.sqlite").matcher(connectionStr);
+                        if (matcher.find()) {
+                            errorFileNames.add(matcher.group());
+                        }
                         return Stream.empty();
                     }
                 })
@@ -113,20 +129,42 @@ public class LoggerService {
 //                    需要发送的数据
                     List<Map<String, Object>> value = stringListEntry.getValue();
 //                    按照目标连接字符串分组
-                    Map<String, List<Map<String, Object>>> targetconnection = value.stream().collect(Collectors.groupingBy(data -> data.get("targetconnection").toString()));
-                    targetconnection.forEach((connectionStr, value1) -> {
+                    Map<String, List<Map<String, Object>>> targetconnection = value.stream().collect(Collectors.groupingBy(data -> data.get("datasourceid").toString()));
+
+                    targetconnection.forEach((datasourceid, value1) -> {
 //                        获取发送的数据流
                         Stream<String> datacontentStream = value1.stream().map(data -> data.get("datacontent").toString());
 
 //                        解析发送目标连接字符串
-                        Map<String, Object> config = ((Map<String, Object>) DataFormatUtil.toMap(connectionStr));
-                        String type = config.getOrDefault("type", "DB").toString();
                         try {
+                            List<Map<String, Object>> dataSourceList = DataBase.query(Config.centerConnectionStr, "select * from datasource where datasourceid=?", Collections.singletonList(new Object[]{datasourceid}));
+                            if (dataSourceList.isEmpty()) {
+                                return;
+                            }
+                            Map<String, Object> config = dataSourceList.get(0);
+                            String type = config.getOrDefault("datasourcetype", "DB").toString();
+                            String connectionStr = config.get("connectset").toString();
+                            String expression = value1.get(0).get("expression").toString();
+                            List<Object> parameters = new ArrayList<>();
+
                             switch (type.toUpperCase()) {
-                                case "ES" -> Elasticsearch.sendMessage(connectionStr, targetName, datacontentStream.toList());
-                                case "KAFKA" -> Kafka.sendMessage(connectionStr, targetName, datacontentStream.toList());
-                                case "DB" ->
-                                        DatabaseScriptUtil.exec(connectionStr, targetName, datacontentStream.map(DataFormatUtil::toMap).map(dataContent -> ((Map<String, Object>) dataContent)).toList(), "1", null, null);
+                                case "ES", "KAFKA" -> {
+                                    parameters.add(DataFormatUtil.toMap(connectionStr));
+                                    parameters.add(expression);
+                                    parameters.add(connectionStr);
+                                    parameters.add(targetName);
+                                    parameters.add(datacontentStream.toList());
+                                    DataProcessService.processByAlgorithm("1", parameters);
+                                }
+                                case "DB" -> {
+                                    parameters.add(connectionStr);
+                                    parameters.add(targetName);
+                                    parameters.add(datacontentStream.map(DataFormatUtil::toMap).map(dataContent -> ((Map<String, Object>) dataContent)).toList());
+                                    parameters.add("1");
+                                    parameters.add(null);
+                                    parameters.add(null);
+                                    DataProcessService.processByAlgorithm("3", parameters);
+                                }
                             }
                         } catch (Exception e) {
 //                        当前数据是在哪一个数据库文件中
@@ -134,15 +172,24 @@ public class LoggerService {
                             errorFileNames.add(currentfile);
                             System.out.println(UniReturnUtil.getMessage(e));
                         }
-
                     });
                 });
-//        过滤掉出错的数据库文件然后删除文件
-        if (logsFiles.removeIf(f -> errorFileNames.stream().anyMatch(errorFileName -> errorFileName.contains(f.getName())))) {
-            for (File logsFile : logsFiles) {
-                logsFile.delete();
+        logsFiles.stream().filter(f ->
+                errorFileNames.stream().filter(Objects::nonNull).noneMatch(errorFileName ->
+                        errorFileName.contains(f.getName()))
+        ).forEach(f -> {
+            try {
+                String connectionStr = connection.formatted(dir + f.getName());
+                DataBase.exec(connectionStr, "delete  from logs");
+                HikariPool hikariPool = DataBase.dataSourcePools.remove(connectionStr);
+                if (Objects.nonNull(hikariPool))
+                    hikariPool.shutdown();
+//                删除文件一直不成功
+                f.delete();
+            } catch (Exception e) {
+                e.printStackTrace();
             }
-        }
+        });
 
     }
 }

+ 1 - 4
src/main/java/com/scbfkj/uni/system/Config.java

@@ -19,10 +19,7 @@ public class Config {
 
     public static String containerCode;
 
-    public static List<String> targets = new ArrayList<>() {{
-        add("""
-                {"jdbcUrl":"jdbc:sqlite:logs.sqlite","driverClassName":"org.sqlite.JDBC"}""");
-    }};
+    public static List<Map<String,Object>> targets = new ArrayList<>();
 
     //    本地日志缓存分片 10分钟
     public static int splitCount = 600000;

+ 7 - 20
src/main/java/com/scbfkj/uni/system/SystemInit.java

@@ -1,6 +1,8 @@
 package com.scbfkj.uni.system;
 
 import com.scbfkj.uni.library.DataEncryptionUtil;
+import com.scbfkj.uni.library.DataFormatUtil;
+import com.scbfkj.uni.process.DataBase;
 import com.scbfkj.uni.service.ControlService;
 import com.scbfkj.uni.service.LoggerService;
 import jakarta.annotation.PostConstruct;
@@ -10,6 +12,7 @@ import org.springframework.stereotype.Component;
 
 import java.io.*;
 import java.time.LocalDateTime;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 
@@ -30,9 +33,6 @@ public class SystemInit {
     private String containerCode;
 
 
-    @Value("${log.target}")
-    private List<String> targets;
-
     @Value("${debug:false}")
     private boolean debug = true;
 
@@ -45,29 +45,16 @@ public class SystemInit {
         Config.securityConnectionStr = DataEncryptionUtil.decryptRSAByPrivateKey(securityConfig);
 
 //        日志配置初始化
-        if (!targets.isEmpty()) {
-//            有配置 需要覆盖 所以删除默认配置
-            Config.targets.clear();
-        }
-        for (String targetStr : targets) {
-            String target = DataEncryptionUtil.decryptRSAByPrivateKey(targetStr);
-            Config.targets.add(target);
-        }
+        Config.targets.addAll(DataBase.query(Config.centerConnectionStr, "select * from systeminfo where 1=?", Collections.singletonList(new Object[]{1})));
+
         initializeSystemEnvironment();
         ControlService.startServiceByContainerCode();
 //        日志任务
-//        ScheduleUtil.start(() -> {
-//            try {
-//                LoggerService.sendLog();
-//            } catch (FileNotFoundException exception) {
-//                System.out.println(exception.getMessage());
-//            }
-//        }, "* * * * * *");
+        ScheduleUtil.start(LoggerService::sendMessage, "*/1 * * * * *");
 //        LoggerService.logSystemError(LocalDateTime.now(), "", "");
-        LoggerService.log("systemerror", new HashMap<>() {{
+        LoggerService.log(LoggerService.LogType.SYSTEM, new HashMap<>() {{
             put("occurrencetime", LocalDateTime.now());
         }});
-
     }
 
     private void initializeSystemEnvironment() {

+ 1 - 1
src/main/resources/application-dev.properties

@@ -1,6 +1,6 @@
 db.center.config=hLcDKcDr4MgqYdb8j0gF0nF806yUy1UdEp1nmztEdo5rNL8IZliDj7/feOp2Fc7j19m9jtiwFp5nPvClI1Ni4kxluI8MQepS8nBK3bEzRzsGSswNHa/Sjyw0GK9/ZnOaiD+lDQyI7+fVbmpdvkLy7QE07bpTIjdI1tcLx8Z9QWs=
 db.security.config=Jnj84d14EmSgKEXyAbSH+bratWGkpV89/VA5Er4yQOt7qlnKtGYJzBVJNNYMBdmSlW0G+nqDHMhJQcmHrwbjjChYuGeDcmKSRmvFQ9u7LwqmgEfazzKKoVawXmJ40dMsec2yaFyNnCM92xn1hzHvle5BL7x3kza2htGm+iOqO7Y=
-log.target=B7xSbq4imA5zapX8kEO42mU/5sA2TyF/Ba2Y/++F3z9Np7iT4ywDUkbRC4w/Xrxv1kMSR8PQMJ4dfYwc3mYj0SJJivN5A5/6hI+ZSQBabfZZrYwaIIRdM1XIk4wo1SIrSCXKzef8X6YUH70R2tnh+Uq6KNNp08KaZ2ZXM8vX5Ss=
+#log.target=B7xSbq4imA5zapX8kEO42mU/5sA2TyF/Ba2Y/++F3z9Np7iT4ywDUkbRC4w/Xrxv1kMSR8PQMJ4dfYwc3mYj0SJJivN5A5/6hI+ZSQBabfZZrYwaIIRdM1XIk4wo1SIrSCXKzef8X6YUH70R2tnh+Uq6KNNp08KaZ2ZXM8vX5Ss=
 server.port=9500
 app.container.code=dev
 app.security.enable=false

+ 1 - 1
src/main/resources/application.properties

@@ -1,5 +1,5 @@
 db.center.config=hLcDKcDr4MgqYdb8j0gF0nF806yUy1UdEp1nmztEdo5rNL8IZliDj7/feOp2Fc7j19m9jtiwFp5nPvClI1Ni4kxluI8MQepS8nBK3bEzRzsGSswNHa/Sjyw0GK9/ZnOaiD+lDQyI7+fVbmpdvkLy7QE07bpTIjdI1tcLx8Z9QWs=
 db.security.config=Jnj84d14EmSgKEXyAbSH+bratWGkpV89/VA5Er4yQOt7qlnKtGYJzBVJNNYMBdmSlW0G+nqDHMhJQcmHrwbjjChYuGeDcmKSRmvFQ9u7LwqmgEfazzKKoVawXmJ40dMsec2yaFyNnCM92xn1hzHvle5BL7x3kza2htGm+iOqO7Y=
-log.target=B7xSbq4imA5zapX8kEO42mU/5sA2TyF/Ba2Y/++F3z9Np7iT4ywDUkbRC4w/Xrxv1kMSR8PQMJ4dfYwc3mYj0SJJivN5A5/6hI+ZSQBabfZZrYwaIIRdM1XIk4wo1SIrSCXKzef8X6YUH70R2tnh+Uq6KNNp08KaZ2ZXM8vX5Ss=
+#log.target=B7xSbq4imA5zapX8kEO42mU/5sA2TyF/Ba2Y/++F3z9Np7iT4ywDUkbRC4w/Xrxv1kMSR8PQMJ4dfYwc3mYj0SJJivN5A5/6hI+ZSQBabfZZrYwaIIRdM1XIk4wo1SIrSCXKzef8X6YUH70R2tnh+Uq6KNNp08KaZ2ZXM8vX5Ss=
 server.port=9500
 app.container.code=dev

+ 1 - 21
src/test/java/com/scbfkj/uni/api/SecurityApiTest.java

@@ -14,27 +14,7 @@ import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
 
 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
 class SecurityApiTest extends ControllerBaseTest {
-    public void testHello() throws Exception {
-
-        /*
-         * 1、mockMvc.perform执行一个请求。
-         * 2、MockMvcRequestBuilders.get("XXX")构造一个请求。
-         * 3、ResultActions.param添加请求传值
-         * 4、ResultActions.accept(MediaType.TEXT_HTML_VALUE))设置返回类型
-         * 5、ResultActions.andExpect添加执行完成后的断言。
-         * 6、ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情
-         *   比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。
-         * 7、ResultActions.andReturn表示执行完成后返回相应的结果。
-         */
-        mockMvc.perform(MockMvcRequestBuilders
-                        .get("/hello")
-                        // 设置返回值类型为utf-8,否则默认为ISO-8859-1
-                        .accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
-                        .param("name", "Tom"))
-                .andExpect(MockMvcResultMatchers.status().isOk())
-                .andExpect(MockMvcResultMatchers.content().string("Hello Tom!"))
-                .andDo(MockMvcResultHandlers.print());
-    }
+
 
 
     @Test